每个工具或者开发语言都有相应的包管理器,好比 Ubuntu 的 apt-get、Centos 的 yum、Java 的 Maven 仓库等等。Node.js 中目前最出名的包管理器为 NPM 也是生态最好的。
对于我们业务开发也很受益,相同的东西不必重复去造轮子。
npm
NPM 是 Node.js 中的包管理器。允许我们为 Node.js 安装各种模块,这个包管理器为我们提供了安装、删除等其它命令来管理模块。这里有一点我们需要注意,我们必须要有一个 package.json 文件或 node_modules 目录安装模块到本地。
NPM 最好的一点是它会在本地存储我们所安装的依赖项,存在于 package.json 的 dependencies 对象里.
并且可以指名对应的版本。
由于npm源在国外,所以下载东西会存在延迟。
npm config set registry=https://registry.npm.taobao.org. // 设置taobao源
npm config set registry=http://registry.npmjs.org // 当然在npm publish时候需要切回
npm的使用
1. 新建一个文件 mkdir 文件名
2. 初始化 npm init
3. 安装对应的包 或初始化项目 npm install
Q1: npm i安装命令中的-G -D -S的区别?
1.npm i xx -g
是npm install xx --global的缩写,将模块进行全局安装。
全局安装就是把模块安装到操作系统上,例如:npm i webapack -g,就是全局安装webpack,这样在操作系统下的任何一个目录下都可以使用webapcak所提供的命令。
2.npm i xx -D
是npm install xx --save-dev的缩写,对模块进行局部安装,模块写到devDependencies对象中。
局部安装的意思就是只针对于当前的项目,模块一般安装在项目文件夹下的node_modules文件夹下。
devDependencies对象,是我们开发的时候需要用到的一些包,只用于开发阶段,真正打包上线的时候不需要这些包,因为这些包都是用来打包代码的,帮助我们生成最终文件的。
3.npm i xx -S
是npm install xx --save 的缩写,对模块进行局部安装,模块写到dependencied对象当中。
dependencied对象是需要发布到生产环境中的,比如你要跑一个react的项目,就需要react.js来支持,react.js就需要跟随项目到最终的生产环境当中。
Q2: package.json文件中的版本号的特点?
"5.0.3", // 5.0.3”表示安装指定的5.0.3版本
"~5.0.3", //~5.0.3”表示安装5.0.X中最新的版本
"^5.0.3" //^5.0.3”表示安装5.X.X中最新的版本
yarn
Yarn 是为了弥补 npm 的一些缺陷而出现的
// 1. 初始化项目
yarn / yarn init
// 2. 局部本地安装包
yarn add package-name
// 3. 全局本地安装包
yarn global add package-name
// 4. 在本地安装软件包作为开发依赖包
yarn add --dev package-name //等价于npm中的 --save-dev 或 -D
// 5. 删除软件包
yarn remove package-name
yarn 的特点
- 速度快
并行安装:无论 npm 还是 Yarn 在执行包的安装时,都会执行一系列任务。npm 是按照队列执行每个 package,也就是说必须要等到当前 package 安装完成之后,才能继续后面的安装。而 Yarn 是同步执行所有任务,提高了性能。
离线模式:如果之前已经安装过一个软件包,用Yarn再次安装时之间从缓存中获取,就不用像npm那样再从网络下载了
- 安装版本统一
为了防止拉取到不同的版本,Yarn 有一个锁定文件 (lock file) 记录了被确切安装上的模块的版本号。每次只要新增了一个模块,Yarn 就会创建(或更新)yarn.lock 这个文件。这么做就保证了,每一次拉取同一个项目依赖时,使用的都是一样的模块版本。npm 其实也有办法实现处处使用相同版本的 packages,但需要开发者执行 npm shrinkwrap 命令。这个命令将会生成一个锁定文件,在执行 npm install 的时候,该锁定文件会先被读取,和 Yarn 读取 yarn.lock 文件一个道理。
- 更简洁的输出
npm 的输出信息比较冗长。在执行 npm install 的时候,命令行里会不断地打印出所有被安装上的依赖。相比之下,Yarn 简洁太多:默认情况下,结合了 emoji直观且直接地打印出必要的信息,也提供了一些命令供开发者查询额外的安装信息
- 多注册来源处理
所有的依赖包,不管他被不同的库间接关联引用多少次,安装这个包时,只会从一个注册来源去装,要么是 npm 要么是 bower, 防止出现混乱不一致。
- 更好的语义化
yarn改变了一些npm命令的名称,比如 yarn add/remove,感觉上比 npm 原本的 install/uninstall 要更清晰。
指令对比
npm install === yarn
npm install taco --save === yarn add taco
npm uninstall taco --save === yarn remove taco
npm install taco --save-dev === yarn add taco --dev
npm update --save === yarn upgrade