Web コンポーネント

フレームワークに依存せず再利用できる UI 部品を作れる Web Components。Custom Elements と Shadow DOM によるカプセル化で、どこでも使える標準のカスタム要素を作る基礎を整理します。

中級Web ComponentsShadow DOMカスタム要素
3つの要点
  1. Web Components はブラウザ標準の技術で独自の HTML タグ(カスタム要素)を作る仕組み。フレームワークに依存しない。
  2. 三本柱は Custom Elements(独自タグ)・Shadow DOM(スタイルと構造のカプセル化)・template(再利用する雛形)。
  3. Shadow DOM で内部の CSS が外に漏れず・外からも壊されない。どのフレームワークでも使い回せる再利用部品が作れる。

Web コンポーネントとは

Web Components は、ブラウザ標準の技術だけで、再利用可能な独自の HTML 要素を作るための仕組みです。React のコンポーネントに似ていますが、特定のフレームワークに属さず、素の HTML として <user-card> のような独自タグを定義できる点が決定的に違います。

最大の狙いは 2 つです。

  • 再利用:一度作った部品を、<my-button> のように HTML に置くだけで何度でも使える。
  • カプセル化:部品の内部構造とスタイルを外から隔離し、互いに干渉しないようにする。

ライブラリを一切読み込まなくても、ブラウザが標準でこれを解釈します。だからフレームワークをまたいで使い回せるのが大きな魅力です。

横にスクロール

利用側がuser-card独自要素へ属性、プロパティ、slot内容を渡し、Custom Elements定義で要素を更新し、Shadow DOM内のtemplateと部品内CSSで描画し、CustomEventで外へ通知する境界
Web Componentの再利用性は、内部DOMを隠すことだけでなく、ホスト要素の安定した入出力契約から生まれます。属性・プロパティ・slot・イベント・公開スタイルを先に設計し、接続解除時の後片付けと未定義時の代替表示も用意します。

三本柱

Web Components は単一の機能ではなく、3 つの標準仕様の組み合わせで成り立ちます。

仕様役割
Custom Elements<my-card> のような独自タグを定義し、その振る舞いを JavaScript で実装する
Shadow DOM要素内部の DOM と CSS を外から隔離する(カプセル化の中核)
HTML Template<template>描画されない雛形を用意し、繰り返し複製して使う

この 3 つがそろうことで、「独自タグを定義し(Custom Elements)、その中身を外と干渉しない形で持ち(Shadow DOM)、雛形から効率よく作る(template)」という流れが完成します。

Custom Elements:独自タグを作る

Custom Elements は、HTMLElement を継承したクラスを定義し、customElements.define でタグ名と結びつける仕組みです。タグ名には必ずハイフンを含める決まりがあり、これで標準タグと衝突しません。

class UserCard extends HTMLElement {
  // 要素が DOM に追加されたときに呼ばれる
  connectedCallback() {
    const name = this.getAttribute("name") || "名無し";
    this.innerHTML = `<p>ようこそ、${name} さん</p>`;
  }
}

// タグ名(ハイフン必須)と結びつける
customElements.define("user-card", UserCard);

定義すれば、あとは普通の HTML として書けます。

<user-card name="Taro"></user-card>

クラスには、要素のライフサイクルに応じて呼ばれるメソッド(コールバック)があります。これを使い分けます。

コールバック呼ばれるタイミング
connectedCallback要素が DOM に追加されたとき
disconnectedCallback要素が DOM から取り除かれたとき
attributeChangedCallback監視中の属性が変化したとき

Shadow DOM:スタイルを閉じ込める

Web Components で最も価値が高いのが Shadow DOM です。これは要素の内部に、外の世界から隔離された独立した DOM ツリー(シャドウツリー)を持たせる仕組みです。

何が嬉しいかというと、スタイルのカプセル化です。Shadow DOM の中に書いた CSS は外に漏れず、外側のページの CSS も中には入ってきません。

class FancyBox extends HTMLElement {
  constructor() {
    super();
    // シャドウルートを作る(mode: "open" で外から参照可能)
    const shadow = this.attachShadow({ mode: "open" });
    shadow.innerHTML = `
      <style>
        /* この p は、この部品の中だけに効く。外の p には影響しない */
        p { color: crimson; font-weight: bold; }
      </style>
      <p><slot></slot></p>
    `;
  }
}
customElements.define("fancy-box", FancyBox);

通常の CSS はページ全体がひとつの空間を共有するため、別々のチームが書いた CSS が思わぬ場所で衝突しがちです。Shadow DOM はこの問題を根本から解決します。

コード中の <slot> は、部品の利用者が外から渡した中身を表示する差し込み口です。<fancy-box>こんにちは</fancy-box> と書くと、その「こんにちは」が <slot> の位置に入ります。これにより、枠(部品側)と中身(利用者側)を分けて設計でき、柔軟に使い回せる部品になります。

カプセル化は諸刃の剣

Shadow DOM の隔離は強力ですが、外側のページの CSS(テーマ色・フォントなど)も基本的に届かなくなるため、サイト全体で見た目を統一したいときは逆に不便になります。意図的に外から調整できるよう、CSS カスタムプロパティ(CSS 変数)や ::part を使って「ここだけは外から変えてよい」という穴を開けておく設計が現実的です。

フレームワーク非依存という強み

Web Components の独自タグは、ブラウザ標準の HTML 要素です。したがって React でも Vue でも Angular でも、素の HTML でも<user-card> と書けばそのまま動きます。

  • フレームワークをまたいで再利用:React のプロジェクトでも Vue のプロジェクトでも、同じ部品を共有できる。
  • 長寿命:特定フレームワークの流行り廃りに左右されにくい。標準仕様なのでブラウザがサポートし続ける。
  • デザインシステムに好適:会社全体で使うボタンやヘッダを、技術スタックを問わず一元配布できる。

このため、複数チーム・複数フレームワークが混在する大きな組織で、共通 UI 部品の配布手段として採用されることが増えています。

React コンポーネントと競合しない

Web Components は React などの「代替」ではなく、より低レイヤーの標準です。アプリ全体の状態管理や画面遷移はフレームワークに任せ、フレームワークをまたいで配りたい末端の UI 部品(ボタン、アイコン、カードなど)を Web Components にする、という使い分けが現実的です。両者は競合ではなく補完の関係にあります。

まとめ

  • Web Components:ブラウザ標準だけで独自タグを作る仕組み。フレームワークに依存しない。
  • 三本柱:Custom Elements(独自タグ)+ Shadow DOM(カプセル化)+ template(雛形)。
  • Shadow DOM:内部の CSS が外に漏れず・外からも壊されない。スタイル衝突を根本解決する。
  • 強み:どのフレームワークでも・素の HTML でも使える。共通 UI 部品の配布に向く。

土台となる HTML のタグの仕組み、操作対象の DOM、隔離するスタイルの CSS を押さえると、Web Components の挙動がより明確になります。

Web/フロントエンドの記事ガイド

Web コンポーネントを実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

Web Components

比較で見る軸

難易度: intermediate / カテゴリ: Web/フロントエンド / タグ数: 3

導入後に効く点

三本柱は Custom Elements(独自タグ)・Shadow DOM(スタイルと構造のカプセル化)・template(再利用する雛形)。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
intermediate
カテゴリ
Web/フロントエンド
タグ数
3

判断チェックリスト

  • 自社の用途が「Web Components / Shadow DOM」に近いか確認する。
  • 強みである「Web Components はブラウザ標準の技術で独自の HTML タグ(カスタム要素)を作る仕組み。フレームワークに依存しない。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

Web ComponentsShadow DOMカスタム要素
参考: 公式情報