一,package.json
在 Node.js 中,模块是一个库或框架,也是一个 Node.js 项目。Node.js 项目遵循模块化的架构,当我们创建了一个 Node.js 项目,意味着创建了一个模块,这个模块的描述文件,被称为 package.json。
-
package.json 属性说明:
- name - 包名;
- version - 包的版本号;
- description - 包的描述;
- homepage - 包的官网URL;
- dependencies / devDependencies - 生产/开发环境依赖包列表。它们将会被安装在 node_module 目录下;
- peerDependencies 对等依赖 参见:https://nodejs.org/en/blog/npm/peer-dependencies/
-
如何更新/下载 package.json 里的依赖包
-
npm install -save moduleName 命令
1. 安装模块到项目node_modules目录下。
2. 会将模块依赖写入dependencies 节点。
3. 运行 npm install 初始化项目时,会将模块下载到项目目录下。
4. 运行npm install --production或者注明NODE_ENV变量值为production时,会自动下载模块到node_modules目录中。 -
npm install -save-dev moduleName 命令
1. 安装模块到项目node_modules目录下。
2. 会将模块依赖写入devDependencies 节点。
3. 运行 npm install 初始化项目时,会将模块下载到项目目录下。
4. 运行npm install --production或者注明NODE_ENV变量值为production时,不会自动下载模块到node_modules目录中。 拉取单个依赖最好后面加上你需要的版本号,如:npm install -save @angular/router@7.2.16
-
-
是否允许你的依赖自动更新
- '~'(波浪符号):他会更新到当前minor version(也就是中间的那位数字)中最新的版本。放到我们的例子中就是:"exif-js": "~2.3.0",这个库会去匹配更新到2.3.x的最新版本,如果出了一个新的版本为2.4.0,则不会自动升级。波浪符号是曾经npm安装时候的默认符号,现在已经变为了插入符号。
- '^'(插入符号): 这个符号就显得非常的灵活了,他将会把当前库的版本更新到当前major version(也就是第一位数字)中最新的版本。放到我们的例子中就是:"vue": "^2.2.2", 这个库会去匹配2.x.x中最新的版本,但是他不会自动更新到3.0.0。
- 不加 ^和~,表示不更新,是精确版本。
二,package-lock.json
- package-lock.json 是在
npm install
时候生成的一份文件,用以记录当前状态下实际安装的各个 npm package 的具体来源和版本号。package-lock.json 文件的作用锁定安装时的包的版本号,并且需要上传到 git,以保证其他人在npm install
时大家的依赖能保证一致。 - 为什么需要把package-lock.json提交到gitlab
- package.json 文件只能锁定大版本,也就是版本号的第一位,并不能锁定后面的小版本,
npm install
都是拉取的该大版本下的最新的版本,为了稳定性考虑我们几乎是不敢随意升级依赖包的,这将导致多出来很多工作量,测试/适配等,所以 package-lock.json 文件出来了,当你每次安装一个依赖的时候就锁定在你安装的这个版本。 - package-lock.json记录的是依赖树,记录了依赖模块之间的完整依赖关系。package.json记录的是依赖项,不能锁定依赖的依赖。
- package.json 文件只能锁定大版本,也就是版本号的第一位,并不能锁定后面的小版本,
三,执行npm i (npm install)的时候,是如何执行package.json和package-lock.json的?
- 当你的项目里只有package.json时,node会先从package.json文件中读取所有dependencies信息,然后根据dependencies中的信息与node_modules中的模块进行对比,没有的直接下载,已有的检查更新,并生成package-lock.json。
- 下载和更新按照package.json 文件按照锁定情况,更新到大版本的最新小版。
- 当你的项目里既有package.json和package-lock.json时,node会从package.json里面读取模块名称,并从package-lock.json文件里找到对应的版本号,进行下载或者更新。
- 这里的下载和更新是指按照package.json 文件指定版本下载,不会更新到大版本的最新小版。
- 正因为有了package-lock.json文件锁定版本号,所以当你执行npm install的时候,node不会自动更新package.json文件中的模块,必须用npm install packagename(自动更新小版本号)或者npm install packagename@x.x.x(指定版本号)或者手动更改package.json来进行安装才会更新,package-lock.json文件中的版本号也会随着更新。
- 当package.json与package-lock.json都不存在,执行"npm install"时,node会重新生成package-lock.json文件,然后把node_modules中的模块信息全部记入package-lock.json文件,但不会生成package.json文件,此时,你可以通过"npm init --yes"来生成package.json文件。
四,版本控制
- 当多人同时修改package-lock.json的时候,有可能出现冲突,为了避免这种冲突,在我们执行npm install命令时,先拉取一下远程分支。
- 当出现冲突时,我们需要怎么解决?
- 如果冲突较少,建议手动解决。
- 如果冲突较多,可以通过手动修复任何
package.json
冲突然后npm install [--package-lock-only]
重新运行来解决。参见:https://docs.npmjs.com/files/package-locks#resolving-lockfile-conflicts