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

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://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"`

`},`

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

image

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 命令会下载新包么?

image

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

  • 如果新旧版本号差距较大,比如从 ^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

其他常用指令

删除node_modules目录下的package

npm uninstall <package>

如需从package.json中删除依赖

npm uninstall --save <package>

升级当前目录下项目所有模

npm update

升级当前目录下指定模块

npm update 模块名

升级全局的xxx模块

npm update -g 模块名

原文地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值