部署NextJS到Azure WebApp Deployment Error报错: cannot find module ../server/require-hook

当我将nextjs应用程序部署到azure web应用程序的时候报错:cannot find module ../server/require-hook。 我通过github-actions构建和部署成功完成,但是部署后,我在url 中收到错误,并且在azure日志流利发现这个错误。刚刚开始我不明白是什么原因造成的,因为“npm start”在我的本地机器上使用相同的 npm 版本构建和运行。 通过网上查找,发现是因为githhb的action默认不会把.next文件夹打包加入zip并且发布到azure。所以需要在默认的工作流基础上修改: 1、adding “startAzure”: “./node_modules/next/dist/bin/next start” in package.json; 还需要在azure应用程序网站的配置立加上 the startup command of the azure web app like “npm run startAzure” 2、添加这个到azure的 pipeline (在创建 zip了之后) - name: Zip artifact for deployment run: zip release.zip ./* -r - name: Add .next folder to zip artifact for deployment run: zip -r release.zip ".next"

February 27, 2025

昆明,两次相遇

大约十年前,毕业实习的时候,我曾在昆明住了将近一个月。 直到今天,我依然忘不了住处楼下那家不起眼的小店,五块钱一碗土鸡米线。现在想来,那时候应该没有什么所谓的“科技”,一锅鸡汤,大概只有盐和味精调味,放上两三片鸡肉,撒一点韭菜叶,再舀一勺本地炒辣椒酱,就是一碗热气腾腾的米线。我们几个实习的同学几乎每天早上都去吃,却从来没有觉得腻。 那一年正赶上亚洲杯,那时候的中国队还能争冠。白天去公司实习,晚上回到住处,一群年轻人围着电视看比赛,为每一个进球欢呼。很多比赛的比分我早已忘记,但那个夏天的昆明却一直留在记忆里:清晨街边飘着米线的香气,傍晚凉风吹过树梢,大家对未来都有些迷茫,却又都相信未来一定会很好。 我是最后一个抵达昆明的人。出发去实习前,我先绕到北京去找小熊,那趟绕远的旅程,对年轻的自己来说是一次壮举。青春就是这样,总会为了想见的人,多坐一程火车,多走一段路,而丝毫不会觉得麻烦。 这次我带着小熊和孩子们,一起重返昆明,看见的却是另一座城市。 学生时代来昆明,眼里只有实习、足球和米线,从未认真了解过这座城市。我们参观了云南陆军讲武堂,那里陈列着中国远征军的资料,这支部队属于国民政府领导下的国民革命军,他们远征缅甸,保卫滇缅公路,许多人再也没有回来。还有有驼峰航线的故事,那些飞越喜马拉雅山的飞行员,在没有现代导航和气象保障的年代,一次次驾驶运输机穿越雪山,把武器、药品和希望送进中国。展厅里还有一张宋美龄与驼峰飞行员的合影。照片中的人都很年轻,隔着几十年的时光,依然能感受到那个时代的勇气。 反法西斯战争中,国军承担了正面战场的主要作战任务,无数将士血战淞沪、武汉、长沙、常德、桂林… 今天回望那段历史,无论后来政治如何变迁,他们的牺牲都不应被遗忘。 昆明也是一座承载着厚重历史的城市。这里曾是吴三桂受封平西王后的大本营,很多人看到“平西王”三个字,脑海里都会浮现昆明,现在还会想到另外一个轰动政治的人物。历史有时很奇妙,同样一个称号,在不同年代会让人想到不同的人物,不禁令人莞尔。 同一座昆明,两次相遇。第一次带给我的是青春,第二次带给我的是历史。而当这两段记忆慢慢重叠在一起时,我才发现,一座真正值得怀念的城市,从来不只是因为风景和美食,更因为它曾经收藏过我们的青春,也收藏过一个民族的记忆。

February 18, 2025

县城故乡

县城 我们又回来了。 车子驶入城区的时候,窗外掠过的街道并没有带来太多陌生感。离开这些年,县城也在变化,新楼盘多了,商业街热闹了许多,但整体的轮廓依然还是记忆中的样子,那条标志性的大道依然如故。岭南小城的冬天几乎没有北方那种肃杀感,树木依旧浓绿,阳光依旧温暖,空气里甚至还残留着一些夏天的气息。爱人出生在这里,而我也曾在这里度过三年的高中时光。 这次我们决定住上一段时间,没有太明确的计划,也没有必须完成的事情。过去这些年,大部分时间都在赶路,总觉得下一件事更重要,下一个目标更值得投入精力,于是时间被切割得越来越碎,人也越来越习惯于奔波。忽然停下来以后,反而有一种久违的松弛感。每天睡到自然醒,饭后陪孩子在大草坪戏耍,或者到南门菜市,看街边的人来人往,看市场里讨价还价的声音此起彼伏。县城的时间似乎总是比大城市慢一些,而正是这种缓慢,让人重新感受到生活本来的质地。 每天早晨出门打粉,街边小店已经升起热腾腾的蒸汽。空气里混杂着各种米粉的香味,老友粉、卷筒粉、桂林米粉,还有只有这一带才常见的生榨米粉。对于外地人来说,那种微微发酵后的酸香未必容易接受,但对于从小闻着这种味道长大的人而言,那几乎就是故乡最具体的气息。很多时候,人怀念的并不是某一种食物本身,而是食物背后所连接的时光。高中外出买生活用品后吃上一碗粉,偶尔和同学在街上闲逛到傍晚,那些已经模糊的人和事,往往会因为一种熟悉的味道重新浮现出来。 闲下来以后,我开始恢复跑步。有一天兴致来了,决定绕着县城跑一圈,导航显示十六公里。我从城区主干道出发,往南跑到路的尽头,然后顺着环线一路向前,几次跨越西江河,再绕回起点。沿途经过的风景其实并不壮观。文江塔依旧静静地立在那里,像一位沉默的老人,看着河水一年年流过,也看着无数人在这里长大、离开,又偶尔回来。西江河的水缓缓向前,傍晚时分的阳光落在河面上,碎成一片金色的波光。 跑到最后几公里时,县城的灯光已经陆续亮起,街边的烧烤摊开始营业,熟悉的烟火气重新弥漫开来。我突然意识到,我对县城已经熟悉地如同老家,那些转弯、坡度和街角的位置,像是某种埋藏在记忆深处的本能,只要重新回来,就会自然地被唤醒。 故乡 春节期间,我们又回到了我那乡下老家。年轻的时候总觉得故乡太小,小到装不下自己的理想,所以一心想着离开;等真正走过许多地方,再回头看时,才发现故乡从来没有离开过自己,它只是安静地停留在原地,等待着某一天的归来。 这些年其实经历过很多次告别。离开家乡去上大学算一次,毕业后远行算一次,后来离开一个又一个生活过的地方,也都算一次。但过去的每一次离开,心里总觉得还有回来的一天,所以离别并不显得沉重。而这一次,当我站在祖屋门前,看着已经有些斑驳的墙壁时,却第一次清晰地感受到一种真正意义上的告别。 村子其实没有太大变化,只是人变了。 小时候眼中的长辈已经逐渐老去,当年的孩子成为父母,新一代的孩子又在院子里追逐奔跑。生命就是这样一代代向前延续,而每个人都只是其中短暂的一段。以前读贾平凹那句话——“你生在那里,其实你的一半就死在那里,所以故乡也叫血地”,总觉得其中更多的是乡愁与苍凉。到了今天才慢慢明白,故乡之所以特殊,并不只是因为那里有亲人和房屋,而是因为那里保存着自己最初的样子。那些已经无法回去的童年、少年时代,那些早已消失的人和事,都沉淀在那里。故乡像一本不会再更新的旧书,里面记录着人生最开始的章节。 然而人终究不能永远停留在过去。 这些年我越来越喜欢余华说过的一段话:“我家附近就是大海,课本里说海水是蓝色的,我经常想为什么我都看不到蓝色呢?有一天,我游了很长一段距离,一边游一边想着:我要一直游,一直游到海水变蓝。” 故乡给予我出发的地方,却未必是最终停留的地方。我理解故乡、怀念故乡,也感激故乡塑造了今天的自己,但人生终究还是要向前走。就像西江河里的水不会因为眷恋岸边而停止流动,人也总会在某一个时刻再次启程。

February 15, 2025

今日离京

昨天我开车去了南边的市场,一路经过那些熟悉又陌生的道路,曾经无数次往返的高架桥、路口和辅路,依旧保持着记忆中的样子。处理完事情后,我经过四号线生物医药基地站,这个地方我们当年也来看过房子。那时候孩子还没出生,对未来有着各种具体而清晰的规划,我们站在售楼处的沙盘前,认真计算着首付、月供和通勤时间,仿佛只要把这些数字安排妥当,未来就会按照预想的轨迹展开。 这么多年过去,再次站在那里,除了新建起来的楼盘、旧了一些的居民楼和商厦,似乎并没有太大的变化。地铁口依旧是匆匆赶路的人。街边的小店依旧亮着灯,大概率晚高峰的人潮依旧拥挤。人还是那些人,城市还是那座城市,变化最大的,反而是自己。 无论如何,该处理的事情都已经处理清楚,那些压在心头许久的事务,在签字、确认、交接之后,终于落下帷幕。走出最后一道门的时候,没有想象中的如释重负,反而有一种说不出的恍惚。就像一本翻了很多年的书,忽然合上,手还停留在最后一页。 对于北京,我有感激,也有遗憾;有留恋,也有释然。它见证了我最重要的十六年,而我把十六年的青春时光,都留在了这里。从一个背着行李、怀揣着各种幻想的年轻人,到如今两鬓渐添风霜,身边有了爱人,有了孩子,也有了属于自己的故事。回头看,这十六年几乎走完了一个普通人在大城市里最完整的人生轨迹。 恋爱、买房、结婚、生子。每一个阶段都曾经觉得漫长,等真正走过之后,却发现不过是转眼之间。我把所得一切主要归功于运气,北京没有亏待过我,它给过机会,也给过回报;给过希望,也给过挫折。那些为了生活奔波的清晨,那些加班到深夜的灯光,那些堵在路上的焦躁,那些拿到结果时的欣喜,都已经成为生命的一部分。 当然,我对这座城市也有很多不满。它拥挤、昂贵、节奏飞快;有时候让人觉得渺小得像一粒尘埃。很多时候,你拼尽全力,也未必能够追上它前进的速度,年轻时总觉得自己能够改变什么,后来才明白,个人终究改变不了一座城市。 幸运的是,人可以改变自己,接受自己的局限,接受时代的变化,也接受人生不同阶段的选择。 今天早晨吃完早餐,我们坐高铁出发。车站里行李箱轮子在地面滚动,西站依然熙熙攘攘,有人刚刚抵达,有人准备离开。人生很多时候也是如此,有人进入一段故事,有人结束一段故事。 车子驶出西站的时候,我没有刻意回头,因为真正重要的东西,其实早已带在身上。那些一起奋斗过的岁月,那些结识过的人,那些深夜里的梦想和迷茫,那些属于青春的热烈与倔强,都不会因为离开而消失,它们已经成为生命的一部分。 列车即将驶向远方,窗外的风景会不断后退,新的风景也会不断出现。人生终究是一场向前的旅程。 告别不是结束,而是另一段故事的序章。带着对过往的感激,带着对未来的期待,我们终于出发。

January 18, 2025

行走在北京胡同:历史没有如果,但仍有温度可守

入秋以来,我给自己安排了一场漫长的城市漫游。十多天时间里,几乎每天步行两万步以上,穿行于北京二环内纵横交错的胡同巷陌之间。从寻常百姓的小门小院,到昔日王公贵族的深宅大院;从熙熙攘攘的街市,到香火隐约的古寺庙宇;从规整修缮后的历史街区,到那些地图上甚至没有名字的狭窄角落。我像一个迟来的访客,试图在城市飞速变化的今天,重新认识这座古老都城的肌理。 有时,我也会壮着胆子走进那些看起来有些凌乱的院落。斑驳的墙面、堆放的杂物、晾晒的衣服、停靠的自行车,以及院子深处偶尔传来的锅碗碰撞声和家长里短的交谈声,共同构成一种真实而具体的生活景象。这些地方或许并不美观,甚至显得拥挤杂乱,但正是在这样的空间里,我感受到一种难以复制的城市温度。 每一次走进胡同,仿佛都是一次时空切换。仅仅隔着一条主干道,外面的世界是车流、人潮、商场和写字楼,是不断更新的广告牌和闪烁的霓虹灯。而拐进胡同之后,仿佛进入了另一个维度。除了偶尔匆忙穿行的外卖电动车,更多时候能够听见的只是自行车轮压过地面的细微声响,以及行人不紧不慢的脚步声。 这里没有现代都市常见的压迫感。低矮的屋檐、曲折的巷道、树木投下的阴影,以及那些历经岁月洗礼的砖墙,共同营造出一种缓慢而安静的节奏。行走其中,人会不自觉地放慢脚步,开始留意门楣上的砖雕、墙角的石墩、残存的匾额,甚至是一棵从院墙里探出枝叶的老树。 每当这种时候,我总会产生许多关于历史的假设。如果北京的老城墙能够完整保留下来,会是怎样的景象?如果那些规模宏大的城门、角楼和护城河至今依旧环绕着老城,北京是否会拥有另一种独特的气质?如果大量四合院没有被改造成大杂院,也没有在城市建设浪潮中被拆除,那么今天的人们是否还能更完整地感受到传统居住文化的魅力?如果那些散布于街巷之间的古老庙宇、牌楼和历史街道没有遭到破坏,北京又会呈现出怎样丰富而完整的历史层次? 然而,历史终究没有如果。 城市的发展从来不是静止的。北京能够成长为今天这样一座现代化国际都市,离不开过去几十年的快速建设与扩张。宽阔的道路、高耸的楼宇、发达的交通网络以及繁荣的商业中心,共同支撑着数千万人的工作与生活。 我当然喜欢西单和王府井的热闹繁华,也深知国贸、金融街和中关村对于这座城市的重要意义。那里汇聚着资本、技术、人才与机会,是现代北京最具活力的象征。 我甚至向往东四环那些环境优越的高端社区,以及京郊掩映在树林与湖泊之间的低调别墅。现代化带来的便利、舒适和效率,没有人能够轻易否认它们的价值。 但与此同时,我仍然认为,由短视和人为因素造成的文化断层,是这座城市无法回避的遗憾。这种遗憾并不仅仅体现在某一座建筑的消失,或者某一条街道的改变,而是在于一个完整文化生态的断裂。城市真正珍贵的东西,往往不仅是那些被列入保护名录的古建筑本身,更是建筑背后的生活方式、邻里关系、空间结构以及代代相传的记忆。当这些东西被整体切断之后,即便未来投入再多资源进行复原,也很难重新获得原有的生命力。 因为建筑可以重建,生活却无法复制。这些年,关于胡同的存留与改造,始终存在着各种不同观点和争论。有人认为胡同代表落后的居住条件,应该让位于更高效、更现代的城市空间;也有人认为胡同是北京最独特的文化遗产,必须最大限度地保护。作为一个普通的行走者,我并非城市规划专家,也无法给出复杂问题的标准答案。只是经过这些天的观察与思考,我越来越觉得,与其进行大刀阔斧的彻底改造,不如给予这些空间更多自然生长的可能。因为我有一个非常深刻的体会:胡同里那些杂院和小杂货铺所散发出的市井气息,往往比大门紧闭的单位院落和空无一人的豪华大院更具生命力。 清晨开门扫地的老人,坐在门口择菜聊天的邻居,经营了几十年的小卖部,修车铺门前停放的自行车,放学后奔跑追逐的孩子,甚至是一只趴在墙根晒太阳的猫——这些看似微不足道的日常场景,恰恰构成了一座城市最真实的灵魂。城市的价值,不仅在于它拥有多少摩天大楼,也在于它是否还保留着普通人的生活痕迹。 那些杂乱、拥挤、甚至略显陈旧的空间,未必符合现代审美,却承载着人与人之间最自然的联系。它们不是博物馆里的标本,而是仍然在呼吸、在生长、在变化的生活现场。当越来越多城市变得相似,当商业综合体和标准化街区不断复制扩张的时候,北京胡同最珍贵的地方,或许正是这种无法被复制的烟火气。 历史没有如果,失去的许多东西也无法重来。但至少今天,当我们仍然能够走进这些胡同,听见自行车铃声,看见院墙上的爬山虎,闻到早点铺升起的热气时,就意味着这座城市与自己的过去还没有完全失去联系。或许,对于北京而言,最重要的不是把胡同变成一件被精心陈列的展品,也不是将其彻底改造成整齐划一的新社区,而是在保护与更新之间找到一种克制而审慎的平衡。 让历史继续存在,让生活继续发生。 因为一座城市最动人的部分,从来不只是它的过去,而是过去仍然活在今天。

October 23, 2024

小提琴演奏主要基本功

小提琴的演奏技术来说,要练好以下几个主要基本功: 一、运弓 优秀的演奏家能在小提琴上发出千变万化的声音,就运弓而言,取决于运弓的速度、弓在弦上的压力以及弓和弦的接触点这3种因素的不同结合。小提琴的弓法繁多,就其主要的有以下几种: ①分弓:一弓演奏一个音; ②连弓:一弓演奏许多音; ③顿弓:音与音之间断开; ④跳弓:弓毛离开琴弦。 这4类弓法是最基本的,在20世纪中期,连顿弓,即在一弓中连续快速演奏许多音与音之间是断开的音,被人视为绝技,所以人们把小提琴演奏艺术称之为“运弓的艺术”。 二、揉弦 通过左手手指在弦上的颤动,使声音的音高产生有规律的波动,称之为揉弦。 揉弦是小提琴演奏中极为重要的表现手段。揉弦分为手指的、手腕的和手臂的。优秀的演奏者不仅要掌握这3种揉弦方法,而且要学会使用不同速度和不同幅度的揉弦,在演奏不同作家,不同作品,不同乐句时,富于变化地运用揉弦。从揉弦的运用,可以使听众明显地辨认出不同演奏家的音乐个性。 三、把位 左手手指在指板上的位置,称之为把位。靠近琴头的把位为低把,靠近琴马的为高把。从一个把位换到另一个把位,称为换把。 换把位的方法有多种,例如空弦换把,同指换把,不同指以及泛音换把等。换把时产生非音乐需要的滑音,是技巧训练不足的标志。滑音可以使音与音之间的连接富于变化,特别是结合换把使用滑音,是一种富于表现力的演奏手段。 四、双音与和弦 小提琴可以同时演奏两个音甚至是3个音,也可以分奏4个音的和弦,这不仅丰富了它的表现力,并可不依赖其他乐器的伴奏进行单独演奏。小提琴的三度、六度、八度以及十度双音音阶,是演奏双音的基础,也是小提琴家必须终身练习的一项基本功。小提琴演奏中的左手颤音、泛音、拨弦等,都是一些高深的技巧。

September 28, 2024

React官网力荐Next.js

随着前端技术的快速发展,React作为一款领先的JavaScript库,不断推动着前端开发的变革。近期,React官网的一个显著变化引起了广大开发者的关注:它不再推荐使用Create-React-App作为构建React应用的默认工具,而是转向了Next.js。 那么,Next.js究竟有何魔力,让React官网做出如此决策?本文将为你详细解析。 一、Next.js:React应用的“升级版” Next.js并不是一个全新的框架,而是基于React的服务器端渲染框架。它提供了许多开箱即用的功能,使得开发者能够更高效地构建复杂、高性能的React应用。与Create-React-App相比,Next.js更像是一个“升级版”,它为React应用带来了以下显著的优势: 性能优化:Next.js支持自动静态优化(Automatic Static Optimization)和服务器端渲染(Server-Side Rendering),使得页面加载速度更快,用户体验更流畅。此外,Next.js还支持预渲染(Pre-rendering)和动态导入(Dynamic Imports),进一步提升了应用的性能。 数据获取简化:Next.js内置了数据获取功能,使得开发者能够更方便地从API或其他数据源获取数据,并将其注入到组件中。这种无缝的数据获取流程大大简化了开发过程,提高了开发效率。 强大的路由功能:Next.js提供了基于文件系统的路由功能,使得页面之间的导航变得简单直观。开发者只需创建相应的页面文件,Next.js就能自动为其生成路由。这种方式不仅易于理解,还能减少错误和提高可维护性。 更好的SEO支持:由于Next.js支持服务器端渲染和预渲染,因此它能够更好地处理页面渲染和加载问题,从而提高网站的搜索引擎优化(SEO)效果。 二、Create-React-App的局限性 虽然Create-React-App为React开发者提供了一个快速搭建项目的脚手架,但随着项目规模的扩大和复杂度的增加,其局限性也逐渐显现: 配置不灵活:Create-React-App为开发者提供了一套固定的配置,虽然这降低了入门门槛,但对于有特定需求的开发者来说,这种固定配置可能会成为束缚。 性能优化有限:Create-React-App主要关注于项目的快速搭建和开发体验,对于性能优化方面的支持相对有限。对于需要高性能的应用来说,开发者可能需要花费更多的时间和精力进行手动优化。 扩展性不足:随着项目的发展,开发者可能需要集成更多的功能和工具。然而,Create-React-App的扩展性相对有限,可能无法满足一些高级需求。 三、React官网推荐的背后 React官网之所以推荐Next.js而非Create-React-App,背后有多重原因。 首先,Next.js作为React的“升级版”,在性能、数据获取、路由等方面提供了更强大的支持,能够更好地满足现代Web应用的需求。 其次,随着前端技术的不断发展,开发者对于高性能、易扩展的应用框架的需求也在不断增加。Next.js正好符合这一趋势,能够为开发者提供更高效、更灵活的开发体验。 最后,React官网的推荐也反映了社区对于Next.js的广泛认可和支持。越来越多的企业和项目采用Next.js构建应用,证明了其在实际应用中的价值和优势。 四、结语 React官网推荐使用Next.js而非Create-React-App,是基于对现代Web应用需求的深入理解和对前端技术发展趋势的敏锐洞察。对于广大React开发者来说,了解和掌握Next.js将是一个值得投入时间和精力的选择。它将帮助你更高效地构建高性能、易扩展的React应用,提升你的开发能力和竞争力。

September 9, 2024

React团队回应用Vite替换Create React App的建议

Create React App 的演变 在 2016 年发布 Create React App 时,工具的环境是分散的。如果想要将 React 添加到现有应用,需要添加一个 script 标签或从 npm 中导入,然后调整现有的构建工具配置。但是,如果要从头开始创建一个仅使用 React 构建的新应用,则没有明确的方法可以做到这一点。 在 Create React App 之前,必须安装一堆工具并将它们连接在一起,提供正确的预设以使用 JSX,为开发和生产环境进行不同的配置,为资源缓存提供正确的设置,配置 linter 等,想要正确完成这一系列工作非常困难。人们通过创建和共享可以克隆的“样板”存储库来解决了这个问题。然而,这产生了另外一个问题:一旦在项目中调整了克隆的样板文件,就很难再拉取样板的更新。这样,项目的设置会变得旧,要么放弃更新,要么花费大量精力让所有工具再次协同工作。在快速发展的生态系统中,这非常困难。 Create React App 通过将多个工具组合在一个包中解决了这个问题。现在,如果想用 React 开始一个新项目,有一个明确的推荐方法(Create React App)可以做到这一点! 然后,每隔一段时间,可以更新这个包,以获得所有底层工具的更新。这种模型变得很流行,以至于今天有很多工具都以这种方式工作。Vite 确实是拥有相似愿景的最佳工具之一,并且在在某些方面更进一步。 Create React App 的目标是为大多数 React 用户提供启动新 React Web 应用的最佳方式,它支持一组协同工作的精选功能。随着时间的推移,它提供的开箱即用的“baseline”会随着我们找到正确的权衡而扩大。 例如,为运行时错误添加了一个遮罩层,添加了对不同样式选项的支持,默认添加了快速刷新,它允许保存组件的代码并查看更改而不会丢失状态。对于默认的 React 开发体验来说,这是一个巨大的里程碑。总的来说,由于 Create React App 完全控制了编译管道,因此添加编译相关的功能是很容易的。 有这样一个精心策划的设置对生态系统仍然很有价值。当 React Hooks 出现时,React 团队将 React Hooks lint 规则添加到默认设置中。除此之外,Create React App 还允许 React 团队向尽可能广泛的受众部署重要的工具更改(快速刷新支持、React Hooks lint 规则)。 如果没有 React 团队策划的流行模板,将很难如此广泛地推出这些工具更改。 ...

July 25, 2024

Create React App和webpack

创建方法 npx: npx 来自 npm 5.2+ 或更高版本 npx create-react-app my-app npm: npm init 在 npm 6+ 中可用 npm init react-app my-app Yarn: yarn create 在 Yarn 0.25+ 中可用 yarn create react-app my-app Scripts 在新创建的项目中,你可以运行一些内置命令: npm start 或 yarn start 在开发模式下运行应用程序, 默认在浏览器打开http://localhost:3000。如果更改代码,页面将自动重新加载。 npm test 或 yarn test 以交互模式运行测试程序。 默认情况下,运行与上次提交后更改的文件相关的测试。 npm run build 或 yarn build 将生产环境的应用程序构建到 build 目录。 它能将 React 正确地打包为生产模式中并优化构建以获得最佳性能。构建将被压缩,文件名中将包含哈希。 npm run eject 注意:这是单向操作。一旦 eject ,就回不去了! 执行完这个命令后会将封装在 CRA 中的配置全部反编译到当前项目,这样开发者完全取得 webpack 文件的控制权,可以自定义修改webpack打包配置。 ...

July 9, 2024

MiniProfiler工具介绍

在日常开发中,应用程序的性能是我们需要关注的一个重点问题。当然我们有很多工具来分析程序性能:如:Zipkin等;但这些过于复杂,需要单独搭建。 MiniProfiler就是一款简单,但功能强大的应用新能分析工具;可以帮助我们定位:SQL性能问题、响应慢等问题。 MiniProfiler是一款针对.NET, Ruby, Go and Node.js的性能分析的轻量级程序。可以对一个页面本身,及该页面通过直接引用、Ajax、Iframe形式访问的其它页面进行监控,监控内容包括数据库内容,并可以显示数据库访问的SQL(支持EF、EF CodeFirst等 )。并且以很友好的方式展现在页面上。 MiniProfiler官网:http://miniprofiler.com/ MiniProfiler的一个特别有用的功能是它与数据库框架的集成。除了.NET原生的 DbConnection类,MiniProfiler还内置了对实体框架(Entity Framework)以及LINQ to SQL、RavenDb和MongoDB的支持。任何执行的Step都会包括当时查询的次数和所花费的时间。为了检测常见的错误,如N+1反模式,profiler将检测仅有参数值存在差异的多个查询。

June 26, 2024