Javascript ES6命名导入引入常量?
在为Python到JavaScript编译器在ES6模块之上实现Python模块机制时,我面临以下问题: 有大量从Python运行时模块导入的标准函数,例如PythonJavascript ES6命名导入引入常量?,javascript,python,ecmascript-6,module,transcrypt,Javascript,Python,Ecmascript 6,Module,Transcrypt,在为Python到JavaScript编译器在ES6模块之上实现Python模块机制时,我面临以下问题: 有大量从Python运行时模块导入的标准函数,例如Pythoninput函数(在JS中实现),可以使用命名导入来提供这些函数(因为它们不必在用户代码中加任何前缀,所以要与Python保持一致,input而不是\uuuuuuuuuuuuuuuu.input) 在Python中,允许重新绑定命名的导入。因此我定义了另一个函数input,该函数将在运行时覆盖该函数。但是如果在JS中这样做,我会得到
input
函数(在JS中实现),可以使用命名导入来提供这些函数(因为它们不必在用户代码中加任何前缀,所以要与Python保持一致,input
而不是\uuuuuuuuuuuuuuuu.input
)
在Python中,允许重新绑定命名的导入。因此我定义了另一个函数input
,该函数将在运行时覆盖该函数。但是如果在JS中这样做,我会得到一个错误:
标识符“input”已声明
似乎所有导入的名称都被视为JS常量,因此根据需要不可重新绑定。我可以想出几个聪明的解决方法,比如在别名下导入,然后分配给模块全局变量而不是常量,但为了保持简单,所以我的问题是:
- JS命名的导入是常量,所以不可重新绑定(如果是,只是好奇,有人知道为什么吗)?我在哪里可以找到这方面的详细信息
- 有没有一种简单的方法可以绕过这个问题,仍然将它们放在导入模块的全局名称空间中,但可以随意覆盖它们
,baz
可以编译为以下内容:
import { bar as _foo__bar, baz as _foo__baz } from 'foo';
let bar = _foo__bar;
let baz = _foo__baz;
这将只保留一些特殊名称,同时保持条
和baz
标识符可变
另一种可能也有助于解决可能的导入语义差异的方法是简单地创建一个闭包:
import { bar, baz } from 'foo';
(function (bar, baz) {
// …
})(bar, baz);
甚至在两者之间添加一些其他查找机制
顺便说一句,Python的
导入
与Node的require
非常相似,因此可能值得研究使Node的模块系统在浏览器中工作的所有解决方案。因为导入的绑定是不可变的绑定,所以它们不能更改。在解析模块时,标识符是保留的由于ES6模块的工作方式:与Python不同,导入不是在执行时包含的语句;相反,在早期编译期间基本上收集模块的所有导入,然后在模块开始执行之前解析
这使得ES6模块不适合作为Python导入系统的实现
一般来说,为了避免丢失这些名称,您可以简单地为导入的绑定指定不同的名称。例如,来自foo import bar的,baz
可以编译为以下内容:
import { bar as _foo__bar, baz as _foo__baz } from 'foo';
let bar = _foo__bar;
let baz = _foo__baz;
这将只保留一些特殊名称,同时保持条
和baz
标识符可变
另一种可能也有助于解决可能的导入语义差异的方法是简单地创建一个闭包:
import { bar, baz } from 'foo';
(function (bar, baz) {
// …
})(bar, baz);
甚至在两者之间添加一些其他查找机制
顺便说一句,Python的
import
与Node的require
非常相似,因此值得研究所有使Node的模块系统在浏览器中工作的解决方案。这是ES6,而不是JS6。您可以检查编译器输出以了解一些想法。ES模块导入不仅仅是常量,它们是模块的只读表示形式e导出(我建议也检查Babel输出的一些想法)。它们不能被修改,至少在正确的实现中是这样。我确信这在之前已经讨论过。避免这种情况的一种方法是不使用ES模块,而是使用CommonJS模块(require
,而不是import
)。这也将消除ES模块的好处。标题相应地进行了调整。它是ES6,而不是JS6。您可以检查编译器输出以了解一些想法。ES模块导入不仅仅是常量,它们是模块导出的只读表示形式(我建议也检查Babel输出以了解一些想法)。它们不能被修改,至少在正确的实现中是这样。我相信这之前已经讨论过了。避免这种情况的一种方法是不使用ES模块,而是使用CommonJS模块(require
,而不是import
)。这也将消除ES模块的好处。标题相应地进行了调整。感谢您的出色说明。有了这些信息,我将做进一步思考…感谢您的出色说明。有了这些信息,我将做进一步思考。。。