Build fails on Node 20 with ESM errors

该报错通常出现在升级到 Node 20 后,构建过程因 require() 加载 ES Module 失败而中断。优先检查依赖中是否存在仅支持 ESM 的包,并确认构建工具与 Node 20 的兼容性。

快速结论:该报错通常出现在升级到 Node 20 后,构建过程因 require() 加载 ES Module 失败而中断。优先检查依赖中是否存在仅支持 ESM 的包,并确认构建工具与 Node 20 的兼容性。

适用环境:Node 20、npm 10.2.4;Issue 仅确认了此运行环境,未提及其他操作系统或硬件细节。

最快修复方案:暂无确认的一步修复方案。Issue 中用户已验证的临时方案是锁定到之前的 Node 版本(未指明具体版本号),以规避该问题。

注意事项:该报错发生在 Diffusers 仓库的构建流程中,并非推理或训练阶段的运行错误。Issue 最终被关闭,但维护者未在讨论中提供官方修复补丁,因此锁版本属于用户侧规避,并非官方认可方案。

问题场景

用户在将运行环境从旧版 Node 升级到 Node 20 后,执行 Diffusers 项目(或关联的前端/工具链)的构建任务时触发失败。构建日志显示 Node 的 require() 无法加载 ES Module 格式的依赖文件,导致进程退出。

报错原文

ERR_REQUIRE_ESM: require() of ES Module not supported

原因分析

可能原因:升级到 Node 20 后,部分依赖包(可能包括构建工具、配置文件加载器或传输层库)被解析为纯 ESM(ES Module)格式。当构建脚本通过 CommonJS 的 require() 去加载这些包时,Node.js 会直接抛出 ERR_REQUIRE_ESM 错误。此问题通常由依赖的版本行为变化或 Node 版本策略收紧所致,而非 Diffusers 核心 Python 推理逻辑的错误。

环境排查

  • Node.js 版本:请确认是否确实为 v20.x,并记录具体小版本号(如 20.0.x 或 20.10.x),不同小版本对 ESM 的处理可能有差异。
  • npm 版本:Issue 中记录为 10.2.4,确认当前锁文件与 npm 版本是否一致。
  • 构建工具链:排查构建脚本中调用的工具(如 Babel、Webpack、Vite、tsup 等)以及它们的配置文件类型(.js.mjs.cjs)。
  • 依赖清单:检查 package.json 及锁文件中 "type": "module" 的字段声明,或是否存在仅提供 exports 字段且仅包含 ESM 入口的包。

解决步骤

  1. 可优先尝试:锁定 Node 版本。如 Issue 评论中用户所述,将 Node 版本回退到升级前的 LTS 版本(例如 Node 18),然后重新执行构建,确认报错是否消失。这是当前唯一在 Issue 讨论中被用户验证可用的临时规避方案。
  2. 检查 ESM 依赖:如果无法降低 Node 版本,请在构建报错堆栈中定位具体是哪一个模块被 require()。查看该模块的 package.json,确认其是否为 type: module 或仅支持 import
  3. 修改加载方式(推测):如果定位到某个依赖或配置文件触发了错误,且项目允许修改构建脚本,可尝试将对应文件的引入方式从 require() 改为动态 import(),或将构建入口转换为 ESM 格式(如修改文件扩展名为 .mjs)。此为可能修复方向,未被 Issue 验证。
  4. 查阅依赖发布说明:确认出现问题的依赖包是否有针对 Node 20 的兼容补丁版本,尝试升级或降级该依赖到兼容版本。

验证方法

在应用上述任意调整后,重新执行之前失败构建命令。若构建执行完毕且不再抛出 ERR_REQUIRE_ESM 相关堆栈,且产出的文件/包结构完整,则可以确认问题已被解决或规避。

参考来源

huggingface/diffusers #14681

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 21677

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注