升到 Astro 7:Rust 编译器很快,但真正卡住我的是冷缓存

Astro 7 把编译器与 Markdown 管线换成 Rust、打包器换成 Rolldown,构建确实快了一截。这篇记我升级时真正卡住的那三件事,以及为什么构建通过从来不等于能跑。

Astro 7 是 2026 年 6 月 22 日发的。核心一句话:这次发布全是速度。

具体换掉的东西不少:

  • .astro 编译器重写成 Rust
  • Markdown / MDX 走一条新的 Rust 管线
  • 渲染引擎换成队列式
  • 打包器跟着 Vite 8 换成 Rolldown
  • 官方基准里构建快 15–61%
  • 路由缓存转正,另有 Netlify / Vercel / Cloudflare 的 CDN 缓存 provider(实验)
  • 新增 src/fetch.ts 的 Advanced Routing,可以完全接管请求管线
  • 给 AI 编码助手加了检测与 JSON 日志

这一站是 533 页 + 40 个 CSS + 532 页搜索索引。升级本身没费什么劲 —— 真正花时间的是升级之后冒出来的东西。

坑一:CJS-only 依赖在新环境里不再被预打包

升级后第一次 astro sync 直接挂:

require is not defined

根因不是我的代码。内容集合(src/content.config.ts 走 astro/loaders 的 glob)依赖链上有一个 CJS-only 的包,而内容集合是在一个叫 astro 的 Vite environment 里求值的 —— 既不是 client 也不是 ssr。顶层的 optimizeDeps 只喂 client,所以那个包在 astro 环境里没被预打包,模块 runner 就把 CJS 文件按 ESM 求值了。

修法是在配置里补一条指名道姓的环境:

optimizeDeps: { include: ['picomatch'] },                                // client 环境
environments: { astro: { optimizeDeps: { include: ['picomatch'] } } },   // astro 环境

两条缺一不可。只给 astro、不要给 ssr —— 两个都写会让 dev 全站 500。

坑二:热缓存会盖住真实的失败

上面这个错,我一开始是“修好了”的 —— 删掉那段绕法,dev 立刻恢复,build 全绿。

那是假的。node_modules/.vite 在 .gitignore 里,本地永远是热的,而热缓存里有上一轮构建产出的依赖。把缓存删掉重跑,第一步就报同样的错。

判断「某个绕法可以删了」的唯一有效方式是冷缓存复验:删掉 node_modules/.vite,或者干脆在干净机器 / CI 上跑一次。本地全绿什么都不能证明。

坑三:build 通过不等于 dev 能起来

这一站的两个失败模式长得很不一样:

  • astro build 全程正常,但 astro dev 每个请求都返回 500,日志里只有一行「找不到组件实例」。
  • dev 起来后打印 ready,然后每个请求 500。

所以改完构建配置,光看 ready 是不够的 —— 必须真的请求一个页面看它是不是 200。

我现在怎么升级

顺序固定成四步:

  1. 删 node_modules/.vite(以及 .astro),冷缓存跑一次 astro sync
  2. npm run check 要 0/0/0
  3. npm run build 页数对得上
  4. 起 dev,请求至少五个不同路由(首页 / 列表 / 文章 / 应用 / 语言入口页),确认都是 200

第 4 步是最容易省、也最容易出事的一步。省掉它的那几次升级,我都在后面还了回来。

← 返回文章列表

评论

…