[0]脚本执行进程:1191367 [0]/root/autMan/task/scripts/6dylan6_jdpro/cs.js:3 [0]const got = require('got'); [0] ^ [0] [0]Error [ERR_REQUIRE_ESM]: require() of ES Module /root/autMan/node_modules/got/dist/source/index.js from /root/autMan/task/scripts/6dylan6_jdpro/cs.js not supported. [0]Instead change the require of index.js in /root/autMan/task/scripts/6dylan6_jdpro/cs.js to a dynamic import() which is available in all CommonJS modules. [0] at Object. (/root/autMan/task/scripts/6dylan6_jdpro/cs.js:3:13) { [0] code: 'ERR_REQUIRE_ESM' [0]} [0] [0]Node.js v18.20.8 [0]脚本执行完毕: -1 如何解决
时间: 2025-09-03 12:57:12 AIGC 浏览: 4
<think>
我们面对的问题是:在Node.js v18.20.8环境下,使用`require('got')`时出现`ERR_REQUIRE_ESM`错误。这是因为从got v12.0.0开始,got仅支持ES模块(ESM),不再提供CommonJS版本。而`require`是CommonJS的引入方式,因此无法直接引入ESM模块。
根据Node.js的模块系统,我们有几种解决方案:
### 解决方案1:使用动态导入(Dynamic Import)
由于动态导入(`import()`)在CommonJS模块中可用,我们可以将`require`替换为动态导入。注意:动态导入返回一个Promise,因此需要在异步函数中使用。
修改`cs.js`脚本,将:
```javascript
const got = require('got');
```
改为:
```javascript
let got;
import('got').then((module) => {
got = module.default;
// 在这里继续编写原本的代码,或者调用一个启动函数
}).catch(err => console.error(err));
```
然后,将原本的脚本代码包裹在一个异步函数中,并在动态导入后调用。例如:
```javascript
let got;
async function main() {
// 原本的代码
const response = await got('https://example.com');
console.log(response.body);
}
import('got').then((module) => {
got = module.default;
main();
}).catch(err => console.error(err));
```
### 解决方案2:将模块系统改为ESM
将整个项目或该脚本改为使用ESM规范。
**步骤:**
1. 将脚本文件扩展名从`.js`改为`.mjs`(例如`cs.mjs`),然后使用`import`语法:
```javascript
import got from 'got';
// ... 其余代码
```
然后使用Node.js运行:`node cs.mjs`
2. 或者,在`package.json`中设置`"type": "module"`,这样所有`.js`文件都会被当作ES模块处理。然后修改`cs.js`,将`require`改为`import`:
```javascript
import got from 'got';
// ... 其余代码
```
### 解决方案3:降级got版本
安装支持CommonJS的got版本(v11及以下)。但这可能不推荐,因为旧版本可能缺少新特性或安全更新。
```bash
npm install got@11
```
然后就可以继续使用:
```javascript
const got = require('got');
```
### 解决方案4:使用兼容包
如果项目中有大量CommonJS模块,且不想立即迁移到ESM,可以考虑使用兼容包。例如,可以使用`require('got').default`(但注意:got v12及以上是纯ESM,此方法无效)。因此,此方案不适用。
### 总结建议
- 如果项目是新的或允许使用ESM,建议采用解决方案2(使用ESM模块)。
- 如果只是临时解决且不想修改代码结构,可以使用动态导入(解决方案1)。
- 如果项目依赖旧版got,可以选择解决方案3(降级版本)。
### 注意事项
- 使用动态导入时,注意代码的异步执行顺序,确保在got加载完成后再执行相关代码。
- 如果整个项目迁移到ESM,需注意CommonJS和ESM的差异(例如,ESM不支持`__dirname`,可以使用`import.meta.url`替代)。
请根据项目的具体情况选择合适的方案。
§§相关问题§§
1. 在Node.js中,如何判断一个模块是ES模块还是CommonJS模块?
2. 动态导入语法(`import()`)与静态导入(`import ... from`)有什么区别?
3. 将Node.js项目从CommonJS迁移到ESM需要注意哪些问题?
4. 除了got,还有哪些流行的HTTP请求库同时支持CommonJS和ESM?
</think>
### 解决 Node.js v18.20.8 中 `require('got')` 的 `ERR_REQUIRE_ESM` 错误
#### 问题原因分析
`got` 从 v12.0.0 开始仅支持 ES 模块(ESM)规范,而您的代码使用 CommonJS 的 `require()` 语法加载模块,导致兼容性失败[^1]。解决方案需根据项目环境选择:
---
### 解决方案(三选一)
#### ✅ 方案一:改用动态导入(推荐)
在不修改文件扩展名和项目配置的情况下,将 `require()` 替换为动态导入:
```javascript
// 修改 cs.js 中的引入方式
async function main() {
const { default: got } = await import('got');
// 原代码保持不变,示例:
const response = await got('https://example.com');
console.log(response.body);
}
main();
```
**优势**:
- 无需修改文件扩展名或项目配置
- 兼容 CommonJS 和 ESM 混合环境
- 适合单文件快速修复
---
#### ✅ 方案二:启用 ES 模块规范
1. 修改 `package.json`(位于项目根目录):
```json
{
"type": "module" // 添加此字段
}
```
2. 修改 `cs.js` 的导入语法:
```javascript
// 使用 import 替换 require
import got from 'got';
```
3. 运行命令:
```bash
node /root/autMan/task/scripts/6dylan6_jdpro/cs.js
```
**注意事项**:
- 启用后所有 `.js` 文件需使用 ESM 语法
- `__dirname` 需改为 `import.meta.url`
- 引用 CommonJS 模块需使用 `createRequire()`[^1]
---
#### ✅ 方案三:降级 `got` 版本(兼容旧项目)
安装支持 CommonJS 的旧版 `got`:
```bash
npm install [email protected] # 最后一个支持 CommonJS 的版本
```
代码保持原样:
```javascript
const got = require('got'); // 可正常运行
```
---
### 验证结果
执行后检查输出:
```bash
[0]脚本执行进程:1191367
[0]脚本执行完毕: 0 # 返回0表示成功
```
> **关键区别**:
> - CommonJS 使用 `require/module.exports`(`.js`)
> - ESM 使用 `import/export`(`.js` + `"type":"module"` 或 `.mjs`)[^1]
阅读全文