Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
picodomでVDOMの理解を深める
Search
takanorip
January 25, 2018
Technology
440
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
picodomでVDOMの理解を深める
takanorip
January 25, 2018
More Decks by takanorip
See All by takanorip
AI-Slopなデザインを生まないためのデザインプロセス戦略
takanorip
7
5.2k
「見せる」登壇資料デザインの極意
takanorip
7
1.4k
Design System Documentation Tooling 2025
takanorip
3
2.8k
デザインエンジニアの延長にデザインマネージャーとしての可能性を探る
takanorip
1
1.2k
Tools for Design Engineers other than LLM in the LLM era
takanorip
1
820
Bulletproof Design System with TypeScript
takanorip
7
5.3k
Eleventy3.0 で始める爆速個人ブログ開発!
takanorip
0
310
Webフォント選定の極意!フォントの基本から最新トレンドまで徹底解説
takanorip
6
1.1k
効果的な管理画面を デザインをするために 避けるべき5つの罠
takanorip
15
7.9k
Other Decks in Technology
See All in Technology
サイバー捜査員研修(後半)
nomizone
1
790
トヨタ⽣産⽅式(TPS)⼊⾨
recruitengineers
PRO
2
600
AI時代の強いチームの作り方
yuukiyo
25
16k
【CEDEC2026】『GRANBLUE FANTASY: Relink - Endless Ragnarok』のバトル制作事例 ~最高のキャラゲーを目指して~
cygames
PRO
0
220
AI ネイティブな組織に Gemini Enterprise Agent Platform がなぜ必要なのか
asei
1
190
Forza Horizon 6 のテレメトリ機能で 自動運転に使えそうな学習データを集める話
henjin0
0
140
Invisible to AI? Making TYPO3 Sites Quotable by AI Search Systems
wolfgangwagner
0
140
20260804_Q4AzureUpdateBite_FabricDataAgentの精度を高める設計.pdf
matayuuu
1
110
Webアクセシビリティ入門 2026
recruitengineers
PRO
2
430
Data Hubグループ 紹介資料
sansan33
PRO
0
3.1k
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
19k
Cursor Meetup Sapporo - Cursor物語 続編
cocacola917
0
140
Featured
See All Featured
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
270
Raft: Consensus for Rubyists
vanstee
141
7.6k
Google's AI Overviews - The New Search
badams
0
1.1k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.7k
[SF Ruby Conf 2025] Rails X
palkan
2
1.2k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
200
Build your cross-platform service in a week with App Engine
jlugia
234
19k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
290
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
230
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
580
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.7k
Transcript
picodomでVDOMの 理解を深める Takanori Oki @Megro.es
自己紹介 • 大木 尊紀(オオキ タカノリ) / @takanorip • 株式会社スマートドライブ •
フロントエンドエンジニア • React、Vue、Polymer、Web制作全般 • Polymer Japan 翻訳チーム • 「イヌでもわかる Web Components」 好評配信中 • 輝夜月かわいい
Polymer Japan Cafe (2月6日@Google Tokyo Office)
hyperapp コードリーディング会 (2月7日@チームスピリット)
picodom ?
picodom • VDOMでページを操作するJSライブラリ • 1kbしかない、軽い • hyperappのJorgeBucaranさんが書いてる • 提供するメソッドは2つだけ •
h():VDOMを生成する • patch():VDOMへ差分適用 • JSXが使える
なんでpicodom? • Fish shellのファンだから(JorgeBucaranさんはFish shellの開発者でもある) • hyperappよりも機能が絞られているから読みやすいか なと思った • VDOMの実装だけ読みたかった
• picodom使ってオレオレライブラリ作れたら面白そう
picodomを読む
構成とか • picodomの構成 • h.js:h()の定義 / 29行 • patch.js:patch()を定義 /
206行 • (index.jsは↑2つのファイルをimportしてるだけ)
picodomを読む: h() • VDOMを生成する • DOM構造をオブジェクトに変換する (VODMはオブジェクト) • めっちゃシンプルなので言うことない •
Reactとかとやってることはだいたい同じ
h("div", {id: 'app'}, [ h("h1", {class: 'title'}, 'Title'), h("button", {
onclick: () => {hoge: 'fuga'} }, "+"), 'some text' ]);
{ name: "div", props: { id: "app" }, children: [
{ name: "h1", props: { class : "title" }, children: ["Title"] }, { name: "button", props: { onclick: () => {hoge: 'fuga'} }, children: ["+"] }, "some text" ] }
picodomを読む: patch() patch patchElement setElementProp removeChildren createElement updateElement setElementProp oldNode
== null patchElement true false
picodomを読む: patch() patch patchElementの結果を返す patchElement 差分更新の処理を司る setElementProp elementにpropsを挿入する createElement document.createElementを使って
elementを作成する updateElement elementのvalueやpropsを更新する removeChildren elementを削除する
picodomを使う
import { h, patch } from picodom /** @jsx h
*/ let node function render(view, withState) { patch(node, (node = view(withState))) } function view(state) { return ( <div> <h1>{state}</h1> <input autofocus type="text" value={state} oninput={e => render(view, e.target.value)} /> </div> ) } render(view, "Hello!")
まとめ • 軽量なVDOMフレームワーク • 仮想DOMの仕組みがなんとなくわかった • コア機能のみの実装で、実装はとてもシンプル • picodomベースでオレオレフレームワークをつくる本 を書いてみたい
おわり (Rounded-L Mgen+ 2p)