# npm5.0新增package-lock.json文件挖的坑

# 一、从package.json说起

  1. 什么是package.json?简单地说:就是管理npm包的文件,包含了项目所依赖的npm包、项目的配置信息。
  2. 创建方式:npm init,按照系统提示填写相关信息即可(回车设置为空)。
  3. 具体配置说明,详见package.json字段全解

# 二、npm5.0的变化

升级了Node.js v8.0后,自带的npm也升级到了5.0,那么 npm5有什么变化呢?

  • 使用 ==npm install xxx== 命令安装模块时,不再需要 ==--save== 选项,会自动将模块依赖信息保存到 package.json 文件;
  • 安装模块操作(改变 node_modules 文件夹内容)会生成或更新 package-lock.json 文件
  • 发布的模块不会包含 package-lock.json 文件
  • 如果手动修改了 package.json 文件中已有模块的版本,直接执行 ==npm install== 不会安装新指定的版本,只能通过 ==npm install name@version== 更新

# 三、package-lock.json的含义&npm5的坑

我们先来看一段官方解释

package-lock.json is automatically generated for any operations where npm modifies either the node_modules tree, or package.json. It describes the exact tree that was generated, such that subsequent installs are able to generate identical trees, regardless of intermediate dependency updates.

大致意思: package-lock.json是当 node_modules 或 package.json 发生变化时自动生成的文件。它记录了整个 node_modules 文件夹的树状结构,甚至连模块的下载地址都记录了,重新安装时只需下载文件即可。因此重装模块速度非常快。

然而,npm5.0在提升速度的同时也挖了一个大大的坑:

以后修改 package.json 文件相应模块的版本号,再执行 ==npm install== 不会更新了,只能手动 ==npm install name@version== 指定版本号来安装。 然后它会自动更新 package-lock.json 文件。

直接执行 ==npm install== 时,如果不存在 package-lock.json 文件,它会根据安装模块后的 node_modules 目录结构来创建; 如果已经存在 package-lock.json 文件,则它只会根据 package-lock.json 文件指定的结构来下载模块,并不会理会 package.json 文件。

目前GitHub上已有相关issue了:https://github.com/npm/npm/issues/16866

【参考文档】

  • https://docs.npmjs.com/files/package.json
  • http://blog.csdn.net/zmrdlb/article/details/53190696
  • http://blog.csdn.net/aaa333qwe/article/details/78021704
  • https://docs.npmjs.com/files/package-lock.json