Web Componentsとは?基礎から実践まで
「システムを作ったはいいけれど、担当者が辞めたら誰もメンテナンスできなくなった」「フレームワークのバージョンアップについていけず、システムが古くなってしまった」——中小企業のIT担当者の方から、こうした悩みをよく耳にします。
Web Componentsは、こうした課題を解決する可能性を持った技術です。Web標準技術を使って再利用可能なコンポーネントを作成できるため、特定のフレームワークに依存せず、長期的に保守しやすいシステムを構築できます。
この記事では、Web Componentsの基礎から実践まで、初心者の方にもわかりやすく解説します。難しいツールの準備は不要で、ブラウザさえあれば今日から始められます。
Web Componentsとは何か
Web Componentsとは、Webブラウザが標準で提供する技術を使って、再利用可能なカスタムコンポーネントを作成する仕組みのことです。
従来、ボタンやモーダルウィンドウなどのUI部品を作るには、ReactやVueなどのフレームワークを使うのが一般的でした。しかしWeb Componentsは、こうしたフレームワークに頼らず、ブラウザの標準機能だけでコンポーネントを作成できます。
具体的には、以下の3つの技術を組み合わせて実現されます。
- Custom Elements(カスタム要素): 独自のHTMLタグを定義できる
- Shadow DOM(シャドウDOM): スタイルやスクリプトをカプセル化できる
- HTML Templates(HTMLテンプレート): 再利用可能なHTMLの雛形を作れる
これらはすべてW3Cが定めたWeb標準技術であり、特別なライブラリやフレームワークを必要としません。
なぜ今注目されているのか
Web Componentsが注目を集めている背景には、フレームワーク疲れという現象があります。
ReactやVueは便利ですが、学習コストが高く、バージョンアップが頻繁で、フレームワークが廃れるとシステム全体の作り直しが必要になります。一方、Web ComponentsはWeb標準技術であるため、ブラウザが存在する限り使い続けることができます。
また、IT人材不足が深刻な中小企業にとって、「特定の人しか触れないシステム」は大きなリスクです。Web標準という誰もが学べる技術で構築することで、属人化を防ぎ、持続可能な開発体制を作ることができます。
Web Componentsを構成する3つの技術
Custom Elements(カスタム要素)
Custom Elementsは、独自のHTMLタグを定義できる技術です。
通常、HTMLでは<div>や<button>といった決められたタグしか使えません。しかしCustom Elementsを使うと、<my-button>や<user-card>のような、オリジナルのタグを作成できます。
// カスタム要素のクラスを定義
class MyButton extends HTMLElement {
constructor() {
super();
this.innerHTML = '<button>クリックしてね</button>';
}
}
// カスタム要素を登録
customElements.define('my-button', MyButton);
このコードを読み込んだ後、HTMLで<my-button></my-button>と書くだけでボタンが表示されます。同じボタンを何度も書く必要がなくなり、コードの再利用性が大幅に向上します。
注意点: タグ名には必ずハイフンを含める必要があります(<helloworld>はNG、<hello-world>はOK)。
Shadow DOM(シャドウDOM)
Shadow DOMは、スタイルやスクリプトをカプセル化する技術です。
Web開発で困るのが、CSSの競合です。あるページで定義したスタイルが、意図せず別の要素に影響を与えてしまうことがあります。Shadow DOMを使うと、この問題を解決できます。
class MyCard extends HTMLElement {
constructor() {
super();
// Shadow DOMを作成
const shadow = this.attachShadow({ mode: 'open' });
shadow.innerHTML = `
<style>
.card {
border: 1px solid #ccc;
padding: 20px;
border-radius: 8px;
}
</style>
<div class="card">
<slot></slot>
</div>
`;
}
}
customElements.define('my-card', MyCard);
この<my-card>内で定義した.cardのスタイルは、外部のCSSに影響を与えません。逆に、外部のCSSもこの内部には影響しません。
HTML Templates(HTMLテンプレート)
HTML Templatesは、再利用可能なHTMLの雛形を作る技術です。
<template>タグを使うと、ページ読み込み時には表示されないHTMLの雛形を定義できます。必要なときにJavaScriptでクローンして使います。
<template id="user-card-template">
<style>
.user-card {
border: 1px solid #ddd;
padding: 15px;
margin: 10px 0;
}
</style>
<div class="user-card">
<h3 class="name"></h3>
<p class="email"></p>
</div>
</template>
この3つの技術を組み合わせることで、独自のタグ名で呼び出せ、スタイルが外部と干渉せず、構造を効率的に再利用できる理想的なコンポーネントが作れます。
メリットとデメリット
5つの主なメリット
1. フレームワークに依存しない長期的な安定性
Web標準技術であるため、特定のフレームワークのライフサイクルに左右されません。5年後、10年後もメンテナンスできるシステムを作れます。
2. 高い再利用性
一度作ったコンポーネントは、WordPressのサイトでも、静的なHTMLサイトでも、業務システムでも同じように動作します。
3. カプセル化によるメンテナンス性の向上
Shadow DOMによって、スタイルやスクリプトが完全に独立します。「あるページのCSSを変更したら、別のページが崩れた」という事故を防げます。
4. 学習コストの低さ
基本的なJavaScriptとHTMLの知識があれば始められます。既存のWeb担当者がスキルアップしやすいのも利点です。
5. 属人化の防止
Web標準技術であるため、「この人しか触れない」という状況になりにくく、引き継ぎもスムーズです。
知っておくべき課題
エコシステムの未成熟
ReactやVueには豊富なライブラリがありますが、Web Componentsのエコシステムはまだ発展途上です。すべてを自分で作る必要がある場面も多く、初期の開発工数は増える可能性があります。
複雑な状態管理には不向き
高度な状態管理機能は標準では提供されていません。複雑なアプリケーションでは、自分で状態管理の仕組みを作る必要があります。
SEOへの配慮が必要
Shadow DOM内のコンテンツは、検索エンジンに正しく認識されない場合があります。SEOが重要なページでは、サーバーサイドレンダリングなどの対策が必要です。
フレームワークとの比較と使い分け
Web Componentsとフレームワークは、対立するものではなく、共存できるものです。
| 項目 | Web Components | React/Vue |
|---|---|---|
| 学習コスト | 低い | 高い |
| エコシステム | 未成熟 | 非常に豊富 |
| 長期的安定性 | 非常に高い | フレームワーク次第 |
| 複雑なアプリ開発 | やや不向き | 得意 |
| ビルドツール | 不要 | 必要 |
使い分けの基準は以下の通りです。
- Web Componentsが向いている場合: 長期運用が前提のシステム、複数のサイトで使う共通部品、既存のサイトへの機能追加
- フレームワークが向いている場合: 複雑な状態管理が必要なアプリ、短期間で大規模開発が必要、豊富なライブラリを活用したい場合
実は、Web ComponentsとReact/Vueを併用することも可能です。例えば、Reactで作ったコンポーネントをWeb Componentsとしてラップして、他のプロジェクトで使うといった方法もあります。
実際に作ってみよう
開発環境の準備
Web Componentsの素晴らしい点は、特別な開発環境が不要なことです。
必要なものは以下だけです。
- テキストエディタ(メモ帳でもOK、VSCodeなら便利)
- Webブラウザ(Chrome、Firefox、Safari、Edgeなど)
Node.jsもnpmも、ビルドツールも必要ありません。
シンプルなカスタム要素を作成
まずは、最もシンプルなカスタム要素を作ってみましょう。index.htmlを作成し、以下のコードを書いてください。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>はじめてのWeb Components</title>
</head>
<body>
<h1>Web Componentsのテスト</h1>
<hello-world></hello-world>
<script>
class HelloWorld extends HTMLElement {
constructor() {
super();
this.innerHTML = `
<div style="padding: 20px; background: #f0f0f0; border-radius: 8px;">
<h2>こんにちは!</h2>
<p>これが私の最初のWeb Componentです。</p>
</div>
`;
}
}
customElements.define('hello-world', HelloWorld);
</script>
</body>
</html>
このファイルをブラウザで開くと、「こんにちは!」というメッセージが表示されます。これだけで、独自のHTMLタグが使えるようになりました。
Shadow DOMでスタイルを分離
次に、Shadow DOMを使ってスタイルを完全に分離してみましょう。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Shadow DOMのテスト</title>
<style>
/* このスタイルはShadow DOM内には影響しない */
.card { background: red !important; }
</style>
</head>
<body>
<user-card name="山田太郎" role="エンジニア"></user-card>
<script>
class UserCard extends HTMLElement {
constructor() {
super();
const shadow = this.attachShadow({ mode: 'open' });
shadow.innerHTML = `
<style>
.card {
border: 2px solid #333;
padding: 20px;
margin: 10px 0;
border-radius: 8px;
background: #fff;
}
</style>
<div class="card">
<p><strong>${this.getAttribute('name')}</strong></p>
<p>${this.getAttribute('role')}</p>
</div>
`;
}
}
customElements.define('user-card', UserCard);
</script>
</body>
</html>
外部で.card { background: red !important; }と定義しているにもかかわらず、カードの背景は白のままです。これがShadow DOMのカプセル化の効果です。
別ファイルに分離して再利用
コンポーネントを別ファイルに分離すると、複数のページで使い回せます。
user-card.jsというファイルを作成します。
class UserCard extends HTMLElement {
constructor() {
super();
const shadow = this.attachShadow({ mode: 'open' });
shadow.innerHTML = `
<style>
.card {
border: 2px solid #333;
padding: 20px;
margin: 10px 0;
}
</style>
<div class="card">
<p><strong>${this.getAttribute('name')}</strong></p>
</div>
`;
}
}
customElements.define('user-card', UserCard);
HTMLファイルからは、以下のように読み込みます。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>コンポーネントの読み込み</title>
</head>
<body>
<user-card name="山田太郎"></user-card>
<script src="user-card.js"></script>
</body>
</html>
中小企業での活用シーン
Web Componentsは、中小企業の以下のような場面で特に有効です。
社内業務システムのUI部品
顧客管理システムや案件管理システムなど、社内で使う業務システムの共通部品として活用できます。一度作ったボタンやフォーム部品を、複数の画面で再利用できます。
コーポレートサイトの機能拡張
既存のWordPressサイトやHTMLサイトに、問い合わせフォームや予約カレンダーなどの機能を追加する際に使えます。既存のサイトを壊さずに機能追加できるのが強みです。
複数サイトで使う共通パーツ
会社案内サイト、サービスサイト、採用サイトなど、複数のサイトで同じデザインのボタンやカードを使いたい場合に便利です。一箇所修正すれば全サイトに反映されます。
長期運用が前提のシステム
5年、10年と長く使い続けるシステムでは、フレームワークの陳腐化リスクを避けたいものです。Web標準技術で作ることで、将来的な保守性を高められます。
よくある質問
JavaScriptの知識はどれくらい必要?
基本的なJavaScriptの文法(変数、関数、クラス)が理解できていれば始められます。ReactやVueのような高度な概念は不要です。
ブラウザの対応状況は大丈夫?
主要なモダンブラウザ(Chrome、Firefox、Safari、Edge)はすべて対応しています。IE11は非対応ですが、現在ではほとんど問題になりません。
既存のライブラリと一緒に使える?
はい、jQueryやBootstrapなど、既存のライブラリと併用できます。Web Componentsは標準技術なので、他の技術と競合しません。
まとめ
Web Componentsは、フレームワークに依存せず、長期的に保守しやすいシステムを構築できる技術です。
まず何から始めればいいか
- この記事のサンプルコードを実際に動かしてみる
- 自社でよく使うボタンやカードを1つ作ってみる
- 既存のサイトに組み込んでみる
導入を検討する際のポイント
- すべてをWeb Componentsで作る必要はありません。一部の機能だけを置き換える段階的な導入が現実的です
- 複雑な状態管理が必要な場合は、フレームワークとの併用も検討しましょう
- 長期運用が前提のシステムほど、Web Componentsのメリットが大きくなります
Web標準技術で構築することで、属人化を防ぎ、持続可能な開発体制を作ることができます。まずは小さく始めて、徐々に拡大していくことをお勧めします。