javascript - 运行 js 测试 - 获取 "Cannot use import statement outside of a module"

标签 javascript jestjs mocha.js babeljs

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

我正在尝试运行对源文件使用 importexport 的 mocha 或 jest 测试。

有关此问题的现有问题的具体情况与我的不同,我还发现对于具有我的具体情况的人来说,这些问题令人困惑,特别是因为我已经制定了一个具体的答案,其中的详细信息与现有问题无关,但与其他人和我的情况一样。

最佳答案

过去,如果不使用 Babel 转译代码,则无法在 Node 中使用 ES 模块(即 import/export)。然而,Node 中对 ES 模块的支持现已成为现实,Jest 和 Mocha 最近也添加了对原生使用 ES 模块的支持。

然而,这不仅仅需要将 "type": "module" 添加到您的 package.json 中。

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

  1. 如前所述,将 "type": "module" 添加到您的 package.json

  2. jest-environment-nodejest-environment-jsdom-sixteen 安装到您的开发依赖项中。例如:

    $ npm i -D jest-environment-node
    
  3. 更新 package.json 中的 Jest 配置并添加 testEnvironment 设置。例如:

    "jest": {
        "testEnvironment": "jest-environment-jsdom-node"
    }
    
  4. 如果您使用的 Node 版本早于 13.2,则在运行 Node 时需要添加两个附加标志:--experimental-modulesexperimental-vm -模块。我使用 npx 来执行命令,尽管它有点冗长:

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

这将使用适当的节点标志运行所有 Jest 测试。如果您愿意的话,我建议您将其作为 package.json 中的 test 脚本。

现在您应该能够在没有 Babel 的情况下使用 import/export 了!

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

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

这里是关于原生 ES 模块的 Node 文档,如果您想更详细地了解这一点:https://nodejs.org/dist/latest-v14.x/docs/api/esm.html

我还建议阅读此 Github 问题,了解有关 native ES 模块的 Jest 实现的更多详细信息:https://github.com/facebook/jest/issues/9430

关于javascript - 运行 js 测试 - 获取 "Cannot use import statement outside of a module",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61575545/

相关文章:

node.js - Jest 模拟 sendgrid 发送电子邮件

javascript - 在 Mocha 中,返回将被拒绝的 Promise 与调用 done(err) 的效果不同

javascript - 在 Jest (Node.js) 中测试单例的静态方法

javascript - 如何只允许 parsley.js 验证中的文本

javascript - 如何在 Google Maps v3 API for Directions 中更改开始和结束标记图像

javascript - 适用于 Mac 的免费应用程序,用于混淆和缩小 javascript/php/html

javascript - 在 Jest 中测试事件监听器的最简单方法是什么?

javascript - 用 Sinon 模拟 Redis 构造函数

javascript - 编写 Ember.js 组件与子组件的集成测试

javascript - 在 Javascript 中使用 indexOf 将变量类型编号与数组进行比较