$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Web Componentsとlit-element #frontkansai
Search
tiwu
November 02, 2019
Technology
2
1.5k
Web Componentsとlit-element #frontkansai
FRONTEND CONFERENCE 2019
https://2019.kfug.jp/
のアンカファレンスで登壇した資料です
tiwu
November 02, 2019
Tweet
Share
More Decks by tiwu
See All by tiwu
Eleventy で SSG
tiwu_dev
2
690
Eleventy - 11ty
tiwu_dev
0
140
Install for PWA
tiwu_dev
0
1.4k
App Shortcuts
tiwu_dev
0
910
Web Vitals
tiwu_dev
0
76
Web Share API
tiwu_dev
0
1.4k
Badge in Background
tiwu_dev
0
79
PWAとCache API #frontkansai
tiwu_dev
5
2.2k
Service Worker Life Cycle “Install” #pwanight
tiwu_dev
0
650
Other Decks in Technology
See All in Technology
「Managed Instances」と「durable functions」で広がるAWS Lambdaのユースケース
lamaglama39
0
330
AI時代の新規LLMプロダクト開発: Findy Insightsを3ヶ月で立ち上げた舞台裏と振り返り
dakuon
0
170
Jakarta Agentic AI Specification - Status and Future
reza_rahman
0
110
エンジニアリングをやめたくないので問い続ける
estie
2
1.2k
Python 3.14 Overview
lycorptech_jp
PRO
1
120
ChatGPTで論⽂は読めるのか
spatial_ai_network
9
29k
re:Invent 2025 ~何をする者であり、どこへいくのか~
tetutetu214
0
220
文字列の並び順 / Unicode Collation
tmtms
3
600
Reinforcement Fine-tuning 基礎〜実践まで
ch6noota
0
190
1人1サービス開発しているチームでのClaudeCodeの使い方
noayaoshiro
1
270
今からでも間に合う!速習Devin入門とその活用方法
ismk
1
740
.NET 10の概要
tomokusaba
0
110
Featured
See All Featured
Measuring & Analyzing Core Web Vitals
bluesmoon
9
710
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
The Invisible Side of Design
smashingmag
302
51k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
A designer walks into a library…
pauljervisheath
210
24k
A better future with KSS
kneath
240
18k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Why Our Code Smells
bkeepers
PRO
340
57k
The World Runs on Bad Software
bkeepers
PRO
72
12k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
970
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.6k
Transcript
Web Components とLitElement Wataru Taguchi
アジェンダ - 自己紹介 - Web Components - LitElement - 比較
- 使ってみたツラミ - まとめ
# Wataru Taguchi - GameWith Engineer - PWA, Web Components,
AMP - パフォーマンスチューニングが好き - @tiwu_official - FF14, ストファイ5, Beer, Kyoto Animation 自己紹介
Web Componentsとは Vanilla JS、HTML、CSS を使用して 再利用可能なコンポーネントを作成する仕組み
例 https://informal-gotanda-js-web-components.netlify.com/
例
例
- ライブラリに依存せずコンポーネントを作成できる - どんなサイトでも動く - Scoped CSSが書ける - 命名ルール地獄からの解放 -
外から影響を受けない - css の影響を受けない - document.querySelectorで取得できない メリット
- カスタム要素 - 新しくHTMLタグを作成する - Shadow DOM - DOMを隠すことができる Web
Componentsを構成する技術
- customElements.define() - 新しいタグを定義することができる - 新しいタグは必ずダッシュ(-)が必要 - 例:◦hoge-button × hogebutton カスタム要素
- attachShadow() - Shadow DOMを取得できる - innerHTMLやappendChildを利用して追加ができる Shadow DOM
None
None
ネイティブ要素の拡張
https://web-components-sample.netlify.com/ いろいろなWeb Copmonents
シンプルなボタン
シンプルなボタン text属性を利用し表示 cssとHTMLをまとめて配布する
シンプルなボタン
シンプルなボタン slotを利用して表示 imgやpやspanとか利用できる
遷移に使ってみたり
遷移に使ってみたり blue-buttonを利用してaでラップする 遷移先とテキストは属性を使って渡す
任意の処理するボタンにしてみたり
任意の処理するボタンにしてみたり ロジックも閉じ込めて配布する
条件分岐いれてみたり
条件分岐いれてみたり 多彩な振る舞いのコンポーネントも作 れる
LitElementとは 軽量で高速なWebコンポーネントをつくる シンプルなベースクラス
- 宣言的に書ける - 要素は、プロパティが変更されると自動的に更新される - 軽い - lit-htmlが変更されたデータのみを再描画するため、DOMの更新は非常に高 速 -
Web Componentsに準拠している - どのフレームワークでも動く - TypeScriptでも書ける メリット
LitElementのサンプル
Todoリスト https://lit-element-sample.netlify.com/
Todoリスト my-todo my-list my-item my-input
Todoリスト my-todo my-list my-item my-input 入力
Todoリスト my-todo my-list my-item my-input 入力 CustomEvent発火
Todoリスト my-todo my-list my-item my-input 入力 CustomEvent発火 入力された値を受け取って listに追加 &LSに追加
Todoリスト my-todo my-list my-item my-input 入力 CustomEvent発火 入力された値を受け取って listに追加 &LSに追加
リスト更新
Todoリスト my-todo my-list my-item my-input 削除
Todoリスト my-todo my-list my-item my-input 削除 CustomEvent発火
Todoリスト my-todo my-list my-item my-input 削除 CustomEvent発火 CustomEvent発火
Todoリスト my-todo my-list my-item my-input 削除 CustomEvent発火 indexを元にlistから削除 &LSに追加 CustomEvent発火
Todoリスト my-todo my-list my-item my-input 削除 CustomEvent発火 CustomEvent発火 indexを元にlistから削除 &LSに追加
リスト更新
比較 my-input addEventListenerを利用し、イベントを付与 inputのvalueは直接DOM弄りを空にする
比較 my-input @clickを利用し、イベントを付与 inputのvalueは直接DOMは弄らず空にする
比較 my-item addEventListenerを利用し、イベントを付与 indexはattributeから取得
比較 my-item @clickを利用し、イベントを付与 indexはClassの変数から取得
比較 my-list observedAttributesを利用しlistプロ パティの変更を監視 attributeChangedCallbackで変更 があったら、my-itemを削除して新し いlistを元にmy-itemをDOMに挿入 する my-itemにdeleteイベントを貼って、 deleteイベントを再度発火させる
比較 my-list this.list.mapを利用してmy-itemを表示させる @my-delete-eventでイベントを貼って、再度発火させる
比較 my-todo listはJSON.stringifyを使ってJSON文字列にして”をエスケープさせる listの追加、削除があったらsetAttributeを使って,リストを描画させる
比較 my-todo JSON文字列はエスケープ無しで問題なし list変数に変更を加えるだけで、リストの再描画が走る ※ filterではなくspliceを利用し削除したら再描画は走らなかった
- 動的な値の変更・描画はLitElementが楽 - LitElementはcssの補完が効かないのが辛い - bundle size - web components
1.5kb - LitElement 7.7kb 所感
- https://www.youtube.com/ - https://voice.ameba.jp/ - https://support.pairs.lv/hc/ja/ - 日経電子版(現在リニューアル中) 事例
使ってみたツラミ https://the-my-best-todo-list.site/
- input をShadow DOM 使って装飾ができない - form でinput のvalue を拾えない
- ネイティブ要素でinput を拡張してみた - Shadow DOM を生やせない - https://developer.mozilla.org/ja/docs/Web/API/Element/attachShado w 使ってみたツラミ
- slot を使ってパワープレイで装飾した 使ってみたツラミ
- slot を使ってパワープレイで装飾した 使ってみたツラミ
- 外部ライブラリが動かない - (当たり前だけど)Shadow DOM 内だと動かない - slot でパワープレイ 使ってみたツラミ
- slot の装飾が1階層しか効かない 使ってみたツラミ
Q : 対応ブラウザは? A : Edge以外大丈夫 Q&A
Q : Edgeどうすれば・・? A : Chromiumベースになるから大丈夫だろう・・・ Q&A
Q : クライアントサイドでレンダリングされるということは SEOが・・・ A : Google I/Oで最新Chromiumレンダリングエンジンを サポートすることが発表されたから大丈夫 Q&A
- ライブラリに依存せずコンポーネントが作れる - Scoped CSSが書ける - LitElementは結構便利 - ただ描画周りは気をつける必要あり -
結構大手のサイトで使われている まとめ
Web Components / LitElement はいいぞ
ご清聴ありがとうございました