【问题标题】:Javascript - Where are 'import' and 'export' statements legal?Javascript - 'import' 和 'export' 语句在哪里合法?
【发布时间】:2018-12-21 21:49:14
【问题描述】:

我正在研究 Javascript 中的新 importexport 功能,但我想知道,这些语句在代码中的哪里在语法上是合法的?

我了解以下内容是不合法的:

(功能(){ 从'./thing.js'导入东西; })();

但这是否意味着import 仅在模块脚本的顶部是合法的?还是在全球范围内?例如,这个呢:

从'./a.js'导入一个; (功能(){ // ... 用 ... 做某事 })(); 从'./b.js'导入b; // ...

此外,此限制是否适用于export?例如,以下内容是否合法?

(功能(){ 函数内部函数(){ // ... } 导出 { 内部函数 }; })();

我似乎在当前的规范草案中找不到任何关于此的内容。

【问题讨论】:

    标签: javascript import module


    【解决方案1】:

    javascript 中没有这样的实现。这是计划好的。但是还没有浏览器实现它。它在 Webpack 和 Babel 等一些转译器中实现。 NodeJs 中也有 require 。但不是原生的javascript。 其他导入文件的方法是使用 RequireJS 库。

    参考:https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Statements/import

    编辑

    回答您在 cmets 中提出的问题:AFAIU 在已经可用的导入和导出实现中,是的,它们在全局空间中可用,是的,导入和导出已被提升。 但是,您的评论问题中不太清楚的是您所说的“仅在全球空间中可用”是什么意思。不存在无法访问全局空间的封闭空间。全球空间无处不在,进出口也是如此。

    【讨论】:

    • 好的。那么,Webpack 和 Babel 转译器在代码中的什么地方在语法上允许 importexport 语句? (我还更新了我的问题以澄清此功能尚未推出)
    • 你想要的任何地方......但它们都会被吊起(在执行前加载)。这个问题是相关的:stackoverflow.com/questions/29329662/…
    • 知道了!因此,从该问题的模块语法的外观(以及此处:tc39.github.io/ecma262/#sec-modules)来看,importexport 仅在全局范围内可用,在这种情况下,导入被提升。它是否正确?如果是这样,请更新您的答案,我会接受。谢谢指点!
    【解决方案2】:

    我对规范的解读是:

    • 模块导出语句应该在模块的顶层

    • 模块导入语句应该在模块的顶层

    • 函数样式的模块导入表达式(它为导入的项目返回一个承诺)在任何允许表达式的地方都可以使用

    正如你所说,目前它仅在转译器中受支持,所以我不确定现有转译器 (Babel) 是否遵循这些规则。

    【讨论】:

    • 有道理。正如@NelsonTeixeira 补充的那样,其他JS 语句之后的import 语句将在执行前被提升和加载。
    【解决方案3】:

    1) 如果你只想玩importexport 语句,那么在谷歌浏览器中使用它而不进行任何转译(使用 webpack);)

    我在进行一些研发时总是使用 ES6 模块。然后只有当我的临时工作值得时,我才会开始考虑转译。

    不要忘记以这种方式包含脚本:

    <script type="module" src="index.js"></script>
    

    2)如果你需要写一些nodejs脚本,那么打开一些实验标志来使用模块-https://nodejs.org/api/esm.html#esm_enabling

    【讨论】:

    • 对,谢谢,但这并不能回答问题。
    猜你喜欢
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 2020-11-13
    • 2019-08-09
    • 2017-03-26
    • 1970-01-01
    • 2014-11-10
    相关资源
    最近更新 更多