这是基于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
答案 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作为可选参数时,该问题永远不会发生。