Skip to content
Latchkey

Nx とは何か? monorepo の build システムを解説

Nx は monorepo 向けの build システムで、プロジェクト間の依存関係グラフを理解し、タスクの結果を cache し、変更が実際に影響するものだけを実行します。

Nx は、JavaScript と TypeScript の monorepo(およびそれ以外)に、スマートで cache 駆動の build をもたらします。プロジェクトが互いにどう依存しているかをモデル化することで、影響を受けない作業をスキップし、cache された結果を再利用し、タスクを並列化できるため、リポジトリが成長しても CI を高速に保ちます。

Nx とは

Nx は拡張可能な build システムであり monorepo ツールです。workspace から project graph を構築し、プロジェクトをまたいでタスク(build、test、lint)を実行し、各タスクの出力を cache します。plugin により、React、Angular、Node などの framework へのファーストクラスなサポートが追加されます。

affected コマンドと cache

Nx は依存関係グラフをたどって、ある変更がどのプロジェクトに影響するかを計算するため、"nx affected" はリポジトリ全体ではなく、影響を受けるプロジェクトに対してのみタスクを実行します。その computation cache はタスクの結果を input をキーとして保存します。関連するものが何も変わっていなければ、Nx は再実行する代わりに cache された出力を即座に再生します。

使用例

最近の変更によって影響を受けるタスクだけを実行します。

Common Nx commands
# build everything affected by changes since main
nx affected -t build --base=main

# run a task for one project
nx test my-app

CI/CD での役割

CI では、Nx の affected コマンドと cache が、変更されたものだけをテストおよび build し、cache された結果を再生することで、monorepo の pipeline 時間を劇的に削減します。共有された remote cache(Nx Cloud または self-hosted)により、CI は実行やマシンをまたいで結果を再利用できます。warm な cache を保持するマネージド runner 上では、これらの monorepo pipeline は高速かつ安価に保たれ、auto-retry が一時的な失敗をカバーします。

代替ツール

Turborepo は、より軽量で類似した monorepo の task runner です。Bazel は、より厳格でセットアップの多い、より大規模な多言語リポジトリにスケールします。Lerna は versioning と publish を扱います。Nx は、その豊富な plugin エコシステムと、JS/TS monorepo における力と手軽さのバランスから好まれています。

重要なポイント

  • Nx は monorepo の project graph をモデル化し、affected なタスクだけを実行する。
  • computation cache は変更のないタスク結果を即座に再生する。
  • CI では、affected コマンドと共有 cache が monorepo の build 時間を削減する。

関連ガイド