一般开发的时候经常会引入一些第三方模块,这些模块可能会依赖同样的底层包,如果他们依赖的版本不一样,那么npm install后势必node_modules里会存在多个版本的依赖包,不然程序就无法正常运行了。那么这个时候node_modules目录结构是怎么样的呢?接下来举几个例子测试下。
首先准备基础测试repo, 准备三个library以满足我们上面说的case。 目录结构很简单,lerna-parent1依赖lerna-child@1版本,lerna-parent2依赖lerna-child@2版本,这里我选了lerna,publish起来很方便。
node版本: v16.14.0
npm install @foliageya/lerna-parent2
npm install @foliageya/lerna-parent1
完事package.json长这样,npm会自动帮我们重新组织包的排序。
"dependencies": {
"@foliageya/lerna-parent1": "^1.1.2",
"@foliageya/lerna-parent2": "^1.1.2"
node_modules目录结构长这样, 结果符合预期,毕竟先安装parent2,所以child@2提到顶级目录, child@v1在parent1的node_modules目录下。
删掉node_modules,手动更改package.json的安装顺序,把parent2放第一个然后执行npm install
"dependencies": {
"@foliageya/lerna-parent2": "^1.1.2",
"@foliageya/lerna-parent1": "^1.1.2"
测试结果跟上面那个保持一致,package.json中的内容没变,node_modules也跟之前一样
删除掉node_modules, 删除掉package lock, package.json顺序和2一样,parent2在前,然后执行npm install
测试结果发现packge.json保持不变,node_modules里child v1被提到顶级目录了。由此可见,package-lock.json会保留library的安装顺序,但是删除掉它后重新install child@v1就被提到顶级目录。
version: 1.22.5
跟npm的测试一样,首先依次执行
yarn add @foliageya/lerna-parent2
yarn add @foliageya/lerna-parent1
测试结果跟npm的步骤1一样。
删掉node_modules,手动更改package.json的安装顺序,把parent2放第一个然后执行yarn install
测试结果就跟npm那个不同了,package.json没变,但是node_modules顶级目录是child@1而不是child@2了.
删除掉node_modules, 删除掉yarn lock, package.json顺序和2一样,parent2在前, 然后执行yarn install
测试结果跟npm的第三个测试结果一样
version: 7.9.1
pnpm add @foliageya/lerna-parent2
pnpm add @foliageya/lerna-parent1
完事package.json长这样。
"dependencies": {
"@foliageya/lerna-parent1": "^1.1.2",
"@foliageya/lerna-parent2": "^1.1.2"
node_modules目录结构如下,可以看到pnpm和npm,yarn均不同,只会把自己直接依赖的package放到顶级目录,然后子依赖放到.pnpm,都是平级的关系。
2,3步骤其实结果都跟1一样,就不列举了。