[英]Is there a design pattern/system for lazy loading bundled AMD modules without loading modules I've already downloaded?
[英]Loading bundled AMD modules with SystemJS
我有幾個使用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中的所有文檔,但是我仍然迷路了。
您需要做的是使用bundles
設置,並按以下方式設置bundle:
bundles: {
'my-bundle.js': ['partA', 'partB', 'partC'],
},
粗略地講,這告訴SystemJS“當您尋找模塊partA
,獲取並執行名為my-bundle.js
的模塊,您將在其中找到partA
。”
您使用meta
方法行不通。 您的meta
設置不會說“不要嘗試獲取名為partA的模塊, 而是要獲取my-bundle.js
”,而是說“當您處理partA
, 除了已經擁有的依賴項之外,還要將my-bundle.js
添加到依賴項列表。” SystemJS仍將獲取partA
。 它沒有理由等待它執行my-bundle.js
才嘗試獲取它,因此它會立即啟動獲取並失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.