【问题标题】:ES2015 module import and export syntax errorES2015 模块导入导出语法错误
【发布时间】:2016-05-22 01:25:39
【问题描述】:

在 ES6 中使用导入导出时,出现以下错误:

SyntaxError: 出口声明只能出现在顶层

我上网查找如何解决此问题,但无法解决。任何人都可以对此进行解释。我是 ES6 新手,尤其是导入和导出。 (我完全使用 StealJS 来处理这种东西) 谢谢!

js 文件是:

app.js

import { cube, cubeRoot } from 'functions';

console.log(cube(4));
console.log(cubeRoot(125));

functions.js

// functions.js

function cube(a) {
    return a * a * a;
}

function cubeRoot(a) {
    return Math.cbrt(a);
}

export { cube, cubeRoot}

【问题讨论】:

  • functions 是文件还是模块?也许你需要import {... } from './functions'
  • 你确定你在某个地方没有一些不匹配的开括号吗?这是您的确切代码吗?你能告诉我们确切的设置以及你是如何编译它的吗?
  • 这是整个错误信息吗?有行号吗?
  • 我从hongkiat.com/blog/ecmascript-6 Point number 9-Modules 中关注了一个简单的例子。控制台中的错误消息 - SyntaxError: export declarations may only appear at top level export { cube, cubeRoot} functions.js (第 11 行,第 4 列)语法错误:导入声明只能出现在顶层 import { cube, cubeRoot } from 'functions'; app.js(第 3 行,第 4 列)

标签: javascript ecmascript-6


【解决方案1】:

2017 年夏季更新:

http://caniuse.com/#search=modules,新支持,可能需要更改设置。

现在事情不那么模糊了。要使模块工作,您必须告诉浏览器它是一个模块(另一个是脚本)。第一种方式是隐式的,一个导入的模块总是一个模块。第二种方式是使用 type module<script src="anymodule.js" type="module"></script>

确保导入和导出仅在顶层,不在块内,不在 if 语句内,不在循环内等。

还要确保提供完整路径(包括 .js),它应该以 ./../ 开头。假设文件位于同一文件夹中,则为import { cube, cubeRoot } from './functions.js';

模块字符串上的eval 将不起作用。

以下已过时的答案:

在我撰写此答案时 (04/2016),任何浏览器都不支持 ES2015 模块导入和导出语法。错误消息是未引导的,因为它暗示该语法受支持,但根本不受支持。请参阅此处的第一个注释https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import

原因是模块加载器的规范仍在进行中。见https://whatwg.github.io/loader/#status

然而,它们是填充或自动转换这种语法的工具,就像 babel 一样。

【讨论】:

  • 浏览器中缺少的模块功能不会导致 OP 报告的错误消息。
  • 我的意思是,如果浏览器不支持模块,它根本不会生成该消息。它将生成一条消息,例如Unexpected token import。因此,OP的问题出在其他地方。
  • 在一个完美的世界里不会是这样,但有时编写错误消息的人也会犯错误,这不是经过良好测试的错误消息的 gcc
  • 在 Windows 上使用 FF 53 进行了尝试,可以确认:您收到的错误消息确实是 SyntaxError: export declarations may only appear at top level of a module,而在 Chrome 中它是(更具描述性的)Unexpected token export。嗯,很奇怪。
  • @WalleCyril 哈,对不起,我什至没有注意到这是一个如此古老的问题和答案。我不认为你的旧答案已经过时了,在我昨天的评论中,我同意 Firefox 确实给出了这个错误,表明没有模块支持,不像 torazaburo 在他的评论中所说的那样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-30
  • 2017-02-09
  • 2015-07-19
  • 2018-12-06
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
相关资源
最近更新 更多