npm
在使用 npm
安装包的时候,给人的第一感觉就是慢,而且还会在命令行打印出一堆的东西,而且经常会出现 “在我的电脑上可以......” 这个问题,着实是有点难受。
但也不得不说 npm
是 node
如此成功的主要原因之一。
npm的缺点如下:
1、由于版本号的影响,所以会造成版本不统一的情况
npm是围绕着语义版本控制的思想而设计的
给定一个版本号:主版本号.次版本号.补丁版本号
主版本号: 当API发生改变,并与之前的版本不兼容的时候
次版本号: 当增加了功能,但是向后兼容的时候
补丁版本号: 当做了向后兼容的缺陷修复的时候
package.json某依赖的版本号如下:
"5.0.3", // 安装指定的5.0.3版本
"~5.0.3", // 安装5.0.X中最新的版本
"^5.0.3" // 安装5.X.X中最新的版本
因此不同的开发人员使用相同的package.json文件,在他们自己的机器上可能会安装同一个库的不同版本,这样就会存在潜在的难以调试的错误和“在我的电脑上…”的情形。
2、由于npm库存在嵌套依赖的关系,会增加无法匹配相应版本的概率
每一个包,会有嵌套其他的依赖包,如果两个包中存在同一个依赖包,但两者需要的依赖包的版本号不同,就会出现包的版本匹配问题。
3、npm 的输出信息比较冗长
安装的时候,包会在同一时间下载和安装,中途某个时候,一个包出了错误,但是 npm
会继续下载和安装包。因为 npm
会把所有的日志输出到终端,有关错误包的错误信息就会在一大堆 npm
打印的警告中丢失掉,所以你很难找到真正出错的包和原因。
4、下载速度慢
npm 2会安装每一个包所依赖的所有依赖项,有一个项目,A依赖B,B依赖C,依赖树如下:
node_modules
- package-A
-- node_modules
--- package-B
----- node_modules
------ package-C
-------- some-really-really-really-long-file-name-in-package-c.js
这个结构可能会很长。这对于基于Unix的操作系统来说只不过是一个小烦恼,但对于Windows来说却是个破坏性的东西,因为有很多程序无法处理超过260个字符的文件路径名。
npm 3采用了扁平依赖关系树来解决这个问题,所以我们的3个项目结构现在看起来如下所示:
node_modules
- package-A
- package-B
- package-C
-- some-file-name-in-package-c.js
这样,一个原来很长的文件路径名就从./node_modules/package-A/node_modules/package-B/node-modules/some-file-name-in-package-c.js
变成了/node_modules/some-file-name-in-package-c.js
。
这种方法的缺点是,npm必须首先遍历所有的项目依赖关系,然后再决定如何生成扁平的node_modules目录结构。npm必须为所有使用到的模块构建一个完整的依赖关系树,这是一个耗时的操作,是npm安装速度慢的一个很重要的原因。
同时,由于npm是从国外服务器下载,由于网络原因,速度会很慢。
cnpm
相对于 npm
而言, cnpm
的下载速度要快很多。cnpm
更快,是因为淘宝将国外服务器的内容,先请求到了自己国内的服务器上,这样我们使用cnpm的时候下载的依赖就是从国内服务器上下载过来的,速度相对快很多。
官网上说:“这是一个完整 npmjs.org镜像,你可以用此代替官方版本,同步频率目前为 10分钟 一次以保证尽量与官方服务同步。”
yarn
yarn的优点:
1、yarn离线模式
如果你以前安装过某个包,再次安装时可以在没有任何互联网连接的情况下进行。
2、安装版本统一
yarn 有锁定文件(lock file) 记录了确切被安装模块的版本号,每次新增文件时,yarn会创建(或更新)yarn.lock这个文件,保证每次安装依赖时都是一样的模块版本。
3、扁平模式
将依赖包的不同版本归结为单个版本,以避免创建多个副本。
npm和yarn的命令对比
npm | yarn |
---|---|
npm install | yarn或者yarn install |
npm install react --save | yarn add react |
npm uninstall react --save | yarn remove react |
npm install react --save-dev | yarn add react --dev |
npm update --save | yarn update |
参考资料:
npm和yarn的区别和对比
npm,cnpm和yarn的区别
yarn中文文档
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。