Open6

next.jsプロジェクトのmonorepo化について調べる

Hirotaka MiyagiHirotaka Miyagi

やりたいこと

  • Vercelでホスティングしているnext.jsプロジェクトで、もう一つ別でnext.jsプロジェクトを作りたくなってきた
  • pagesやホスティング先は違うが、コンポーネントなどで共通で利用できるものは利用したいため、monorepoにするのが妥当そう
Hirotaka MiyagiHirotaka Miyagi

https://classic.yarnpkg.com/blog/2017/08/02/introducing-workspaces/
https://classic.yarnpkg.com/en/docs/workspaces/

  • 複数のpackageを管理するための規約を提供する
  • サブディレクトリのpackageで必要な依存関係をルートディレクトリのnode_modulesでhoistedできる

https://yarnpkg.com/en/docs/cli/workspaces

  • ルートで実行できるコマンド
  • yarn workspaces info でpackageを一覧表示
  • yarn workspaces run xxx でpackageそれぞれでxxxを実行
Hirotaka MiyagiHirotaka Miyagi

続いてVercelでのmonorepo対応状況を見ていく

https://vercel.com/docs/concepts/monorepos

プロジェクトのroot directoryを変更することで利用できそうだ
ということで試してみる

この設定は特定のPreview環境だけで有効化することができないので、production環境に影響するのではないかとかなり怖い。安全に進めるならVercelで別のプロジェクトを作って再度repositoryのimportから進めた方が良いかもしれない

このプロジェクトは個人サイトなので影響範囲は少ないためガンガン進める

Hirotaka MiyagiHirotaka Miyagi

Next.jsアプリを apps/blog ディレクトリに移動して動かせるようにする

まずは単純にディレクトリを移動させる

https://github.com/MH4GF/log.mh4gf.dev/commit/fac0cc5c891ba7c20ecdcbdec2150c6de5b9c291

ルートディレクトリにpackage.jsonを新しく作り、workspacesの設定を追加する

{
  "name": "mh4gf.dev",
  "version": "0.0.1",
  "repository": "git@github.com:MH4GF/log.mh4gf.dev.git",
  "author": "MH4GF <h.miyagi.cnw@gmail.com>",
  "license": "MIT",
  "private": true,
  "workspaces": ["apps/blog"]
}

各種コマンドが動くようにする

ここまでで、 yarn workspace blog devapps/blog ディレクトリの yarn dev がいつも通り実行できるようになった

Hirotaka MiyagiHirotaka Miyagi

turborepoの導入

  • 差分ビルドとクラウドキャッシングの提供 ... キャッシュヒットすればビルドがすぐ終わる、クラウド経由でキャッシュアーティファクトを取得できる
  • 並列実行 ... 複数プロセス(yarn dev等)を同時に実行できる
  • タスクパイプライン ... タスクの依存関係を制御できる

https://turborepo.org/docs

まだ1つのサブパッケージしかないが、導入しておくとサブパッケージの追加がしやすそうなので今のうちに使ってみる

https://github.com/MH4GF/log.mh4gf.dev/commit/66fe41df58da5572fb7a4f07629efd710160d6f5

とりあえずよくあるコマンド(dev, build, lint, format)は yarn workspace を叩かずとも実行できるようになった

Hirotaka MiyagiHirotaka Miyagi

lib配下のコードの一部を別packagesとして管理してみる

自身のアプリケーションにはNotion APIを利用しており、それらはapp/blog/lib/notion配下に置いていたので、試しに別パッケージとして移動して複数アプリケーションから参照できるようにしてみる。

ディレクトリの移動

https://github.com/MH4GF/log.mh4gf.dev/commit/3363cd1093230eca10fe6c6952dc74b5a9e71a1b

  • libのファイルをpackages/notn配下に移動する
  • app/blogのpackage.jsonのdependenciesとしてnotnを追加
  • アプリケーションから呼び出している箇所でimport元を変更

このままだと以下のようなエラーが出る。

Module parse failed: Unexpected token (4:17)
moet:dev: You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders

外部ディレクトリに移動したことでwebpackでのloadingができていないようだ。

https://github.com/martpie/next-transpile-modules を利用することで、外部ディレクトリのファイルのトランスパイルができる。

https://github.com/MH4GF/log.mh4gf.dev/commit/7936bfca766c1d3389a4bf28c2bcbf8dbdefa680
参考:
https://zenn.dev/takeharu/scraps/f4055f1869531f