尝试ES6风格的导入给出了“不能在模块外使用导入语句”

ryhaxcpt  于 2022-10-07  发布在  其他
关注(0)|答案(6)|浏览(181)

我正在尝试用IntelliJ编写一个Java脚本测试,为此我需要导入一些依赖项,并且我想使用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;
  });

});
ryoqjall

ryoqjall1#

运行用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

nxagd54h

nxagd54h2#

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

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

没有巴别塔就解决了这个问题,只是为了测试而添加了一个自己的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",

(跨环境将环境变量设置为独立于os)

xt0899hw

xt0899hw3#

我在我的项目源代码中添加了一个.mocharc.yaml文件,其中包含以下内容,从而实现了这一点:

require: '@babel/register'

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

t9eec4r0

t9eec4r04#

对我来说,我无法通过Intelligence j中的内联调试选项运行它。因此,我设置了额外的摩卡选项,这解决了问题。

--compilers js:babel-core/register

另外,通过终端运行

npx mocha  --compilers js:babel-core/register
wsxa1bj1

wsxa1bj15#

我的问题的原因是旧版本的Mocha,实际上是任何小于6.0.0的版本,即使在配置了‘Required:@Babel/Register’的情况下也是如此。我把Mocha更新到了9.0.0,我还把Babel库更新到了最新版本,这个问题已经解决了。

正如Mocha文档中也建议的那样,使用配置文件,如‘.mocharc.js’,其中您必须声明所需的Babel依赖关系,如this示例:

.mocharc.js

module.exports = {
  ...
  require: '@babel/register',
  ...
}

Package.json

{
  ...
  "devDependencies": {
    "@babel/core": "^7.9.0",
    "@babel/preset-env": "^7.3.4",
    "@babel/preset-react": "7.18.6",
    "@babel/register": "^7.9.0"
    ...
    "mocha": "^9.0.0",
  }
}
wmomyfyw

wmomyfyw6#

根据文件:
Https://nodejs.org/api/esm.html#esm_code_import_code_statements

因此,您必须确保将脚本作为ES模块执行。

例如,使用babel-node而不是NodeJS执行脚本以启用ES6或更高版本。

相关问题