【问题标题】:SystemJS: Named AMD modules sometimes have empty defaultsSystemJS:命名的 AMD 模块有时有空的默认值
【发布时间】:2018-08-21 03:34:49
【问题描述】:

这是基于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

【问题讨论】:

    标签: amd systemjs


    【解决方案1】:

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

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

    More details on the AMD-page on github.

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

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

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

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

    【讨论】:

    • 谢谢大卫。我试图了解您的解释如何适用于我的示例。你是说id“a”和“b”不是顶级/绝对的吗?它们不以“。”开头。或“..”,所以它们对我来说似乎是顶级的。 “模块的对象”和加载顺序有什么关系?而当你说“B”是第一次加载b.js时分配的Symbol,这个Symbol是什么,它的意义是什么?
    • 您只能加载一个带有 id 的定义,所有其他 id 将被忽略。为了确保正确的加载了 id,您应该只使用一个 id 分配(关于加载顺序的任何不可预测的变化)。在您的示例中, a 和 b 都是顶级的,但只允许一个。该示例不是真正的用例,因此它只是关于 AMD 定义的一个很好的演示/测试用例。使用您在a 中定义的函数,您可以为模块动态分配一个 id,这对我来说似乎是这种构造的意义,其他不需要给出。
    • 好吧,我对 AMD 的理解肯定是错误的。我以为 React 之类的供应商库会将 define('react', ... 作为其他模块的机制调用为 require('react'),但这似乎不是他们所做的,而且它似乎根本不是 ID 的目的。我仍然不确定我是否理解为什么我可以加载带有 ID 的单个定义,但这肯定开始变得更有意义了。谢谢。
    • 只要每个模块只加载一个 id,你的 react 用例就没有错,也不会与我的描述冲突。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 2011-02-04
    • 2020-04-13
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    相关资源
    最近更新 更多