likes
comments
collection
share

剖析 npm 的包管理机制

作者站长头像
站长
· 阅读数 14

剖析 npm 的包管理机制

一、包管理的演变

多层嵌套

npm 的早期版本以递归方式处理依赖包,严格按照 package.json 结构以及子依赖包的 package.json 结构将依赖安装到他们各自的 node_modules 中。直到有子依赖包不在依赖其他模块。

这样会有一个问题,执行 npm install 后,项目的 node_modules 目录将随着项目依赖增多变得越来越庞大,难免会有相同依赖进行重复安装。如图:

剖析 npm 的包管理机制

扁平结构

npm3.x 版本会把项目中的多层嵌套的依赖包打平存放到 node_modules 一级目录下,以减少相同依赖包的重复下载和存储冗余。例如: 我们新建一个 react 项目 npmDemo,依赖包的嵌套关系结构如图:

剖析 npm 的包管理机制

执行 npm innstall 命令,我们打开 node_modules 目录,看到依赖包都被打平到 node_modules 目录下了:

剖析 npm 的包管理机制

看到这里,细心的人可能会问了:

如果说依赖包都打平到 node_modules 目录下,那么当项目中出现不同版本的依赖包时,npm 会怎么处理呢?

当依赖包版本不同,npm 会按照 package-lock.json 文件的路径层次结构处理依赖包

比如,项目中同时依赖 js-tokens@4.0.0js-tokens@6.0.0 两个包,会按照 package-lock.json 文件里的目录结构处理依赖包。避免因包版本不同造成覆盖进而导致兼容问题。

举个例子🌰:假如项目中依赖了 @babel/code-framepac 包,那么 package-lock.json 文件将存储该依赖包的相关信息如下:

"@babel/code-frame": {
    "version": "7.0.0",
    "resolved": "http://registry.npm.taobao.org/@babel/code-frame/download/@babel/code-frame-7.0.0.tgz",
    "integrity": "sha1-uKGrGb21YNThVaq7XKUgoABPg=",
    "dev": true,
    "requires": {
      "@babel/highlight": "^7.0.0"
    }
},

其中,几个字段含义如下:

  • version 标记当前依赖包的版本号
  • resolved 字段存储npm包的下载地址
  • integrity 字段是npm安装的缓存地址

因此,项目中的 package-lock.json 文件一定要上传到远程仓库。可以使得 npm install 命令安装的依赖包目录结构保持一致,避免开发中的因依赖包版本、路径不同而出现问题。同时可以提高 npm install 的安装速度。

以上,感谢你的阅读和时间,如果这篇小结对你有用,不妨顺手点个赞哦👍,你的鼓励将是我分享的动力!哈哈哈

📢 update 同步更新

掘金专栏 | 知乎专栏 | Github | 简书专栏 | CSDN | segmentfault

转载自:https://juejin.cn/post/7241498912916914236
评论
请登录