×
Copy
Open
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
Immutable Model 簡介
Slide 2
Slide 2 text
Jeremy Lu @thecat |
[email protected]
Founder and builder, Lovelyreader | Pubulous | Visualmarks | Docknote
Slide 3
Slide 3 text
Developer 10+ years of hands-on experience
Slide 4
Slide 4 text
Consulting Social Media Finance Real Estate Digital Publishing
Slide 5
Slide 5 text
Founder Lovelyreader Pubulous Visualmarks Docknote
Slide 6
Slide 6 text
FullstackRocks.com LATEST
Slide 7
Slide 7 text
Immutable 是什麼? 每次對 model 操作,不會變動原始內 容,⽽而是返還新的物件
Slide 8
Slide 8 text
Immutable 是什麼? - 以 Array.map() 為例 var arr1 = ['a', 'b', 'c']; var arr2 = arr1.map( function(item){ return 'x_' + item} ) // ["x_a", "x_b", "x_c"] - arr1 原始內容不變,map 處理後的值在 arr2 內
Slide 9
Slide 9 text
為何需要? - user.info.arrPhones.push({'02-1111-2222'}); - 無界不易偵知物件內部的 arrPhones[] 值已改變 - 傳統解法有 KVO, watcher, Object.observe(), 各有不同爛法 - 最乾淨解法是 immutable data types
Slide 10
Slide 10 text
有何好處? - 元件 dirty check 無敵快 - shouldComponentUpdate: function(nextProps, nextState) - react 元件⽣生命週期依賴 shouldComponentUpdate() 判斷此輪是否需要重繪 - ⺫⽬目前⼀一律 return true 讓元件重繪 - 如果採⽤用 immutable,可⽤用⼀一句話 nextProps === this.props ⽐比對出資料是否變動
Slide 11
Slide 11 text
有何好處? - 運算速度快 (因為不是 clone object,⽽而是 clone reference) - 節省記憶體消耗 - 也因為其值保証不變,因此可當 hash key
Slide 12
Slide 12 text
現⾏行 react 可⽤用⽅方案 - update helper - 輕量⼿手法 - 對原本程式影響最⼩小 - 語法⿇麻煩(尤其遇到深層結構時) - 無法防呆 * http://goo.gl/jpSxnB
Slide 13
Slide 13 text
現⾏行 react 可⽤用⽅方案 - immutablejs - 較重 - 要根本改變資料結構 - 可充份防呆 - 輕易操作深層物件結構 - 內部使⽤用 hash maps tries & vector tries - ⽀支援 chaining 操作 * http://goo.gl/GdrcfL
Slide 14
Slide 14 text
現⾏行 react 可⽤用⽅方案 - view plugin - 是個 React mixin,直接跟 view 綁在⼀一起 * http://goo.gl/HWkloq
Slide 15
Slide 15 text
現⾏行 react 可⽤用⽅方案 - Transducers * https://github.com/jlongster/transducers.js - Mori - 最像 clojure 語法,較怪異 * https://github.com/swannodette/mori - Cortex * https://github.com/mquan/cortex
Slide 16
Slide 16 text
現⾏行 react 可⽤用⽅方案 - OM - 純 clojure 語法,純欣賞兼致敬⽤用... * https://github.com/swannodette/om
Slide 17
Slide 17 text
推薦哪個? - 資料結構單純的⽤用 update helper - ⼤大案⼦子⽤用 immutable.js - immutablejs 與 update 的差異 - immutablejs 可以防呆,update 不⾏行
Slide 18
Slide 18 text
為何不該⽤用 immutable? - 90% 的案⼦子都沒這麼複雜 - 並且 VDOM 的 diff 本⾝身很有效率,可先⽤用它擋著
Slide 19
Slide 19 text
為何不該採⽤用 immutable? - 現⾏行⼤大部份 immutable ⽅方案都讓程式碼變的更⻑⾧長、 更⿇麻煩、也更難寫 - 因此⼀一定要先 benchmark 確認瓶頸在 dirty checking,才值得改⽤用 immutable - 你會⽤用 devtools 的 timeline 與 profiler 對吧?
Slide 20
Slide 20 text
你會⽤用 devtools 的 timeline 與 profiler 對吧?
Slide 21
Slide 21 text
為何不該採⽤用 immutable? - 官⽅方也強調⽤用在 performance critical 的地⽅方才會有 明顯好處
Slide 22
Slide 22 text
何時該⽤用 immutable model? - 程式裏有幾百個元件同時運⾏行導致效率不佳時
Slide 23
Slide 23 text
何時該⽤用 immutable model? - 需要 undo/redo 時 - 每次變動 model 後,皆會返還⼀一份新 model - 每次將舊的 model 塞⼊入 array 內保存,就免費獲得 undo/redo 功能 - ⼤大前提是 view 真的有忠實反應 model state - single source of truth + always redraw 原則 - Undo 就是抽換不同版本 model,view 就保証重繪 - 但如果某些狀態值只保存在 view 端,這招就 gg
Slide 24
Slide 24 text
何時該⽤用 immutable model? - 就算要⽤用 - 可以只選部份關鍵資料採⽤用 - 其它不會共⽤用的資料結構仍可延⽤用普通 js 資料格式
Slide 25
Slide 25 text
其它注意事項 - 範例裏常⽤用 ES6 語法 - 例如 fat arrow function =>
Slide 26
Slide 26 text
其它注意事項 - 選擇正確的 data structure ,剩下的問題都好解決
Slide 27
Slide 27 text
其它注意事項 - 有類似 OM 的 cursor 功能 - 可深⼊入 model 內部取出⼀一⼩小部份資料餵給元件當作 state - 因此操作⼿手續上較單純 * http://goo.gl/ZTpRXL
Slide 28
Slide 28 text
其它注意事項 - ⾄至少 2015 年初再開始⽤用 immutable.js,那時⼤大概出 到 v4 版,API 會更穩定
Slide 29
Slide 29 text
90% 以上的機會你不需要⽤用到 immutable,或有其它更佳解 法,因此⾏行動前請務必三思。
Slide 30
Slide 30 text
Professional training on fullstack development at fullstackrocks.com
Slide 31
Slide 31 text
[email protected]
Questions?