我加了 type: module
但这并没有帮助。
我正在尝试运行使用了 import
和 export
的源文件。
现有的关于这个问题的具体内容和我的不一样,我也觉得这些问题对于我这种具体情况的人来说很混乱,尤其是我制定了一个具体的答案,其中的细节和现有的问题无关,但是和我这种情况的其他人有关。
每 Jest文件如果你确定 babel-jest
并提供您的巴别配置 巴别文件,在配置文件中或 package.json
例如:
.babelrc.json
{
"presets": [
"@babel/env"
]
}
那么... babel-jest
将会自动识别,您不需要明确的预建文件来测试它们。这也意味着您在调用 Babel 时不需要在命令行中设置标志。
请注意,如果您使用 做 想要明确的预构建,我建议。
pre<script>
脚本,而不是一行中的多个步骤;以及build
脚本,这样你就不必在两个地方进行修改。在你的情况下。
"scripts": {
"build": "babel src/ --out-dir lib",
"pretest": "npm run build",
"test": "jest lib/*.test.js"
}
在过去,你不能在Node中使用ES模块(例如: import
export
)在Node中使用ES模块,而不需要使用Babel对您的代码进行转码。但是,现在Node中对ES模块的支持已经成为现实,Jest和Mocha最近也都增加了对原生使用ES模块的支持。
这需要的不仅仅是添加 "type": "module"
对你的 软件包.json然而,。
"type": "module"
对你的 软件包.json安装任一 jest-environment-node
或 jest-environment-jsdom-sixteen
到您的开发依赖。例如
$ npm i -D jest-environment-node
更新Jest配置 软件包.json 并加上 testEnvironment
设置。 比如说
"jest": {
"testEnverionment": "jest-environment-jsdom-node"
}
如果您使用的Node版本早于13.2,那么您需要在运行Node时添加两个额外的标志。--experimental-modules
和 experimental-vm-modules
. 我用的是 npx
来执行命令,尽管它有点啰嗦。
$ npx --node-arg=--experimental-modules --node-arg=--experimental-vm-modules jest
这将使用适当的Node标志来运行所有的Jest测试。我建议将其作为您的 test
脚本中 package.json
如果这是你要去的地方。
现在你应该可以使用 import
export
没有Babel!
最后一点很重要:在Node中使用原生ES模块时,你必须使用本地模块的整个导入路径,包括文件扩展名。比如说
import lib from "./my/lib.js"
这里是Node关于本地ES模块的文档,如果你想阅读更多细节的话。https:/nodejs.orgdistlatest-v14.xdocsapiesm.html。
我还推荐大家阅读这个Github问题,以了解更多关于Jest实现原生ES模块的细节。https:/github.comfacebookjestissues9430
你需要使用编译器,然后在运行测试时使用编译后的文件。
许多参考资料都说要添加 type: module
但不多说了。说白了,基本信息。
SyntaxError: Cannot use import statement outside a module
就是因为你在使用 import
export
和 你是想不经过编译直接运行文件。
这里的思维转变是习惯于在一个目录下编辑文件,在另一个目录下运行测试。 另外,一些解决方案提供了 "in'flight "编译,所以这个细节基本上是隐藏的,只使用源文件。
根据具体的需求,有几种不同的方法可以做到这一点。这里是我目前发现的最简单的方法之一,使用 Babel 进行编译。
npm install babel --save-dev
增加巴别命令 package.json
脚本,例如。
"scripts": {
"test": "babel src/ --out-dir lib --presets=@babel/env; jest lib/*.test.js",
"build": "babel src/ --out-dir lib --presets=@babel/env"
}, // this was for jest but you can use mocha, etc as needed
// Note that using preset this way eliminates the need for a specific .babel.config.json file
现在,如果你运行
jest .
你会得到 SyntaxError: Cannot use import statement outside a module
但如果你运行 npm t
你得到
Successfully compiled 2 files with Babel.
PASS lib/app.test.js
All tests
✓ Canary test (2ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
今后,只要记得。
src/
lib/