八股神话-鲤鱼跃龙门-npm i、package、package-lock的那些事

183 阅读7分钟

很早很早以前,龙门还未凿开,伊水流到这里被龙门山挡住了,就在山南积聚了一个大湖。

居住在黄河里的鲤鱼听说龙门风光好,都想去观光。它们从河南孟津的黄河里出发,通过洛河,又顺伊河来到龙门水溅口的地方,但龙门山上无水路,上不去,它们只好聚在龙门的北山脚下。 而龙门山的山顶漂浮的云化作了npm i的字样。 “我有个主意,咱们跳过这龙门山怎样?”一条大红鲤鱼对大家说。 “那么高,怎么跳啊?”“跳不好会摔死的!”,伙伴们七嘴八舌拿不定主意。

大红鲤鱼便自告奋勇地说:“我先跳,试一试。”。只见它从半里外就使出全身力量,如离弦的箭,纵身一跃, 飞到1/5的高度时,大红鲤鱼的头顶突然出现一层光幕,“Duang”,在众鱼惊愕的眼神下,大红鲤鱼撞了上去,额头撞出了一道裂痕。

山顶的云化作了npm i --save的字样,一道金光从中飞出,涌进他额头的裂痕处。

“package.json中有一个属性为dependencies,里面写着使用该项目必要的依赖,比element-ui的项目,由于它的form表单的校验器使用了async-validator这个第三方依赖(这个依赖会写在dependencies中),开发者通过npm发布element-ui后,当我们npm i element-ui时,便会自动去pm i async-validator,因为这个是使用element-ui必要的依赖。”

“而 npm i 命令默认自带--save,后面跟的依赖会自动写入dependencies中,”

“扑通”,它掉进水里了。

沉浸在金光所蕴含的知识里,许久,大红鲤鱼才浮出水面,尽管额头上的裂痕吓退了众鱼。

没有注意到众鱼惊愕的眼神,它转身下浅,下一瞬,一道红光从水面射出,激起水花的同时,大红鲤鱼穿过了第一层光幕,身上的鳞片仿佛染上了光彩,变得亮丽起来。

当快到2/5的高度时,第二道光幕出现了,尽管有所预感,众鱼还是不忍的闭上了双眼,“Duang”,这一声响彻湖面,大红鲤鱼额头上的裂痕深了几分,鲜血从中流淌而出。

山顶的云化作了npm i --save-dev的字样,一道金光再次从中飞出,涌进他额头的裂痕处。

“package.json中有一个属性为devDependencies,里面写着element-ui的开发者在开发element-ui项目时,使用到的依赖,比如eslint、babel的插件、less-loader、css-loader、webpack的一些打包插件等,这样很明显都是提高开发效率的依赖,而不是element-ui项目自身引用的依赖,所以我们在npm i element-ui时,是不会去下载这个devDependencies里的依赖的。”

“通过 npm i --save-dev,后面跟的依赖会自动写入devDependencies中。”

“扑通”,它掉进水里了。

清澈的湖水染上了一丝的鲜红,格外的显眼。

而这次,大红鲤鱼一下就从水里浮出水面,尽管鲜血从额头流淌进眼睛,但它的眼神却显得越发明亮。

二话不说,躬身,弹射,鱼跃,水溅,浪起。

红色的鳞片在穿过两层光幕之后添加了几分金黄,当快到3/5的高度时,第三道光幕如期而显,大红鲤鱼没有害怕,更没有退缩,它在空中扭动着身躯,加快了速度,一往无前的撞了上去,“Duang”,头上的裂痕长的几分,更多的鲜血从额头中流出。

山顶的云化作了package.json中依赖的版本号前^ ~ *的符号的字样,一道耀眼金光从中飞出,涌进他额头的裂痕处。

“package.json中依赖的版本号前一般会有各种符号

  • element-ui: 2.4.1 -> 固定版本 通过npm i --save-exact element@2.4.0就能让package.json里的版本号锁定在2.4.0,且版本号前没有任何符号。
  • element-ui: ~2.4.1 -> 允许安装2.4.x,x为任意,一般是最新的,比如2.4.5
  • element-ui: ^2.4.1 -> 允许安装2.x.x,x为任意,一般也是最新的,比如2.5.1
  • element-ui: *2.4.1 -> 允许安装x.x.x,x为任意,一般也是最新的,比如3.4.0 ”

“扑通”,它掉进水里了。

鲜血随着水波扩散着,飘过众鱼的鳞片,波动着的红宛如众鱼内心的惊讶,久久无法平息。

它露出水面,染着血的眼睛,红色鲜艳却坚定,在阳光的照射下,给人一股妖异的感觉。

它纵身一跃,穿过三层光幕的鳞片上的金黄越显明亮,而它正全速向4/5高度的第四道光幕撞了过去,“Duang”,额头上的裂痕随着骨头裂开的声响形成了蜿蜒曲折的形状,这道裂痕横跨了大红鲤鱼的额头,血液中混入了一抹金色。

山顶的云化作了package-lock.json的字样,一道耀眼金光再次从中飞出,涌进他额头的裂痕处。

“当你package.json文件有依赖element-ui:^2.4.0,你本地安装的element-ui是2.4.1版本(后面简写成eui),然后你将package.json提交到github。

过几天,别人用你的package.json去npm i下载依赖,然而这几天eui发布了2.5.0,那么别人就会安装到2.5.0版本的eui。

这就会造成安装的版本不一致,为了让每一个人通过package.json去下载依赖的版本是一致的,npm推出了一个package-lock.json文件,这个能锁定依赖的版本。

当我们第一次npm i时,会根据package.json去生成指定依赖版本的package-lock.json文件,比如目前eui最新版就是2.4.1,package.json里有element-ui:^2.4.0,那么npm i之后的package-lock里的eui版本是2.4.1。你将package.json和package-lock.json提交到github,过几天eui官方发布了2.5.0,别人拿到你的package.json和package-lock.json执行npm i时,那么就会下载2.4.1版本的eui”

大红鲤鱼在空中停滞了一瞬,下一秒,不知不觉中变修长的尾巴在空中一甩,鱼身跨越第四道光幕,身上的鳞片显得金灿灿的,它的身型开始涨长,直冲山顶那笼罩整个山顶的第五道光幕,尽管它看起来不可摧毁,但大红鲤鱼势不可挡。“Duang”,额头上的裂痕蜿蜒曲折,众鱼包括它自己都没意识到这条裂痕俨然形成了一条龙的形状。

山顶的云化作了存在package-lock.json时,执行npm i的字样,一道耀眼金光再次从中飞出,涌进他额头的裂痕处。

  • 当package.json中有eui:^2.4.0,package-lock.json中eui为2.4.1时,因为2.4.1符合^2.4.0,所以执行npm i会根据package-lock.json去下载2.4.1。
  • 当package.json中有eui:^3.4.0,package-lock.json中eui为2.4.1时,因为2.4.1不符合^3.4.0,所以执行npm i会根据package.json去下载符合^3.4.0版本的eui,比如3.5.0,同时更新package-lock.json的eui版本为3.5.0。
  • 当package.json中有eui:^2.4.0,package-lock.json中eui为2.4.1时,npm i element-ui@2.4.2,这个不管package.json和package-lock.json,直接下载2.4.2,package.json更新为^2.4.2,package-lock.json更新为2.4.2。 ”

“扑通”,它掉进水里了。

许久,大红鲤鱼都没浮出水面,众鱼见状,围住了那个还没停息的水波中心。

“芜湖”,大红鲤鱼一跃而出,修长的身型,金黄的鳞片,龙型的裂痕仿佛镶嵌在它的额头上,增添了几分神性。

众鱼没了当初的惊讶,只剩下满目的钦佩。

下一刻,水面波动,一条水龙卷从水面托起大红鲤鱼,直冲山顶。

这道缤纷的光幕,隔绝了四方上下,当大红鲤鱼的额头在接触光幕时,世界仿佛停寂在此刻,额头上龙型裂痕的眼睛燃起了纯金色的火焰,瞬息间,整条裂痕都燃起了火焰。

鱼头越过光幕,慢慢化形为龙头,龙须飘然,威严之首;

鱼鳍越过光幕,化形为爪,四爪为蛟,五爪为龙,无所不摧;

鱼身越过光幕,化形龙身,鳞片金光夺目,身型修长;

鱼尾越过光幕,化形龙尾,灵活却蕴含无限能量;

一声龙吼,响彻整个天地。

它在空中飘动,向着远边的天空而去。

鲤鱼们见到此情此景,受到鼓舞,开始一个个挨着跳龙门山。可是除了个别的跳过去化为龙以外,大多数都过不去。

凡是跳不过去,从空中摔下来的,额头上就落一个黑疤。直到今天,这个黑疤还长在黄河鲤鱼的额头上呢。 

后来,唐朝大诗人李白,专门为这件事写了一道诗:“黄河三尺鲤,本在孟津居,点额不成龙,归来伴凡鱼。”