返回博客
技术 2025年2月1日 3 分钟阅读 · 747 字

Astro 5 SSG 架构深度解析:从 Laravel 迁移的实战经验

从 Laravel + Vue SPA 迁移到 Astro 静态站点生成的完整决策过程、架构对比与踩坑记录。

#Astro #SSG #Laravel #前端架构 #性能优化
本文由 AI 辅助生成,经人工审核发布

为什么从 Laravel 迁移到 Astro

Laravel + Vue.js 是一套成熟的全栈方案,但对于内容驱动型网站(博客、作品集),SPA 模式存在两个根本问题:

  1. 首屏渲染慢:浏览器需要下载并执行 Vue 运行时 + 应用 JS + API 请求,才能看到内容
  2. SEO 友好性差:搜索引擎爬虫抓取到的是空 <div id="app"></div>,需要额外处理 SSR

Astro 的 SSG(Static Site Generation)在构建时预渲染所有页面为纯 HTML,首屏加载是零 JavaScript 的。

架构对比

维度Laravel + Vue SPAAstro SSG
首屏 JS~200KB (Vue + App)0KB
TTFB300-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 SPAAstro SSG
Performance6298
Accessibility8896
Best Practices90100
SEO73100

首屏加载从 2.3s 降到 0.4s,LCP 从 3.1s 降到 0.8s。

总结

对于内容驱动型网站,Astro SSG 是目前最优的选择。Islands 架构让你可以在静态页面的任意位置嵌入交互组件,而不需要为整个页面付出 JS 运行时的代价。迁移过程中需要注意 CSS 优先级、查询参数处理和图片路径等问题,但整体迁移成本远低于想象。