RemixのMetaFunctionの中でURLを取得したい

公開日: 

ゴール

import type { MetaFunction } from '@remix-run/node'; // or cloudflare/deno

export const meta: MetaFunction = () => {
  return {
    title: 'Something cool',
    description: 'This becomes the nice preview on search results.',
    'og:url': `${サイトのURL}`, // こいつを動的に取得したい
  };
};

こんな感じでMetaFunctionの中で OGP の設定をするときにサイトの URL を動的に取得したい!

環境変数とかで URL を定義してしまってもいいけれど、動的に取得できたらありがたいなぁという願望。

ライブラリのバージョン

  • @remix-run/node: v1.19.3

試行錯誤

// 公式より引用
export const meta: MetaFunction = ({ location }) => {
  const searchQuery = new URLSearchParams(location.search).get('q');
  return [{ title: `Search results for "${searchQuery}"` }];
};

locationという引数は取れるようだが、

// locationの中身
 {
  pathname: '/news',
  search: '',
  hash: '',
  state: null,
  key: 'default'
}

pathnameだけで、originまでは取得できず

結論

loaderrequestパラメーターから取得する。

https://remix.run/docs/en/main/route/loader#request

requestパラメーターから url が取得できるので

// loader
export async function loader({ request }: LoaderArgs) {
  const url = new URL(request.url);
  const origin = url.origin;

  return json({
    origin,
  });
}

// meta
export const meta: MetaFunction = ({ data }) => {
  const { origin } = data;

  return {
    'og:url': origin,
  };
};

こんな感じでできた。

最後に

MetaFunctionは内部でごちゃごちゃやる感じじゃなくて、単に情報を meta タグでレンダリングするだけの役割なんですね。ごちゃごちゃするのはloaderの役目っぽい。

では

Bye