我在开源代码中看到有使用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.
请问这个是什么原因呢?
在 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 格式的模块。
这个错误表明你尝试在一个使用CommonJS模块系统(即require
)的Node.js环境中引入了一个ES模块(ESM)。从Chai 5.0开始,Chai提供了两种格式的模块:CommonJS和ESM。然而,如果你遇到了上述错误,很可能是因为Chai包中的某个文件或整个包是以ESM格式发布的,而你的Node.js代码或者项目的package.json
文件可能配置为了仅支持CommonJS。
要解决这个问题,你可以采取以下几种方法之一:
使用动态import()
:
如果你的Node.js版本支持(通常是Node.js 12及更高版本),你可以使用动态import()
语法来引入ESM模块。例如:
(async () => {
const { assert } = await import('chai');
// ... 使用assert进行断言
})();
注意:import()
返回的是一个Promise,所以你需要使用await
来等待模块加载。
更改你的package.json
:
如果你的整个项目都打算使用ESM,你可以在package.json
中添加"type": "module"
,这样Node.js就会将你的.js
文件当作ESM来处理。
{
"type": "module",
// ... 其他字段
}
之后,你就可以直接使用import
语法来引入ESM模块,包括Chai。
process.versions.modules
等属性来确定Node.js是否支持ESM,并据此进行条件性的require
或import
。最后,错误消息中提到的/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,但我得到以下错误我必须要文件。:
是否可以在Node.js 代码文件中,既可以使用require引入三方库,又可以使用import引入呢?
尝试换了 3 种服务器,清除缓存,无痕模式都试了也没用。
<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
我看到ts代码有:如下的引用: 但是我下载repo本地会报错: fs 应该是nodejs的库,一般我们知道是:require方式进行引入, 但是为何这里使用import引入也可以呢,是需要额外配置哪里才能使用ESM引入吗?
在ipython中 但是在python中: 为什么会发生这个奇怪的错误?请帮我弄清楚。