在Meteor 1.3+中使用包含相同npm包的多个包

时间:2016-04-28 09:30:09

标签: meteor

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

我已经迁移到Meteor 1.3+并尝试使用angular&的npm版本。 angular-meteor套餐,但我很难完全理解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

我通过在每个包的Npm.depends()文件中使用package.js来实现此目的;这会在该包中创建一个.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试图为每个使用它的包包含角度。

从我可以收集的内容来看,这与Meteor知道只包含一次的Meteor软件包不同;这是我在迁移到Meteor 1.3 +之前使用它的方式

替代

我能让它工作的唯一方法就是直接在流星应用程序中包含npm依赖项。

保持一切与上述相同,但从Npm.require()文件中删除package.js。然后我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()作为我已包含在项目中的npm软件包,我将得到与上述相同的重复错误。< / LI>
  • 然后我还需要在应用程序级别管理软件包的npm依赖项,这是不理想的,因为我需要记住在&amp;时删除依赖项。只有当其余任何包裹不再需要它们时。

1 个答案:

答案 0 :(得分:0)

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

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

至于我想在浏览器中使用Npm.require() npm包的问题...从我可以收集到的内容中,没有办法在Meteor包中进行此操作。在包装中运行npm安装是很常见的。使用package.jsapi.addFiles( ... , 'client' )文件中包含每个所需文件,但这有明显的缺点,例如不知道哪些Meteor软件包包含来自其npm依赖项的文件 - 所以你最终可能会遇到2个Meteor软件包包括bootstrap(例如),导致Meteor应用程序中包含重复的内容。

由于我认为Meteor将在未来的Meteor版本中弃用Meteor软件包 - 支持纯粹的npm软件包 - 我将离开这一思路并辞职,使用npm install我需要使用的所有npm包的根级别。由于上述假设无法完成,我可能会因使用Npm.require()与我通过npm install添加的npm包而与其他软件包发生冲突。