运行js测试--得到 "无法在模块外使用导入语句"

问题描述 投票:0回答:1

我加了 type: module 但这并没有帮助。

我正在尝试运行使用了 importexport 的源文件。

现有的关于这个问题的具体内容和我的不一样,我也觉得这些问题对于我这种具体情况的人来说很混乱,尤其是我制定了一个具体的答案,其中的细节和现有的问题无关,但是和我这种情况的其他人有关。

javascript mocha babel jest
1个回答
5
投票

Jest文件如果你确定 babel-jest 并提供您的巴别配置 巴别文件,在配置文件中或 package.json 例如:

.babelrc.json

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

那么... babel-jest 将会自动识别,您不需要明确的预建文件来测试它们。这也意味着您在调用 Babel 时不需要在命令行中设置标志。


请注意,如果您使用 想要明确的预构建,我建议。

  1. 使用 pre<script> 脚本,而不是一行中的多个步骤;以及
  2. 再利用 build 脚本,这样你就不必在两个地方进行修改。

在你的情况下。

"scripts": {
  "build": "babel src/ --out-dir lib",
  "pretest": "npm run build",
  "test": "jest lib/*.test.js"
}

4
投票

在过去,你不能在Node中使用ES模块(例如: importexport)在Node中使用ES模块,而不需要使用Babel对您的代码进行转码。但是,现在Node中对ES模块的支持已经成为现实,Jest和Mocha最近也都增加了对原生使用ES模块的支持。

这需要的不仅仅是添加 "type": "module" 对你的 软件包.json然而,。

在Jest中使用原生ES模块的步骤。

  1. 如前所述,添加 "type": "module" 对你的 软件包.json
  2. 安装任一 jest-environment-nodejest-environment-jsdom-sixteen 到您的开发依赖。例如

    $ npm i -D jest-environment-node
    
  3. 更新Jest配置 软件包.json 并加上 testEnvironment 设置。 比如说

    "jest": {
        "testEnverionment": "jest-environment-jsdom-node"
    }
    
  4. 如果您使用的Node版本早于13.2,那么您需要在运行Node时添加两个额外的标志。--experimental-modulesexperimental-vm-modules. 我用的是 npx 来执行命令,尽管它有点啰嗦。

    $ npx --node-arg=--experimental-modules --node-arg=--experimental-vm-modules jest
    

    这将使用适当的Node标志来运行所有的Jest测试。我建议将其作为您的 test 脚本中 package.json 如果这是你要去的地方。

现在你应该可以使用 importexport 没有Babel!

最后一点很重要:在Node中使用原生ES模块时,你必须使用本地模块的整个导入路径,包括文件扩展名。比如说

import lib from "./my/lib.js"

这里是Node关于本地ES模块的文档,如果你想阅读更多细节的话。https:/nodejs.orgdistlatest-v14.xdocsapiesm.html。

我还推荐大家阅读这个Github问题,以了解更多关于Jest实现原生ES模块的细节。https:/github.comfacebookjestissues9430


3
投票

你需要使用编译器,然后在运行测试时使用编译后的文件。

许多参考资料都说要添加 type: module 但不多说了。说白了,基本信息。

SyntaxError: Cannot use import statement outside a module

就是因为你在使用 importexport你是想不经过编译直接运行文件。

这里的思维转变是习惯于在一个目录下编辑文件,在另一个目录下运行测试。 另外,一些解决方案提供了 "in'flight "编译,所以这个细节基本上是隐藏的,只使用源文件。

根据具体的需求,有几种不同的方法可以做到这一点。这里是我目前发现的最简单的方法之一,使用 Babel 进行编译。

  • 安装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/
© www.soinside.com 2019 - 2024. All rights reserved.