54
Web Components 概概 2012/10/20 概概概概概概概概 概概概概 Web 概概概概概概概概 概概概概@Shumpei

Web Component概要

Embed Size (px)

DESCRIPTION

Web Componentに関する概要スライドです。

Citation preview

Page 1: Web Component概要

Web Components 概要2012/10/20株式会社シーエー・モバイル Web 先端技術フェロー白石俊平( @Shumpei )

Page 2: Web Component概要

自己紹介

白石俊平と申します。コミュニティ html5.org 管理人(会員数 5000 名超)HTML5 とか勉強会主催(毎月一回、 100 名を動員)Google API Expert (HTML5)Microsoft Most Valuable Professional (IE9)Twitter: @Shumpei

Page 3: Web Component概要

今日のアジェンダWeb Components とは何か?

Web Components の構成要素テンプレートデコレータカスタム要素Shadow DOM

Web Components は Web をどう変えるか?

Page 4: Web Component概要

Web Components とは何か?

→Web の UI を「コンポーネント化」するための仕様群である。

Page 5: Web Component概要

Web には、コンポーネント

化が必要だ。

Page 6: Web Component概要

Web には、コンポーネント

化が必要だ。

メンテナンス性

再利用性

開発効率

Page 7: Web Component概要

Web Components 概要Google によって仕様提案

2012/10 現在、 Google Chrome が一部を実装済み

一部の仕様が公式のドラフトとして公開→ 一般的に使えるようになるにはまだ時間がかかりそう

Page 8: Web Component概要

Web Components の構成要素

Web Components を構成する 4 つの要素

テンプレート デコレータ

カスタム要素 Shadow DOM

Page 9: Web Component概要

HTML テンプレート

Page 10: Web Component概要

HTML テンプレート現在、 JavaScript で UI をいじくる方法は2つある。

文字列テンプレートDOM 操作

Page 11: Web Component概要

HTML テンプレート現在、 JavaScript で UI をいじくる方法は2つある。

文字列テンプレートDOM を考慮しない非標準

DOM 操作

<script id="tmpl1" type="text/x-handlebars-template"> <div>...</div></script>

Page 12: Web Component概要

HTML テンプレート現在、 JavaScript で UI をいじくる方法は2つある。

文字列テンプレートDOM 操作

コードが書きにくい結果が予想しづらい

var div = document.getElementById('...');div.setAttribute('key', 'value');var p = document.createElement('p');p.innerHTML = '...';div.appendChild(p);

Page 13: Web Component概要

HTML テンプレート現在、 JavaScript で UI をいじくる方法は2つある。

文字列テンプレートXSS の危険性

DOM 操作コードが書きにくい結果が予想しづらい

HTML テンプレートで解決!

Page 14: Web Component概要

HTML テンプレートの定義方法

<template> 要素を使用する。<template> 内に、通常通り HTML を記述する<template> はレンダリングされない<body>, <head> に定義

<html><head> <template id="t"> <div id="message"></div> </template></head><body></body></html>

Page 15: Web Component概要

HTML テンプレートを使用する

content プロパティから、内部の DOM を取得する。

<template id="t"> <div id="message"></div></template>

var tmplElem = document.getElementById('t');var tmpl = tmplElem.content.cloneNode();

elem.appendChild(tmpl);

Page 16: Web Component概要

HTML テンプレートぶっちゃけ、これだけじゃ全然便利じゃない。

デコレータ、カスタム要素で使用される汎用要素と理解すべき。

「テンプレートである」というセマンティックを与えることができるのは良い。

今までの <script> 要素よりは見通しが良い。<script type="text/x-handlbars-template"></script>

Page 17: Web Component概要

デコレータ

Page 18: Web Component概要

CSS の限界を超える

CSS の限界とは?

DOM を操作することはできない

Page 19: Web Component概要

<ul> <li> <i> アイコン </i> <span> 自由人会議 </span> <span>5</span> </li> …</ul>

くらいで済みそうなものだけれど・・

Page 20: Web Component概要

デコレータ要素を「デコレーション」するための仕組み

HTML 内で定義し、 CSS 内で使用する

Page 21: Web Component概要

デコレータの定義<decorator> 要素と <template> 要素を使用して定義する。

<decorator id="labelDecorator"> <template> ラベル: </template></decorator>

Page 22: Web Component概要

デコレータの使用CSS 内で、 decorator プロパティを使って要素に指定する。

/* 全ての label 要素が「ラベル:」となる */label { decorator: url(#labelDecorator); }

<label for="name"> お名前</label><input id="name">

Page 23: Web Component概要

デコレータの使用テンプレート内で <content> 要素を使用して、要素内容を挿入する箇所を指定できる。

<decorator id="labelDecorator"> <template> <!-- ここに、要素内容が挿入される --> <content></content> : </template></decorator>

<label for="name"> お名前</label><input id="name">

Page 24: Web Component概要

複数の <content> 要素を指定する

<content> は複数指定できる。

select 属性を用いて、要素内容の一部を抜きだして挿入できる。<decorator id="fieldRowDecorator"> <template> <div> <!-- ここに、要素内容が挿入される --> <content select="label"></content> : </div> <!-- 残りの要素はここに挿入される --> <div id="field"><content></content></div> </template></decorator>

Page 25: Web Component概要

複数の <content> 要素を指定する

/* ラベルとフィールドの組み合わせ */.fieldRow { decorator: url(#fieldDecorator); }

<div class="fieldRow"><label for="name"> お名前</label><input id="name"></div>

Page 26: Web Component概要

Advanced:デコレータのスタイリング

スコープ付きの style 要素を使用する。

<decorator id="fieldRowDecorator"> <template> <style scoped>...</style> … </template></decorator>

Page 27: Web Component概要

Advanced:デコレータ内のイベント処理

デコレータは、 listen() というメソッドを使用してイベントハンドラを登録する

デコレータのコードが実行されるのは、ロード時に一度きり

<decorator id="decorator-event-demo"> <script> function h(event) { alert(event.target); } this.listen( {selector: "#b", type: "click", handler: h}); </script> <template> <content></content> <button id="b">Bar</button> </template></decorator>

Page 28: Web Component概要

デコレータあくまで表示目的の機能である。

Shadow DOM (後述)は持たないデコレータで定義された DOM には、アクセスする手段がない

スタイリング目的の余計なマークアップを劇的に減らすことができるため、非常に強力

Page 29: Web Component概要

カスタム要素

Page 30: Web Component概要

カスタム要素とは?

要素を自作できる!!!!

Page 31: Web Component概要

カスタム要素の定義<element> 要素を使用する

name 属性に要素名を指定する自作要素には「 x- 」という接頭辞をつけなくてはならない

extends 属性に、継承元の要素を指定する

<element name="x-fancybutton" extends="button"> <template> <!-- デコレータと同様 --> … </template></element>

Page 32: Web Component概要

カスタム要素の使用要素に is 属性を指定して、カスタム要素の名称を指定する。

対象となる要素は、カスタム要素の extends と一致している必要がある

<button is="x-fancybutton"> <span>ボタン </span></button>

Page 33: Web Component概要

Advanced:カスタム要素のインスタンス化

カスタム要素は通常の要素と同じく、 document.createElement() でインスタンス化できる

constructor 属性で、コンストラクタを生成させることも可能

var e = document.createElement('x-fancybutton');

<element name="x-fancybutton" extends="button" constructor="FancyButton">...</element>

var fancyButton = new FancyButton();

Page 34: Web Component概要

Advanced:カスタム要素のクラス定義

コンストラクタのプロトタイプを変更して、要素独自の振る舞いを追加する。<element ... constructor="FancyButton"> <script> FancyButton.prototype.razzle = ... // constructor 属性を使用しない場合は // 以下のコードでコンストラクタにアクセス // var FancyButton = this.generatedConstructor; </script> ...</element>

Page 35: Web Component概要

Advanced:カスタム要素のライフサイクル

カスタム要素は、以下の様なライフサイクルイベントを捕捉して処理を行える。

created

attributeChanged

inserted

removed

<element extends="time" name="x-clock"><script>this.lifecycle({ inserted: function(){ this.startUpdatingClock(); }, removed: function() { this.stopUpdatingClock(); }});</script></element>

Page 36: Web Component概要

Shadow DOM

Page 37: Web Component概要

Shadow DOM とは?開発者の目から隠された DOMツリー

複雑な内部構造を隠蔽し、シンプルな DOM に見せかけることができる(=カプセル化)。

Page 38: Web Component概要

Shadow DOM の実装状況Google Chrome には Shadow DOM が実装されている。

標準的な要素の多くが、 Shadow DOM で実装されている。

video/audio/textarea/details/input...

Page 39: Web Component概要

Shadow DOM を「見る」chrome://flags にて、以下のフラグをオンにする。

Shadow DOM を有効にする<style scoped> を有効にする

Shadow DOM を自分で使うためには必要デベロッパーツールのテストを有効にする

Shadow DOM の内容を開発者ツールで見るために必要

Page 40: Web Component概要

Shadow DOM を見る標準的な要素が、 Shadow DOM によって構築されていることを確認する。

Page 41: Web Component概要

Advanced:Shadow DOM の動作を理解する

Shadow DOM を使用した要素( Shadow Host )の「内側」には、 2つのDOMツリーがある。<element name="x-fancybutton" extends="button"> <template> <content></content> <div>...</div> </template></element>

<button is="x-fancybutton"> <span>ボタン </span></button>

カスタム要素の定義に含まれる DOMツリー。こちらのツリーは開発者の目に見えない。( Shadow DOM )

カスタム要素内に入れ子にした DOMツリー。こちらのツリーは、Shadow DOM に取って代わられる

Page 42: Web Component概要

Advanced:Shadow DOM の動作を理解する二種類の DOMツリー

Page 43: Web Component概要

Advanced:Shadow DOM の動作を理解する

Shadow DOM に差し替えられる

Page 44: Web Component概要

Advanced:Shadow DOM の動作を理解する

元の DOMツリーは、 <content> 要素の位置に挿入される

<element name="x-fancybutton" extends="button"> <template> <content></content> <div>...</div> </template></element><button is="x-fancybutton"> <span>ボタン </span></button>

<button is="x-fancybutton"> <span>ボタン </span> <div>...</div></button>

Page 45: Web Component概要

Advanced:Shadow DOM を使う

Chrome上では既に、 Shadow DOM の API が利用可能となっている。

WebKitShadowRoot を用いて、任意の要素をShadow Host にすることができる。

Page 46: Web Component概要

Advanced:Shadow DOM を使う以下のコードを、 Shadow DOM API を使用して整形する。

<!DOCTYPE html><div id="shadowHost"> もともとあった DOMツリー</div><div id="shadowSubtree"> <style scoped> #origTree { color: red; } </style> <h1>Shadow DOM Subtree</h1> <div id="origTree"> <content></content> </div></div>

Page 47: Web Component概要

Advanced:Shadow DOM を使う

// Shadow Host となる要素を取得var shadowHost = document.getElementById('shadowHost');// Shadow Host に変換// この時点で、元の DOMツリーは一旦非表示にvar shadowRoot = new WebKitShadowRoot(shadowHost);// Shadow DOM サブツリーになる要素var shadowSubtree = document.getElementById('shadowSubtree');// Shadow DOM サブツリーとして指定// 表示されるのはこちらの要素になる。// <content> 要素の部分に、もとの DOMツリーが表示されるshadowRoot.appendChild(shadowSubtree);

Page 48: Web Component概要

Web Components はWeb をどう変えるか?

Page 49: Web Component概要

UI フレームワークの利用方法が統一

$('#list').somelist();

<ul data-role="listview"></ul>

<ul dojoType="x.y.SomeList"></ul>

<ul is="x-somelist"></ul>

Page 50: Web Component概要

外部コンポーネントの読み込み

link 要素を用いて、外部コンポーネントを読み込むことができる。

<link rel="components" href="URL">

CDN によるコンポーネント配信などが期待できる!

Page 51: Web Component概要

Web UI 開発の分業が可能に

コンポーネント開発者(ハイスキル)

HTML/CSS/JS を駆使したコンポーネント開発開発標準策定

サードパーティコンポーネントの選定など

コンポーネント利用者(ロースキル)

HTML マークアップCSS スタイリング

Page 52: Web Component概要

よりセマンティックなマークアップに

複雑なマークアップをカプセル化することで、よりシンプルでセマンティックなマークアップに。

<textarea is="x-tweetbox" placeholder="ツイートする"></textarea>

Page 53: Web Component概要

WebComponents には注目!

数年後の HTML マークアップは、今とは全く違うものになっているかも?

いつまでも泥臭かった HTML フロントエンド開発を、洗練されたものに。

Page 54: Web Component概要

ご清聴ありがとうございました。

Follow me @Shumpei