我有一對夫婦的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'選項只適用於使用SystemJS Builder創建的bundle,這意味着我需要使用System模塊格式。我正在使用AMD格式。我想我現在明白'deps'的作用了。它按順序加載模塊,所以兩者都需要存在,但是它們首先用'deps'執行。 – martin
你可以在AMD模塊中使用'bundle'。我已經完成了。沒有涉及SystemJS構建器。該文檔具有誤導性。關於構建器和使用'System.register'的說法僅用於說明目的(這是*一種*做法)。它不是*規定性*。 – Louis
這很有趣,我只是測試過它,它也適用於AMD模塊。 – martin