【问题标题】:Unexpected token export when running Terminal App运行终端应用程序时意外的令牌导出
【发布时间】:2018-12-08 02:44:00
【问题描述】:

这似乎只是一个普通的模块和导出,不确定是什么原因造成的。

myES6Module.js

const showCar = () => {
   //...code
}

const drive = () => {
  //...code
};

drive();

export { drive, showCar }

奇怪的是,我的测试可以很好地导入和调用它们,而我的测试使用它们并通过了。但是当我实际运行 drive() 通过提示用户进行终端输入来运行应用程序时,我收到一条错误消息:

SyntaxError: Unexpected token export at new Script (vm.js:74:7) at createScript (vm.js:246:10) at Proxy.runInThisContext (vm.js:298:10) at Module._compile (internal/modules/cjs/loader.js:670:28)

为什么这可以很好地解决测试但不能实时运行代码?

这是我的运行方式,我的 package.json 中的一个脚本

"start": "node --experimental-modules ./myES6Module.js"

所以当我运行yarn start 时,我明白了。否则,当我运行测试时,drive() 输出到控制台就好了。

如果我注释掉该导出,我的脚本运行良好...但这当然会破坏我依赖于导出内容的测试。

更新

我正在使用--experimental-modules

因为我安装了 babel-cli,所以我尝试了这个:

"start": "babel ./myES6Module.js"

package.json 有以下 babel 包:

"@babel/cli": "^7.0.0-beta.51", "@babel/preset-env": "^7.0.0-beta.51", "@babel/register": "^7.0.0-beta.51", "@babel/core": "^7.0.0-beta.51",

但这只是 console.logged 文件内容,它没有运行它。 我也不想使用--experimental-modules我不想更改我的文件扩展名,那么如何运行它?

我看了一下这个,它提到了如果你已经在使用 babel-node 进行迁移,但这是唯一的方法吗?

https://babeljs.io/docs/en/next/v7-migration

【问题讨论】:

  • 我想这可能已经在这里回答了stackoverflow.com/questions/38296667/…
  • 是的,但--experimental-modules 应该可以解决我认为的这个问题。 nodejs.org/api/esm.html 这样我就不需要 babel 了
  • 啊垃圾文件扩展名必须是mjs
  • 我认为你只是错过了.mjs 扩展名(编辑:抱歉页面打开了,看起来你明白了:))
  • 是的,就是这样。所以我拿出实验,尝试了babel。我想让它现在在没有 --experimental-modules 的情况下工作

标签: javascript ecmascript-6


【解决方案1】:

要回答您最初的问题,您需要将文件的文件扩展名设为 .mjs,以便您可以在 package.json 脚本中定义:

"start": "node --experimental-modules myES6Module.mjs"

关于删除--experimental-modules 标志的第二部分正如您所指出的,刚刚在使用babel 时注销了文件内容。要解决这个问题,您可以使用babel-node,但请注意其在生产中使用的警告。在该警告中,您将找到指向 Example Node Server w/ Babel 的链接,该链接演示了一个可行的解决方案。

在我创建了一个对我有用的最低工作解决方案之后,要产生结果:

npm i babel-cli babel-preset-es2015

将您的 package.json 更新为:

"start": "babel-node --presets es2015 myES6Module.js"

还有一个使用 export 的工作 .js 文件:

const showCar = () => {
  //...code
}

const drive = () => {
  //...code
  console.log('driving')
};

drive();

export { drive, showCar }

通天塔 7

如果您想使用第 7 版,请尝试以下操作。

npm i @babel/cli @babel/core @babel/node @babel/preset-env 所以你的package.json 有以下依赖:

"@babel/cli": "^7.0.0-beta.51",
"@babel/core": "^7.0.0-beta.51",
"@babel/node": "^7.0.0-beta.51",
"@babel/preset-env": "^7.0.0-beta.51"

设置运行脚本为

"start": "babel-node myES6Module.js"

使用

在项目的根级别创建 .babelrc 文件
{
  "presets": ["@babel/preset-env"]
}

现在您可以从终端执行npm run start,您应该会看到根据我的示例代码记录到终端的输出driving

我以前没有使用过版本 7,文档说 .babelrc 文件应该使用 "presets": ["env"] 但我收到了一个错误,但是上面和 "presets": ["@babel/env"] 的工作方式相同。其他人可能知道我遇到此错误背后的原因,但这是另一个问题。

【讨论】:

    猜你喜欢
    • 2014-06-03
    • 2020-05-31
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 2018-11-24
    • 2020-10-21
    相关资源
    最近更新 更多