Satori:将 HTML 和 CSS 转换为 SVG 的启发式库。
注意
要在你的项目中使用 Satori 生成 PNG 图像,如开放图谱图像和社交卡片,请查看我们的公告和Vercel 的开放图谱图像生成 →
要在 Next.js 中使用它,请查看 Next.js 开放图谱图像生成模板 →
Satori 支持 JSX 语法,这使得它非常易于使用。以下是基本用法概述:
// api.jsx import satori from 'satori' const svg = await satori( <div style={{ color: 'black' }}>你好,世界</div>, { width: 600, height: 400, fonts: [ { name: 'Roboto', // 使用 `fs`(仅限 Node.js)或 `fetch` 将字体读取为 Buffer/ArrayBuffer 并在此处提供 `data`。 data: robotoArrayBuffer, weight: 400, style: 'normal', }, ], }, )
Satori 将把元素渲染成一个 600×400 的 SVG,并返回 SVG 字符串:
'<svg ...><path d="..." fill="black"></path></svg>'
在底层,它处理布局计算、字体、排版等,生成与浏览器中完全相同的 HTML 和 CSS 的 SVG。
<br/>Satori 只接受纯粹且无状态的 JSX 元素。你可以使用 HTML 元素的子集(见下文),或自定义 React 组件,但不支持 React API,如 useState
、useEffect
、dangerouslySetInnerHTML
。
如果你没有启用 JSX 转译器,你可以直接传递具有 type
、props.children
和 props.style
(以及其他属性)的类 React 元素对象:
await satori( { type: 'div', props: { children: '你好,世界', style: { color: 'black' }, }, }, options )
由于其特殊用例,Satori 支持有限的 HTML 和 CSS 功能子集。通常,只实现了静态和可见的元素和属性。
例如,<input>
HTML 元素、cursor
CSS 属性不在考虑范围内。而且你不能使用 <style>
标签或通过 <link>
或 <script>
使用外部资源。
此外,Satori 不保证 SVG 会 100% 匹配浏览器渲染的 HTML 输出,因为 Satori 基于 SVG 1.1 规范实现了自己的布局引擎。
你可以在这里找到支持的 HTML 元素及其预设样式列表。
你可以使用 <img>
嵌入图像。但建议设置 width
和 height
属性:
await satori( <img src="https://picsum.photos/200/300" width={200} height={300} />, options )
使用 background-image
时,如果你没有指定尺寸,图像默认会被拉伸以适应元素。
如果你想将生成的 SVG 渲染为其他图像格式(如 PNG),最好直接使用 base64 编码的图像数据(或 buffer)作为 props.src
,这样 Satori 就不需要额外的 I/O:
await satori( <img src="https://raw.githubusercontent.com/vercel/satori/main/data:image/png;base64,..." width={200} height={300} />, // 或 src={arrayBuffer}, src={buffer} options )
Satori 使用与 React Native 相同的 Flexbox 布局引擎,它不是一个完整的 CSS 实现。然而,它支持规范的一个子集,涵盖了大多数常用的 CSS 功能:
<table> <thead> <tr> <th>属性</th> <th>属性扩展</th> <th>支持的值</th> <th>