Vite bundledDev 动态导入报 requestLazy is not a function
Vite 8.3.0 配合 Rolldown 1.2.9 开启 bundledDev 后,动态 import 因运行时缺少 requestLazy 失败。说明两个正式修正节点与临时关闭范围。
开启 experimental.bundledDev 后,页面停在加载状态,控制台报 TypeError: __rolldown_runtime__.requestLazy is not a function。如果普通 .js 模块和 JSON 的动态导入都失败,而关闭 bundledDev 后恢复,应核对生成代码与浏览器收到的 Rolldown 运行时是否来自兼容组合。
已经确认的组合是 Vite 8.3.0 配合 Rolldown 1.2.9。Vite 当时允许解析到这个 Rolldown 版本,但内嵌的客户端运行时没有生成代码需要的新方法。这条错误发生在开发模式,不能直接等同于生产服务器删除了旧 chunk。
为什么重新安装依赖后才出现
Vite 8.3.0 的 Rolldown 依赖范围是 ~1.2.6,新安装可以解析到 1.2.9。后者生成延迟导入时会调用 requestLazy,Vite 预先打包进客户端的运行时却仍是旧实现,于是正常的动态导入也会在调用处失败。
先从锁文件和实际依赖树确认两个版本,再看浏览器开发响应中是否出现 __rolldown_runtime__.requestLazy。它是打包器内部协议,不是应用需要自己实现的函数。给全局对象添加一个同名空函数会跳过模块加载逻辑,无法完成导出注册和缓存管理。
错误中有明确的 requestLazy is not a function,与 Network 中某个 JS 文件 404 是两种证据。若确实是发布后旧页面请求已删除资源,应检查旧哈希 chunk 的保留策略,不要用本篇的依赖修正解释所有动态导入失败。
两个正式修正节点
Rolldown 1.2.11 撤回了当时不兼容的变化,可解除这组版本的具体冲突。Vite 8.3.2 则调整运行时供应方式:开发服务从实际安装的 Rolldown 提供运行时代码,避免把另一份实现固定在 Vite 客户端中。
对仍在使用 bundledDev 的项目,优先在框架支持范围内更新到包含该处理的 Vite 正式版本,并核对原来为了临时避错添加的 Rolldown override。旧 override 若继续生效,实际安装结果仍可能与预期不同;删除或调整前应保留旧值及锁文件。
暂时不能更新时,可以在开发配置中关闭这一实验项:
import { defineConfig } from 'vite';
export default defineConfig({
experimental: {
bundledDev: false,
},
});
将它合并进原配置,不覆盖其他插件或实验选项。这会切换开发模块供应方式,应检查原来依赖 bundledDev 的开发行为。曾使用固定 Rolldown 1.2.6 的方式避开故障,也应作为有记录的临时版本组合处理,不能长期任意覆盖打包器后只检查一条路由。
同时检查延迟页面和热更新
更新依赖或修改实验项后,完全停止旧开发进程,再从原启动入口打开新页面。保留一个普通 JS 动态导入和一个 JSON 动态导入作为检查点,确认都得到正确导出;使用 React.lazy 的页面还应真正离开 loading 状态。
随后编辑一个相关模块,检查热更新及再次进入路由。只确认首次加载成功,可能漏掉模块缓存与 HMR 的后续行为。正式构建也要按项目原流程单独验收,不能把开发运行时修正当作生产拆包问题已经全部解决。


