使用pkg打包Typescript+NodeJS应用报ENOENT node:util错误如何解决
问题解决指南
报错根因
Cannot read file, ENOENT node:util 错误来自两方面:
- 你使用的pkg 5.4.1版本对Node.js核心模块的
node:前缀导入识别存在兼容缺陷,对ESM(ECMAScript模块)的支持不完善 - 你的项目在package.json中声明了
"type": "module",同时tsconfig配置输出的是ES2020模块格式,pkg默认对ESM项目的解析逻辑没有对齐Node原生规则
解决方案
方案1:切换输出为CommonJS格式(兼容性最好,优先选)
修改tsconfig.json的compilerOptions配置:
{ "compilerOptions": { // 把原来的 "module": "ES2020" 替换为下面的配置 "module": "CommonJS", // 可选:保留target为ES2021不影响 } }
修改完成后重新执行编译命令:
npm run compile
再执行原打包命令即可正常运行:
pkg --out-path binaries .
方案2:保留ESM格式,补充pkg配置
如果必须使用ESM模块,在package.json中新增pkg专属配置段:
{ // 其他原有配置不变,新增下面的段 "pkg": { "scripts": "distribution/**/*.js", "options": ["experimental-modules"], "targets": ["node16-linux-x64", "node16-macos-x64", "node16-win-x64"] } }
打包时添加参数规避模块解析问题:
pkg --out-path binaries --public-packages "*" .
方案3:升级pkg版本
最新版pkg已经修复了node:前缀核心模块的识别问题,直接升级pkg到最新版本后重新打包即可。
遗漏配置说明
你确实缺少必要的配置:
- 没有提前对齐TS编译输出的模块格式和pkg的兼容范围
- ESM项目没有给pkg补充对应的实验性模块支持配置
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

