はじめに
ブログやドキュメントサイトでは、
Twitter のツイートを埋め込んで内容を豊かにすることがよくありますよね。
今回は、Next.js/App Router と MDX で構築されたアプリケーションに、
URL を貼るだけでツイートを埋め込む機能を追加する方法を、紹介します。
機能追加した、記録ですー 🙌
実際の使用方法
使い方としては、
以下のように MDX または md ファイル内に Twitter(X)の URL を貼るだけで、ツイートが埋め込まれます。
この記事の冒頭の例:
https://x.com/b13ocom/status/1862896133045178476
## はじめに
ブログやドキュメントサイトでは、
[Twitter のツイート](https://x.com/b13ocom/status/1862896133045178476)を埋め込んで内容を豊かにすることがよくありますよね。
今回は、Next.js/App Router と MDX で構築されたアプリケーションに、
**URL を貼るだけでツイートを埋め込む機能を追加する方法**を、紹介します。
このように、特別なコンポーネント構文を使わずに、
URL を貼るだけでツイートが自動的に埋め込まれます。
文章の中にある場合は、通常のリンクとしても表示できますね!
執筆の流れを妨げることなく、素早くコンテンツを追加できますね。
react-tweet の紹介
ツイート埋め込みの実装には、Vercel が提供するreact-tweetライブラリを使用します。
このライブラリは、以下の特徴を持っています:
- サーバーサイドレンダリング(SSR)に対応
- 軽量で高速
- カスタマイズ可能なスタイル
- Twitter API のレート制限を考慮したキャッシング機能
まずは、プロジェクトに react-tweet をインストールします:
npm install react-tweet
# または
yarn add react-tweet
実装手順
1. TwitterCard コンポーネントの作成
まず、ツイートを表示するためのTwitterCard
コンポーネントを作成します:
"use client";
import { Tweet } from "react-tweet";
import "react-tweet/assets/light-theme.css";
import styles from "./twitter-card.module.css";
export default function TwitterCard({ id }: { id: string }) {
return (
<div className={styles.twitterCard}>
<Tweet id={id} />
</div>
);
}
react-tweet をラッピングしています。
MDX ばら、これだけでも、Twitter の埋め込み機能を実装することができますね!
2. rehype プラグインの作成
次に、Twitter URL を自動検出してTwitterCard
コンポーネントに変換する rehype プラグインを作成します:
import { visit } from "unist-util-visit";
import { Element, Root } from "hast";
// Twitter/X URLパターンの正規表現
const TWITTER_URL_REGEX =
/^https?:\/\/(www\.)?(twitter|x)\.com\/(?:#!\/)?(\w+)\/status(?:es)?\/(\d+)(?:\?.*)?$/;
export function rehypeTwitterUrls() {
return (tree: Root) => {
visit(tree, "element", (node: Element, _, parent?: Element) => {
// a要素のみを処理
if (node.tagName !== "a") return;
// hrefプロパティを確認
const href = node.properties?.href;
if (!href || typeof href !== "string") return;
// Twitter/X URLにマッチするか確認
const match = href.match(TWITTER_URL_REGEX);
if (!match || !match[4]) return;
// 単独のURLの場合のみ変換(段落内にURLのみが存在する場合)
if (
parent?.type === "element" &&
parent?.tagName === "p" &&
parent.children.length === 1
) {
// ツイートIDを抽出
const tweetId = match[4];
// TwitterCardコンポーネントに変換
const twitterCardNode: Element = {
type: "element",
tagName: "TwitterCard",
properties: { id: tweetId },
children: [],
position: node.position,
};
// 親のpタグを置き換える
if (parent) {
parent.tagName = twitterCardNode.tagName;
parent.properties = twitterCardNode.properties;
parent.children = twitterCardNode.children;
}
}
});
};
}
3. 設定ファイルの更新
あとは適宜、扱いの md、MDX ライブラリの設定を更新するだけですね 👍
実装のポイント
1. URL の検出
rehype プラグインでは、次の条件を満たす場合のみ Twitter の URL を変換します:
- リンク(a 要素)である
- URL が Twitter/X のツイートパターンに一致する
- リンクが段落(p 要素)内で単独で存在する
これにより、通常のリンクテキストや文章中に埋め込まれた URL は変換されません。
2. キャッシング対応
大量のツイートを埋め込む場合、Twitter API のレート制限に注意が必要です。
react-tweet
は内部でキャッシュを実装していますが、
さらに Next.js のunstable_cache
を使用して、サーバーサイドでキャッシュを実装することも検討できます。
まだ、実験的な機能ですが、便利ですね!
おわりに
この記事では、Next.js+MDX のアプリケーションに、
Twitter/X の埋め込み機能を追加する方法を紹介しました。
単に URL を貼るだけでツイートが埋め込まれるようになると、快適ですね!
最後まで読んでいただき、ありがとうございます 🥳
Happy Hacking ! :)