「` `教」からの脱却:FragmentでDOMの健全性を守る技術
フロントエンド開発の現場で、コードレビューをしていると時折見かける光景がある。コンポーネントを囲うためだけに、意味もなく配置された「とりあえずの`
「とりあえず`div`で囲めばReactのルールはパスできる」――確かにそうだが、それはブラウザに対する不誠実であり、将来の自分への技術的負債だ。今日は、React Fragmentを使ってDOM構造をスリムに保ち、ブラウザのレンダリング負荷を最小限に抑える「大人の流儀」について話をしよう。
—
なぜ「意味のないdiv」は悪なのか?
Reactのコンポーネントが単一の親要素を返さなければならないという制約は、誰もが知っているはずだ。かつては、この制約を満たすために親要素として`
1. HTML構造のスパゲッティ化: 開発者ツールを開いたとき、本来存在しなくていい階層がネストされ、CSSのセレクタ指定(特にFlexboxやGrid)が予期せぬ挙動を起こす原因になる。
2. ブラウザのレンダリングコスト: 仮想DOMから実際のDOMへ反映される際、ブラウザは無駄なノードに対してもレイアウト計算やペイント処理を行う。大規模なアプリであればあるほど、この「塵も積もれば」のコストは無視できない。
3. アクセシビリティの低下: DOMツリーが不必要に深いと、スクリーンリーダーを利用するユーザーにとって情報の構造が理解しづらくなる場合がある。
—
Fragment:魔法の「幽霊ノード」
React Fragment(`
ブラウザ側から見れば、Fragmentは文字通り「存在しない」。コンポーネントが子要素を親に直接挿入したかのように振る舞う。これにより、CSSのレイアウトを壊さず、DOMをクリーンに保つことができる。
—
実践:現場で使うべきコードパターン
では、実際の現場でどう使い分けるべきか。以下の例を見てほしい。
import React, { Fragment } from ‘react’;
/
- 悪い例:リストアイテムを返す際に不要なdivを生成してしまっている
- これにより、ul > div > li という不正なHTML構造になりがち
/
const BadListItem = () => (
);
/
- 良い例:Fragmentを活用してDOMを汚さない
/
const GoodListItem = () => (
//
<>
>
);
/
- 応用編:キーが必要な場合は明示的な
を使う - <> > 構文ではkeyプロパティを渡せないので注意
/
const ListItems = ({ items }) => (
-
{items.map((item) => (
- {item.name}
- {item.description}
))}
);
ここがプロのポイント
- 短縮記法 `<>` の積極活用: 基本はこれ一択だ。コードがスッキリする。
- `key`が必要な時だけ `
` : これを忘れて「なぜかkeyが渡せない!」と悩む若手が本当に多い。`map`でリストを回す際に、Fragmentで要素をまとめたい場合は、必ず明示的な``を使う必要がある。
—
「とりあえずdiv」を禁止するチーム文化を
最後に、アーキテクトとしてのアドバイスだ。Fragmentを使うことは、単なるコーディング規約の話ではない。「今、自分が書いているコードがブラウザでどう展開されるか」を想像する力があるかどうか、というプロ意識の指標だ。
コードレビューで「この`div`は本当に必要?」と問いかけてみてほしい。その問いかけ一つで、チームのコード品質は劇的に向上する。
DOMの健全性は、プロダクトのパフォーマンスと保守性を支える土台だ。小さなFragmentの積み重ねが、数年後の「メンテナンスしやすいコード」を作る。ぜひ今日から、不要な`div`を削ぎ落とす習慣を身につけてほしい。

コメント