基于SAM与esbuild的MJS文件构建报错:Dynamic require of "net" is not supported
解决SAM + esbuild ESM模式下动态require报错问题
核心思路
你找到的esbuild方案是通过添加自定义插件拦截动态require调用,将其转换为ESM兼容的写法。要和SAM集成,只需在SAM的esbuild配置中指定自定义插件文件即可。
具体步骤
1. 创建esbuild插件文件
在项目根目录新建esbuild-plugins.js文件,写入以下内容:
export const fixDynamicRequire = { name: 'fix-dynamic-require', setup(build) { build.onLoad({ filter: /\.js$/ }, async args => { const fs = require('fs'); let content = await fs.promises.readFile(args.path, 'utf8'); // 把依赖包中的动态require('net')替换为ESM的import写法 content = content.replace(/require\(['"]net['"]\)/g, "await import('net')"); return { contents: content, loader: 'js' }; }); }, };
2. 修改SAM的esbuild配置
在你的SAM模板的BuildProperties中添加Plugins字段,关联刚才创建的插件:
Metadata: BuildMethod: esbuild BuildProperties: Format: esm Minify: false Target: "es2022" OutExtension: - .js=.mjs Sourcemap: false EntryPoints: - handler.ts # 新增插件配置 Plugins: - esbuild-plugins.js:fixDynamicRequire
3. 额外注意事项
- 如果依赖包里还有其他动态require的模块(比如
fs、http),可以扩展插件中的替换规则,比如用require\(['"](.+?)['"]\)匹配所有动态require,替换为await import('$1') - 确保Lambda运行时选择Node.js 16及以上版本,原生支持顶层await和ESM语法
- 可以用
sam build --debug查看构建日志,确认插件是否正常生效
内容的提问来源于stack exchange,提问作者Linoy
相关产品推荐
相关产品推荐

