我使用TypeScript的--outFile
选项将一些AMD模块编译到一个文件中:
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中的所有文件,但我想我还是迷路了。
答案 0 :(得分:1)
您需要做的是使用bundles
设置并设置您的捆绑包:
partA
粗略地说,这会告诉SystemJS"当您查找模块my-bundle.js
时,获取并执行名为partA
的模块,您将在那里找到meta
。&# 34;
使用meta
的方法无效。您的my-bundle.js
设置没有说"请勿尝试获取名为partA的模块,而取代获取partA
"它说"当你处理my-bundle.js
,以及它已经拥有的依赖时,将partA
添加到依赖项列表中。" SystemJS仍将获取my-bundle.js
。它没有理由等到它在尝试获取它之前执行memcpy
,因此它会立即启动提取并失败。