SystemJS:命名的AMD模块有时具有空默认值

时间:2018-08-21 03:34:49

标签: amd systemjs

这是基于this functional demo的。

我看到SystemJS 0.21.4将未命名的模块作为空对象导入。

// define('a', [], function () { return 'A'; });
SystemJS.import('a.js')
  .then(m => console.log(m.default, '<- a')) // "A"

// define('b', [], function () { return 'B'; });
SystemJS.import('b.js')
  .then(m => console.log(m.default, '<- b')) // {}

// define([], function () { return 'A'; });
SystemJS.import('a-anon.js')
  .then(m => console.log(m.default, '<- a-anon'))  // "A"

// define([], function () { return 'B'; });
SystemJS.import('b-anon.js')
  .then(m => console.log(m.default, '<- b-anon')) // "B"

由于某些原因,a.js正确导入为“ A”,但是b.js导入为空对象(而不是“ B”)。如果我对它们进行重新排序,以便首先导入b.js,则会看到相反的信息-b正确导入而a不正确导入。

这是怎么回事?这是错误吗?我使用SystemJS / AMD错误吗?

交叉发布的from Github

1 个答案:

答案 0 :(得分:1)

这里的问题是第一个参数“ id”,它必须是顶级的:

  

第一个参数id是字符串文字。它指定要定义的模块的ID。此参数是可选的,如果不存在,则模块ID应该默认为加载程序为给定响应脚本请求的模块的ID。如果存在,则模块ID必须是“顶级”或绝对ID(不允许使用相对ID)。

More details on the AMD-page on github.

对于B,仅返回模块的对象。此处的模块是定义定义的功能。

仍然有一个有趣的观点,即使可能并不奇怪:
如果即使脚本中的排序是a.js,b.js,也首先加载第二个URL(b.js),那么B也是分配的符号。这意味着第一个传输的定义文件将获胜。您可以通过从cdn加载一个文件,再从本地加载另一个文件来进行测试。

此外,如果您以与A和B相同的方式分配C和D,则也会显示对象。因此,行为与B相同。

就像您在最后两个示例中所展示的那样,当省略id作为可选参数时,该问题永远不会发生。