top
技術

本題

HiLow Blog の開発メモやTIPSをまとめておくページです。

使用技術

Next.js + TailwindCSS + Vercel + Notion (Headless CMS)

Next.js 関連

  • 公式チュートリアル

  • ISR 対応について

getStaticProps メソッドの戻り値に revalidate を設定することで可能。値は秒刻み。なので、仮に一日ごとなら86400を指定。

export const getStaticPaths: GetStaticPaths = async () => {
    const postIds = await PostProcessor.getPostIds();

    return {
        paths: postIds.map((postId) => ({
            params: {
                id: postId
            }
        })),
        fallback: false
    };
};

export const getStaticProps: GetStaticProps = async ({ params }) => {
    const id = params.id as string;
    const post = await PostProcessor.getPost(id);

    return {
        props: {
            post,
        },
+       revalidate: 86400
    };
};

export default Post;
  • dotenv について

next devコマンドで Next.js を起動している最中に .envファイルに環境変数を追加しても undefined になる。

一度サーバを停止してから再起動すること。

  • useLayoutEffect 使用時に warnings が発生する場合

Warning: useLayoutEffect does nothing on the server, because its effect cannot be encoded into the server renderer's output format. This will lead to a mismatch between the initial, non-hydrated UI and the intended UI. To avoid this, useLayoutEffect should only be used in components that render exclusively on the client. See https://reactjs.org/link/uselayouteffect-ssr for common fixes.

useLayoutEffect を使用する前に window の有無で場合分けをする

if (typeof window !== 'undefined') {
    useLayoutEffect(effectCallback, []);
} else {
    useEffect(effectCallback, []);
}

TailwindCSS 関連

生CSSを扱うことなく、あらかじめ定められたクラスを使うことで、手軽に画面のレイアウトを設定することができるCSSフレームワーク。BootStrap よりは複雑。

  • 公式チュートリアル

Vercel 関連

Webアプリのホスティングサービスを提供している会社。Next.js を開発している会社でもあるので、Next.js との相性は抜群。CI/CD のユーザビリティは圧巻の一言。

  • 公式

Notion 関連

  • 公式ホームページ

  • API リファレンス

  • 画像の取り扱い

Notion にアップロードしたファイルを API で取得する場合、URL に1時間の有効期限がついているので、ホスティングした後に閲覧者が画像を表示できないケースが発生してしまう。

revalidate による ISR対応をすることにより一定の対応はできるが、根本的な解決にはならない。

解決のための方法としては、ビルド時に Notion から取得した画像を別のストレージに保存したり、useSWR でキャッシュを利用する。