OGP画像を簡単に作れるvercelのRuntimeを作りました!

2 min read読了の目安(約2200字

どうも、 @uzimaru0000 です。
タイトルにもあるように OGP 画像を簡単に作れる vercel の Runtime を作りました。

作ったもの

https://github.com/uzimaru0000/vercel-og-image

使い方としては vercel.json に以下のように記述します。

{
  "version": 2,
  "functions": {
    "api/**/*.(html|tsx)": {
      "runtime": "@uzimaru0000/vercel-og-image@1.4.0",
      "memory": 1024
    }
  }
}

functionsapi/**/*.(html|tsx) に対応するファイルがこの Runtime で処理されます。
htmltsx に対応しています。

tsx は、React の Component を default で export することでその Component を元にした OGP 画像が生成されます。

// ベタ書きでCSSを書きたい
const Style = () => (
  <style
    dangerouslySetInnerHTML={{
      __html: `
    @import url('https://fonts.googleapis.com/css2?family=Langar&display=swap');

    .body {
        margin: 0;
        padding: 0;
    }

    .wrapper {
        display: flex;
        width: 100%;
        height: 100vh;
        justify-content: center;
        align-items: center;
    }

    .langar {
        font-family: 'Langar';
        font-size: 64px;
    }
`,
    }}
  />
);

export default ({ query }) => (
  <html>
    <head>
      <Style />
    </head>
    <body>
      <div className="wrapper">
        <div className="langar">{query.title || 'Hello'}</div>
        <div>generated from tsx</div>
      </div>
    </body>
  </html>
);

このような Component を作ることで下のような画像が生成されます。

この Component には下のような props が渡ってきます。

interface Props {
  query: { [key: string]: string };
  path: string;
}

query は渡ってきたクエリパラメータが入っています。
path はその Lambda 関数にアクセスされたパスが入っています。

やっていること

この Runtime でやっていることは

https://github.com/vercel/og-image

とほとんど同じものです。
このリポジトリでは作成される画像のテンプレートを HTML 文字列にしているのですがその部分を指定されたファイルの情報にしているという感じです。

html の場合はそのままで良いのですが、tsxtsc でコンパイルして JavaScript に変換しています。
現在は jsx を利用することは出来ないのですが、後々利用できるようにしていきたいです。
また、今の状態ですと styled-component などの外部のライブラリを利用しようとすると動かないなどの問題点もあります。

まとめ

OGP 作成に FaaS を使っている人、特に vercel/og-image を fork して利用している人がいたら使ってみて欲しいです。
使ってみた感想やバグ報告、コントリビュートなど大歓迎です!!
僕のTwitter にリプをするなり、リポジトリ の issue に投稿するなり、何でも大丈夫です!!