获得意外的令牌导出

Jas*_*son 161 javascript babel ecmascript-6 webpack

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

export class MyClass {
  constructor() {
    console.log("es6");
  }
}
Run Code Online (Sandbox Code Playgroud)

Phi*_*tts 200

您正在使用ES6模块语法.

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

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

解:

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

要么

  • 使用CommonJS语法重构.

  • nodejs何时支持`import`本地?我以为v10.0.0会有它,但显然不是. (9认同)
  • 这并不是一个真正有用的评论,但对于前端世界之外的人来说,这一切都非常令人困惑。只是想构建一个用于 Web 的模块,我正在 CLI 中测试它。我假设 Node.js 作为成熟的环境将支持开箱即用的 ES6 语法。 (7认同)
  • 对于仍然不清楚 CommonJs 语法的人。请查看此链接,可能会有所帮助。https://flaviocopes.com/commonjs/ (3认同)
  • @chovy实验支持带有标志“ --experimental-modules”。文件必须具有.mjs扩展名 (2认同)
  • 我在使用 Chrome 66 时遇到此错误,并且对模块提供本机支持。 (2认同)
  • @AndrewKoster 我刚刚将一个节点项目移植到 ESM 模块,这是一场噩梦。这是一个重大的范式转变,花费大量时间来使其全部工作是可以预料的,尤其是使用各种工具。绝对不是添加“type”:“module”那么简单 (2认同)

Wil*_*ilt 94

如果您收到此错误,也可能与您将javascript文件包含在html页面中的方式有​​关.加载模块时,您必须明确声明这些文件.这是一个例子:

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

var bar = "bar";

export { foo, bar };
Run Code Online (Sandbox Code Playgroud)

当您包含这样的脚本时:

<script src="module.js"></script>
Run Code Online (Sandbox Code Playgroud)

你会收到错误:

未捕获的SyntaxError:意外的令牌导出

您需要包含type属性设置为"module"的文件:

<script type="module" src="module.js"></script>
Run Code Online (Sandbox Code Playgroud)

然后它将按预期工作,您可以在另一个模块中导入模块:

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

console.log( foo() );
console.log( bar );
Run Code Online (Sandbox Code Playgroud)

  • 与"最受欢迎的"答案不同,这实际上解决了这个问题,并解释了为什么会发生这种情况,而没有建议唯一的选择是利用CommonJS方法,APM方法或转换我们的代码...这也是一个例外到w3c标准,其中`type`应该是一个有效的mime类型(也就是媒体类型),所以这是一个意想不到的发现.谢谢! (21认同)
  • 这修复了错误,但我在Chrome 67中的import语句行上获得了"Unexpected token {",脚本是内联的,例如<script> import ... </ script> (4认同)

Bar*_*kkr 71

我的两分钱

出口

ES6

我的类.js

export class MyClass1 {
}
export class MyClass2 {
}
Run Code Online (Sandbox Code Playgroud)

其他.js

import { MyClass1, MyClass2 } from './myClass';
Run Code Online (Sandbox Code Playgroud)

CommonJS 替代品

我的类.js

class MyClass1 {
}
class MyClass2 {
}
module.exports = { MyClass1, MyClass2 }
// or
// exports = { MyClass1, MyClass2 };
Run Code Online (Sandbox Code Playgroud)

其他.js

const { MyClass1, MyClass2 } = require('./myClass');
Run Code Online (Sandbox Code Playgroud)

导出默认值

ES6

我的类.js

export default class MyClass {
}
Run Code Online (Sandbox Code Playgroud)

其他.js

import MyClass from './myClass';
Run Code Online (Sandbox Code Playgroud)

CommonJS 替代品

我的类.js

module.exports = class MyClass1 {
}
Run Code Online (Sandbox Code Playgroud)

其他.js

const MyClass = require('./myClass');
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助

  • 谢谢!这确实帮助我理解了 ES6 和 CommonJS 导入/导出模式之间的区别。 (2认同)

Ale*_*ory 15

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

// index.js
require = require('esm')(module)
module.exports = require('./app.js')
Run Code Online (Sandbox Code Playgroud)

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

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


Alv*_*nda 12

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

消息.js

module.exports = 'Hello world';
Run Code Online (Sandbox Code Playgroud)

应用程序.js

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

console.log(msg); // Hello World
Run Code Online (Sandbox Code Playgroud)

  • 那么你将如何导出一个类呢? (4认同)
  • @SherwinAblañaDapito module.exports = class MyClass {} 有效 (2认同)

Jal*_*lal 10

要使用ES6添加 babel-preset-env

在你的.babelrc:

{
  "presets": ["@babel/preset-env"]
}
Run Code Online (Sandbox Code Playgroud)

  • 他的问题不是解释巴贝尔.那么为什么要回答一些不需要的东西呢? (6认同)
  • @monsto这个问题已被作者标记为"babel".虽然Phil Ricketts的回答确实澄清了问题,这很好,但这个答案直接解决了作者的问题. (6认同)

You*_*Bee 6

安装 babel 包@babel/core@babel/preset这会将 ES6 转换为 commonjs 目标,因为 node js 不直接理解 ES6 目标

npm install --save-dev @babel/core @babel/preset-env

然后,您需要.babelrc在项目的根目录中创建一个具有名称的配置文件,并在那里添加此代码。

{ "presets": ["@babel/preset-env"] }

  • 我还需要安装@babel/register,否则我仍然会得到“SyntaxError:无法在模块之外使用 import 语句” (2认同)