搞定immutable.js詳細(xì)說明
什么是Immutable Data
Immutable Data是指一旦被創(chuàng)造后,就不可以被改變的數(shù)據(jù)。
通過使用Immutable Data,可以讓我們更容易的去處理緩存、回退、數(shù)據(jù)變化檢測等問題,簡化我們的開發(fā)。
js中的Immutable Data
在javascript中我們可以通過deep clone來模擬Immutable Data,就是每次對數(shù)據(jù)進(jìn)行操作,新對數(shù)據(jù)進(jìn)行deep clone出一個(gè)新數(shù)據(jù)。
deep clone
/** * learning-immutable - clone-deep.js * Created by mds on 15/6/6. */ 'use strict'; var cloneDeep = require('lodash.clonedeep'); var data = { id: 'data', author: { name: 'mdemo', github: 'https://github.com/demohi' } }; var data1 = cloneDeep(data); console.log('equal:', data1===data); //false data1.id = 'data1'; data1.author.name = 'demohi'; console.log(data.id);// data console.log(data1.id);// data1 console.log(data.author.name);//mdemo console.log(data1.author.name);//demohi
當(dāng)然你或許意識到了,這樣非常的慢。如下圖,確實(shí)很慢
主角immutable.js登場
immutable.js是由facebook開源的一個(gè)項(xiàng)目,主要是為了解決javascript Immutable Data的問題,通過參考hash maps tries 和 vector tries提供了一種更有效的方式。
簡單的來講,immutable.js通過structural sharing來解決的性能問題。我們先看一段視頻,看看immutable.js是如何做的
當(dāng)我們發(fā)生一個(gè)set操作的時(shí)候,immutable.js會只clone它的父級別以上的部分,其他保持不變,這樣大家可以共享同樣的部分,可以大大提高性能。
為什么你要在React.js中使用Immutable Data
熟悉React.js的都應(yīng)該知道,React.js是一個(gè)UI = f(states)的框架,為了解決更新的問題,React.js使用了virtual dom,virtual dom通過diff修改dom,來實(shí)現(xiàn)高效的dom更新。
聽起來很完美吧,但是有一個(gè)問題。當(dāng)state更新時(shí),如果數(shù)據(jù)沒變,你也會去做virtual dom的diff,這就產(chǎn)生了浪費(fèi)。這種情況其實(shí)很常見,可以參考flummox這篇文章
當(dāng)然你可能會說,你可以使用PureRenderMixin來解決呀,PureRenderMixin是個(gè)好東西,我們可以用它來解決一部分的上述問題,但是如果你留心的話,你可以在文檔中看到下面這段提示。
This only shallowly compares the objects. If these contain complex data structures, it may produce false-negatives for deeper differences. Only mix into components which have simple props and state, or use forceUpdate() when you know deep data structures have changed. Or, consider using immutable objects to facilitate fast comparisons of nested data.
PureRenderMixin只是簡單的淺比較,不使用于多層比較。那怎么辦??自己去做復(fù)雜比較的話,性能又會非常差。
方案就是使用immutable.js可以解決這個(gè)問題。因?yàn)槊恳淮蝧tate更新只要有數(shù)據(jù)改變,那么PureRenderMixin可以立刻判斷出數(shù)據(jù)改變,可以大大提升性能。這部分還可以參考官方文檔Immutability Helpers
總結(jié)就是:使用PureRenderMixin + immutable.js
參考
相關(guān)文章
javascript實(shí)現(xiàn)去除HTML標(biāo)簽的方法
這篇文章主要介紹了javascript實(shí)現(xiàn)去除HTML標(biāo)簽的方法,涉及javascript正則替換相關(guān)操作技巧,需要的朋友可以參考下2016-12-12JavaScript知識點(diǎn)總結(jié)(五)之Javascript中兩個(gè)等于號(==)和三個(gè)等于號(===)的區(qū)別
這篇文章主要介紹了JavaScript知識點(diǎn)總結(jié)(五)之Javascript中兩個(gè)等于號(==)和三個(gè)等于號(===)的區(qū)別的相關(guān)資料,需要的朋友可以參考下2016-05-05《javascript設(shè)計(jì)模式》學(xué)習(xí)筆記三:Javascript面向?qū)ο蟪绦蛟O(shè)計(jì)單例模式原理與實(shí)現(xiàn)方法分析
這篇文章主要介紹了Javascript面向?qū)ο蟪绦蛟O(shè)計(jì)單例模式原理與實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了《javascript設(shè)計(jì)模式》中Javascript面向?qū)ο髥卫J较嚓P(guān)概念、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-04-04使用script的src實(shí)現(xiàn)跨域和類似ajax效果
在解決js的跨域問題的時(shí)候, 有多種方式, 其中有一種是利用script標(biāo)簽的src屬性,因?yàn)檫@個(gè)屬性是不受域名限制的,我們可以直接讓src的這個(gè)鏈接指向跨域網(wǎng)站的一個(gè)接口, 這個(gè)接口返回的是js代碼或者json格式數(shù)據(jù), 從而實(shí)現(xiàn)跨域獲取數(shù)據(jù)。2014-11-11JS時(shí)間戳與日期格式互相轉(zhuǎn)換的簡單方法示例
這篇文章主要給大家介紹了關(guān)于JS時(shí)間戳與日期格式互相轉(zhuǎn)換的簡單方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11JavaScript中的console.profile()函數(shù)詳細(xì)介紹
這篇文章主要介紹了JavaScript中的console.profile()函數(shù)詳細(xì)介紹,本文講解了console.profile()函數(shù)的瀏覽器支持情況、console.profile()的使用、Firebug中Profile按鈕的使用等內(nèi)容,需要的朋友可以參考下2014-12-12JavaScript中的Error錯(cuò)誤對象與自定義錯(cuò)誤類型詳解
Error是JavaScript中最原始的錯(cuò)誤對象,作為各種異常的基礎(chǔ)對象,還有多個(gè)衍生的具體的錯(cuò)誤類型,這些錯(cuò)誤對象類型在nodejs中也可應(yīng)用,這篇文章主要介紹了JavaScript中的Error錯(cuò)誤對象與自定義錯(cuò)誤類型,需要的朋友可以參考下2022-12-12js實(shí)現(xiàn)鼠標(biāo)懸浮給圖片加邊框的方法
這篇文章主要介紹了js實(shí)現(xiàn)鼠標(biāo)懸浮給圖片加邊框的方法,涉及jquery.insetborder.js中borderEffect方法的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01