前端:做了差不多一年的前端了,经常使用到npm这样的包管理工具,也听说过yarn这东西。在我的见识,只知道npm和yarn是个同样的工具,具体有什么区别没有深入了解过。。。今天在网上看前端文章的时候,看到了关于这方面的内容。就结合自己的经验,做一次总结。
npm3以前的版本,被称为远古时代。那时候的安装策略并不是扁平化的。开发者安装一个模块,就会在node_modules找到对应的模块名称的文件夹,模块的所有依赖又会在其文件夹下。这样就会容易导致目录的层级特别高,而且对于windows的操作系统,最长的路径长度限制在248个字符之内。
总结一个一下缺点:
1.目录嵌套层级过深;
2.模块是相互独立的,相同的模块实例无法共享。
后来人们为了解决嵌套过深的问题,引入了软链接的方案。(把所有的包扁平化的安装在一个位置,然后通过软链接-windows 快捷方式的方式组合到 node_modules 中。)npminstall和pnpm就实现了这种方案。cnpm使用的就是npminstall
好处可以减少嵌套层级太深,而且可以达到模块共享,减少内存占有。但也有很明显的缺点:
1.一般情况都是通过第三方库来实现这功能,无法保证跟npm一样的行为;
2.无法和npm一起使用,要么使用npm或者是cnpm/pnpm,两者混用可能会造成奇怪的效果。
npm3的时代,它不是通过软链接的形式来实现扁平化,而是直接把所有的模块安装在node_modules下。在对于不同版本的模块依赖时,(如:package-a依赖 package-c@0.x.x ,而package-b依赖 package-c@1.x.x )则会按照原来的嵌套方式解决。
这种方式很好的解决了之前的缺点,但唯一不足的就是安装速度还是相对慢。
yarm的时代:随着node应用到企业级项目,npm暴露出很多问题。
1.npm 无法保证两次安装的版本是完全相同的,因为它是通过语义化的版本来安装,可以限制你安装模块的版本号,但是你无法限制你安装模块依赖的模块的版本号;
2.安装速度真的是很慢,一旦一个项目依赖上千个包,那就要等半个钟。
yarm诞生就是为了解决这些问题:
1)引入 yarn.lock 文件来管理依赖版本问题,保证每次安装都是一致的;
2)缓存加并行下载保证了安装速度
npm5的时代,在yarn的带动下,npm官方开始进行了改进。
1)引用了package-lock.json,默认添加。作用和yarn.lock一样;
2)安装自动添加 dependencies,不需手动书写-S参数;
3)提升了安装速度。