做了三年 Astro,每次改一行文档都要等全站重新构建——Astro 7.2 把这件事彻底变了

配了三年 Astro,每次给文档站加个段落,都要坐着等它把所有页面全跑一遍。上万篇 Markdown,全量重新渲染,哪怕你只改了一个字。这是静态站点构建的通病:Astro 7.0 解决了打包阶段的性能,但生成阶段还是每次全量跑。

上周发布的 Astro 7.2,从根本上修了这个问题。

增量构建是什么

Astro 7.2 引入了实验性增量静态构建(Incremental Static Builds)。开启方式很简单,在配置里加一个 flag:

// astro.config.mjs
export default defineConfig({
  experimental: {
    incrementalBuild: true,
  },
});

然后在动态路由的 getStaticPaths() 里返回一个 cacheKey

---
import { getCollection } from astro:content;

export async function getStaticPaths() {
  const posts = await getCollection(blog);
  return posts.map((post) => ({
    params: { slug: post.id },
    props: { post },
    cacheKey: post.digest, // 内容变化时才会重新渲染
  }));
}
---
<h1>{post.data.title}</h1>

机制是这样的:Astro 对每个页面的完整模块图(模板、布局、组件、样式、依赖包)做一次 hash,同时用 cacheKey 追踪数据变化。两者都没变,页面直接复用上一次构建的结果,不做任何渲染。只有当代码或数据变了,才触发对应页面的重新生成。

这个设计把选择权交还给开发者——不带 cacheKey 的路由行为和以前完全一致,不会突然静默跳过构建。

CI 里真正省时间的关键

Astro 把构建缓存存在 node_modules/.astro/ 目录(和内容层、图片缓存放在一起)。CI 里只要把这个目录持久化到下一轮构建,增量效果才能真正体现。

对一个月更一次的内容站,CI 时间可以从几十分钟降到几十秒。对一个 5000 篇文档的大型 docs 站,每次只重跑改了的部分。

另外两个省事的改动

session: false 是另一个实打实的优化。之前即使不用 Session,SSR 产物里也会打包 Session 运行时。Astro 7.2 允许完全关掉它:

export default defineConfig({
  session: false,
});

关掉后,Cloudflare / Netlify / Node 适配器不会接入默认 Session 驱动,Session 运行时从产物里彻底剔除。Astro.session 变成 undefined,但类型层面本来就这么允许的,所以现有的 if (Astro.session) 判断不会报错。

如果你根本没配 Session 驱动,Tree-shaking 现在会自动把这个运行时摇掉,连 session: false 都不用写。

astro preview --background 则让预览服务器可以在后台运行,用 astro preview statusastro preview logsastro preview stop 管理。检测到 AI coding agent 在驱动时,这个模式会自动开启。

下一步

如果你现在跑着 Astro 内容站,第一件事是升级到 7.2 然后打开 experimental.incrementalBuild: true,在 CI 里把 node_modules/.astro/ 持久化。几行改动,换来的是以后每次只改内容的构建快几十倍。

评论区

0 条评论

登录后可评论。

阿柯·前端架构 11 阅读