0

0

自动化 OG 图像:从手动设计到 API 驱动生成

聖光之護

聖光之護

发布时间:2024-12-07 20:42:03

|

789人浏览过

|

来源于dev.to

转载

自动化 og 图像:从手动设计到 api 驱动生成

从手动创建 opengraph 图像到实现自动化 api 驱动系统的旅程代表了不断增长的 web 应用程序的关键演变。今天,我将分享我如何在 gleam.so 转变这一流程,从单独的 figma 设计转向处理数千张图像的自动化系统。

手动阶段:了解基线

最初,像许多开发人员一样,我手动创建了 og 图像:

// early implementation
const getogimage = (postid: string) => {
  return `/images/og/${postid}.png`;  // manually created in figma
};

此过程通常涉及:

  1. 打开每张新图像的figma
  2. 调整文本和元素
  3. 导出为正确的尺寸
  4. 上传并链接图像

每张图像的平均时间: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 => {
  const svg = rendertemplate(template, content);
  return converttoimage(svg);
};

这将每个图像的创建时间减少到 5 分钟,但仍然需要手动干预。

构建api层

下一个演变引入了适当的 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();
  private readonly redis: redis;
  private readonly cdn: cdnstorage;

  async getimage(key: string): promise {
    // 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 {
    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 (
    
      
      
      
    
  );
}

绩效结果

自动化系统取得了重大改进:

营销型企业网站源码响应式界面1.0.1
营销型企业网站源码响应式界面1.0.1

这几年企业营销型网站成为PC端风靡一时的设计主流,主要特点就是首页长度比较长,首页展示的内容量非常大,通过对首页的大量渲染,突出企业优势、产品服务优势等众多信息,让用户在页面停留时间更久,对企业的映像更加深刻,从而达到营销的目的。但是对于大部分的营销型网站来说,一个最大的弱点就是在手机上的用户体验都比较差,而这又恰好是自适应网站所具备的优势,自适应网站能够自动检测访问者浏览设备的分辨率,从而根据访

下载
  • 生成时间:
  • 缓存命中率:95%
  • 错误率:
  • cpu 使用率:之前实施的 15%
  • 每张图像的成本:0.0001 美元(体力劳动成本约为 5 美元)

主要经验教训

通过这次自动化之旅,出现了一些重要的见解:

  1. 图像生成策略

    • 预热缓存以获取可预测的内容
    • 实施故障后备
    • 首先优化模板渲染
  2. 资源管理

    • 实现请求排队
    • 监控内存使用情况
    • 积极缓存
  3. 错误处理

    • 提供后备图像
    • 全面记录失败
    • 监控生成指标

前进的道路

og图像自动化的未来在于:

  1. 人工智能增强的模板选择
  2. 动态内容优化
  3. 预测性缓存变暖
  4. 实时性能调整

简化实施

虽然构建自定义解决方案可以提供宝贵的学习经验,但它需要大量的开发和维护工作。这就是我构建 gleam.so 的原因,它将整个自动化堆栈作为服务提供。

现在您可以:

  • 视觉设计模板
  • 免费预览所有选项
  • 通过 api 生成图像(针对终身用户的公开 beta 测试)
  • 专注于您的核心产品

终生访问 75% 折扣即将结束 ✨

分享您的经验

您是否已自动化生成 og 图像?您面临哪些挑战?在评论中分享您的经验!


让 opengraph 发挥作用系列的一部分。关注以获取更多 web 开发见解!

相关文章

驱动精灵
驱动精灵

驱动精灵基于驱动之家十余年的专业数据积累,驱动支持度高,已经为数亿用户解决了各种电脑驱动问题、系统故障,是目前有效的驱动软件,有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

386

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

569

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

386

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

569

2023.08.10

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

510

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

244

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

254

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

5267

2023.08.17

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

10

2026.01.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

Redis+MySQL数据库面试教程
Redis+MySQL数据库面试教程

共72课时 | 6.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号