<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://organizeseries.com/"
	>

<channel>
	<title>Shadow DOM &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/shadow-dom/feed/" rel="self" type="application/rss+xml" />
	<link>https://html5experts.jp</link>
	<description>日本に、もっとエキスパートを。</description>
	<lastBuildDate>Sat, 07 Jul 2018 03:14:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.19</generator>
	<item>
		<title>Web Componentsについて気になること、泉水さんに全部聞いてきました！</title>
		<link>/shumpei-shiraishi/24239/</link>
		<pubDate>Thu, 21 Sep 2017 01:05:10 +0000</pubDate>
		<dc:creator><![CDATA[白石 俊平]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Custom Elements]]></category>
		<category><![CDATA[Shadow DOM]]></category>
		<category><![CDATA[Web Components]]></category>

		<guid isPermaLink="false">/?p=24239</guid>
		<description><![CDATA[連載： HTML5 Conference 2017特集 (8)こんにちは、編集長の白石です。 この記事は、9月24日に開催されるHTML5 Conference 2017に登壇するエキスパートに、予定しているセッションの...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/html5-conf2017/" class="series-457" title="HTML5 Conference 2017特集" data-wpel-link="internal">HTML5 Conference 2017特集</a> (8)</div><p>こんにちは、編集長の白石です。</p>

<p>この記事は、9月24日に開催される<a href="http://events.html5j.org/conference/2017/9/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTML5 Conference 2017</a>に登壇するエキスパートに、予定しているセッションのトピックを中心に、様々な技術的なお話を伺おうというものです。セッションの内容をより深く理解する手助けになるだけでなく、本記事単体でも面白く読んでいただけることを目指しています。</p>

<p>今回お話を伺ったのは、株式会社サイバーエージェントにお勤めの泉水翔吾さんです。</p>

<p><img src="/wp-content/uploads/2017/09/ce4ef7d68f1accac27a33bbf3fb35849.jpg" alt="" width="640" height="417" class="alignnone size-full wp-image-24289" srcset="/wp-content/uploads/2017/09/ce4ef7d68f1accac27a33bbf3fb35849.jpg 640w, /wp-content/uploads/2017/09/ce4ef7d68f1accac27a33bbf3fb35849-300x195.jpg 300w, /wp-content/uploads/2017/09/ce4ef7d68f1accac27a33bbf3fb35849-207x135.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><br><span style="font-size: 80%;">▲<strong>株式会社サイバーエージェント 泉水翔吾さん</strong></span></p>

<p>泉水さんのセッションは「<a href="http://events.html5j.org/conference/2017/9/session/#a5" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">The State of Web Components</a>」（ルームA 16:20-17:00）です。
（現在<a href="https://html5j.connpass.com/event/64992/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTML5 Conference</a>は定員オーバーの状態ですが、無料イベントということもあってキャンセルも多めに出るらしいので、あきらめずにキャンセル待ちすることをお勧めします！）</p>

<h2>Web Componentsについてまずは復習</h2>

<p><b class="speaker siraisi">白石:</b> まずは、Web Componentsについて詳しくご存じない方のために、「Web Componentsとは何か」を簡単にお話していただけますでしょうか？</p>

<p><b class="speaker siraisi">泉水:</b> Web Componentsは、一言で言えば<strong>HTML/CSS/JavaScriptといったWeb技術上で、再利用できる部品作りを促進する仕組み</strong>です。</p>

<p>ReactやAngularなど、昨今のフレームワークを使えば、WebのUIをコンポーネントとして扱うのはすでに可能です。しかし、例えばCSSが単一のグローバルスコープしか持たなかったり、インポートする仕組みが弱かったりするという問題は、ブラウザがネイティブに対応することが望まれる問題なのです。</p>

<p><b class="speaker siraisi">白石:</b> 具体的な技術として見た場合、Web Componentsとはどのような技術なのでしょうか？</p>

<p><b class="speaker siraisi">泉水:</b> <strong>大きく分けて4つの仕様からなっています</strong>。</p>

<p>1つ目は<strong>Shadow DOM</strong>（<a href="https://www.w3.org/TR/shadow-dom/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">仕様</a>）。個人的には一番のポイントとなる技術だと思っています。</p>

<p>コンポーネントはそれぞれ、メインのDOMツリーから分離された、独自のDOMツリーを持つことができるようになり、それをShadow DOMといいます。Shadow DOMはそれぞれ異なるスコープを持つため、CSSやJavaScriptの名前空間が他と干渉しません。</p>

<p>例えば、一度作ったUI部品を、一年後にまた別の箇所で使おうと思った時、CSSのクラス名がかぶってしまってうまく扱えない…などの問題はありがちです。そういう問題を根本的に解決する手段として、Shadow DOMはとても有望な技術です。</p>

<p><img src="/wp-content/uploads/2017/09/71802129d7faf8b2dddc59c46e669afb.jpg" alt="" width="640" height="419" class="alignnone size-full wp-image-24292" srcset="/wp-content/uploads/2017/09/71802129d7faf8b2dddc59c46e669afb.jpg 640w, /wp-content/uploads/2017/09/71802129d7faf8b2dddc59c46e669afb-300x196.jpg 300w, /wp-content/uploads/2017/09/71802129d7faf8b2dddc59c46e669afb-207x136.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>2つ目は<strong>Custom Elements</strong>です（<a href="https://www.w3.org/TR/custom-elements/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">仕様</a>）。</p>

<p>これは一言で言うと<strong>「独自の要素を作れる」技術</strong>です。 <code>customElements.define()</code>というAPIを用いて自由に要素を作成でき、作った要素は通常のHTML要素と同じくマークアップが可能です。Web Componentsによる「部品の再定義」とは、この「独自の要素を作って、使える」というCustom Elementsの機能を指すことが多いと思います。</p>

<p>3つ目は<strong>template要素</strong>です（<a href="https://www.w3.org/TR/html5/scripting-1.html#the-template-element" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">仕様</a>）。</p>

<p><strong>テンプレートとして使いたいHTMLを定義するための要素</strong>で、すでにほとんどのブラウザが対応しています。昔は、そういうテンプレートは不可視の<code>div</code>要素だとか、独自の<code>type</code>を指定した<code>script</code>要素の中に書くのが通例でした。</p>

<p>標準の要素を用いてテンプレートを扱えるようになったことで、セマンティクス上わかりやすくなったり、テンプレートをDOMとして扱えるのでセキュリティ上の懸念がある<code>innerHTML</code>を利用する必要がなかったり、テンプレート内に<code>img</code>要素があったときに画像のリクエストが行われてしまう…といった問題を避けられるようになりました。</p>

<p>最後は<strong>HTML Imports</strong>と呼ばれている仕様でした（<a href="https://w3c.github.io/webcomponents/spec/imports/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">仕様</a>）。この仕様はもともと、<code>link</code>要素を用いて他のHTMLファイルを読み込むことができるというものです。</p>

<p>ただ、この仕様には反対するブラウザベンダーも多く、実装は進みませんでした。代わりにES Modules（※）の実装が進んできたので、まずはそれを使ってコンポーネントを宣言するJavaScriptを読み込む…というのが、当面はスタンダードな手段になりそうです。</p>

<p><small>
※ES Modules…<a href="https://tc39.github.io/ecma262/#sec-modules" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ECMAScriptで定められた</a>、モジュールを扱うための標準仕様。<code>import {XXX} as 'module';</code>のような形式で、他のモジュールを読み込むことができる。
</small></p>

<h2>Web Componentsが「ようやく使える」わけ</h2>

<p><b class="speaker siraisi">白石:</b> 泉水さんが<a href="http://events.html5j.org/conference/2017/9/session/#a5" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTML5 Conferenceのセッション説明</a>に書かれていたことによると、<strong>Web Componentsは「ようやくまともに使えるようになりそう」</strong>とのことですね。これまでなぜまともに使えなかったのか、そしてどのように状況が変わってきたのでしょうか？</p>

<p><b class="speaker siraisi">泉水:</b> <strong>ブラウザの対応が進まなかった</strong>というのが、これまでまともに使えなかったという理由です。</p>

<p>Web Componentsはもともと、2011年にGoogleが提案したものでしたが、ブラウザの反対にあったり実装されなかったり…という部分がとても多かった。
Shadow DOMやCustom Elementsの当初の仕様は「v0」（バージョン0）と呼ばれていて、ほぼ「なかったこと」になっています。</p>

<p>しかし、仕切り直された「v1」でようやくブラウザベンダーの合意形成がなされて、実装も進んできた。特にSafariの実装が進んできたのが大きいですね。やはり、iOSの存在感はとても大きいので、Safariで動かないとなると、「使えない」「使いにくい」と見なされるのが普通ですから。</p>

<p><img src="/wp-content/uploads/2017/09/dd6aaa54d1e7188928500b4031b935a9.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24293" srcset="/wp-content/uploads/2017/09/dd6aaa54d1e7188928500b4031b935a9.jpg 640w, /wp-content/uploads/2017/09/dd6aaa54d1e7188928500b4031b935a9-300x200.jpg 300w, /wp-content/uploads/2017/09/dd6aaa54d1e7188928500b4031b935a9-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>先程申し上げた仕様で言うと、<a href="http://caniuse.com/#feat=shadowdomv1" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Shadow DOMはChromeとSafariでほぼ使える</a>。
<a href="http://caniuse.com/#feat=custom-elementsv1" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Custom Elementsも同様に、ChromeとSafariが対応しています</a>。
<a href="http://caniuse.com/#feat=template" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">template要素はIEを除くほぼすべてのブラウザで使えます</a>し、<a href="http://caniuse.com/#feat=es6-module" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ES ModulesもChrome、Safariが最新版で対応済み</a>です。</p>

<p><b class="speaker siraisi">白石:</b> こうして見ると、むしろモバイルブラウザのほうがWeb Componentsを使いやすそうですね。最新版のブラウザであれば、ほぼ100%対応している。ようやく、時代がWeb Componentsに追いついてきたという感じですね。</p>

<h2>Web Componentsの「作りかた」</h2>

<p><b class="speaker siraisi">白石:</b> では、Web Componentsに準拠したコンポーネントはどのようにして作るのでしょうか？フレームワークやライブラリを使ったほうがいいですか？</p>

<p><b class="speaker siraisi">泉水:</b> 現時点だと、全てのブラウザがWeb Componentsに対応しているわけではないので、<strong>Polyfillの利用は考えたほうがいい</strong>かもしれませんね。
<a href="https://github.com/webcomponents/webcomponentsjs" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">webcomponents.js</a>というライブラリがあるので、それを読み込んでおけば、あらゆるブラウザでWeb Componentsのコードが動作するようになります。</p>

<p>その上でまずは、<strong>素のJavaScriptで全然作っていける</strong>と思います。<a href="https://github.com/1000ch/webcomponents-sandbox/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">私の作ってみたサンプルがGitHubに上がっているので</a>、そちらを例に取って説明しますね。</p>

<p>まずコンポーネントの作り方ですが、既存のHTML要素を継承したクラスを作ります。</p>

<p></p><pre class="crayon-plain-tag">// fancy-button.js
// ↓のコードを記事用に改変
// https://github.com/1000ch/webcomponents-sandbox/blob/master/fancy-button.js
export default class FancyButton extends HTMLElement {
  static get template() {
    return `
      &lt;style&gt;
        button {
          display: inline-block;
          /* 中略 */
        }
      &lt;/style&gt;
      &lt;button&gt;
        &lt;slot&gt;&lt;/slot&gt;
      &lt;/button&gt;
    `;
  }

  constructor() {
    super();
  }

  connectedCallback() {
    this.attachShadow({
      mode: 'open'
    }).innerHTML = FancyButton.template;
  }
};</pre><p></p>

<p>コンポーネントを使う側は、そのコンポーネントを<code>import</code>で読みこんで、<code>customElements.define()</code>を使ってカスタム要素を生成します。後は普通のHTML要素と同様に使っていけばいい。この例では、<code>&lt;fancy-button&gt;</code>というタグが使えるようになりました。</p>

<p></p><pre class="crayon-plain-tag">// app.js
// ↓のコードを記事用に改変
// https://github.com/1000ch/webcomponents-sandbox/blob/master/app.js
import FancyButton from './fancy-button.js';

customElements.define('fancy-button', FancyButton);</pre><p></p>

<p><b class="speaker siraisi">白石:</b> この例でいくと、<code>style</code>やその他の要素を文字列として定義しておくんですね。</p>

<p><b class="speaker siraisi">泉水:</b> そうですね。将来的にもこうした方法がスタンダードになるかはわかりませんが、現時点では<a href="https://github.com/Polymer/polymer/tree/3.0-preview" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Polymer 3.0</a>なども同様の方法を取っています。</p>

<p><img src="/wp-content/uploads/2017/09/0a2e89d5a587668cfed4cd5da7d36356.jpg" alt="" width="640" height="420" class="alignnone size-full wp-image-24294" srcset="/wp-content/uploads/2017/09/0a2e89d5a587668cfed4cd5da7d36356.jpg 640w, /wp-content/uploads/2017/09/0a2e89d5a587668cfed4cd5da7d36356-300x197.jpg 300w, /wp-content/uploads/2017/09/0a2e89d5a587668cfed4cd5da7d36356-207x136.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>Web Componentsに関連するライブラリやサービス</h2>

<p><b class="speaker siraisi">白石:</b> <a href="https://www.polymer-project.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Polymer</a>とはなんですか？</p>

<p><b class="speaker siraisi">泉水:</b> Web Componentsの開発を促進するライブラリです。データバインディングなど、コンポーネントを作るのに便利な機能が数多く含まれています。現在は<a href="https://www.polymer-project.org/blog/2017-08-22-npm-modules.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">3.0が開発中</a>で、コンポーネントのロード手段がHTML ImportsからES Modulesに変更されたり、APIが大幅に変わったりする予定です。</p>

<p><b class="speaker siraisi">白石:</b> その他、Web Componentsに関連するライブラリとか、サービスってありますか？</p>

<p><b class="speaker siraisi">泉水:</b> <a href="https://www.webcomponents.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">webcomponents.org</a>はWebComponentsのポータルサイトで、Web Componentsに関する情報や、公開されているコンポーネントが載っています。Polymerプロジェクトが作ったコンポーネントも多数公開されていて、<a href="https://www.webcomponents.org/search/iron" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">&#8216;iron&#8217;という接頭辞が付いたものはコアコンポーネント</a>、<a href="https://www.webcomponents.org/collection/PolymerElements/paper-elements" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">&#8216;paper&#8217;という接頭辞が付いたものはマテリアルデザインのコンポーネント</a>です。</p>

<p><b class="speaker siraisi">白石:</b> Polymer以外にも、Web Componentsのライブラリってあるんでしょうか？</p>

<p><b class="speaker siraisi">泉水:</b> <a href="https://www.webcomponents.org/introduction#libraries-for-building-web-components" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">webcomponents.orgに一覧があります</a>。例えば、<a href="https://github.com/skatejs/skatejs" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">SkateJS</a>は軽量なライブラリで、Reactライクな仮想DOMを持ち、stateやpropsの管理も行ってくれるというものです。</p>

<h2>YouTubeはWeb Componentsを使っている！</h2>

<p><b class="speaker siraisi">白石:</b> Web Componentsがようやく使える段階に来ているということで、何か事例とかあったりするんでしょうか？</p>

<p><b class="speaker siraisi">泉水:</b> 事例で言うと、<a href="https://react-etc.net/entry/youtube-is-being-rebuilt-on-web-components-and-polymer" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">YouTubeがWeb Componentsを使っている</a>というのは有名ですね。去年発表されて話題になりました。最近デザインもリニューアルされましたが、Polymerを使っているようです。</p>

<p><b class="speaker siraisi">白石:</b> YouTubeが！凄まじい利用者数もいるだろうに、そんなドラスティックな改変を行っているだなんて…。</p>

<p><b class="speaker siraisi">泉水:</b> YouTubeのチームは、すごく攻めるらしいんです(笑) 。ただYouTubeチームは、素のWeb Componentsを使っているわけではありません。</p>

<p>YouTubeのHTMLソースを見てみると、確かにたくさんのカスタム要素を使っているのですが、Shadow DOMは使っていないんです。</p>

<p><img src="/wp-content/uploads/2017/09/79aef22c885b4b8647c52e0222bd8cd7.jpg" alt="" width="640" height="419" class="alignnone size-full wp-image-24295" srcset="/wp-content/uploads/2017/09/79aef22c885b4b8647c52e0222bd8cd7.jpg 640w, /wp-content/uploads/2017/09/79aef22c885b4b8647c52e0222bd8cd7-300x196.jpg 300w, /wp-content/uploads/2017/09/79aef22c885b4b8647c52e0222bd8cd7-207x136.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石:</b> 本当だ、<code>yt-</code>って接頭辞の付いたタグをたくさん使ってるけど、それらの中身は通常のDOMですね。</p>

<p><img src="/wp-content/uploads/2017/09/bd7723deb3f6bdc87b34624d28f979a5.png" alt="" width="302" height="309" class="aligncenter size-full wp-image-24243" srcset="/wp-content/uploads/2017/09/bd7723deb3f6bdc87b34624d28f979a5.png 302w, /wp-content/uploads/2017/09/bd7723deb3f6bdc87b34624d28f979a5-293x300.png 293w, /wp-content/uploads/2017/09/bd7723deb3f6bdc87b34624d28f979a5-202x207.png 202w" sizes="(max-width: 302px) 100vw, 302px" /></p>

<p><b class="speaker siraisi">泉水:</b> 聞くところによると、<a href="https://github.com/webcomponents/shadydom" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Shady DOM</a>や<a href="https://github.com/webcomponents/shadycss" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Shady CSS</a>というWeb ComponentsのPolyfillを使っているそうです。Shady DOMやShady CSSは、Web Componentsの動作を完全にエミュレーションするわけではないのですが、そのかわりに動作が軽量です。</p>

<p><b class="speaker siraisi">白石:</b> なるほど、それでWeb Componentsと互換性のあるコードを書いているというわけですね、きっと。</p>

<p><img src="/wp-content/uploads/2017/09/c697a7cf33dfa2b08c65806c744b978a.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24296" srcset="/wp-content/uploads/2017/09/c697a7cf33dfa2b08c65806c744b978a.jpg 640w, /wp-content/uploads/2017/09/c697a7cf33dfa2b08c65806c744b978a-300x200.jpg 300w, /wp-content/uploads/2017/09/c697a7cf33dfa2b08c65806c744b978a-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>Web Componentsの気になることを何でも聞いてみる</h2>

<p><b class="speaker siraisi">白石:</b> では、あとはWeb Componentsについて聞きたいことをいくつか用意してきたので、順に質問させてもらってもいいですか？</p>

<p><b class="speaker siraisi">泉水:</b> はい、お答えできることであれば何でも答えます。</p>

<p><b class="speaker siraisi">白石:</b> 例えば<strong>アクセシビリティ</strong>はいかがでしょうか。Web Componentsが広まると、たくさんの独自要素が開発者の手によって作られていくことになると思いますが、それでもアクセシビリティは担保できるものなのでしょうか。</p>

<p><b class="speaker siraisi">泉水:</b> それは問題にならないと予想しています。</p>

<p>Web Componentsの中身は、結局のところ一般的なHTML要素から構成されますので、そうした要素が持つセマンティクスなどをブラウザが活用することは可能です。また、アクセシビリティ情報を付与したければ、自作のコンポーネントにWAI-ARIAの属性などを指定していくこともできるでしょう。</p>

<p><b class="speaker siraisi">白石:</b> ReactやAngularなど、<strong>既存のフレームワークとWeb Componentsの関係</strong>はどうなりますか？うまく組み合わせて使っていけるものなのでしょうか？</p>

<p><b class="speaker siraisi">泉水:</b> 私もあらゆるフレームワークを知っているわけではありませんが、Reactに限って言うなら、組み合わせて使うことは難しくありません（筆者注: <a href="https://facebook.github.io/react/docs/web-components.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Reactのドキュメントにも言及がある</a>）。</p>

<p>Reactのコンポーネントを、Shadow DOMにするのも難しくはないと思います。仮想DOMから実際のDOMをレンダリングする部分で、通常のDOMの代わりにShadow DOMを使えばいい。</p>

<p><img src="/wp-content/uploads/2017/09/e5c345982f3ab685b33276960a7285de.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24298" srcset="/wp-content/uploads/2017/09/e5c345982f3ab685b33276960a7285de.jpg 640w, /wp-content/uploads/2017/09/e5c345982f3ab685b33276960a7285de-300x200.jpg 300w, /wp-content/uploads/2017/09/e5c345982f3ab685b33276960a7285de-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石:</b> そうすることによる利点には何があるでしょうか？</p>

<p><b class="speaker siraisi">泉水:</b> やはり、CSSがコンポーネントごとに分離できるのはうれしいですね。私はCSS Modulesとかがあまり好きではないので、標準的な仕組みでそれが行えるのであればすごく嬉しいです。</p>

<p><b class="speaker siraisi">白石:</b> CSSの分離という話でいうと、<strong>コンポーネントを使う側が、コンポーネント内のスタイルをカスタマイズしたい</strong>という要望は必ずあるかと思います。ですが、コンポーネントは基本的にスコープが閉じているので、外からスタイルを当てるのは工夫が必要ですよね。それについてはどう対応するのが正解なのでしょうか？</p>

<p><b class="speaker siraisi">泉水:</b> CSSカスタムプロパティを使うことですね。コンポーネント側では、使う変数名を決めておき、<code>var(--変数名, デフォルト値)</code>と指定して使用します。こうすれば、コンポーネントのデフォルト値でレンダリングはされつつも、呼び出し元で変数を指定すれば、コンポーネントのスタイルを上書きすることができます。<br>
（筆者注: Google Developersの文書に詳しく説明がある。<a href="https://developers.google.com/web/fundamentals/getting-started/primers/shadowdom?hl=ja#stylefromoutside" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Shadow DOM v1: 自己完結型ウェブ コンポーネント</a>）</p>

<p><b class="speaker siraisi">白石:</b> ほか、最近Web Components周りで気になっている話題とかはありますか？</p>

<p><b class="speaker siraisi">泉水:</b> そうですね、コンポーネントの読み込みに関する部分はかなり気になるところです。</p>

<p>例えば、先程もコンポーネントをES Modulesで読み込むのが一般的になりそうだというお話をしましたが、一つ問題がありまして。<code>type='module'</code>を指定した<code>script</code>要素（筆者注: JavaScriptモジュール）って、デフォルトで<code>defer</code>で読み込まれる（※）ので、コンポーネントを宣言するJavaScriptの実行がどうしても遅くなってしまうんです。</p>

<p>なのでそうなると、<strong>コンポーネントを宣言するJavaScriptがロードされるまで、カスタム要素の中身がそのままレンダリングされちゃう</strong>っていう事態が発生してしまうんですよね。</p>

<p><small>
※script要素がdeferで読み込まれる…defer属性を指定されたscript要素は、レンダリングをブロックしないようにレンダリング処理と並列で読み込まれ、DOMContentLoaded終了後に実行される。
</small></p>

<p><img src="/wp-content/uploads/2017/09/2ac7fcb66c67ae7faf9d2b1d6e521b20.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24300" srcset="/wp-content/uploads/2017/09/2ac7fcb66c67ae7faf9d2b1d6e521b20.jpg 640w, /wp-content/uploads/2017/09/2ac7fcb66c67ae7faf9d2b1d6e521b20-300x200.jpg 300w, /wp-content/uploads/2017/09/2ac7fcb66c67ae7faf9d2b1d6e521b20-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石:</b> おお、それは、先日<a href="https://html5experts.jp/shumpei-shiraishi/24207/" data-wpel-link="internal">ソフトバンク・テクノロジーの関口さんに伺ったWebフォントの話（「フォント素人のWebエンジニアが、「フォントおじさん」に聞いてみた！Webフォントの最近の事情とか」）</a>にも近いものがあるかもしれません。Webフォントの場合も、フォントファイルの読み込みが終わる前にシステムフォントでレンダリングされてしまうという問題があって、それをFONTPLUSでは独自に、該当要素を非表示にすることでちらつきを抑えているそうです。</p>

<p><b class="speaker siraisi">泉水:</b> 同様の対処が必要かもしれませんね。</p>

<p>あともう一つ、コンポーネントの読み込み周りで気になるところでいうと、HTML Importsならぬ<a href="https://github.com/w3c/webcomponents/issues/645" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTML Modulesっていう仕様が最近議論されていました</a>ね。これは、<code>import</code>にHTMLファイルを指定できるようにしようとするものです。</p>

<p><b class="speaker siraisi">白石:</b> それはなかなかアグレッシブなアイデアですね。ES Modulesで、コンポーネントのJavaScriptを読み込めるようにするというだけでは、やはりまだ満たせないものがあるということでしょうか。</p>

<p><b class="speaker siraisi">泉水:</b> やはり、ES Modulesだけだと、どうしてもJavaScriptが中心になってしまうんですよね。先程お見せしたコードでも、HTMLやCSSのコードを文字列としてコンポーネントが保持していました。でも、あれはそれほどいい方法とも思いません。マークアップやスタイリングを分業しやすいよう、JavaScriptファーストではない方法についても、検討の余地はまだまだあるということだと思います。</p>

<p><b class="speaker siraisi">白石:</b> なるほど、Web Compornentsの周りでも、まだまだ面白い展開が待ってそうですね。本日はいろんなことにお答えいただき、誠にありがとうございました！</p>
]]></content:encoded>
		
		<series:name><![CDATA[HTML5 Conference 2017特集]]></series:name>
	</item>
	</channel>
</rss>
