有没有库可以通过 jsx 生成对应的图像?

目前找到一个 next/og 库,但是生成的是一个图像响应。有没有类似的可以直接生成图像的库,最好支持生成多种图像格式。

import { ImageResponse } from 'next/og'
 
// Image metadata
export const alt = 'About Acme'
export const size = {
  width: 1200,
  height: 630,
}
 
export const contentType = 'image/png'
 
// Image generation
export default async function Image() {
  return new ImageResponse(
    (
      // ImageResponse JSX element
      <div
        style={{
          fontSize: 128,
          background: 'white',
          width: '100%',
          height: '100%',
          display: 'flex',
          alignItems: 'center',
          justifyContent: 'center',
        }}
      >
        About Acme
      </div>
    ),
    // ImageResponse options
    {
      ...size,
    }
  )
}

ImageResponse 可以通过 jsx 渲染为图像,并为客户端响应该图像。但是这个专为 SEO 服务的,有没有更通用的库,不用直接返回图像响应,返回图像就可以了。参数也不要求必须是 jsx(本质上 ReactNode),可以是 html 字符串。运行环境在 node 环境。

阅读 1.7k
avatarAI BotBETA

答案:

目前,没有直接通过 JSX 生成图像的库能够直接输出多种图像格式的文件。JSX 是 JavaScript 的一种语法扩展,主要用于描述 React 组件的结构,它本身并不涉及图像的生成。

next/og 这样的库生成的是图像的响应,即它生成的是一个可以在网页中展示的图像内容,而不是一个可以保存为文件的图像。这种库通常用于生成 Open Graph 图像,这些图像主要用于在社交媒体上展示网页的预览。

如果你需要生成图像并保存为文件,你可能需要使用其他的库或工具。例如,你可以使用像 sharpjimpcanvas 这样的库来在 Node.js 环境中处理图像。这些库允许你创建图像、绘制形状、添加文本等,并可以将结果保存为 PNG、JPEG 等多种格式的图像文件。

另外,如果你希望在前端生成图像并允许用户下载,你可以使用 HTML5 的 canvas API 来绘制图像,并使用 toDataURL 方法将 canvas 内容转换为数据 URL,然后提供一个链接让用户下载。但请注意,这种方法生成的图像质量和格式可能有限制。

如果你需要更高级的图像生成功能,比如基于 JSX 的模板生成图像,你可能需要自定义一个解决方案,或者使用像 Photoshop 或 Illustrator 这样的专业图形设计软件,并通过脚本或插件来生成图像。但这样的解决方案通常会更复杂,并且可能需要更多的学习和配置时间。

3 个回答

jsx 是模版,跟生成图像没有任何关系。

js 当然可以生成图像,比如 html2canvas。

og 是 SEO 优化用的,跟你的需求无关。

建议使用Node.js写一个服务,服务接收HTML字符串作为入参,使用puppeteer等渲染html, 再调用 Page.screenshot() API对页面进行截图,返回给客户端

客户端使用ReactDOM.render(<YourComponent/>)将组件渲染为html字符串,获取后传递给Node.js服务

使用 puppeteer 截屏渲染

实现步骤:

  1. 安装 puppeteer:

    npm install puppeteer
  2. 编写代码渲染 JSX 并截图:

    const puppeteer = require('puppeteer');
    
    (async () => {
     // 启动无头浏览器
     const browser = await puppeteer.launch();
     const page = await browser.newPage();
    
     // 在页面中加载 React 组件
     await page.setContent(`
     <div id="root"></div>
     <script src="https://unpkg.com/react@17/umd/react.production.min.js"></script>
     <script src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js"></script>
     <script>
       const App = () => React.createElement('div', null, 'Hello, world!');
       ReactDOM.render(React.createElement(App), document.getElementById('root'));
     </script>
     `);
    
     // 截图并保存为图片
     await page.screenshot({ path: 'jsx-screenshot.png' });
    
     // 关闭浏览器
     await browser.close();
    })();
推荐问题