ES6 named import引入一个const?

2024-04-28 22:44:22 发布

您现在位置:Python中文网/ 问答频道 /正文

在为TranscryptPython to JavaScript编译器在ES6模块之上实现Python模块机制时,我面临以下问题:

有大量从Python运行时模块导入的标准函数,例如Python input函数(在JS中实现),可以使用命名导入(因为它们不必在用户代码中加任何前缀,所以input而不是{},与Python一致)。在

在Python中,允许重新绑定命名的导入。所以我定义了另一个函数input,它将覆盖运行时的函数。但是如果我在JS中这样做,我会得到一个错误:

Identifier 'input' has already been declared

似乎所有导入的名称都被视为JS const,因此根据this article不可重新绑定。我可以想出几个聪明的解决方法,比如在别名下导入,然后将其分配给模块global var而不是const,但是我喜欢保持简单,所以我的问题是:

  • JS命名的imports是const,所以不可重新绑定(如果是的话,只是好奇,有人知道为什么吗)?我在哪里可以找到这方面的细节?在
  • 有没有一种简单的方法可以绕过这个问题,并将它们放在导入模块的全局命名空间中,但可以随意重写它们?在

Tags: 模块to方法函数用户input标准编译器
1条回答
网友
1楼 · 发布于 2024-04-28 22:44:22

per the language specification一样,导入的绑定是不可变的绑定,因此无法更改。由于ES6模块的工作方式,在解析模块时标识符是保留的:与Python不同,导入不是在执行时包含的语句;相反,模块的所有导入基本上都是在早期编译期间收集的,然后在模块开始执行之前解析。在

这使得ES6模块不适合作为Python导入系统的实现。在

一般来说,为了避免丢失这些名称,只需为导入的绑定指定不同的名称。例如,from foo import bar, baz可以编译为以下内容:

import { bar as _foo__bar, baz as _foo__baz } from 'foo';
let bar = _foo__bar;
let baz = _foo__baz;

这将只保留一些特殊名称,同时保持barbaz标识符可变。在

另一种可能也有助于解决可能的导入语义差异的方法是创建一个闭包:

^{pr2}$

或者在两者之间添加其他查找机制。在


顺便说一句,Python的import与Node的require非常相似,因此,有必要研究一下使Node的模块系统在浏览器中工作的所有解决方案。在

相关问题 更多 >