运行终端应用程序

时间:2018-06-29 00:13:23

标签: javascript ecmascript-6

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

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.log记录了文件内容,它没有运行它。 我也不想使用--experimental-modules我不想更改文件扩展名,所以我如何运行它?

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

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

1 个答案:

答案 0 :(得分:0)

要回答您的第一个问题,您需要将文件扩展名为.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"

以及使用.js的有效export文件:

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

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

drive();

export { drive, showCar }

Babel 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"]的工作原理相同。可能有人知道我遇到此错误的原因,但这是另一个问题。