导入Javascript中未由模块显式导出的内容

时间:2016-03-28 14:30:16

标签: javascript

在Javascript中,有没有办法从该模块导入(或要求)未由模块导出的对象

我意识到这可能是不好的做法,但我不知道它是否可能。我有Python背景,所以我对我可以导入模块但无法访问Javascript中的所有数据元素的想法感到困惑。

1 个答案:

答案 0 :(得分:4)

不使用模块API。模块导出一个对象,导入模块的任何代码都会被赋予对该对象的引用(JS意义上的“引用”)。

部分15.2.3 of the spec涵盖导出,并且非常详细地显示export关键字用于在模块的导入/导出表中包含一些局部变量。很简单,如果您没有指定export,则该变量是模块范围的本地变量。

这与传统IIFE模块的行为相匹配,后者使用函数范围隐藏其局部变量,然后导出要公开的对象。

ES6模块,如:

export class Foo {
  ...
}

export const bar = new Foo();
被编译后的

看起来像是:

(function () {
  function Foo() {
    ...
  }
  var bar = new Foo();
  return {
    Foo: Foo,
    bar: bar
  };
})();

关于JS模块的大多数文章(甚至the fantastic 2ality module writeup)都未提及未导出变量会发生什么。

为了进行比较,the CommonJS module standard表明模块具有变量exports并且“模块可以在执行时添加其API。” CommonJS标准到目前为止我发现的唯一参考通过关键字/对象导出(来自模块上下文2.1):

  

模块必须使用“exports”对象作为唯一的导出方式。