Node版本兼容:require('node:util')在Node14报错,需Babel/Rollup转换?
Node 14 环境运行构建代码时出现
node:util 模块找不到的问题 环境信息
本地构建环境
- @babel/core: ^7.24.5
- rollup: ^4.18.0
- node: v20.12.1
- pnpm: 8.15.3
- npm: 10.5.0
- OS: Darwin
服务器运行环境
- node: v14.17
问题现象
在 Node 20 环境构建代码,部署到 Node 14 环境运行时,代码中本该调用 require('util'),实际却出现了 require('node:util') 的调用。在 Node 14 环境执行测试命令时直接报错:
▶ node -e "require('node:util')" # node 14 internal/modules/cjs/loader.js:892 throw err; ^ Error: Cannot find module 'node:util'
已尝试的配置与测试
Babel 配置(.babelrc)
{ "presets": [ [ "@babel/preset-env", { "modules": false, "targets": { "node": "14.17" }, "useBuiltIns": "entry", "corejs": "3.37" } ], ["@babel/preset-typescript"] ] }
Rollup Babel 插件的两种尝试配置
尝试1
babel({ extensions: ['.js', 'ts'], babelHelpers: "bundled", exclude: 'node_modules/**' }),
尝试2
babel({ extensions: ['.js', 'ts'], babelHelpers: "bundled", include: ['node_modules/**/ldapjs/**/*', 'src/**'], exclude: 'node_modules/**' }),
问题分析
node:util 这种带 node: 前缀的模块导入方式是 Node.js 16+ 才支持的特性,Node 14 并不识别这种语法。出现问题的核心原因:
- 构建环境为 Node 20,部分依赖(比如
ldapjs)在该环境下的代码使用了node:util导入方式; - 当前 Rollup+Babel 配置存在逻辑矛盾——尝试2中
include指定了要处理ldapjs,但exclude: 'node_modules/**'会覆盖该规则,导致ldapjs的代码完全没被 Babel 处理; - 虽然
@babel/preset-env配置了目标环境为 Node 14,但因为没处理到使用node:util的代码,无法将其转换为 Node 14 支持的require('util')。
解决方案
1. 修正 Rollup Babel 插件的配置逻辑
移除矛盾的exclude规则,确保ldapjs的代码能被 Babel 处理。修改后的配置示例:
babel({ extensions: ['.js', 'ts'], babelHelpers: "bundled", include: ['src/**', 'node_modules/**/ldapjs/**/*'] }),
说明:exclude: 'node_modules/**'会覆盖所有node_modules下的include规则,必须移除才能让Babel处理指定的依赖代码。
2. 确保 Babel 转换生效
@babel/preset-env 7.x 版本已支持将node:前缀的导入转换为普通导入,只要配置生效就能完成转换。如果调整后仍有问题,可检查是否有其他依赖也使用了node:前缀导入,需要将这些依赖也加入include规则。
3. 验证产物
构建完成后直接查看生成的代码,确认是否还有require('node:util')的调用,确保转换完全生效。
内容的提问来源于stack exchange,提问作者yhding
相关产品推荐
相关产品推荐

