将 SystemJS 配置为始终 return 相同的库实例

Configure SystemJS to always return same instance of library

我有两个 jspm 模块,ModuleA 和 ModuleB。两者都依赖于 d3.js 库。我有第三个 jspm 模块 ModuleC,它依赖于 ModuleA 和 ModuleB。当我 运行 ModuleC 时,我得到 d3 错误,即使 ModuleA 和 ModuleB 都独立工作。

发生这种情况是因为 ModuleA 依赖于 d3 插件 (nvd3),它向 SystemJS 提供的 d3 实例添加了功能。但是,当 ModuleB 加载时,它会用自己的新版本 d3 替换此版本的 d3,从而有效地删除 ModuleA 所依赖的插件。

如何配置 SystemJS 为 ModuleA 和 ModuleB 提供相同的 d3 实例?

想通了。默认情况下,SystemJS 确实 提供相同的模块实例。但是,所请求的模块必须是同一来源的同一版本

在我的例子中,ModuleA 通过 jspm install d3 直接依赖于 d3,它从 GitHub 中提取了它的 d3 版本。 ModuleB 通过 angular-nvd3 的依赖间接依赖于 d3,最终解析为 d3 的 npm 版本。因为 SystemJS 无法知道这些是同一个库,所以它加载了两个版本。

一旦我更新 ModuleA 以使用 d3 的 npm 版本 (jspm install npm:d3@3.5.17),两个模块在 ModuleC 中运行良好并且 d3 仅加载一次。