IBM Cloud Functions的Node.js环境是否支持ES模块?仅支持CommonJS吗?
IBM Cloud Functions Node.js 16 部署报ERR_REQUIRE_ESM错误解决
问题复现
通过压缩包创建Node.js v16版本云函数,使用的创建命令如下:
ibmcloud fn action create test/estest estest.zip --kind nodejs:16
压缩包内入口文件estest.js代码:
function main(params) { return { message: 'Hello World' }; }
压缩包内package.json配置了"type": "module"字段,部署触发后返回如下错误:
{ "error": "Initialization has failed due to: Error [ERR_REQUIRE_ESM]: require() of ES Module /nodejsAction/1AfjbP59/estest.js from /nodejsAction/runner.js not supported.estest.js is treated as an ES module file as it is a .js file whose nearest parent package.json contains \"type\": \"module\" which declares all .js files in that package scope as ES modules.\nInstead rename estest.js to end in .cjs, change the requiring code to use dynamic import() which is available in all CommonJS modules, or change \"type\": \"module\" to \"type\": \"commonjs\" in /nodejsAction/1AfjbP59/package.json to treat all .js files as CommonJS (using .mjs for all ES modules instead).\n\n at eval (eval at <anonymous> (/nodejsAction/runner.js:51:31), <anonymous>:1:1)\n at /nodejsAction/runner.js:51:31" }
查阅IBM Cloud官方文档,未找到任何关于该运行环境仅支持CommonJS规范的明确说明。
根本原因
- IBM Cloud Functions的Node.js运行时,底层加载用户入口代码的内置脚本
runner.js目前是用CommonJS规范的require()方法加载用户文件,没有适配ESM的动态导入逻辑。 - 当
package.json中声明"type": "module"时,Node.js会把当前包下所有.js后缀文件识别为ESM模块,CommonJS的require()无法直接加载ESM模块,直接抛出ERR_REQUIRE_ESM错误。 - 这个限制属于运行时实现的未文档化细节,公开文档里确实没有标注。
可行解决方法
根据自身需求选任意一种即可:
- 不需要使用ESM特性:直接删除
package.json里的"type": "module"字段,或者将其值改为"commonjs",保持原有estest.js代码不变,重新打包部署就能正常运行。 - 需要使用ESM特性写业务逻辑:
- 将入口文件重命名为
estest.cjs,用CommonJS规范写入口main函数 - 所有ESM业务代码统一用
.mjs后缀命名,在入口文件里用动态import()加载ESM模块即可,示例入口代码:// estest.cjs async function main(params) { const logic = await import('./esm-business.mjs'); return logic.handle(params); } module.exports = { main }; - 不需要修改
package.json的"type": "module"配置,打包后直接部署即可。
- 将入口文件重命名为
- 快速兼容方案:直接把入口文件
estest.js改名为estest.cjs,Node.js会忽略package.json的type配置,永远把.cjs文件当作CommonJS模块加载,直接解决加载报错。
内容的提问来源于stack exchange,提问作者user19453462
相关产品推荐
相关产品推荐

