作者:京东零售 陈震
目前比较常见的前端包管理器有 npm 和 Yarn,npm 是 Node.js 自带的包管理器,它可以安装、共享和分发 node.js 模块。最近pnpm也挺火的,通过并行下载和安装依赖项,在执行安装、更新、删除等操作时也更快。
package.json的配置方式。
一、分类管理
根据package.json规范,依赖包被大致分为以下几种:dependencies、devDependencies、optionalDependencies、peerDependencies和bundledDependencies总共5种。dependencies和devDependencies这两项是我们使用较为频繁的。
1、dependencies
2、devDependencies
工程只有开发环境需要,生产环境不需要的依赖,例如eslint、babel等,使用-D或--save-dev来写入devDependencies。
3、optionalDependencies
4、peerDependencies
工程需要和这个依赖配套使用,一般用于解决插件依赖的核心库的版本和主项目依赖的核心库的版本不一致的问题,常见于开发配套插件。例如vuex@4.1.0声明了:
"peerDependencies": {
"vue": "^3.2.0"
}
表明vuex@4.1.0需要和vue@^ 3.2.0一起安装和使用,否则可能会出现异常。使用-O或--save-optional来写入optionalDependencies。
5、bundledDependencies
看到这里你可能会有点疑问,为什么npm没有提供类似--save-peer的指令来写入peerDependencies呢?原因是peerDependencies暗示本工程将会被其他主模块使用,但是主模块本身并不需要在项目代码中显式使用。因此官方没有支持这一指令。
二、版本管理
- 当发生不兼容的 API 修改时,更新major位
- 当做了向下兼容的功能性新增时,更新minor位
- 当做了向下兼容的问题修正时,更新patch位
在 npm 的依赖的规则中,还有~、>、<、=、>=、<=、-、||、x、X、*
等符号来描述适用的版本范围;
-
~1.1.0,代表
>=1.1.0 <1.2.0
的版本范围。 -
1.1.x,也代表
>=1.1.0 <1.2.0
的版本范围。
^1.1.0,代表>=1.1.0 <2.0.0
的版本范围。
三、npm install加载机制
1、npm 向 registry 查询依赖压缩包的网址。
2、下载压缩包,存放在cache目录,供下次安装时使用。
3、解压压缩包到当前项目的node_modules目录。
4、把所有安装的包信息写入package-lock.json,供下次安装时使用。
5、继续处理依赖的依赖。
install的过程速度也和每一个步骤息息相关:
(1)共享工程package-lock.json,可以避免向registry查询的步骤,并且保证不同环境下安装包的一致性。
(2)使用下载速度快的registry镜像(例如jd镜像)。
(3)预先进行依赖关系分析构建依赖关系,然后最后再并行下载(例如yarn)。
希望以上的介绍能够帮助你更好的理解npm的依赖管理。