首页 > 解决方案 > SystemJS:命名的 AMD 模块有时有空的默认值

问题描述

这是基于这个功能演示

我看到 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?

从 Github交叉发布

标签: amdsystemjs

解决方案


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

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

有关 github 上 AMD 页面的更多详细信息。

B仅返回模块对象的情况下。这里的模块是进行定义的函数。

还有一个有趣的点,即使它可能不会太令人惊讶:
如果第 2 个 URL 是先加载的(b.js),即使脚本中的排序是 a.js,b.js,那么B也是分配的 Symbol。这意味着第一个传输的定义文件获胜。您可以通过从 cdn 加载一个文件,从本地加载另一个文件来测试它。

此外,如果您将 C 和 D 分配为与 A 和 B 相同的类型,那么对象也会显示出来。所以行为与 B 相同。

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


推荐阅读