npm 5 坑坑坑!!

时间:2025-05-15 15:19:13

前几天升级了 v8.0 后,自带的 npm 也升级到了5.0,第一次使用的时候确实惊艳到了:原本重新安装一次模块要十几秒到事情,现在一秒多就搞定了。先不要激动,现在我来大概讲一下 npm 5 的一些大的变化:

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

重新安装模块之所以快,是因为 文件中已经记录了整个 node_modules 文件夹的树状结构,甚至连模块的下载地址都记录了,再重新安装的时候只需要直接下载文件即可(这样看起来 facebook 的 yarn 好像没有啥优势了)。以下是 文件的例子:

  1. {
  2. "name": "test_pkg_lock",
  3. "version": "1.0.0",
  4. "lockfileVersion": 1,
  5. "dependencies": {
  6. "commander": {
  7. "version": "2.9.0",
  8. "resolved": "/commander/-/commander-2.9.",
  9. "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q="
  10. },
  11. "cssfilter": {
  12. "version": "0.0.8",
  13. "resolved": "/cssfilter/-/cssfilter-0.0.",
  14. "integrity": "sha1-ZWTKzLqKdt2bS5IGaLn7f9pQ5Uw="
  15. },
  16. "graceful-readlink": {
  17. "version": "1.0.1",
  18. "resolved": "/graceful-readlink/-/graceful-readlink-1.0.",
  19. "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU="
  20. },
  21. "xss": {
  22. "version": "0.2.18",
  23. "resolved": "/xss/-/xss-0.2.",
  24. "integrity": "sha1-bfX7XKKL3FHnhiT/Y/GeE+vXO6s="
  25. }
  26. }}

带来速度的同时,npm 也挖了个大大的坑:

以后直接改 文件相应模块的版本号,再执行npm install不会更新了(好可怕),你只能手动用npm install xxx@yy指定版本号来安装,然后它会自动更新 文件。直接执行npm install时,如果不存在 文件,它会根据安装模块后的 node_modules 目录结构来创建;如果已经存在 文件,则它只会根据 文件指定的结构来下载模块,并不会理会 文件。

网上已经有很多人反应这个问题了:GitHub 上的 issue: file not updated after file is changed链接:/npm/npm/issues/16866

clean project with some deps in run npm imodules are installed and file is you update module A in run npm i. I would expect this updates the file but it doesn’t. which results in module A not being updated.

文章:Understanding lock files in NPM 5链接:/2017/06/02/

这里是 npm 文档关于 package-locks 的说明链接:/files/package-locks