使用SystemJS

时间:2017-02-28 23:48:04

标签: javascript node.js systemjs es6-module-loader es6-modules

我使用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();
});

完全忽略metahttps://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 个答案:

答案 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,因此它会立即启动提取并失败。