You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 03:22:49