前端Leader你应该知道的NPM包管理机制
暗夜余晖 人气:4npm 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://git@github.com: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" },
最优版本号前面会多出一个“标记”,这个标记有啥意义?它的写法又有哪些?
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 命令会下载新包么?
带着这个疑问,笔者做了实验,得出如下结论:
-
如果新旧版本号差距较大,比如从 ^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
加载全部内容