升级至Node.js 20后使用@yao-pkg/pkg打包的可执行文件运行报错求助
解决pkg打包ES模块为exe时的ERR_REQUIRE_ESM错误
错误信息(中文翻译)
node:internal/modules/cjs/loader:1432
throw err;
^Error [ERR_REQUIRE_ESM]: 不支持使用require()加载ES模块 C:\snapshot\backend\bundle\app.js。
app.js被视为ES模块文件,因为它是一个.js文件,其最近的父级package.json包含"type": "module",这会将该包范围内的所有.js文件声明为ES模块。
你可以选择以下方式解决:将app.js重命名为以.cjs结尾;修改调用代码使用动态import()(该方法在所有CommonJS模块中都可用);或者将C:\snapshot\backend\package.json中的"type": "module"改为"type": "commonjs",这样所有.js文件都会被视为CommonJS模块(ES模块改用.mjs后缀)。at Function.runMain (pkg/prelude/bootstrap.js:1983:12) { code: 'ERR_REQUIRE_ESM' }Node.js v20.11.1
可行解决方案
- 调整package.json模块类型:打开项目根目录的
package.json,将"type": "module"替换为"type": "commonjs"。如果项目中存在ES模块,把对应的文件后缀改为.mjs即可。 - 重命名入口文件:把
app.js改名为app.cjs,同时在package.json里更新"main"字段的值为"app.cjs",确保pkg能正确定位入口文件。 - 改用动态导入:找到代码中使用
require()加载app.js的位置,替换为import('./app.js')的动态导入方式,注意这种方式需要处理异步逻辑(比如用async/await包裹)。
内容的提问来源于stack exchange,提问作者Vivin Prasannaa
相关产品推荐
相关产品推荐

