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
Inside hyperapp
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Yusaku Omasa
February 26, 2018
Technology
240
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Inside hyperapp
Yusaku Omasa
February 26, 2018
More Decks by Yusaku Omasa
See All by Yusaku Omasa
Data Transformation in Digdag
taise
0
2.1k
Rails on CircleCI Tuning
taise
0
140
データ分析基盤Night #2
taise
2
5.6k
Other Decks in Technology
See All in Technology
AI時代こそ、スケールしないことをしよう -「作る人」から「なぜ作るか」を考える人へ / Do Things That Don't Scale in the AI Era — From How to Why
kaminashi
1
120
どこまでAIに任せるか 〜確率論と決定論の境界決定〜
shukob
0
500
Alphaモジュール使っていいのかい!?いけないのかい!?どっちなんだいっ!?
watany
1
330
AI時代の開発生産性を捉え直す — 経営と現場をつなぐ「開発組織のオブザーバビリティ」— / AI Dev Ex Conference 2026
tkyowa
1
1.5k
アップデートで何が変わった?デモで学んで使いこなすIBM Bob2.0
muehara
0
250
AI時代の開発生産性は、個人技からチーム設計へ
moongift
PRO
4
2.6k
Vポイント分析基盤におけるデータモデリング20年史
taromatsui_cccmkhd
4
750
10年目を迎えた「ABEMA」がどのように AI 活用を推進して、AI 駆動開発にシフトしているのか / How ABEMA, entering its 10th year, is promoting the use of AI and shifting toward AI-driven development
miyukki
0
380
“それは自分の仕事じゃない"を越えて行け
yuukiyo
1
530
AI時代におけるエンジニアの新たな役割──FDEとクオリアの探求/登壇資料(戸井田 裕貴)
hacobu
PRO
0
370
SRENEXT_2026_Chairs__Talks_in_Tamachi.sre.pdf
srenext
1
150
OPENLOGI Company Profile for engineer
hr01
1
75k
Featured
See All Featured
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
380
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.5k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
180
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
150
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
62
45k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
310
YesSQL, Process and Tooling at Scale
rocio
174
15k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
190
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
240
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.9k
Transcript
Inside hyperapp How to implement virtual dom 0x64 Stories Yusaku
Omasa
Hello! Yusaku Omasa. Twitter: @_eurk Web Engineer & Data Engineer
None
Hyperappとは 2017年のAdvent Calendarで Qiitaのエンジニアが開発し 実際にプロダクトでも採用 されたことで話題になった JavaScriptのFrameworkの ことである。 ref: 2018
年は Hyperapp の年だ
Hyperappとは (抄訳) Hyperapp is a JavaScript library for building web
applications. • Minimal ◦ 小さな実装で、多くのことに対応する試み。 あなたが理解すべきコンセプトも最小にしつつ、他のFrameworkができることを維持する。 • Functional ◦ The Elm Architectureにインスパイアされて設計している。 関数型パラダイムを使い、スケーラブルにブラウザベースのアプリケーションを作れる。 新しい言語を学ぶ必要はない。 • Batteries-included ◦ そのままの状態で、Hyperappはstate管理と仮想DOMエンジンなどの依存するものを全て含んでいる。 ref: https://github.com/hyperapp/hyperapp/blob/master/README.md
Hyperappとは ref: https://codepen.io/hyperapp/pen/zNxZLP?editors=0010
Hyperappとは ref: 1 KB にこだわった理由、1 KB であることの利点
Hyperappとは ref: 1 KB にこだわった理由、1 KB であることの利点
1KBのコードを読むのに 6時間かかりました (JSエンジニアではないとはいえ)
hyperapp design
• h() ◦ HTMLのタグをモデル化したもの ◦ JSXから変換可能になっている • app() ◦ Framework本体
▪ State管理 ▪ actionとstateの紐付け ▪ Lifecycle ▪ Virtual dom更新 ▪ レンダリングロック Reactにほぼ近く、router、SSR用のrenderなどは、関連packageがある Frontend MVC、validationみたいなものはない Hyperapp design
Hyperapp design import { h, app } from "hyperapp" const
state = { count: 0 } const actions = { down: value => state => ({ count: state.count - value }), up: value => state => ({ count: state.count + value }) } const view = (state, actions) => ( <div> <h1>{state.count}</h1> <button onclick={() => actions.down(1)}>-</button> <button onclick={() => actions.up(1)}>+</button> </div> ) app(state, actions, view, document.body)
Hyperapp design • Virtual DOM ◦ わりかし普通の木構造。 JavaScriptのObjectそのもの。 ▪ Nodeを基本単位として、
Nodeが再帰的に子Nodeを持つ ▪ 要素 • nodeName • attributes • children ref: https://github.com/hyperapp/hyperapp/blob/master/README .md#virtual-dom
Hyperapp design Virtual DOMの設計について • JSX互換性を維持するために babel pluginのtransform-react-jsx を使えるようにしており、この pluginが
Virtual DOMの設計を規定しているように見える。 (React.jsも同じ構造) • transform-react-jsx は、そのまま使うとReact.createElement() のかたちでNode Treeを 出力するが、JSXファイルで import { h } from "hyperapp"をすると h()に切り替えて出力する。
Process Flow Hyperapp design scheduleRender render action renderLock wait 1
msec patch unlock lifecycleStack push pop ① ② ③ ④ createElement
• action ◦ app()でProcess Flowに組み込まれる ◦ function wireStateToActions(path, state, actions)
{} でactionの関数を再定義して app直下にあるwiredActionsに登録される ▪ actionによってstateが変更 & actionがPromiseではないときだけ、 globalState を更新して、 scheduleRender() を呼び出す ◦ actionのトリガはonClickなどでView側に埋め込む Hyperapp design const actions = { down: value => state => ({ count: state.count - value }), up: value => state => ({ count: state.count + value }) } app(state, actions, view, document.body) <button onclick={() => actions.down(1)}>-</button>
Action関数の再定義って どうやって実装するの? こうやっている ===> これだけだと読むのが辛いので、 コードにメモを付けたブランチを作り ました https://github.com/taise/hyperapp/tree/memo Hyperapp design
Hyperapp design • StateとActionの紐づけ ◦ key: up ◦ action: value
=> state => ({ count: state.count + value }) • 関数の再定義 ◦ L136: actions[key] = function(data){} ◦ L150: action() はコメントアウトのところの ような呼び出し方をしている ◦ { count: state.count + value } で渡して いるので、stateと同じ形で返る ◦ state の値が変わっていて、 data が Promise ではない時に、globalState を更新しつつ、 scheduleRender() が呼び出される ◦ dataを返して終了
• hyperappは、たしかに読み切れるサイズのライブラリ ◦ React.jsとかを読むのと比べると遥かに簡単 ◦ JSエンジニアなら1~2時間くらいで読めるかもしれないけど サーバーサイド エンジニアは6時間かかったよ • FWのような抽象化されたライブラリの設計を読み解きながら
コードリーディングするのは楽しく、学びが多い ◦ 処理フローを図式化しながらやると、頭も整理されてよい 他にもrenderやpatchなど、なかなか読み応えがあるので、 レベルアップしたいJSエンジニアは読んでみると良いかもしれない https://github.com/taise/hyperapp/tree/memo まとめ