Astro 的部署方式取决于你选择的渲染模式(SSG、SSR 或混合模式)。了解不同的部署选项和最佳实践对于成功发布 Astro 项目至关重要。
静态部署(SSG):
对于纯静态站点,可以将构建输出部署到任何静态托管服务。
-
Vercel 部署:
bash# 安装 Vercel CLI npm i -g vercel # 部署 verceljavascript// vercel.json { "buildCommand": "astro build", "outputDirectory": "dist" } -
Netlify 部署:
bash# 安装 Netlify CLI npm i -g netlify-cli # 部署 netlify deploy --prodtoml# netlify.toml [build] command = "astro build" publish = "dist" [[redirects]] from = "/*" to = "/index.html" status = 200 -
GitHub Pages 部署:
javascript// astro.config.mjs import { defineConfig } from 'astro/config'; export default defineConfig({ site: 'https://username.github.io', base: '/repository-name', });bash# 构建并部署 npm run build # 将 dist 目录内容推送到 gh-pages 分支
服务端部署(SSR):
对于需要服务端渲染的应用,需要使用适配器。
-
Vercel SSR 部署:
bashnpx astro add verceljavascript// astro.config.mjs import { defineConfig } from 'astro/config'; import vercel from '@astrojs/vercel/server'; export default defineConfig({ output: 'server', adapter: vercel(), }); -
Netlify Edge Functions:
bashnpx astro add netlifyjavascript// astro.config.mjs import { defineConfig } from 'astro/config'; import netlify from '@astrojs/netlify/edge'; export default defineConfig({ output: 'server', adapter: netlify(), }); -
Node.js 服务器:
bashnpx astro add nodejavascript// astro.config.mjs import { defineConfig } from 'astro/config'; import node from '@astrojs/node'; export default defineConfig({ output: 'server', adapter: node({ mode: 'standalone', }), });bash# 构建并运行 npm run build node ./dist/server/entry.mjs -
Cloudflare Pages:
bashnpx astro add cloudflarejavascript// astro.config.mjs import { defineConfig } from 'astro/config'; import cloudflare from '@astrojs/cloudflare'; export default defineConfig({ output: 'server', adapter: cloudflare(), });
Docker 部署:
dockerfile# Dockerfile FROM node:18-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build FROM node:18-alpine AS runner WORKDIR /app COPY /app/package*.json ./ RUN npm ci --production COPY /app/dist ./dist EXPOSE 4321 CMD ["node", "./dist/server/entry.mjs"]
bash# 构建和运行 Docker 镜像 docker build -t astro-app . docker run -p 4321:4321 astro-app
环境变量配置:
bash# .env.example PUBLIC_API_URL=https://api.example.com DATABASE_URL=postgresql://... SECRET_KEY=your-secret-key
javascript// astro.config.mjs import { defineConfig } from 'astro/config'; export default defineConfig({ vite: { define: { 'import.meta.env.PUBLIC_API_URL': JSON.stringify(process.env.PUBLIC_API_URL), }, }, });
CI/CD 配置:
yaml# .github/workflows/deploy.yml name: Deploy on: push: branches: [main] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Setup Node.js uses: actions/setup-node@v3 with: node-version: '18' cache: 'npm' - name: Install dependencies run: npm ci - name: Build run: npm run build - name: Deploy to Vercel uses: amondnet/vercel-action@v20 with: vercel-token: ${{ secrets.VERCEL_TOKEN }} vercel-org-id: ${{ secrets.ORG_ID }} vercel-project-id: ${{ secrets.PROJECT_ID }} vercel-args: '--prod'
性能优化部署:
-
启用压缩:
javascript// astro.config.mjs export default defineConfig({ compressHTML: true, }); -
配置 CDN:
javascript// astro.config.mjs export default defineConfig({ build: { assets: '_astro', }, }); -
缓存策略:
javascript// src/middleware.ts export const onRequest = async (context, next) => { const response = await next(); if (context.url.pathname.startsWith('/_astro/')) { response.headers.set('Cache-Control', 'public, max-age=31536000, immutable'); } return response; };
监控和日志:
typescript// src/lib/monitoring.ts export function logDeploymentInfo() { console.log({ version: import.meta.env.PUBLIC_VERSION, buildTime: new Date().toISOString(), environment: import.meta.env.MODE, }); } // 在入口文件中调用 logDeploymentInfo();
最佳实践:
-
选择合适的部署平台:
- 静态站点:Vercel、Netlify、GitHub Pages
- SSR 应用:Vercel、Netlify Edge、Node.js
- 边缘计算:Cloudflare Workers、Vercel Edge
-
环境变量管理:
- 使用
.env文件进行本地开发 - 在部署平台配置生产环境变量
- 区分公开和私有变量
- 使用
-
自动化部署:
- 使用 CI/CD 管道
- 自动运行测试
- 自动部署到生产环境
-
监控和日志:
- 设置错误追踪
- 监控性能指标
- 记录部署信息
-
回滚策略:
- 保留多个部署版本
- 快速回滚到稳定版本
- 使用功能标志
Astro 提供了灵活的部署选项,可以根据项目需求选择最适合的部署策略。