Hyperapp是一個輕量級視圖庫,擁有完備的界面渲染、以及視圖數據交互更新能力。專一於視圖渲染的核心部分,使得它的體積很是輕巧,也使得它具有"無限可能"。在設計上並沒有涉及太多複雜場景,尤其適用於輕量級的移動開發場景。html
Hyperapp
僅關心狀態渲染、調度生成後actions對象。在狀態管理上,咱們能夠自主使用flux
、redux
,甚至無需使用任何狀態管理庫。node
Hyperapp
提供vnode
生成輔助函數,但並不限制渲染模板的選擇,咱們能夠自由選擇相似JSX
,甚至類VUE
的模板語言。webpack
在Hyperapp
初始渲染以後,觸發視圖更新的惟一方式是,經過調用action
變動狀態,從而觸發視圖更新。這使得咱們能夠創建易於跟蹤、健壯、可維性強的應用。git
詳細的分析,能夠在源碼註釋倉庫下看到,裏面有hyperapp
各個源碼重要細節的分析。下面來介紹一下hyperapp
源碼有意思的地方:github
專一於視圖渲染&數據交互更新,在實現上也是恰到好處地實現這些功能。具有內置狀態驅動的視圖更新引擎、標準VNode
四板斧、DOM-diff
機制。在這點來講,hyperapp
處於新生期,須要具有完善的生態,才能夠發揮出強大的內核能力。web
VNode四板斧:redux
// 基本的HTML標籤均可以被抽象成以下形式: // { // nodeName, // attributes, // children, // key // } // TextNode只有一個nodeValue,SVG也是比較特殊,因此在更新時候也會對這兩種類型作特殊處理
DOM-diff 原則:app
// 1. 平級對比,非平級則認爲是不同的dom,直接剷平重建 // 2. 只更新同類型節點,非同類型同樣剷平重建 // 3. 儘量利用現有dom,免除額外的刪除建立開銷,只須要從新插入(appendChild or insertBefore) // 4. index&key相同的vdom,對應的dom無需對比,直接複用,下一個!
hyperapp
在細看一些實現上,會以爲有些"不嚴謹",可能會被鑽空子。好比:clone、get等函數實現,或者是Promise、Array的判斷。dom
事實上,這些函數用於在有標準DOM結構的實現、自調用的源碼上,做爲判斷能達到"剛恰好"的要求。既不會浪費性能體積,也不會致使出錯。異步
function get(path, source) { for (var i = 0; i < path.length; i++) { source = source[path[i]] } return source } // const result = { winner: { name: 'Tony' } } // get(['winner', 'name'], result) => Tony
沒必要具有lodash get
的兼容性,以最優形態抽象出適用於源碼的函數,即是最好的。
說出來你可能不信,hyperapp
僅有四個生命週期函數。
他們分別是:
視圖渲染
oncreate(DOMElement)
onupdate(DOMElement)
視圖銷燬
銷燬前執行:
onremove(DOMElement, action)
銷燬前通知:
ondestory(DOMElement)
這使得hyperapp
比較適用於輕交互場景,配合webpack
的模板語法編譯能力,能夠實現很是輕量級的移動應用。
在列表渲染時候,hyperapp
嚴格要求組件提供對應key
屬性。
若是沒有對應的key
,至關於默認每次渲染都是全新的列表,這會涉及到原有列表DOM
的銷燬、新列表DOM
建立以及添加,大型列表上有可能會致使性能問題。
也正由於這個特性,使得在良好結構下,hyperapp
的渲染性能表現不亞於現有主流渲染庫。
Hyperapp
雖然精巧,卻徹底支持SSR
特性。在初次渲染時候,會將現有DOM
結構轉成vdom
,當有行爲觸發數據變更時,高效進行dom-diff
以更新現有視圖。