logoブルーベリーモヒート
> Blog

Next.js + MDX にツイートを埋め込む方法【機能追加】

最終更新日:
Tweet

Hi there 👋 Blueberry Mojito(略して b13o)は、 React 開発を学習するコミュニティです! 初心者が、モダンな技術スタックで、 フロントエンドアプリを作れるようになるために、: - 勉強会 - ハンズオンワークショップ - 共同プロジェクト などを行っています 🫐🌿 #b13o b13o.com

9
Reply

はじめに

ブログやドキュメントサイトでは、
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ライブラリを使用します。

このライブラリは、以下の特徴を持っています:

まずは、プロジェクトに 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 を変換します:

これにより、通常のリンクテキストや文章中に埋め込まれた URL は変換されません。

2. キャッシング対応

大量のツイートを埋め込む場合、Twitter API のレート制限に注意が必要です。

react-tweetは内部でキャッシュを実装していますが、
さらに Next.js のunstable_cacheを使用して、サーバーサイドでキャッシュを実装することも検討できます。

まだ、実験的な機能ですが、便利ですね!

おわりに

この記事では、Next.js+MDX のアプリケーションに、
Twitter/X の埋め込み機能を追加する方法を紹介しました。

単に URL を貼るだけでツイートが埋め込まれるようになると、快適ですね!

最後まで読んでいただき、ありがとうございます 🥳

Happy Hacking ! :)

参考

最新の投稿をチェック

b13o コミュニティは、React 開発を学習するコミュニティです!
公式 X で、新着記事や勉強会イベントの情報を、チェックしてください 🙌