如何部署 Astro 应用到不同的平台(Vercel、Netlify、Node.js)?有哪些部署最佳实践?
核心答案
Astro 部署分两条路线:静态站点(SSG)直接丢到 Vercel/Netlify 就行,零配置;SSR 应用则必须装对应平台的适配器(@astrojs/vercel、@astrojs/netlify、@astrojs/node),在 astro.config.mjs 里设 output: 'server' 并注册适配器。
选平台的关键判断:纯内容站选哪个都差不多,Vercel 对 SSR 支持更成熟(支持 ISR 缓存),Netlify 的 Edge Functions 延迟更低,自建服务器用 Node.js 适配器跑 node ./dist/server/entry.mjs。
静态部署:三行命令搞定
Vercel 和 Netlify 对 SSG 项目开箱即用——连仓库、自动构建、自动部署,不需要任何适配器。GitHub Pages 也没问题,在 astro.config.mjs 里配好 site 和 base 就行。
SSR 部署的关键区别
三个平台的适配器装法一样(npx astro add vercel/netlify/node),但运行时差异很大:
- Vercel:支持 ISR(增量静态再生),设
isr: true可对动态页面做缓存,适合内容偶尔更新的场景 - Netlify:Edge Functions 跑在 Deno runtime 上,冷启动极快,但有些 Node API 用不了
- Node.js:分
standalone和middleware两种模式——前者直接跑,后者可以嵌入 Express/Fastify
Docker 和 CI/CD
Docker 部署本质还是 Node.js 适配器:多阶段构建,builder 阶段装依赖+构建,runner 阶段只拷贝产物。CI/CD 就是标准的 checkout → install → build → deploy 流水线,各平台都有现成 Action。
追问:这些你大概率会被接着问
Q:SSG 和 SSR 能混用吗?
能。设 output: 'hybrid',默认静态,需要动态的页面加 export const prerender = false。
Q:环境变量怎么区分公开和私有?
PUBLIC_ 前缀的变量客户端可见,其他的只在服务端。别把密钥暴露到前端代码里。
Q:部署后首屏慢怎么排查? 先看是不是 SSR 模式下冷启动问题(Edge Functions 可缓解),再查有没有大量未优化图片,最后用 Lighthouse 跑一遍确认瓶颈在渲染还是网络。