在Javascript中,有没有办法从该模块导入(或要求)未由模块导出的对象?
我意识到这可能是不好的做法,但我不知道它是否可能。我有Python背景,所以我对我可以导入模块但无法访问Javascript中的所有数据元素的想法感到困惑。
答案 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”对象作为唯一的导出方式。