获得意外的令牌导出

IT技术 javascript ecmascript-6 webpack babeljs
2021-02-04 18:22:59

我试图在我的项目中运行一些 ES6 代码,但出现意外的令牌导出错误。

export class MyClass {
  constructor() {
    console.log("es6");
  }
}
6个回答

您正在使用 ES6 module语法。

这意味着您的环境(例如 node.js)必须支持 ES6 module语法。

NodeJS 使用 CommonJS module语法(module.exports)而不是 ES6 module语法(export关键字)。

解决方案:

  • 使用babelnpm 包将 ES6 转换为commonjs目标

或者

  • 使用 CommonJS 语法重构。

CommonJS 语法的示例是(来自flaviocopes.com/commonjs/):

  • exports.uppercase = str => str.toUpperCase()
  • exports.a = 1
不是一个真正有用的评论,但对于前端世界之外的人来说,这一切都非常令人困惑。只是想构建一个用于 Web 的module,我正在 CLI 中对其进行测试。我会假设 Node.js 作为成熟的环境将支持 ES6 语法开箱即用。
2021-03-13 18:22:59
对于某些人仍然不清楚 CommonJs 语法。请查看此链接,可能会有所帮助。flaviocopes.com/commonjs
2021-03-20 18:22:59
@chovy 实验支持可通过标志“--experimental-modules”获得。文件需要有 .mjs 扩展名
2021-03-30 18:22:59
nodejsimport什么时候会原生支持我以为 v10.0.0 会有,但显然没有。
2021-04-09 18:22:59
我在使用 Chrome 66 时遇到此错误,并且对module提供本机支持。
2021-04-11 18:22:59

如果您收到此错误,也可能与您将 JavaScript 文件包含到 html 页面的方式有关。加载module时,您必须明确声明这些文件。下面是一个例子:

//module.js:
function foo(){
   return "foo";
}

var bar = "bar";

export { foo, bar };

当您包含这样的脚本时:

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

你会得到错误:

未捕获的语法错误:意外的令牌导出

您需要包含类型属性设置为“module”的文件:

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

那么它应该会按预期工作,并且您已准备好将您的module导入另一个module:

import { foo, bar } from  "./module.js";

console.log( foo() );
console.log( bar );
你必须把它放在什么文件中<script type="module" src="module.js"></script>
2021-03-25 18:22:59
这修复了错误,但随后我在 Chrome 67 的导入语句行上得到了“意外令牌 {”,其中的脚本是内联的,例如 <script>import ...</script>
2021-03-26 18:22:59
@PandaWood<script type="module">import ...</script>从module导入时必须使用, 。我在最新版本的 Chromium 中对其进行了测试。
2021-03-29 18:22:59
与“投票最多”的答案不同,这实际上解决了问题并解释了为什么会发生这种情况,而没有暗示唯一的选择是利用 CommonJS 方法、APM 方法或转译我们的代码......这也将是一个例外到 w3c 标准,其中type预期是有效的 mime 类型(又名媒体类型),所以这是一个意外的发现。谢谢!
2021-04-03 18:22:59
@inquisitive 在您导入脚本的 html 文件中...
2021-04-10 18:22:59

我的两分钱

出口

ES6

我的类.js

export class MyClass1 {
}
export class MyClass2 {
}

其他.js

import { MyClass1, MyClass2 } from './myClass';

CommonJS 替代品

我的类.js

class MyClass1 {
}
class MyClass2 {
}
module.exports = { MyClass1, MyClass2 }
// or
// exports = { MyClass1, MyClass2 };

其他.js

const { MyClass1, MyClass2 } = require('./myClass');

导出默认值

ES6

我的类.js

export default class MyClass {
}

其他.js

import MyClass from './myClass';

CommonJS 替代品

我的类.js

module.exports = class MyClass1 {
}

其他.js

const MyClass = require('./myClass');

希望这可以帮助

谢谢!这真的帮助我理解 ES6 和 CommonJS 导入/导出模式之间的区别。
2021-04-01 18:22:59

我通过制作一个入口点文件来解决这个问题。

// index.js
require = require('esm')(module)
module.exports = require('./app.js')

以及我在内部app.js外部导入的任何文件imports/exports 现在您只需像这样运行它node index.js

注意:如果app.js使用export default,则require('./app.js').default在使用入口点文件时变为

谢谢。一个最简单有用的答案!
2021-03-15 18:22:59
这个答案真的救了我。关于这个问题有太多复杂或错误的答案,我简直不敢相信。
2021-03-20 18:22:59
不需要 babel、webpack、parcel 等的简单项目的最佳答案......我在 monorepo 项目中使用了简单的 /server express 项目。像魅力一样工作......
2021-03-24 18:22:59
这应该是公认的答案。谢谢!
2021-03-28 18:22:59
很好的答案。这样,我的项目中很多不同的module文件就可以紧密联系起来。而且方法就是这么简单!
2021-04-01 18:22:59

现在不需要使用 Babel(JS 变得非常强大),只需使用默认的 JavaScript module导出即可。查看完整教程

消息.js

module.exports = 'Hello world';

应用程序.js

var msg = require('./Messages.js');

console.log(msg); // Hello World
那么你将如何导出一个类呢?
2021-03-14 18:22:59
@SherwinAblañaDapito module.exports = class MyClass {} 有效
2021-03-19 18:22:59