DEBUG.WIKI
搬瓦工;先看线路,再选 VPS;CN2 GIA · 对应线路套餐;查看线路 →
野草云;香港 200Mbps 峰值;不限月流量 · BGP VPS;查看套餐 →
V.PS:让项目靠近用户,亚太、欧洲、北美 KVM VPS

运行 astro check 后开发页报 jsxDEV 不是函数:检查共享优化缓存

Astro 7.4.0 的 sync、check 或 build 可能覆盖运行中开发服务的 React 预构建缓存。7.4.2 已隔离临时 Vite 缓存,恢复时仍需重启旧进程。

astro dev 一直开着,在另一个终端运行 astro check、astro sync 或 astro build 后,原页面突然报 TypeError: _jsxDEV is not a function。如果重启开发服务能暂时恢复,先检查磁盘上的预构建文件有没有被另一个命令覆盖。

Astro 7.4.0、Vite 8.3.4、@astrojs/react 7.1.0 有明确的这组条件。页面也可能出现 Invalid hook call,但不能只凭 hook 错误就一律认定项目装了两份 React。

开发进程读到了生产 runtime

开发页需要 React 的开发 JSX runtime。受影响路径下,运行 sync 后,node_modules/.vite/deps/react_jsx-dev-runtime.js 会被另一份优化结果替换,其中 jsxDEV 变为未提供的值。开发服务仍活着,却开始从同一路径提供这份新文件。

sync 为加载内容配置和动态导入创建临时 Vite 服务。仅设置 optimizeDeps.noDiscovery 并不等于关闭所有优化:integration 仍可能显式 include React 入口。临时服务与 dev 共用缓存位置时,就会互相覆盖。

先对齐命令的执行时间、错误出现时间和实际缓存目录,再比较失败前后相关 runtime 的内容。没有并行运行这些命令,或文件未变化,应继续查重复 React、插件配置及其他运行时差异。

7.4.2 已给临时服务单独的缓存目录

Astro 7.4.2 的正式 sync 实现,把临时 Vite 服务的缓存放到 Astro cacheDir 下的 vite-sync/,避免替换运行中的 dev 依赖。可在兼容分支采用包含该实现的正式版本,保留原配置与锁文件,确认实际执行的 Astro 版本。

这是确认 7.4.2 包含隔离逻辑,不把它当作未经逐版核对的最早修复号。升级后停止原开发进程,并沿原入口重新优化;若 dev 脚本直接运行 Astro,可用:

npm run dev -- --force

框架或自定义脚本再封装一层时,确认参数真正传给 Astro。这个启动会更新开发缓存,不能让仍在运行的旧进程自动获得源码修正。

暂时无法更新时,避免 dev 与 sync、check、build 同时使用该工作目录。先停 dev,再完成需要的命令,随后强制重启开发服务。保留正常检查流程;不要干脆取消类型检查,也不要修改缓存文件里的 jsxDEV。

用原来的并行操作回归

新开发服务加载正常后,再按原顺序运行 sync、check 和 build,确认 dev 的 React runtime 不再被改成生产版本,island 可以水合、事件和热更新正常。同时确认内容同步和正式构建仍成功,不能只证明缓存隔离而遗漏临时服务原来的工作。

如果用了自定义 Astro 或 Vite 缓存目录,核对两条路径确实分开。无需删除整个依赖树或锁文件;保留失败文件和对应版本,更有助于区分缓存覆盖与真实的依赖重复。