【发布时间】:2016-07-23 19:53:45
【问题描述】:
我已经用 webpack 构建了 3 个独立的 npm 模块。 他们都依赖于角度,因为我有这条线:
var angular = require('angular');
在每个 npm 模块的角度模块定义中。
其中一个模块依赖于另外两个:
var angular = require('angular');
var ngModule = angular.module('topModule', [
require('dependency1'),
require('dependency2')
]);
我相信我收到 tried to load angular more than once 错误的原因是因为 Angular 已包含在 webpack 构建的所有 3 个包中。
我知道我可以将 webpack 配置为将 angular 放在单独的文件中(例如 vendor.js),但我认为当我构建顶级文件时,它会看到 Angular 已经包含在其他 2 个模块中并且不会再添加它。
如何在所有模块中使用 `require('angular')',但在顶级模块中只包含一次?
【问题讨论】:
-
Webpack 缓存模块,它应该只评估一次模块。此警告不会造成任何伤害,但这表明构建中存在问题。一些依赖可能有自己的
angular模块副本,这会导致类似的事情。如果 semver 限制兼容,npm dedupe可能会有所帮助。您可以使用github.com/webpack/webpack/issues/690 检查构建,在不了解您的构建的情况下,目前无法提出更具体的建议。 -
@estus - 感谢您的回复。是的,正如我在原始帖子中提到的,每个依赖项中肯定都包含了 angular。我只是认为 webpack 会让每个包都能够检测到任何重复的模块,并且最终输出中只有一个版本。
-
不,Webpack 是愚蠢的,它只是从 node_modules 中摄取所有提供给它的东西。幸运的是,它发生在 Angular 上,其他模块只会默默地膨胀这个包。
-
@estus - 再次感谢。哇,我没有意识到这一点。我最初确实将依赖模块设置为不创建生产构建,所以当我从父模块运行构建时,它会对所有模块使用 require ,因此只包含一次 angular。我发现的问题是,在运行我的测试时,它也会运行子模块的测试。也许我应该研究一种排除子模块中的测试的方法。