添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

一般开发的时候经常会引入一些第三方模块,这些模块可能会依赖同样的底层包,如果他们依赖的版本不一样,那么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一样,就不列举了。

  • 私信