【发布时间】:2016-08-22 23:26:01
【问题描述】:
我想知道如何在 Meteor 1.3+ 中创建/使用多个使用相同 npm 依赖项的包。
我已经迁移到 Meteor 1.3+ 并且正在尝试使用 angular 和 angular-meteor 软件包的 npm 版本,但我很难完全理解 npm 在软件包中的使用方式并且似乎无法使其正常工作根据需要。
我有一个现有的 Meteor 应用程序,我将功能拆分为 Meteor 包以提高模块化和可重用性 - 而不是直接在 Meteor 根目录中。
我尝试了几种不同的结构方式,但都无济于事。
我最喜欢的结构
这是我的首选方式,因为这样我就不必担心我的 Meteor 包依赖于哪些 npm 包。
如果我的应用程序结构如下:
Meteor App
Meteor Package A
NPM Package angular@1.5.5
NPM Package angular-meteor@1.3.10
Meteor Package B
NPM Package angular@1.5.5
NPM Package angular-meteor@1.3.10
我通过在每个包的package.js 文件中使用Npm.depends() 来实现这一点;在该包中创建一个.npm 文件夹:
Npm.depends({
'angular': '1.5.5',
'angular-meteor': '1.3.10'
});
在 js 文件中,我在使用 angular 和/或 angular-meteor 的任何文件的顶部都有以下内容。
// Included only when angular is needed
import angular from 'angular';
// Included only when angular-meteor is needed
import angularMeteor from 'angular-meteor';
这种方法的问题是,对于每个具有重复 npm 依赖项的包,我会在浏览器控制台中收到以下错误:WARNING: Tried to load angular more than once.;因为我会想象 Meteor 正在尝试为每个使用它的包包含 angular。
据我所知,这与 Meteor 软件包不同,Meteor 知道只包含一次;这就是我在迁移到 Meteor 1.3+ 之前使用它的方式
另类
我似乎可以让它工作的唯一方法是如果我直接在流星应用程序中包含 npm 依赖项。
保持一切与上述相同,但从 package.js 文件中删除 Npm.require()。然后我执行meteor npm install --save angular angular-meteor,以便将angular 和angular-meteor 包直接添加到流星应用程序中,并且在整个项目中只包含一次。
然后结构变成:
Meteor App
NPM Package angular@1.5.5
NPM Package angular-meteor@1.3.10
Meteor Package A
Meteor Package B
虽然这个方法现在可行,但这种方法的问题是双重的:
- 如果我需要将使用
Npm.depends()的第 3 方包(我无法控制)用于我已经包含在我的项目中的 npm 包,我将收到与上述相同的重复错误。 - 然后,我还需要在应用程序级别管理包的 npm 依赖项,这并不理想,因为我需要记住仅当其余包不再需要依赖项时才删除依赖项。
【问题讨论】:
标签: meteor