【问题标题】:Using multiple packages in Meteor 1.3+ that include the same npm package在 Meteor 1.3+ 中使用多个包含相同 npm 包的包
【发布时间】:2016-08-22 23:26:01
【问题描述】:

我想知道如何在 Meteor 1.3+ 中创建/使用多个使用相同 npm 依赖项的包。

我已经迁移到 Meteor 1.3+ 并且正在尝试使用 angularangular-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,以便将angularangular-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


    【解决方案1】:

    我尚未将此标记为已回答,因为我还没有找到解决我的问题的方法,但我在可能对其他人有所帮助的错误消息方面取得了一些进展。

    我的部分问题与我仍在为angular-ui-router 使用 Meteor 包而不是更新我的项目以使用 npm 版本这一事实有关。产生错误WARNING: Tried to load angular more than once.是因为angular-ui-router的Meteor版本依赖于Meteor包angular;它似乎以与 npm 包不同的方式包含在内,因此 Meteor 不会检测到它已经加载并再次加载它。

    至于我想在浏览器中将Npm.require() 用于 npm 包的问题......据我所知,在 Meteor 包中无法做到这一点。在包中运行 npm install 并使用api.addFiles( ... , 'client' )package.js 文件中包含每个需要的文件,但这有明显的缺点,例如不知道哪些 Meteor 包包含它们的 npm 依赖项中的哪些文件 - 所以你可以结束最多有 2 个 Meteor 包,每个包都试图包含引导程序(例如),导致 Meteor 应用程序中包含重复的包。

    由于我认为 Meteor 将在 Meteor 的某些未来版本中弃用 Meteor 包 - 转而支持纯 npm 包 - 我将放弃这种思路并让自己在根级别使用 npm install对于我需要使用的所有 npm 包。有了上述无法完成的假设,有理由认为,对于我通过 npm install 添加的 npm 包,我不会与使用 Npm.require() 的其他包发生冲突。

    【讨论】:

      猜你喜欢
      • 2016-07-27
      • 1970-01-01
      • 2015-01-22
      • 2016-10-31
      • 1970-01-01
      • 2020-12-16
      • 2016-07-31
      • 2019-10-21
      • 2013-03-13
      相关资源
      最近更新 更多