【问题标题】:Trying ES6 style import gives 'Cannot use import statement outside a module'尝试 ES6 样式导入会给出“不能在模块外使用导入语句”
【发布时间】:2020-03-21 09:17:39
【问题描述】:

我正在尝试在 intellij 中编写一个 javascript 测试,我需要为此导入一些依赖项,并且我想使用 ES6 样式的导入语句但出现错误

/usr/local/bin/node /workspace/rr-sample/node_modules/mocha/bin/_mocha
--ui bdd --reporter "/Users/me/Library/Application Support/IntelliJIdea2019.1/NodeJS/js/mocha-intellij/lib/mochaIntellijReporter.js"
tests/*.test.js /workspace/rr-sample/tests/App.test.js:3
import chai from 'chai'
^^^^^^

SyntaxError: Cannot use import statement outside a module
    at wrapSafe (internal/modules/cjs/loader.js:1043:16)
    at Module._compile (internal/modules/cjs/loader.js:1091:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1160:10)
    at Module.load (internal/modules/cjs/loader.js:976:32)
    at Function.Module._load (internal/modules/cjs/loader.js:884:14)
    at Module.require (internal/modules/cjs/loader.js:1016:19)
    at require (internal/modules/cjs/helpers.js:69:18)
    at /workspace/rr-sample/node_modules/mocha/lib/mocha.js:334:36
    at Array.forEach (<anonymous>)
    at Mocha.loadFiles (/workspace/rr-sample/node_modules/mocha/lib/mocha.js:331:14)
    at Mocha.run (/workspace/rr-sample/node_modules/mocha/lib/mocha.js:809:10)
    at Object.exports.singleRun (/workspace/rr-sample/node_modules/mocha/lib/cli/run-helpers.js:108:16)
    at exports.runMocha (/workspace/rr-sample/node_modules/mocha/lib/cli/run-helpers.js:142:13)
    at Object.exports.handler (/workspace/rr-sample/node_modules/mocha/lib/cli/run.js:292:3)
    at Object.runCommand (/workspace/rr-sample/node_modules/yargs/lib/command.js:242:26)
    at Object.parseArgs [as _parseArgs] (/workspace/rr-sample/node_modules/yargs/yargs.js:1087:28)
    at Object.parse (/workspace/rr-sample/node_modules/yargs/yargs.js:566:25)
    at Object.exports.main (/workspace/rr-sample/node_modules/mocha/lib/cli/cli.js:68:6)
    at Object.<anonymous> (/workspace/rr-sample/node_modules/mocha/bin/_mocha:10:23)
    at Module._compile (internal/modules/cjs/loader.js:1121:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1160:10)
    at Module.load (internal/modules/cjs/loader.js:976:32)
    at Function.Module._load (internal/modules/cjs/loader.js:884:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:67:12)
    at internal/main/run_main_module.js:17:47

究竟是什么问题?我找到了这个链接(和其他链接)http://xahlee.info/js/js_import_export.html,它告诉你如何解决这个错误,但在另一个对我没有帮助的情况下,它也没有解释问题是什么。

如果有帮助,这里是我正在使用的代码。

//const chai = require("chai");
import chai from 'chai'

const React = require("react");
const expect = chai.expect;

describe('how it works first-time test', () => {
  it('checks equality', () => {

    const val = false;
    expect(val).to.be.false;
  });

});

【问题讨论】:

  • “它没有解释问题是什么” — 它明确说 “如果你的代码使用 importexport,那么它必须被加载为模块。” 沿着它说你必须使用type="module" 的部分。你见过Intellij Idea Ecmascript Harmony modules syntax吗?

标签: javascript intellij-idea mocha.js chai


【解决方案1】:

运行用 ES6 编写的 Mocha 测试的最简单方法是使用 Mocha --require @babel/register 选项即时编译它们(请参阅 https://github.com/mochajs/mocha/wiki/compilers-deprecation#what-should-i-use-instead-then)。当然,你需要确保安装了相应的模块并相应地设置了.babelrc

package.json:

"dependencies": {
  "@babel/cli": "^7.7.4",
  "@babel/core": "^7.7.4",
  "@babel/preset-env": "^7.7.4",
  "@babel/register": "^7.7.4",
...
}

.babelrc:

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

另见https://dev.to/bnorbertjs/my-nodejs-setup-mocha--chai-babel7-es6-43ei

【讨论】:

  • 对我来说重要的是额外的摩卡选项
  • 这是Mocha运行配置,你可以在Run > Edit Configurations...中找到
  • 为我工作,没有使用他在截图中的配置
【解决方案2】:

在将我的一个 ts 库更新为 es6 模块而不是 commonjs 时,我遇到了同样的问题。在 tsconfig.json 更改后,我的 npm run test 产生了上述错误。

import chai from 'chai'
^^^^^^
SyntaxError: Cannot use import statement outside a module

在没有 babel 的情况下解决了这个问题,添加了一个自己的 tsconfig 文件只是为了测试。

tsconfig.testing.json

{
  "compilerOptions": {
      "module": "commonjs",
      "target": "es6"
  },
  "include": ["**/*.spec.ts"]
}

通过 package.json 中的脚本运行测试

"test": "cross-env TS_NODE_PROJECT=\"tsconfig.testing.json\" mocha -r ts-node/register src/**/*.spec.ts",

(cross-env 设置 env 变量 os 独立)

【讨论】:

  • 请注意cross-env 处于维护模式
  • @pixel,能否请您补充一下这是如何相关的,谢谢
  • 有些人可能想要坚持最新/积极维护的库 - 我的评论是为这些人准备的
  • 维护模式基本上意味着不会添加新功能,如果需要,只会修复错误。它与上面的用例保持相关。在github.com/kentcdodds/cross-env/issues/257 上查看更多信息并查找替代方案
  • 如果不更改 tsconfig 是否无法正常工作?我刚刚遇到了同样的问题,这个脚本在没有任何额外更改的情况下更正了它:“test”:“mocha -r ts-node src/**/*.test.ts”
【解决方案3】:

我可以通过在我的项目的源代码中添加一个 .mocharc.yaml 文件来完成这项工作:

require: '@babel/register'

来源:https://github.com/mochajs/mocha-examples/tree/master/packages/babel

【讨论】:

  • 这足以让我通过右键单击 itdescribe 在 webstorm 中运行
【解决方案4】:

根据doc

https://nodejs.org/api/esm.html#esm_code_import_code_statements

所以您必须确保将脚本作为 es 模块执行。

例如使用 babel-node 代替 Nodejs 执行脚本以启用 es6 或更高版本。

【讨论】:

  • 问题是关于在 Mocha 中使用 Typescript。不在应用内
猜你喜欢
  • 2020-07-18
  • 2021-08-12
  • 2016-12-11
  • 2021-12-28
  • 2021-09-01
  • 2020-07-14
  • 2021-02-06
  • 2021-07-05
  • 1970-01-01
相关资源
最近更新 更多