npm install 命令

首先总结下npm 安装一个模块包的常用命令。

/* 模块依赖会写入 dependencies 节点 */

npm install moduleName

npm install -save moduleName

npm install -S moduleName

/* 模块依赖会写入 devDependencies 节点 */

npm install -save-dev moduleName

npm install -D moduleName

/* 全局安装模块包 */

npm install -g moduleName

/* 安装特定版本的包 */

npm install 包名@版本号

/* 通过地址安装git仓库 */

npm install git+https://github.com/itwmike/axios.git

npm install git+ssh://[email protected]:itwmike/axios.git

/* 安装特定分支或Tag的git仓库 */

npm install git+https://github.com/itwmike/axios.git#tag

/* 通过用户名安装git仓库 */

npm install github:帐号/仓库名 # npm install github:itwmike/axios

npm install github:帐号/仓库名

  

npm 依赖包版本号

npm 所有node包都使用语义化版本号,规则要求如下:  

  • 每个版本号都形如1.2.3,由三个部分组成,依次叫做“主版本号(major)”、“次版本号(minor)”和“修订号(patch)” 。

  • 当新版本无法兼容基于前一版本的代码时,则提高主版本号 。

  • 当新版本新增了功能与特性,但仍兼容前一版本的代码时,则提高次版本号 。

  • 当新版本仅仅修正漏洞或者增强效率,仍然兼容前一版本代码,则提高修订号。

默认使用 npm install -save 下载的都是最新版本,同时会在package.json 文件中登记一个最优版本号,如下形式:

"dependencies": {
  "axios": "^0.19.0"
},

  

最优版本号前面会多出一个“标记”,这个标记有啥意义?它的写法又有哪些?

前端Leader你应该知道的NPM包管理机制-LMLPHP

npm install 都做了哪些事?

拿到一个node项目时首要做法是运行 npm install 命令,这个命令将 package.json 文件中的依赖包自动解析并安装,这也是项目能够本地运行的前置条件。那如此简单的一条命令,npm 背后又做了哪些不为人知的事呢?

Number One

自 npm 5.0后,项目中如果没有 package-lock.json 文件的时候,npm 会自动帮我们生成。该文件的主要作用是记录依赖包之间的具体版本号,对包版本有一个锁定的意义,项目开发中应该将此文件上传到git等版本控制工具(博主为此经历了血淋淋的惨痛教育)。

Number Two

检测本地包是否已经下载。如果本地 node_modules 下已经存在和 package-lock.json 中版本一致的包,则不会重新下载。

Number Three

下载依赖节点中对应的模板包。下载规则是:如果 package-lock.json 文件存在,则按照该文件中记录的版本号下载对应的模块包;如果文件不存在或文件中没有该包的记录,此时会按照版本号的标记(上面已讲)规范下载并同时更新到 package-lock.json。

了解了 package-lock.json 的作用后,笔者有个疑问:手动修改 package.json 中的包版本号后运行 npm install 命令会下载新包么?

前端Leader你应该知道的NPM包管理机制-LMLPHP

带着这个疑问,笔者做了实验,得出如下结论:

  • 如果新旧版本号差距较大,比如从 ^2.5.2 变为 2.6.0 ,那么会下载最新包并且更新 package-lock.json 。

  • 如果新旧版本号差距较小,比如从 ^2.5.2 变为 2.5.4,那么不会更新。

总之是否更新要看特定情况,取决于 package.json中版本号的标记和 package-lock.json 是否一致。

cnpm install 探索

cnpm 是淘宝 npm 镜像,在国内很受欢迎,虽然笔者并不喜欢使用。那 cnpm 和 npm 对包的管理是否一样呢?

  • cnpm install 并不会生成 package-lock.json

  • cnpm install 并不受 package-lock.json 的约束,它会按照版本号标记规则下载依赖包

由此可见,我们在项目中使用 cnpm 的时候一定要慎重,因为很可能团队成员每个人使用的依赖包版本都不相同,造成打包后的结果也不同。

如果团队要使用 cnpm,请使用固定版本号的方式安装依赖包如:cnpm install -E moduleName

11-17 17:29