從手動建立 OpenGraph 映像到實現自動化 API 驅動系統的旅程代表了不斷增長的 Web 應用程式的關鍵演變。今天,我將分享我如何在 gleam.so 轉變這個流程,從單獨的 Figma 設計轉向處理數千張影像的自動化系統。
最初,像許多開發人員一樣,我手動建立了 OG 影像:
// Early implementation const getOGImage = (postId: string) => { return `/images/og/${postId}.png`; // Manually created in Figma };
此過程通常涉及:
每張影像的平均時間:15-20 分鐘。
第一個自動化步驟涉及建立可重複使用範本:
interface OGTemplate { layout: string; styles: { title: TextStyle; description?: TextStyle; background: BackgroundStyle; }; dimensions: { width: number; height: number; }; } const generateFromTemplate = async ( template: OGTemplate, content: Content ): Promise<Buffer> => { const svg = renderTemplate(template, content); return convertToImage(svg); };
這將每個影像的建立時間減少到 5 分鐘,但仍需要手動幹預。
下一個演進引入了適當的 API:
// api/og/route.ts import { ImageResponse } from '@vercel/og'; import { getTemplate } from '@/lib/templates'; export const config = { runtime: 'edge', }; export async function GET(request: Request) { try { const { searchParams } = new URL(request.url); const template = getTemplate(searchParams.get('template') || 'default'); const content = { title: searchParams.get('title'), description: searchParams.get('description'), }; const imageResponse = new ImageResponse( renderTemplate(template, content), { width: 1200, height: 630, } ); return imageResponse; } catch (error) { console.error('OG Generation failed:', error); return new Response('Failed to generate image', { status: 500 }); } }
效能最佳化需要多個快取層:
class OGCache { private readonly memory = new Map<string, Buffer>(); private readonly redis: Redis; private readonly cdn: CDNStorage; async getImage(key: string): Promise<Buffer | null> { // Memory cache if (this.memory.has(key)) { return this.memory.get(key); } // Redis cache const redisResult = await this.redis.get(key); if (redisResult) { this.memory.set(key, redisResult); return redisResult; } // CDN cache const cdnResult = await this.cdn.get(key); if (cdnResult) { await this.warmCache(key, cdnResult); return cdnResult; } return null; } }
處理增加的負載需要仔細的資源管理:
class ResourceManager { private readonly queue: Queue; private readonly maxConcurrent = 50; private activeJobs = 0; async processRequest(params: GenerationParams): Promise<Buffer> { if (this.activeJobs >= this.maxConcurrent) { return this.queue.add(params); } this.activeJobs++; try { return await this.generateImage(params); } finally { this.activeJobs--; } } }
以下是這一切在 Next.js 應用程式中的組合方式:
// components/OGImage.tsx export function OGImage({ title, description, template = 'default' }) { const ogUrl = useMemo(() => { const params = new URLSearchParams({ title, description, template, }); return `/api/og?${params.toString()}`; }, [title, description, template]); return ( <Head> <meta property="og:image" content={ogUrl} /> <meta property="og:image:width" content="1200" /> <meta property="og:image:height" content="630" /> </Head> ); }
自動化系統取得了重大改進:
透過這次自動化之旅,出現了一些重要的見解:
影像產生策略
資源管理
錯誤處理
OG影像自動化的未來在於:
雖然建立自訂解決方案可以提供寶貴的學習經驗,但它需要大量的開發和維護工作。這就是我建立 gleam.so 的原因,它將整個自動化堆疊作為服務提供。
現在您可以:
終身訪問 75% 折扣即將結束 ✨
您是否已自動化產生 OG 影像?您面臨哪些挑戰?在評論中分享您的經驗!
讓 OpenGraph 發揮作用系列的一部分。關注以獲取更多 Web 開發見解!
以上是自動化 OG 影像:從手動設計到 API 驅動生成的詳細內容。更多資訊請關注PHP中文網其他相關文章!