我试图在我的项目中运行一些ES6代码,但我得到了一个意外的令牌导出错误。
export class MyClass {
constructor() {
console.log("es6");
}
}
我试图在我的项目中运行一些ES6代码,但我得到了一个意外的令牌导出错误。
export class MyClass {
constructor() {
console.log("es6");
}
}
当前回答
我让模块工作了一段时间,然后它们没有出现这个Uncaught SyntaxError:意外的令牌导出错误。
结果是,我添加了一个开大括号而没有一个闭大括号。喜欢的东西:
if (true) {
/* } missing here */
export function foo() {}
虽然最大的错误是忘记了end},但解析器首先在大括号内找到一个导出,这是不允许的。
export关键字必须在文件的顶层。
So:
if (true) {
export function foo() {}
}
也不合法。当解析器遇到这种情况时,它立即停止解析,模糊地宣布错误使用了export,并给出与加载使用export关键字的“非模块”JavaScript文件时相同的错误。它从不报告底层缺少大括号错误。
我花了很长时间才弄明白,所以我在这里发帖,以帮助未来的患者。
理想情况下,解析器将报告只允许在文件的顶层导出。
其他回答
2022年更新
您正在使用EcmaScript模块(ESM或'ES6模块')语法,但您的环境不支持它。
v14.13.0之前的NodeJS版本不支持ESM(导出关键字语法),并使用CommonJS Modules (module. js Modules)。导出属性语法)。NodeJS v14.13.0及更新版本支持ESM,但必须先启用它。
解决方案:
If you are using NodeJS v14.13.0 or newer (which does support ESM) you can enable it by setting "type":"module" in your project package.json Refactor with CommonJS Module syntax (for older versions of NodeJS) Consider using TypeScript alongside ts-node or ts-node-dev npm packages (for instant transpilation at development time) and write TypeScript in .ts files Transpile ESM to CommonJS using esbuild (esbuild package on npm) configured to transpile your ES6 javascript to a CommonJS target supported by your environment. (babel is no longer recommended)
我让模块工作了一段时间,然后它们没有出现这个Uncaught SyntaxError:意外的令牌导出错误。
结果是,我添加了一个开大括号而没有一个闭大括号。喜欢的东西:
if (true) {
/* } missing here */
export function foo() {}
虽然最大的错误是忘记了end},但解析器首先在大括号内找到一个导出,这是不允许的。
export关键字必须在文件的顶层。
So:
if (true) {
export function foo() {}
}
也不合法。当解析器遇到这种情况时,它立即停止解析,模糊地宣布错误使用了export,并给出与加载使用export关键字的“非模块”JavaScript文件时相同的错误。它从不报告底层缺少大括号错误。
我花了很长时间才弄明白,所以我在这里发帖,以帮助未来的患者。
理想情况下,解析器将报告只允许在文件的顶层导出。
要使用ES6,请添加babel-preset-env
在你的。babelrc中:
{
"presets": ["@babel/preset-env"]
}
答案更新,感谢@ghanbari评论应用babel 7。
安装babel包@babel/core和@babel/preset,这将把ES6转换为commonjs目标,因为node js不直接理解ES6目标
npm install --save-dev @babel/core @babel/preset-env
然后,您需要在项目的根目录中创建一个名为.babelrc的配置文件,并将这段代码添加到其中。
[“@babel/preset-env”]
通常import不能在.js扩展名中工作,因为默认情况下js意味着javascript的cjs版本。如果你想要es6特性,你需要将.js扩展名重命名为.mjs扩展名
parent.mjs
export default class Car {
constructor(brand) {
this.carname = brand;
}
present() {
return 'I have a ' + this.carname;
}
}
child.mjs
import Car from './parent.mjs'
export default class Model extends Car {
constructor(brand, mod , country) {
super(brand);
this.model = mod;
this.country = country;
}
show() {
return this.present() + ', it is a ' + this.model + "i am from " +
this.country;
}
}
index . html
<!DOCTYPE html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0,
shrink-to-fit=no">
<title>Quick Start Pack Template</title>
</head>
<div class="demo"></div>
<script type="module">
import Model from './child.mjs'
let value = new Model("Ford", "Mustang", "bangladesh")
document.querySelector(".demo").innerHTML = value.show()
</script>
</body>
</html>
最后在活动服务器上运行此代码