剖析 npm 的包管理机制
剖析 npm 的包管理机制
一、包管理的演变
多层嵌套
npm 的早期版本以递归方式处理依赖包,严格按照 package.json 结构以及子依赖包的 package.json 结构将依赖安装到他们各自的 node_modules 中。直到有子依赖包不在依赖其他模块。
这样会有一个问题,执行 npm install
后,项目的 node_modules 目录将随着项目依赖增多变得越来越庞大,难免会有相同依赖进行重复安装。如图:
扁平结构
npm3.x 版本会把项目中的多层嵌套的依赖包打平存放到 node_modules 一级目录下,以减少相同依赖包的重复下载和存储冗余。例如:
我们新建一个 react 项目 npmDemo
,依赖包的嵌套关系结构如图:
执行 npm innstall
命令,我们打开 node_modules 目录,看到依赖包都被打平到 node_modules
目录下了:
看到这里,细心的人可能会问了:
如果说依赖包都打平到 node_modules
目录下,那么当项目中出现不同版本的依赖包时,npm 会怎么处理呢?
当依赖包版本不同,npm 会按照 package-lock.json 文件的路径层次结构处理依赖包。
比如,项目中同时依赖 js-tokens@4.0.0
和 js-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 同步更新
转载自:https://juejin.cn/post/7241498912916914236