Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
picodomでVDOMの 理解を深める Takanori Oki @Megro.es
Slide 2
Slide 2 text
自己紹介 • 大木 尊紀(オオキ タカノリ) / @takanorip • 株式会社スマートドライブ • フロントエンドエンジニア • React、Vue、Polymer、Web制作全般 • Polymer Japan 翻訳チーム • 「イヌでもわかる Web Components」 好評配信中 • 輝夜月かわいい
Slide 3
Slide 3 text
Polymer Japan Cafe (2月6日@Google Tokyo Office)
Slide 4
Slide 4 text
hyperapp コードリーディング会 (2月7日@チームスピリット)
Slide 5
Slide 5 text
picodom ?
Slide 6
Slide 6 text
picodom • VDOMでページを操作するJSライブラリ • 1kbしかない、軽い • hyperappのJorgeBucaranさんが書いてる • 提供するメソッドは2つだけ • h():VDOMを生成する • patch():VDOMへ差分適用 • JSXが使える
Slide 7
Slide 7 text
なんでpicodom? • Fish shellのファンだから(JorgeBucaranさんはFish shellの開発者でもある) • hyperappよりも機能が絞られているから読みやすいか なと思った • VDOMの実装だけ読みたかった • picodom使ってオレオレライブラリ作れたら面白そう
Slide 8
Slide 8 text
picodomを読む
Slide 9
Slide 9 text
構成とか • picodomの構成 • h.js:h()の定義 / 29行 • patch.js:patch()を定義 / 206行 • (index.jsは↑2つのファイルをimportしてるだけ)
Slide 10
Slide 10 text
picodomを読む: h() • VDOMを生成する • DOM構造をオブジェクトに変換する (VODMはオブジェクト) • めっちゃシンプルなので言うことない • Reactとかとやってることはだいたい同じ
Slide 11
Slide 11 text
h("div", {id: 'app'}, [ h("h1", {class: 'title'}, 'Title'), h("button", { onclick: () => {hoge: 'fuga'} }, "+"), 'some text' ]);
Slide 12
Slide 12 text
{ name: "div", props: { id: "app" }, children: [ { name: "h1", props: { class : "title" }, children: ["Title"] }, { name: "button", props: { onclick: () => {hoge: 'fuga'} }, children: ["+"] }, "some text" ] }
Slide 13
Slide 13 text
picodomを読む: patch() patch patchElement setElementProp removeChildren createElement updateElement setElementProp oldNode == null patchElement true false
Slide 14
Slide 14 text
picodomを読む: patch() patch patchElementの結果を返す patchElement 差分更新の処理を司る setElementProp elementにpropsを挿入する createElement document.createElementを使って elementを作成する updateElement elementのvalueやpropsを更新する removeChildren elementを削除する
Slide 15
Slide 15 text
picodomを使う
Slide 16
Slide 16 text
import { h, patch } from picodom /** @jsx h */ let node function render(view, withState) { patch(node, (node = view(withState))) } function view(state) { return (
{state}
render(view, e.target.value)} />
) } render(view, "Hello!")
Slide 17
Slide 17 text
まとめ • 軽量なVDOMフレームワーク • 仮想DOMの仕組みがなんとなくわかった • コア機能のみの実装で、実装はとてもシンプル • picodomベースでオレオレフレームワークをつくる本 を書いてみたい
Slide 18
Slide 18 text
おわり (Rounded-L Mgen+ 2p)