加载捆绑AMD模块,SystemJS
我有一对夫妇的AMD模块使用打字稿的--outFile
选择到一个单一的文件编译:加载捆绑AMD模块,SystemJS
define("partA", ["require", "exports"], function (require, exports) {
"use strict";
function partAFunc() {
console.log('partAFunc');
return 'partAFunc';
}
exports.partAFunc = partAFunc;
});
define("partB", ["require", "exports"], function (require, exports) {
"use strict";
exports.partB = 42;
});
define("partC", ["require", "exports"], function (require, exports) {
...
});
现在我想只载入partA
模块,并调用其partAfunc()
所以我可以做在Node.js的以下内容:
SystemJS.config({
map: {
'main': 'my-bundle.js',
},
});
SystemJS.import('main').then((m) => {
SystemJS.import('partA').then((m) => {
m.partAFunc();
});
});
首次进口SystemJS.import('main')
刚刚注册的所有模块,然后SystemJS.import('partA')
作品,因为模块partA
已经注册(或至少我客串这就是它的作用)。
可是,为什么我不能只用SystemJS.import('partA')
和配置捆绑作为一个依赖:
SystemJS.config({
meta: {
'partA': {
deps: [ 'my-bundle.js' ],
}
}
});
SystemJS.import('partA').then((m) => {
m.partAFunc();
});
的meta
完全被忽略。 https://github.com/systemjs/systemjs/blob/master/docs/config-api.md#meta的文档说:
在此模块之前加载的相关性。通过常规路径并映射规范化。仅支持cjs,amd和全局格式。
它看起来像SystemJS首先检查文件partA
是否存在(这显然并非如此),并抛出一个错误(我与现有的文件进行了测试和meta
配置工作):
(node:60981) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: ENOENT: no such file or directory, open '/Users/.../partA'
Instantiating /Users/.../partA
Loading partA
我期望当第一个变体与两个嵌套的SystemJS.import
调用一起工作时,以下应该也能工作。
SystemJS.config({
map: {
'partA': 'my-bundle.js',
},
});
SystemJS.import('partA').then((m) => {
// m.partAFunc();
console.log(m)
});
这会打印一个空的对象。它看起来像是当一个文件中有多个模块时,它只注册它们并且不加载它们中的任何一个?
我看过https://github.com/systemjs/systemjs/tree/master/docs的所有文件,但我想我还是输了。
你需要做的就是使用bundles
设置和设置您的捆绑像这样的内容:
bundles: {
'my-bundle.js': ['partA', 'partB', 'partC'],
},
粗略地说,这告诉SystemJS“当你寻找模块partA
,读取和执行模块命名my-bundle.js
和你那里会找到partA
。“
使用meta
无法工作,你的做法。您meta
设置不会说“不尝试获取名为A部分一个模块,而是取my-bundle.js
”它说:“当你处理partA
,除了已经拥有的依赖,增加对my-bundle.js
依赖性列表“。 SystemJS仍将获取partA
。在它试图获取它之前没有理由等到它执行my-bundle.js
,因此它立即启动提取并失败。
我以为'bundles'选项只适用于使用SystemJS Builder创建的bundle,这意味着我需要使用System模块格式。我正在使用AMD格式。我想我现在明白'deps'的作用了。它按顺序加载模块,所以两者都需要存在,但是它们首先用'deps'执行。 – martin
你可以在AMD模块中使用'bundle'。我已经完成了。没有涉及SystemJS构建器。该文档具有误导性。关于构建器和使用'System.register'的说法仅用于说明目的(这是*一种*做法)。它不是*规定性*。 – Louis
这很有趣,我只是测试过它,它也适用于AMD模块。 – martin