扬帆远洋

返京 启程之前,我们提前几天回到了北京,回到这座我们最熟悉的中国城市。 此时的南方已经有了初春的气息,路边的木棉开始抽出新芽,空气里也带着一点潮湿的暖意。北京却依然停留在冬天的尾声里,街道两旁的树木光秃秃地站着,灰白色的枝干伸向天空,远远望去似乎没有一丝生机,但是我知道,它们并没有死去。 大约二十年前,我第一次坐火车穿越华北平原。那是一个阳光灿烂的下午,车窗外的田野和村庄不断向后退去。那时候我从南方来,对北方的冬天毫无概念,看着那些光秃秃的树木,竟天真地以为它们已经死了,小熊告诉我它们其实都活得好好的呢。生命有时候并不表现为枝繁叶茂,而是隐藏在沉默之中,等待某一个时刻重新生长,许多事情其实都是如此。 北京于我,也是这样。这座城市有过我人生中最重要的十六年,那些奋斗、挣扎、收获与失落,都已经深深嵌入生命之中,即便离开了这里,也不会因此消失。 这几天,我们就待在亚运村附近,不远处就是国家体育场鸟巢。夜幕降临的时候,巨大的钢结构在灯光下泛着柔和的光泽,周围则分布着这些年陆续建成的国家级场馆。这里是新北京最具时代象征意义的区域之一,也是无数人记忆中的奥运地标。而对我来说,这里还有另一层意义。 很多年前,我和爱人常常来这里放风筝。那时候刚刚毕业不久,我们租住在附近,偶尔骑车来到这片开阔地,看风筝在天空里越飞越高,也谈论那些尚未实现的梦想。后来有了自己的家,搬去了更远的地方,来的次数越来越少。再后来,孩子出生,生活被工作、家庭和责任填满,那些悠闲的下午逐渐成为记忆。 现在这里的场馆更多了,道路更宽了,周边的建筑也比从前壮观许多。可是站在那里时,我最先想起的却不是这些变化,而是当年那两个在草地上奔跑的年轻情侣。那时候的我们不会想到,二十年后自己会以这样的方式再次经过这里。 我们又去了一趟王府井,去了一趟前门,也去了附近的奥林匹克森林公园,那里曾经是我们恋爱时最常去的地方之一。很多城市都有著名景点,但真正属于一个人的城市记忆,往往不是景点本身,而是与某些人共同经历过的时光。 启程 今日惊蛰,按照节气,万物应当开始苏醒,可北京依旧笼罩在阴霾之下。 今天也是两会的开幕式,新闻里到处都是相关报道,街道上增加了许多安保力量,整个城市似乎都在围绕着某种宏大的叙事运转。但是如同过去的十年,那种热闹属于他们,我们有自己的世界。 知道我计划的同事问过我:你有这么好的职位和待遇,为什么要离开?这个问题真的很难用一句话回答。如果只是抱怨,那么任何地方都能找到无数离开的理由;如果只是留恋,那么任何地方也都有值得留下的东西。北京如此,中国亦如此。 这里有很多让人难以理解的事情,有时甚至会让人感到无力。与此同时,这片土地又拥有独特而深厚的文化传统,那些古老的诗歌、历史、语言和记忆,早已融入我们的血液之中。很多年前读高行健的《灵山》,书中始终在追问一个问题:人在庞大的集体叙事之中,如何寻找真正属于自己的自由和自我。 后来我慢慢明白,对于许多人来说,即便身处各种约束之中,也依然能够活出自己的精神世界。 我其实一直是个乐观主义者,我相信未来肯定会变得越来越好,哪怕是螺旋式地发展,而且也相信无论身处何种环境,人都可以保留独立思考的能力、也能够创造属于自己的生活。 然而,生命终究是有限的。特别是当你提前看见了一些东西,看见了更多可能存在的人生路径之后,就很难再假装自己什么都没有看见。选择本身未必意味着否定什么,很多时候它只是承认另一种可能同样值得尝试。 这些年,我越来越认同余英时先生的一种精神态度:“我们在哪里,哪里就是中国。”对于我而言,故乡其实比国家更重要,那里是族人们生活了几百年的地方,甚至超越历史、政治和国家。“我们在哪里,哪里就是壮乡。”故乡未必只是地图上的一个坐标,它也是一种语言、一种记忆、一种生活方式。只要这些东西还存在于我们身上,它们就不会因为地理位置的变化而消失。 远航 吃完早餐,我们拖着四个超大的行李箱和两个小行李箱来到首都国际机场。曾经人潮汹涌的大厅现在门可罗雀,去年我们两次从这里东渡扶桑就是这样的情景,这是经济发展的一个信号,未来不容乐观。航班信息在电子屏幕上滚动更新,孩子们显得有些兴奋,他们把这当成一次普通的旅行,不停讨论着飞机和目的地。对于他们来说,这只是一次出发;他们或许还不知道,这实际上将成为他们人生中的一个重要转折点。 我和爱人则都很安静,经历了过去将近一年漫长的准备、整理、告别与等待之后,真正走到这里时,反而没有太多情绪。 飞机开始滑行,发动机的轰鸣声越来越大,当机轮离开地面的那一刻,我看着窗外逐渐缩小的城市轮廓,内心出奇地平静,甚至没有离开故乡时那种强烈的不舍。后来我想,也许原因很简单:故乡连接的是血缘、童年和生命最初的记忆;而国家、城市、制度和时代,则终究是为具体的人而存在。 我认同爱因斯坦的那句名言:国家是为人而设立的,而人不是为国家而生存。无论身处哪个时代,个人先于国家存在,国家是因个人而成立。毕竟人并不是为了某种宏大的概念而活着,而是为了自己有限而珍贵的一生。 飞机穿过云层,阳光从舷窗照射进来,北京被留在了身后。前方是什么,其实谁也不知道。但人生很多重要的时刻,本来就不是因为看清了终点才出发,而是在确认方向之后,愿意扬帆远航。而此刻,漫长的远航终于开始了。

March 5, 2025

部署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 15, 2025

今日离京

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

January 18, 2025

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

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

October 23, 2024

小提琴演奏主要基本功

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

September 28, 2024

[转]React官网力荐Next.js:为何它取代了Create-React-App?

随着前端技术的快速发展,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应用,提升你的开发能力和竞争力。 https://segmentfault.com/a/1190000044806695

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 配置

Create React App(以下简称 CRA)是一个官方支持的创建 React 单页应用的脚手架,它提供了一个零配置的现代构建设置,将一些复杂工具(比如 webpack, Babel)的配置封装了起来,让使用者不用关心这些工具的具体配置,从而降低了工具的使用难度。 创建方法 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