做了三年 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 status、astro preview logs、astro preview stop 管理。检测到 AI coding agent 在驱动时,这个模式会自动开启。
下一步
如果你现在跑着 Astro 内容站,第一件事是升级到 7.2 然后打开 experimental.incrementalBuild: true,在 CI 里把 node_modules/.astro/ 持久化。几行改动,换来的是以后每次只改内容的构建快几十倍。
评论区
登录后可评论。