amd - 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交叉发布
解决方案
这里的问题是第一个参数,“id”,它必须是顶级的:
第一个参数 id 是一个字符串文字。它指定正在定义的模块的 id。此参数是可选的,如果不存在,则模块 ID 应默认为加载程序为给定响应脚本请求的模块的 ID。如果存在,模块 id 必须是“顶级”或绝对 id(不允许使用相对 id)。
在B
仅返回模块对象的情况下。这里的模块是进行定义的函数。
还有一个有趣的点,即使它可能不会太令人惊讶:
如果第 2 个 URL 是先加载的(b.js),即使脚本中的排序是 a.js,b.js,那么B
也是分配的 Symbol。这意味着第一个传输的定义文件获胜。您可以通过从 cdn 加载一个文件,从本地加载另一个文件来测试它。
此外,如果您将 C 和 D 分配为与 A 和 B 相同的类型,那么对象也会显示出来。所以行为与 B 相同。
就像您在最后两个示例中展示的那样,当省略 id 作为可选参数时,问题永远不会发生。
推荐阅读
- reinforcement-learning - 如何在pybullet中模拟另一个对象平衡?
- sql-server - 在 SSIS 中将 VARCHAR(MAX) 字段从 SQL 导出到 Excel
- java - 在接口声明上使用@PreAuthorize
- mysql - 检索所有帖子计数与日期排序日期错误
- ios - 尝试将图像叠加到 CALayer 上并保留子视图 (UITextView) 的位置
- django - 视图集响应的 Django Rest Framework 序列化
- reactjs - 如何从反应制作的电子应用程序制作MSI文件
- pyinstaller - pyinstaller:找不到命令
- c++ - glDeleteTextures 给出错误 E0167(类型参数与类型参数不兼容)
- vb.net - SharePoint 链接应在文件资源管理器中打开,但在 Web 浏览器中打开