npm install安装依赖的流程及package.json和package.lock.json关系解析

前言

  • 本文使用的npm版本为 npm v6 —> 6.14.17
  • package-lock.json具体介绍可以参照官网:https://docs.npmjs.com/cli/v6/configuring-npm/package-lock-json?v=true

1、package-lock.json 文件解析

{"name": "xxx", // 项目名称,同package.json"version": "1.0.0", // 版本"lockfileVersion": 1, // v6生成的是1;v7/v8生成的是2; 如果其他开发者使用npm版本不一致时可能会出现安装依赖冲突"requires": true,  // 这是模块名称到版本的映射。即此模块所需的所有内容的列表,无论它将安装在何处。版本应通过正常匹配规则匹配我们的依赖项或高于我们的级别的依赖项。"dependencies": { // 依赖项"js-tokens": {"version": "4.0.0","resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz","integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="},"loose-envify": {"version": "1.4.0", // 实际安装的版本"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", // registry中该版本代码的压缩包地址"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==","requires": {"js-tokens": "^3.0.0 || ^4.0.0"}},"react": {"version": "18.2.0","resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz","integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==","requires": {"loose-envify": "^1.1.0" // react依赖了loose-envify,版本号为^1.1.0,即安装依赖时主版本号不变1.x.x,次版本和修订版本安装最新的版本,即1.4.0版本}}}
}

npm install 原理

先上流程图
在这里插入图片描述
执行npm install以后会去校验是否有package-lock.json文件

  • 有lock文件
    • 分析依赖关系,一个包有可能会依赖其他的多个包
    • 从registry仓库下载压缩包 https://registry.npmjs.org
    • 获取到压缩包以后会对压缩包在本地进行缓存(具体位置见下文)
    • 将压缩包解压到node_modules文件夹中
  • 没有lock文件
    • 检测lock文件中包版本是否和package.json文件中一致
      • 不一致会重新构建依赖关系,走顶层的流程
    • 一致时会优先查找缓存
      • 缓存中没有的时候会去registry仓库中下载,跳到顶层的流程中
    • 查找到会获取缓存中的压缩文件,将压缩包解压到node_modules中

获取本地npm缓存

  • 获取位置的终端命令 npm config get cache
  • 获取到位置后 command+shift+G前往对应文件夹

npm v7 后的新变化

npm v7官方文档
1、从 npm v7 开始,package-lock.json文件包含足够的信息来获得完整的 package tree的图,减少了读取package.json文件的需求,性能有了显著提升。
2、Hidden Lockfiles:为了避免重复处理node_modules文件夹,npm 从 v7 开始使用 node_modules/.package-lock.json 中存在的隐藏锁定文件。它包含有关树的信息,并且用于代替读取整个node_modules层次结构。
3、…


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部