使用SystemJS / JSPM加载多版本化Web组件依赖项?

时间:2016-08-28 22:59:52

标签: ecmascript-6 polymer-1.0 web-component systemjs jspm

只是一个免责声明 - 这是一个假设的场景,因为我试图找出使用JSPMSystemJS之类的东西来处理Web组件直接和传递依赖的最佳方法。

场景1

假设我有2个网络组件 - component-acomponent-b。一个使用momentjs@1.2.4构建,另一个使用momentjs@1.6.4构建。

每个组件作者将Polymer列为对等关系,将momentjs列为其package.json文件中的直接依赖关系,如下所示:

  "dependencies": {
    "moment.js": ">= 1.0.1 <= 1.8.0"
  }   
  "peerDependencies": {
    "Polymer.js": "0.5.0^",
  }   

因此,在这种情况下,当开发人员声明对这两个组件的package.json依赖关系时,包管理器可以找出要安装的最佳版本moment.js并使其可用。让我们假设版本为1.8.0

很棒 - 只需要moment.js的一个版本来处理这两个组件。现在组件如何加载/注入依赖项? JSPMSystemJS目前是否有能力支持此功能?

例如,在本文Taming Polymer with SystemJS and Typescript中,作者执行委托给SystemJS的导入,如下所示:

 import 'elements/app-frontend';

所以我认为momentjs会遵循类似的方法并像这样导入(在component-acomponent-b的打字稿文件中:

 import 'js/momentjs';

在上面的例子中,momentjs依赖项不知道将获取什么版本,因为导入声明不知道版本(因为它是在设计时写的)。

稍后当使用组件并且在应用程序中使用组件时,JSPM会找出最适合安装的momentjs依赖项。

在这种情况下,我们假设它安装在这样的布局中:

`jspm_packages/momentjs/momentjs@1.8.0`

那么JSPM如何意识到导入语句import 'js/momentjs'转换为导入jspm_packages/momentjs/momentjs@1.8.0

在这种情况下,这是相当微不足道的,但在下面的情景2中它变得更加棘手......我认为。

场景2

与方案一相同,但momentjs上的版本要求是互斥的。例如,component-a需要版本1.2.4component-b需要版本2.4.4

因此两个组件都执行如下导入:

 import 'js/momentjs';

jspm_packages安装了这两个版本:

`jspm_packages/momentjs/momentjs@1.4.4`
`jspm_packages/momentjs/momentjs@2.4.4`

那么现在SystemJS如何知道component-a需要版本1.4.4component-b需要版本2.4.4

总结一下: 1)JSPM是否可以使用相同依赖项的多个版本?

根据这篇文章Introduction to the Jspm package manager and the SystemJs module loader以及来自guybeford的答案,但是每个组件如何获得正确的版本?

2)SystemJS / JSPM是否有办法为每个组件配置版本元数据?

3)SystemJS是否有办法理解并将正确版本的依赖项注入Web组件?

TIA, 奥莱

1 个答案:

答案 0 :(得分:1)

  

如果组件需要其他几个模块,比如CSS等,会发生什么?

我不确定你的意思。您可以使用SystemJS导入多个模块和其他内容(可能通过插件)。

  

1)JSPM是否可以使用相同依赖项的多个版本?

我想你部分回答了这个问题。 JSPM将始终为每个组件选择和安装一个版本,这最符合其他组件的要求。如果存在冲突,JSPM将要求手动选择。

  

那么JSPM如何意识到导入语句导入&#39; js / momentjs&#39;转换为导入jspm_packages/momentjs/momentjs@1.8.0?

config.js文件为已安装的软件包分配导入名称(不确定命名法)。实际上可以使用jspm install x=npm:package语法更改这些名称。这将导致像

这样的配置
"x": "npm:package@1.2.3"

您可以import ximport npm:package@1.2.3

  

2)SystemJS / JSPM是否有办法为每个组件配置版本元数据?

我认为config.js的结构已经满足你所需要的一切。它包含与其版本的依赖关系。

"component-a": {
  "momentjs": "momentjs@1.2.4"
},
"component-b": {
  "momentjs": "momentjs@1.6.4"
}
  

3)SystemJS是否有办法理解并将正确版本的依赖项注入Web组件?

我希望SystemJS在请求component-acomponent-b时使用此信息导入正确的版本。

我不确定如何以这种方式安装JSPM,保留多个版本的软件包。我认为这应该是一个单独的,专门的问题。