部署架构概述
GABA Blog 选择 Vercel 作为部署平台,主要基于以下考虑:
- 开发者友好:无缝的 Git 集成和自动部署
- 性能优秀:全球 CDN 和边缘网络
- 成本效益:个人项目免费额度充足
- 功能丰富:支持 Serverless Functions、环境变量等
- 监控完善:内置性能监控和分析工具
Vercel 配置详解
vercel.json 配置解析
json
{
"headers": [
{
"source": "/assets/(.*)",
"headers": [
{
"key": "Cache-Control",
"value": "max-age=31536000, immutable"
}
]
}
]
}配置说明
- 缓存策略:静态资源(assets)设置一年缓存(31536000秒)
- immutable 标志:资源内容不会改变,浏览器可以永久缓存
- 路径匹配:使用正则表达式匹配
/assets/目录下的所有文件
缓存策略优化
资源分类与缓存策略
| 资源类型 | 缓存策略 | 说明 |
|---|---|---|
| HTML 文件 | max-age=3600, must-revalidate | 内容可能更新,需要重新验证 |
| CSS/JS 文件 | max-age=31536000, immutable | 通过文件哈希确保内容不变 |
| 图片资源 | max-age=31536000, immutable | 内容不变,永久缓存 |
| 字体文件 | max-age=31536000, immutable | 内容不变,永久缓存 |
完整的缓存配置示例
json
{
"headers": [
{
"source": "/assets/(.*)",
"headers": [
{
"key": "Cache-Control",
"value": "max-age=31536000, immutable"
},
{
"key": "Vary",
"value": "Accept-Encoding"
}
]
},
{
"source": "/(.*).(html|htm)",
"headers": [
{
"key": "Cache-Control",
"value": "max-age=3600, must-revalidate"
}
]
},
{
"source": "/(.*).(css|js)",
"headers": [
{
"key": "Cache-Control",
"value": "max-age=31536000, immutable"
}
]
}
]
}构建优化配置
Vite 构建配置优化
typescript
// .vitepress/config.mts 中的构建配置
vite: {
build: {
cssCodeSplit: true,
sourcemap: false,
minify: 'esbuild'
}
}图片优化配置
typescript
import viteImagemin from 'vite-plugin-imagemin'
export default defineConfig({
vite: {
plugins: [
viteImagemin({
gifsicle: {
optimizationLevel: 7,
interlaced: false,
},
optipng: {
optimizationLevel: 7,
},
mozjpeg: {
quality: 80,
},
pngquant: {
quality: [0.8, 0.9],
speed: 4,
},
svgo: {
plugins: [{ name: 'removeViewBox' }, { name: 'removeEmptyAttrs', active: false }],
},
}),
],
},
})构建优化策略
- 代码分割:将第三方库分离,提高缓存利用率
- 文件哈希:使用内容哈希命名,支持长期缓存
- 资源内联:小资源内联减少 HTTP 请求
- 目标版本:使用现代 JavaScript 特性
- 图片压缩:自动压缩图片资源
性能监控与分析
Google Analytics 4 集成
html
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
<script>
window.dataLayer = window.dataLayer || []
function gtag() {
dataLayer.push(arguments)
}
gtag('js', new Date())
gtag('config', 'G-XXXXXXXXXX')
</script>自定义性能监控
typescript
export class PerformanceMonitor {
static trackPageView() {
if (typeof window.gtag !== 'undefined') {
window.gtag('event', 'page_view', {
page_title: document.title,
page_location: window.location.href,
page_path: window.location.pathname,
})
}
}
static trackCustomMetric(name: string, value: number) {
if (typeof window.gtag !== 'undefined') {
window.gtag('event', 'custom_metric', {
metric_name: name,
metric_value: value,
})
}
}
static trackLCP(entry: PerformanceEntry) {
this.trackCustomMetric('lcp', entry.startTime)
}
}
if ('PerformanceObserver' in window) {
const observer = new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
if (entry.entryType === 'largest-contentful-paint') {
PerformanceMonitor.trackLCP(entry)
}
}
})
observer.observe({ entryTypes: ['largest-contentful-paint'] })
}部署流程优化
开发脚本使用
bash
# 开发模式
pnpm dev
# 构建生产版本
pnpm build
# 预览构建结果
pnpm preview
# 更新依赖并构建
pnpm update本地构建测试
bash
# 构建
pnpm build
# 预览
pnpm preview
# 检查构建输出
ls -la .vitepress/dist/
# 检查文件大小
find .vitepress/dist/ -type f -name "*.js" -exec du -h {} \;安全优化策略
安全头部配置
json
{
"headers": [
{
"source": "/(.*)",
"headers": [
{
"key": "X-Content-Type-Options",
"value": "nosniff"
},
{
"key": "X-Frame-Options",
"value": "DENY"
},
{
"key": "X-XSS-Protection",
"value": "1; mode=block"
},
{
"key": "Referrer-Policy",
"value": "strict-origin-when-cross-origin"
}
]
}
]
}CSP 内容安全策略
html
<meta
http-equiv="Content-Security-Policy"
content="
default-src 'self';
script-src 'self' 'unsafe-inline' https://www.googletagmanager.com;
style-src 'self' 'unsafe-inline';
img-src 'self' data: https:;
font-src 'self';
connect-src 'self' https://www.google-analytics.com;
"
/>故障排除与调试
部署问题排查
bash
# 本地构建测试
pnpm build
# 预览构建结果
pnpm preview
# 检查构建输出
ls -la .vitepress/dist/
# 检查缓存头
curl -I https://blog.crudclass.com/assets/main.js性能问题排查
typescript
const measurePerformance = (name: string, callback: () => void) => {
const start = performance.now()
callback()
const duration = performance.now() - start
console.log(`[Performance] ${name}: ${duration.toFixed(2)}ms`)
if (duration > 100) {
console.warn(`[Performance Warning] ${name} took ${duration.toFixed(2)}ms`)
}
}最佳实践总结
1. 部署最佳实践
- 使用 immutable 缓存策略优化静态资源
- 配置合理的 CDN 缓存规则
- 设置安全头部保护网站安全
- 监控 Core Web Vitals 指标
2. 性能最佳实践
- 代码分割和懒加载
- 资源压缩和优化
- 图片懒加载和响应式图片
- 字体优化和预加载
- 减少第三方依赖
3. 监控最佳实践
- 集成 Google Analytics 4
- 监控 Core Web Vitals
- 设置错误监控
- 定期性能审计
总结
通过合理的部署优化策略,GABA Blog 在 Vercel 上实现了优秀的性能表现:
- 极快的加载速度:通过缓存策略和 CDN 优化
- 优秀的用户体验:通过性能监控和优化
- 可靠的部署流程:通过自动化构建
- 完善的安全防护:通过安全头部配置
- 持续的监控改进:通过数据分析优化
这些优化策略不仅提升了博客的性能和用户体验,也为后续的扩展和维护打下了坚实的基础。