2017-02-28 124 views
0

我有一对夫妇的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的所有文件,但我想我还是输了。

回答

1

你需要做的就是使用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,因此它立即启动提取并失败。

+0

我以为'bundles'选项只适用于使用SystemJS Builder创建的bundle,这意味着我需要使用System模块格式。我正在使用AMD格式。我想我现在明白'deps'的作用了。它按顺序加载模块,所以两者都需要存在,但是它们首先用'deps'执行。 – martin

+0

你可以在AMD模块中使用'bundle'。我已经完成了。没有涉及SystemJS构建器。该文档具有误导性。关于构建器和使用'System.register'的说法仅用于说明目的(这是*一种*做法)。它不是*规定性*。 – Louis

+0

这很有趣,我只是测试过它,它也适用于AMD模块。 – martin