0Pricing
HTML Academy · レッスン

宣言的Shadow DOM

shadowrootmodeを使い、JavaScriptなしでHTMLからShadow DOMを付加します

「宣言的Shadow DOM」はCoddyKit上の無料HTML Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはHTML Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 HTML Academyコースには全4レッスンが含まれています。

解決する問題

従来の Shadow DOM は JavaScript(attachShadow)で作成します。サーバーレンダリングされたページでは、これは JS が実行されるまでシャドーツリーが空であることを意味し、最初のバイトで完全な HTML を提供するという SSR の目的が失われます。Declarative Shadow DOM はこの問題を解決します。

shadowrootmode 属性

パース時に HTML 内でシャドールートを宣言するには、shadowrootmode="open" を指定した <template> を使用します。ブラウザが親要素にシャドールートを自動的にアタッチし、テンプレートのコンテンツがシャドーツリーになります。JavaScript は必要ありません。

<my-card>
  <template shadowrootmode="open">
    <style>:host { display: block; padding: 16px; }</style>
    <slot></slot>
  </template>
  <p>This goes into the slot</p>
</my-card>

Web Components での SSR

Declarative Shadow DOM により、真のサーバーレンダリングされた Web Components を実現できます。サーバーは完全なシャドーツリーをインラインで出力し、ブラウザは JS の実行前にそれをパースしてアタッチします。その後、ハイドレーション用の JS が完全にレンダリングされた状態を引き継げます。フレームワークの SSR と同等です。

モード: open または closed

命令型の attachShadow と同じモードを使用します。shadowrootmode="open" はシャドーを element.shadowRoot として公開し、shadowrootmode="closed" は非公開にします。動作は JavaScript でアタッチした場合と同一です。

要素ごとに一度だけパースされる

ブラウザは、最初に <template shadowrootmode> を認識した時点でシャドールートをアタッチします。アタッチされるとテンプレートは消費されるため、後から検索しても何も返りません。これは attachShadow のライフサイクルと同じです。要素が存在する間、シャドーは存続します。

スロットは通常どおり機能する

ライト DOM の子要素(例の <template> の外側にある <p>)は、命令型の Shadow DOM と同じように、シャドーツリー内の <slot> 要素へ投影されます。コンポジションの仕組みは同一で、異なるのはアタッチ方法だけです。

Custom Elements との組み合わせ

<my-card> が登録済みの Custom Element であれば、アップグレード処理は attachShadow を再度呼び出すのではなく、すでにアタッチされているシャドールートを使用します。Custom Element のクラスは、作成する必要なく connectedCallback で this.shadowRoot を読み取れます。

サーバーツールのサポート

Lit-html の render、Astro コンポーネント、その他いくつかのフレームワークは、SSR の出力の一部として Declarative Shadow DOM を出力するようになりました。独自実装も可能です。文字列テンプレート方式であれば、どのようなシステムでも shadowrootmode テンプレートを書き出せます。

ブラウザサポート

Declarative Shadow DOM は Chrome、Edge、Safari、Firefox で利用できます。古いブラウザは <template> 要素を何もせずに無視します。テンプレート内のコンテンツは表示されないため、非対応環境でも適切に機能を縮退できます。

ポリフィル戦略

より広くサポートするには、小さなスクリプトで DOM を走査し、template[shadowrootmode] を実際のシャドールートに変換できます。後続のコンポーネントのアップグレードで期待どおりのシャドーツリーが認識されるように、Custom Element の登録前に実行してください。

トレードオフ

Declarative Shadow DOM では構造が重複します。<template> のコンテンツがコンポーネントのクラスに組み込まれているにもかかわらず、HTML にも存在するためです。同じコンポーネントが多数あるページでは、ペイロードが膨らみます。フレームワークは重複排除を行いますが、独自実装の SSR でも同じ対応を検討するとよいでしょう。

導入すべきタイミング

Web Components を提供していて、最初のバイトでのレンダリングや SEO を重視するなら、今すぐ導入してください。この機能は安定しており、サポートも整っているため、Web Components ベースのアプリケーションにおける SSR の仕組みを大幅に改善します。Shadow DOM を使わないアプリケーションには適用できません。

知識チェック

Declarative Shadow DOM は、命令型の attachShadow と比べてどのような問題を解決しますか。

まとめ

Declarative Shadow DOM は、Custom Element 内の <template shadowrootmode="open"> を使用して、JS を必要とせずにパース時にシャドールートをアタッチします。Web Components で真の SSR を実現し、ハイドレーション前からシャドーツリー、スコープ付きスタイル、スロットをすべて機能させられます。すべてのモダンブラウザでサポートされ、古いブラウザ向けのポリフィルも利用できます。フレームワーク(Lit、Astro)は自動的に出力します。

よくある質問

「宣言的Shadow DOM」レッスンは無料ですか?

はい。「宣言的Shadow DOM」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、HTML Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 HTML Academyコースには全4レッスンが含まれています。

「宣言的Shadow DOM」で何を学びますか?

shadowrootmodeを使い、JavaScriptなしでHTMLからShadow DOMを付加します ブラウザで直接実行するハンズオンコードでHTML Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

HTML Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのHTML Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「宣言的Shadow DOM」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このHTML Academyレッスンでコードを書いて実行できますか?

はい。すべてのHTML Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 宣言的Shadow DOM
  2. Popover API
  3. selectlist要素
  4. Interest Invokersとcommand属性
← HTML Academyに戻る