8

我有一个项目,其中几个前端共享一个公共库。

这些项目的模块依赖项由 npm 管理。

因此,在我拥有的每个项目的 package.json 中:

  "dependencies": {
    "mylib": "file:../<...path...>/mylib",
    ...other deps...
  },

我使用“mylib”有两个目的:

  • 分享一些课程;
  • 共享共同的依赖关系(主要是角度)

到目前为止,我使用的是 npm 3.3.12,并且在运行之后npm install,mylib 的角度依赖项位于我的顶级项目的 node_modules 目录下。

所以,我有例如

node_modules
    @angular
        core
        common
        ....
    mylib

现在,使用 npm 5.4.2,我有:

node_modules
    mylib
        node_modules
            @angular
                core
                common

这在我的构建过程中导致了很多问题。它需要额外配置打字稿,通过添加如下指令:

"baseUrl": "",
"paths": {
    "@angular/common": ["node_modules/mylib/node_modules/@angular/common/"],
    "@angular/core": ["node_modules/mylib/node_modules/@angular/core/"],
    "@angular/compiler": ["node_modules/mylib/node_modules/@angular/compiler/"],
    "@angular/compiler-cli": ["node_modules/mylib/node_modules/@angular/compiler-cli/"],
    "@angular/forms": ["node_modules/mylib/node_modules/@angular/forms/"],
    "@angular/http": ["node_modules/mylib/node_modules/@angular/http/"],
    "@angular/platform-browser": ["node_modules/mylib/node_modules/@angular/platform-browser/"],
    "@angular/platform-browser/animations": ["node_modules/mylib/node_modules/@angular/platform-browser/animations/"],
    "@angular/platform-browser-dynamic": ["node_modules/mylib/node_modules/@angular/platform-browser-dynamic/"],
    "@angular/router": ["node_modules/mylib/node_modules/@angular/router/"],
    "primeng/primeng": ["node_modules/mylib/node_modules/primeng/primeng"],
    "rxjs/Rx": ["node_modules/mylib/node_modules/rxjs/Rx"]
    }

在 tsconfig.json

当您必须对 AOT、汇总等进行类似配置时,这变得非常烦人......

我尝试使用 npm dedupe 来简化这一点。由于项目有很多依赖项,因此仅其中一个项目就需要超过 1000 万个:

npm dedupe
...
...
removed 824 packages and moved 1020 packages in 623.196s

有没有一种标准的、有效的方法可以像以前一样扁平化依赖关系?npm dedupe 可以完成这项工作,但需要花费大量时间,因此它不是一个可接受的替代方案。

4

1 回答 1

6

作为替代方案,npm您可能想要切换到使用yarn. 默认情况下,这应该对模块进行重复数据删除。首先删除现有node_modules文件夹,然后执行yarn install.

您也可以强制yarn执行平面安装 ( yarn install --flat),但在这种情况下,只需执行普通安装就足够了。

yarn.lock文件添加到版本控制,然后任何其他签出都将被锁定到相同的模块版本(除非他们这样做yarn upgrade)。

于 2017-10-03T13:23:53.613 回答