next-transpile-modulesを使ってモノレポ環境でNext.jsコンポーネントライブラリを作成する方法

2023/02/25に公開

この記事では、モノレポ環境で2つのNext.jsプロジェクトを作成し、共通で使うコンポーネントをパッケージ化して、Next.jsプロジェクトにインストールする方法について説明します。

まず、以下のようなディレクトリ構成を想定します。

.
├── apps
│   ├── next-app1
│   └── next-app2
├── packages
│   └── components
└── package.json

appsディレクトリに2つのNext.jsプロジェクトを作成し、packagesディレクトリに共通で使うコンポーネントを作成します。

次に、packages/componentsディレクトリにボタンコンポーネントを作成し、index.tsでエクスポートします。

.
└── packages
    └── components
	      ├── Button
        └── index.ts

index.ts

export { Button } from './Button';

packages.jsonnamenext-componentsにして、version1.0.0に設定します。

{
  "name": "next-components",
  "version": "1.0.0",
  "main": "index.ts"
  ...
}

Nextjsプロジェクトにインストール

次に、Next.jsプロジェクトにボタンコンポーネントをインストールします。ローカルライブラリをインストールする場合は、バージョン指定が必要になります。

yarn add next-components@1.0.0

next-transpile-modulesを使用して、ローカルライブラリをNext.jsで使用するために必要なトランスパイル設定を行います。ただし、Next.js 13.1.0以降では、next-transpile-modulesはネイティブに組み込まれています。

next.config.jsに以下のような設定を追加します。

/** @type {import('next').NextConfig} */
const withTM = require("next-transpile-modules")(["next-components"]);

const nextConfig = withTM({
  reactStrictMode: true,
})

module.exports = nextConfig

これで、共通のコンポーネントをパッケージ化して、複数のNext.jsプロジェクトで使えるようにしました。

Discussion