Astro 5 SSG 架构深度解析:从 Laravel 迁移的实战经验
从 Laravel + Vue SPA 迁移到 Astro 静态站点生成的完整决策过程、架构对比与踩坑记录。
为什么从 Laravel 迁移到 Astro
Laravel + Vue.js 是一套成熟的全栈方案,但对于内容驱动型网站(博客、作品集),SPA 模式存在两个根本问题:
- 首屏渲染慢:浏览器需要下载并执行 Vue 运行时 + 应用 JS + API 请求,才能看到内容
- SEO 友好性差:搜索引擎爬虫抓取到的是空
<div id="app"></div>,需要额外处理 SSR
Astro 的 SSG(Static Site Generation)在构建时预渲染所有页面为纯 HTML,首屏加载是零 JavaScript 的。
架构对比
| 维度 | Laravel + Vue SPA | Astro SSG |
|---|---|---|
| 首屏 JS | ~200KB (Vue + App) | 0KB |
| TTFB | 300-800ms (DB + PHP) | <50ms (CDN 静态文件) |
| SEO | 需要 Prerender/SSR | 天然支持 |
| 部署 | PHP 服务器 + MySQL | 任意静态托管 |
| 动态内容 | 原生支持 | 需要客户端 JS 或 API |
Islands 架构
Astro 的核心创新是 Islands 架构——页面主体是静态 HTML,交互组件作为”岛屿”按需注水:
---
// 构建时执行:直接访问文件系统
import { getCollection } from 'astro:content';
const posts = await getCollection('blog');
---
<html>
<body>
<!-- 纯 HTML,零 JS -->
<article>{posts[0].data.title}</article>
<!-- 仅此组件需要客户端 JS -->
<MusicPlayer client:load />
</body>
</html>
client:load 指令告诉 Astro:这个 Vue 组件需要在页面加载时注水。其他部分保持纯 HTML。
Content Collections 类型安全
Astro 5 的 Content Collections 提供了编译时类型检查:
// src/content.config.ts
import { defineCollection, z } from 'astro:content';
import { glob } from 'astro/loaders';
const blog = defineCollection({
loader: glob({ pattern: '**/*.md', base: './src/content/blog' }),
schema: z.object({
title: z.string(),
excerpt: z.string(),
category: z.enum(['tech', 'psychology', 'life']),
tags: z.array(z.string()).default([]),
publishedAt: z.coerce.date(),
aiGenerated: true
}),
});
z.coerce.date() 会自动将 YAML 中的字符串日期转换为 Date 对象,无需手动 new Date()。
迁移踩坑记录
1. CSS Reset 覆盖 Tailwind
在 global.css 中写 *{margin:0; padding:0} 在 @import "tailwindcss" 之后,会导致所有 Tailwind 间距工具类失效。Tailwind 4 的 Preflight 已经处理了 reset,不要重复写。
2. 查询参数在 SSG 中不可用
?category=tech 这种查询参数在静态生成模式下无法被服务端处理。解决方案是用客户端 JavaScript 过滤:
// 读取 URL 参数,在浏览器端过滤 DOM 元素
const params = new URLSearchParams(window.location.search);
const cat = params.get('category');
document.querySelectorAll('.post-item').forEach(el => {
el.style.display = el.dataset.category === cat ? 'block' : 'none';
});
3. 图片路径
Astro 的图片优化仅对 import 的图片生效。public/ 目录下的图片直接按路径引用,不做优化。对于大量证书/奖杯图片,放在 public/ 是合理的选择。
性能数据
迁移后的 Lighthouse 分数:
| 指标 | Laravel SPA | Astro SSG |
|---|---|---|
| Performance | 62 | 98 |
| Accessibility | 88 | 96 |
| Best Practices | 90 | 100 |
| SEO | 73 | 100 |
首屏加载从 2.3s 降到 0.4s,LCP 从 3.1s 降到 0.8s。
总结
对于内容驱动型网站,Astro SSG 是目前最优的选择。Islands 架构让你可以在静态页面的任意位置嵌入交互组件,而不需要为整个页面付出 JS 运行时的代价。迁移过程中需要注意 CSS 优先级、查询参数处理和图片路径等问题,但整体迁移成本远低于想象。