Chapter 10

部署:Vercel/Netlify/Cloudflare Pages

掌握 Astro 的各种部署方案,包括适配器配置、图片优化、CI/CD 流水线搭建与性能监控

部署模式概览

三种输出模式

output: 'static'
纯静态生成。构建产物是一堆 HTML/CSS/JS 文件,可部署到任何静态文件服务器(GitHub Pages、S3、Nginx)。无需适配器。
output: 'server'
全站服务端渲染。每个请求都动态渲染,需要服务器运行时。需要安装对应平台的适配器。
output: 'hybrid'
混合模式。默认静态预渲染,个别页面/API 可设置 export const prerender = false 启用 SSR。

部署到 Vercel

# 安装 Vercel 适配器
npx astro add vercel
// astro.config.mjs
import { defineConfig } from 'astro/config';
import vercel from '@astrojs/vercel/serverless';

export default defineConfig({
  output: 'server',
  adapter: vercel({
    // Edge Functions(更快,更便宜)
    edgeMiddleware: true,
    // 图片优化(自动使用 Vercel Image Optimization)
    imageService: true,
    // 增量静态再生(ISR)
    isr: {
      expiration: 60 * 60,  // 1 小时重新生成
    },
  }),
});
# 通过 Vercel CLI 部署
npm install -g vercel
vercel

# 或者直接连接 GitHub 仓库,Vercel 自动部署

部署到 Netlify

npx astro add netlify
import netlify from '@astrojs/netlify';

export default defineConfig({
  output: 'server',
  adapter: netlify({
    edgeMiddleware: true,  // 使用 Netlify Edge Functions
  }),
});

Astro <Image> 图片优化

---
import { Image } from 'astro:assets';
import heroImage from '../assets/hero.jpg';
---

<!-- 本地图片:自动优化为 WebP,生成 srcset -->
<Image
  src={heroImage}
  alt="英雄图"
  width={800}
  height={400}
  format="webp"
  quality={85}
/>

<!-- 远程图片:需要在 astro.config.mjs 中配置允许的域名 -->
<Image
  src="https://example.com/image.jpg"
  alt="远程图片"
  width={400}
  height={300}
  inferSize  <!-- Astro 5+ 自动推断尺寸 -->
/>

CI/CD 配置(GitHub Actions)

# .github/workflows/deploy.yml
name: Deploy to Vercel

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Type check
        run: npx astro check

      - name: Build
        run: npm run build
        env:
          DATABASE_URL: ${{ secrets.DATABASE_URL }}

      - name: Deploy to Vercel
        uses: vercel/action@v1
        with:
          vercel-token: ${{ secrets.VERCEL_TOKEN }}
性能监控:Vercel Speed Insights

Vercel 提供免费的 Speed Insights,可以在 astro.config.mjs 中通过 speedInsights: true 一键启用。它会收集真实用户的 Core Web Vitals 数据(LCP、FID/INP、CLS),帮助发现性能问题。对于 Astro 网站,通常会看到接近完美的分数。

适配器选择指南

@astrojs/vercel — 首选
支持 Serverless 和 Edge Runtime;isr 配置实现增量静态再生(ISR),静态 + 动态两全其美;与 Vercel 图片优化、Analytics 深度集成;免费套餐适合个人项目。
@astrojs/netlify — 成熟稳定
支持 Netlify Functions 和 Edge Functions;netlify.toml 配置重定向规则;表单处理、Identity 服务与 Astro 集成良好;适合已有 Netlify 工作流的团队。
@astrojs/cloudflare — 边缘优先
在 Cloudflare Workers(Edge)上运行,全球节点延迟极低;可访问 Cloudflare KV、D1(SQLite)、R2(对象存储)等产品;注意 Workers 环境限制(无 Node.js 内置模块)。
@astrojs/node — 自托管
生成标准 Node.js HTTP 服务,用于自托管服务器(VPS、Docker);支持 standalone 模式(自带静态文件服务);适合需要完全控制服务器环境的场景。

部署到 Cloudflare Pages

// astro.config.mjs
import cloudflare from '@astrojs/cloudflare';

export default defineConfig({
  output: 'server',
  adapter: cloudflare({
    mode: 'directory',  // 'directory' 或 'advanced'
    platformProxy: {
      enabled: true,      // 本地开发时模拟 Cloudflare 环境
    },
  }),
});
// 在 API 端点中访问 Cloudflare 绑定
export const GET: APIRoute = async ({ locals }) => {
  // locals.runtime.env 是 Cloudflare 的环境绑定
  const { env } = locals.runtime;

  // 访问 KV 存储
  const value = await env.MY_KV.get('key');

  // 访问 D1 数据库
  const result = await env.DB.prepare('SELECT * FROM posts').all();

  return new Response(JSON.stringify(result.results));
};

本章小结

本章核心要点
完成!你已掌握 Astro 全貌

从 Islands 架构理念,到内容集合、多框架集成、SSR 模式,再到 SEO 优化与生产部署,你已经系统了解了 Astro 5 的核心特性。下一步,建议动手构建一个真实项目:博客、文档站或个人主页,将所学知识付诸实践。Astro 官方文档(docs.astro.build)也是极佳的参考资料。