Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Inside hyperapp
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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.2k
Rails on CircleCI Tuning
taise
0
140
データ分析基盤Night #2
taise
2
5.6k
Other Decks in Technology
See All in Technology
Codex概要
ymiya55
0
230
HolmesGPTで始めるSREエージェント入門!プラットフォームの障害調査はAIにお任せ 〜
leveragestech
PRO
0
130
生成AIを使って「人が」考える技術 ― AI時代の人機共想と実践ノウハウ|UNITT AC2026
ishiirikie
0
520
Swap and Memory Reclaim - Squeezing Out More RAM
ennael
PRO
1
1.5k
企業の現実世界をグラフで写し取る
sansantech
PRO
0
240
spanner-autoscalerに学ぶ CRD設計パターン 〜自動化と緊急時対応を両立する Kubernetesコントローラーの作り方〜
tkuchiki
0
220
20260929_AmazonGuardDutyの検出通知メールにAWS DevOpsAgentの調査結果を追加する
yhana
1
410
LLM機能を自作して分かるSnowflake Cortex AIの強み
nayuts
0
200
AI Native Platform Engineering 〜PlatformとAgileで“作る速さ”を“価値”へ〜
uya116
0
600
Snowflake Horizon Catalog と Apache Iceberg で作る オープンなデータ基盤
kitagawaz
0
390
2026-10-01_MagicPod_QAハーネスエンジニアリングとQA組織の未来像
ynisqa1988
1
410
The seven pitfalls of AI (revised version)
ufried
0
200
Featured
See All Featured
ラッコキーワード サービス紹介資料
rakko
1
5.1M
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
31k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
How to Talk to Developers About Accessibility
jct
2
560
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
Making Projects Easy
brettharned
120
6.8k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
470
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
Designing Experiences People Love
moore
143
24k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
260
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 まとめ