当前位置: 首页 > 知识库问答 >
问题:

javascript - 为何在chai的实际使用中却不能在nodejs的代码中进行require引入呢?

徐友樵
2024-07-21

我在开源代码中看到有使用require引入chai库的API:

https://github.com/tree-sitter/node-tree-sitter/blob/master/test/tree_test.js#L4

const { assert } = require("chai");

但是我在chai的实际使用中却不能在nodejs的代码中进行require引入:

const { assert } = require("chai");
                   ^

Error [ERR_REQUIRE_ESM]: require() of ES Module /Users/mmkk/Desktop/code/Test/Test-demos/nodejs/nodejs-node-tree-sitter-test-01/node_modules/.pnpm/chai@5.1.1/node_modules/chai/chai.js from /Users/mmkk/Desktop/code/Test/Test-demos/nodejs/nodejs-node-tree-sitter-test-01/test/tree_test.js not supported.

请问这个是什么原因呢?

共有2个答案

徐峰
2024-07-21

在 JS 中引入其它模块有两种方式,一种是 CommonJS Module,需要使用 require 引入;一种是 ES6 Module,需要使用 import 引入。一般来说,使用 require 无法引入 ES6 Module;使用 import 也无法引入 CommonJS Module。你这里使用 require 引入 ES6 Module,所以 NodeJS 报错了。

JS 的第三方库有的会提供两种格式的模块,有的在旧版本提供 CommonJS Module,而在新版本提供 ES6 Module。

要解决你的问题,要么将 require 改为 ES6 的 import 语法,要么引入 CommonJS 格式的模块。

赫连俊悟
2024-07-21

这个错误表明你尝试在一个使用CommonJS模块系统(即require)的Node.js环境中引入了一个ES模块(ESM)。从Chai 5.0开始,Chai提供了两种格式的模块:CommonJS和ESM。然而,如果你遇到了上述错误,很可能是因为Chai包中的某个文件或整个包是以ESM格式发布的,而你的Node.js代码或者项目的package.json文件可能配置为了仅支持CommonJS。

要解决这个问题,你可以采取以下几种方法之一:

  1. 使用动态import()
    如果你的Node.js版本支持(通常是Node.js 12及更高版本),你可以使用动态import()语法来引入ESM模块。例如:

    (async () => {
        const { assert } = await import('chai');
        // ... 使用assert进行断言
    })();

注意:import()返回的是一个Promise,所以你需要使用await来等待模块加载。

  1. 更改你的package.json
    如果你的整个项目都打算使用ESM,你可以在package.json中添加"type": "module",这样Node.js就会将你的.js文件当作ESM来处理。

    {
      "type": "module",
      // ... 其他字段
    }

之后,你就可以直接使用import语法来引入ESM模块,包括Chai。

  1. 安装一个旧的Chai版本
    如果你不想在项目中使用ESM,可以安装一个旧版本的Chai,该版本只提供CommonJS模块。但是请注意,这可能会限制你使用Chai的新功能。
  2. 使用条件引入
    在某些情况下,你可能需要根据运行时环境来动态地选择使用哪种模块格式。这通常涉及到检查process.versions.modules等属性来确定Node.js是否支持ESM,并据此进行条件性的requireimport
  3. 使用第三方工具
    一些构建工具(如Webpack、Rollup等)或模块解析器可以帮助你处理不同格式的模块。

最后,错误消息中提到的/Users/mmkk/Desktop/code/Test/Test-demos/nodejs/nodejs-node-tree-sitter-test-01/node_modules/.pnpm/chai@5.1.1/node_modules/chai/chai.js文件可能是一个特定于你使用的包管理器(例如pnpm)的路径。确保你的包管理器已正确安装和配置,并且你的Node.js版本支持你正在尝试使用的功能。

 类似资料:
  • 我试图在JS中使用require,但我得到以下错误我必须要文件。:

  • <script>标签引入php生成的js代码段,执行失败,如何解决? <script>标签引入php生成的js代码段,执行失败,说明如下: 1.a.com ,2.a.com,3.a.com页面都需要引入js的json变量值,所以想用4.a.com写一个php页面生成如下的js代码内容例如:var jsdata={"list":[{...},{...}]}; 1.a.com ,2.a.com,3.a

  • 在ipython中 但是在python中: 为什么会发生这个奇怪的错误?请帮我弄清楚。

  • 我在 Ubuntu 120 上使用罗技 K20.04 键盘(105 键),在所有其他应用程序中我可以使用引号(双引号和单引号),但在 PhpStorm 中我不能。它发生在我身上的引号和其他字符,如“”。 我该怎么办?我已经使用了 ,但它仍然不起作用。

  • 我正在使用spring MVC创建Rest Web服务。并希望发送213代码状态作为响应。但是在类org.springframework.http.HttpStatus和类ResponseEntity(T body,HttpStatus statusCode)accept HttpStatus类型中不存在此代码。我们如何处理发送此httpStatus代码?下面是伪代码:

  • 当我执行时 在控制台(javascript)中,它通过类名返回元素,但是当我执行时: < code > driver . find elements(by . class name(" jobs-company-card _ _ content-wrapper ")); 结果(元素)是一个空的列表,注意返回

  • 本文向大家介绍nodejs使用socket5进行代理请求的实现,包括了nodejs使用socket5进行代理请求的实现的使用技巧和注意事项,需要的朋友参考一下 需要用到2个库, request socks5-http-client/lib/Agent/ 或 socks5-https-client/lib/Agent 因为一些已知原因,有时候,http.request请求无法拿到数据, 首先想到的是

  • 需求: 后端会返回一个各种内容组合的数据到前端。前端需要根据对应的名称生成各种展示样式 例: 上面有三个简单的示例(/业务场景比这个多): name: 需要直接输出即可, address: 需要按某种格式输出, capital: 需要每个投资人一行. 其中capital.name要增加连接 现代码: printChangeItem方法负责将英文键换成中文. printAdapterExpr方法根据