只是一个免责声明 - 这是一个假设的场景,因为我试图找出使用JSPM和SystemJS之类的东西来处理Web组件直接和传递依赖的最佳方法。
假设我有2个网络组件 - component-a
和component-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
的一个版本来处理这两个组件。现在组件如何加载/注入依赖项? JSPM和SystemJS目前是否有能力支持此功能?
例如,在本文Taming Polymer with SystemJS and Typescript中,作者执行委托给SystemJS的导入,如下所示:
import 'elements/app-frontend';
所以我认为momentjs会遵循类似的方法并像这样导入(在component-a
和component-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中它变得更加棘手......我认为。
与方案一相同,但momentjs
上的版本要求是互斥的。例如,component-a
需要版本1.2.4
而component-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.4
和component-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, 奥莱
答案 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 x
和import 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-a
或component-b
时使用此信息导入正确的版本。
我不确定如何以这种方式安装JSPM,保留多个版本的软件包。我认为这应该是一个单独的,专门的问题。