境界を一度だけ引く設計が、複雑さを減らす理由
Hatched by Ryusei Nakamura
May 16, 2026
1 min read
3 views
94%
最初に問うべきは「何をするか」ではなく「どこで線を引くか」
コードを書いていると、つい「この関数は何をするのか」「このコンポーネントは何を表示するのか」に意識が向きます。けれど、本当に難しい設計は別の問いから始まります。どこで境界を引くべきか、です。
この問いは、フロントエンドでもアーキテクチャでも、驚くほど多くの問題を一気に整理します。ある印を一度だけ置けば、その先の世界の性質が決まる。つまり設計とは、部品を増やす技術ではなく、伝播するルールを最初に決める技術なのです。
その感覚を、Next.jsのコンポーネント設計はとても鮮やかに教えてくれます。"use client" は単なる宣言ではありません。これは「このファイルはクライアントで動く」というラベルではなく、ここから先はクライアント側の世界になるという境界宣言です。ここを誤解すると、ファイル単位の操作に見えていたものが、実は依存関係全体を決めるスイッチだったと気づきます。
設計の本質は、要素を分類することではない。振る舞いがどこまで伝播するかを決めることだ。
"use client" が教える、境界は「属性」ではなく「波及条件」である
多くの人は最初、"use client" を「このコンポーネントはクライアントコンポーネントです」という自己紹介のように捉えます。ですが、実際にはもっと強い意味を持っています。そのファイルを起点にして、import されたモジュール群までクライアント扱いになる。一度境界を引くと、その下流にいるものはまとめて同じルールに従うのです。
これは、設計における重要な反直感を示しています。人はしばしば、複雑さを細かく刻めば減ると思いがちです。しかし実際には、細かいラベルを大量に貼ると、かえって世界は重くなります。必要なのは、局所的な説明の積み重ねではなく、大域的なルールの一回の宣言です。
たとえば、家の中で「ここから先は土足禁止」と言うとき、部屋ごとに毎回靴を脱ぐ理由を説明する必要はありません。玄関で一度だけルールを決めれば、その先の空間は自然に秩序を持ちます。"use client" も同じです。重要なのは、「この1枚の札が何を表すか」ではなく、「この1枚がどこまで効くか」です。
この視点で見ると、設計の上手さは局所の正しさではなく、境界の正確さに現れます。境界を適切な場所に置ければ、その内側では自由に考えられる。逆に境界が曖昧だと、内側でも外側でも同じことを気にし続ける羽目になります。
重要なのは「一度だけ付ける」ことではなく、「一度で済むようにする」こと
"use client" を一度だけ書けばよい、という事実は表面的には小さな実装知識に見えます。ですが、その背後には、もっと大きな設計原理があります。複雑なルールは、伝播の起点を少なくすると管理しやすくなる、という原理です。
これを別の言い方にすると、よい設計は「説明の回数を減らす設計」だと言えます。ある処理が何度も現れるたびに「これはクライアントです」「ここはサーバーです」と再宣言していると、コードは冗長になるだけでなく、認識コストも増えます。読む側は毎回、同じ確認を強いられるからです。
この現象は、組織や文章にも似ています。たとえば会議で毎回「我々の優先順位は何か」を最初から最後まで説明し直していたら、議論は進みません。最初に原則を一つ共有しておけば、各人はその原則に照らして判断できます。境界を一度だけ定めることは、以後の判断を自動化することなのです。
ここで見えてくるのは、"use client" がただの構文ではなく、思考の圧縮装置だということです。情報を減らすのではありません。むしろ、情報の配置を変えて、以後の判断を軽くします。
良い境界は、コードを制限するためにあるのではない。考える回数を減らすためにある。
Next.jsの考え方の核心は、役割分担ではなく「責務の流れ」を見ること
Next.jsを理解するとき、単に「サーバーとクライアントを分ける仕組み」と捉えるだけでは足りません。もっと本質的には、これは責務がどこで生まれ、どこで止まり、どこまで流れるかを扱う思想です。
ここでいう責務とは、データ取得、表示、インタラクション、状態保持、ブラウザAPIへの依存など、コンポーネントが背負う性質のことです。これらを全部同じ平面で扱うと、設計はすぐに混線します。ですが境界をきちんと引けば、サーバーはサーバーの仕事に集中し、クライアントはクライアントの仕事に集中できます。
この分離は、単純に性能の話ではありません。もちろん、クライアント側に余計なものを持ち込まないことは重要です。しかしそれ以上に大きいのは、概念の純度が保たれることです。データの生成とインタラクションの責任が混ざると、変更の影響範囲が読みにくくなります。逆に責務を境界で切ると、変更の意味が局所化されます。
たとえば、記事一覧ページを考えてみましょう。記事データを取得して整形し、タイトルだけを表示する部分はサーバー寄りに置けます。一方、いいねボタンやフィルタの切り替えなど、ユーザー操作に応じて即座に変わる部分はクライアント寄りに置くべきです。ここで重要なのは「どちらが偉いか」ではなく、どの責務をどこに属させると最も自然かです。
この発想は、Next.jsの設計思想を超えて、あらゆるシステムに通じます。よいシステムは、機能を足した結果ではなく、責務の流れを整理した結果として立ち上がります。
境界設計の実践モデル: まず中心を決め、次に外側を広げる
境界をうまく引ける人は、いきなり全体を分割しません。先に中心となる責務を決め、その周囲に境界を広げます。これが、"use client" を正しく使うときの感覚とよく似ています。
1. まず「最小のクライアント領域」を探す
インタラクションが必要な部分はどこか。ブラウザAPIを使うのはどこか。状態を持つ必要があるのはどこか。これらを洗い出したら、クライアント化すべき最小単位を見つけます。広げるのではなく、狭めることが最初の目標です。
2. 境界の外側にデータと構造を置く
静的に決まる要素、取得したデータの整形、初期表示の骨格は、できるだけ外側に追いやります。これにより、クライアント側は「動き」に集中でき、サーバー側は「準備」に集中できます。責務が混ざらないほど、各層は単純になります。
3. 境界をファイルのラベルではなく、設計の合意として扱う
"use client" は記号ですが、本質は合意です。この下にあるものはクライアント前提で組む。だからこそ、後から下層に別の前提を忍び込ませない。境界は注釈ではなく、構造的な約束事です。
4. 境界を増やしすぎない
境界は少ないほど強いです。あちこちに "use client" を散らすと、設計の重心が見えにくくなります。境界を増やすのではなく、境界の質を上げる。これが、実践で最も重要です。
このモデルを使うと、設計の判断がかなり明確になります。コンポーネントを見たときに問うべきは、「何ができるか」ではなく、「どこまで責任を引き受けるか」です。その答えが、境界を引く位置を決めます。
Key Takeaways
"use client"はラベルではなく境界宣言。このファイルだけでなく、import された下流にも影響する。- 境界は一度だけ引く方が強い。繰り返し説明するのではなく、ルールを起点で固定する。
- 責務を混ぜないことが、可読性と保守性を同時に高める。サーバーは準備、クライアントは操作に集中させる。
- 設計では「何をするか」より「どこで止めるか」を先に考える。境界の精度が、複雑さの総量を決める。
- クライアント化の範囲は最小にする。広げるより、狭く正確に定義する方が長期的に強い。
境界を正しく引ける人は、複雑さを減らすのではなく、複雑さの居場所を決めている
ここまで見てきたことを一言でまとめるなら、優れた設計とは、要素を整理する技術ではなく、複雑さがどこに存在してよいかを決める技術です。"use client" の真価は、クライアントとサーバーを分けること自体よりも、境界が一度定まると、その先の世界が自然に整う点にあります。
これは、コードだけの話ではありません。プロダクト設計でも、チーム運営でも、文章構成でも同じです。最初に境界を丁寧に引けると、その内部は自由になります。逆に境界を曖昧にすると、自由になったように見えて、実は誰も責任を持てない曖昧さが増えます。
だから次にコンポーネントを見たら、こう考えてみてください。これは何をしているのかではなく、何をここで終わらせ、何を先へ流すのか。その問いが持てた瞬間、設計は単なる実装作業から、構造を作る知性へと変わります。
そしてそれこそが、Next.jsが静かに教えてくれる最も重要なことです。境界は制約ではない。複雑さを美しく扱うための、最初の自由なのです。
Sources
Hatch New Ideas with Glasp AI 🐣
Glasp AI allows you to hatch new ideas based on your curated content. Let's curate and create with Glasp AI :)
Start Hatching 🐣