搞定immutable.js详细说明


Posted in Javascript onMay 02, 2016

什么是Immutable Data

Immutable Data是指一旦被创造后,就不可以被改变的数据。

通过使用Immutable Data,可以让我们更容易的去处理缓存、回退、数据变化检测等问题,简化我们的开发。

js中的Immutable Data
在javascript中我们可以通过deep clone来模拟Immutable Data,就是每次对数据进行操作,新对数据进行deep clone出一个新数据。

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

当然你或许意识到了,这样非常的慢。如下图,确实很慢

搞定immutable.js详细说明

主角immutable.js登场

immutable.js是由facebook开源的一个项目,主要是为了解决javascript Immutable Data的问题,通过参考hash maps tries 和 vector tries提供了一种更有效的方式。

简单的来讲,immutable.js通过structural sharing来解决的性能问题。我们先看一段视频,看看immutable.js是如何做的

搞定immutable.js详细说明

当我们发生一个set操作的时候,immutable.js会只clone它的父级别以上的部分,其他保持不变,这样大家可以共享同样的部分,可以大大提高性能。

为什么你要在React.js中使用Immutable Data

熟悉React.js的都应该知道,React.js是一个UI = f(states)的框架,为了解决更新的问题,React.js使用了virtual dom,virtual dom通过diff修改dom,来实现高效的dom更新。

听起来很完美吧,但是有一个问题。当state更新时,如果数据没变,你也会去做virtual dom的diff,这就产生了浪费。这种情况其实很常见,可以参考flummox这篇文章

当然你可能会说,你可以使用PureRenderMixin来解决呀,PureRenderMixin是个好东西,我们可以用它来解决一部分的上述问题,但是如果你留心的话,你可以在文档中看到下面这段提示。

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只是简单的浅比较,不使用于多层比较。那怎么办??自己去做复杂比较的话,性能又会非常差。

方案就是使用immutable.js可以解决这个问题。因为每一次state更新只要有数据改变,那么PureRenderMixin可以立刻判断出数据改变,可以大大提升性能。这部分还可以参考官方文档Immutability Helpers

总结就是:使用PureRenderMixin + immutable.js

参考

React.js Conf 2015 - Immutable Data and React

Immutability Helpers

PureRenderMixin

immutable-js

Javascript 相关文章推荐
JS实现网页滚动条感应鼠标变色的方法
Feb 26 Javascript
ECMA5数组的新增方法有哪些及forEach()模仿实现
Nov 03 Javascript
js判断移动端是否安装某款app的多种方法
Dec 18 Javascript
js纯数字逐一停止显示效果的实现代码
Mar 16 Javascript
关于原生js中bind函数的简单实现
Aug 10 Javascript
Javascript使用SWFUpload进行多文件上传
Nov 16 Javascript
使用gulp搭建本地服务器并实现模拟ajax
Apr 05 Javascript
JavaScript实现时间表动态效果
Jul 15 Javascript
Vue实现移动端页面切换效果【推荐】
Nov 13 Javascript
layer弹出层自适应高度,垂直水平居中的实现
Sep 16 Javascript
Vue状态模式实现窗口停靠功能(灵动、自由, 管理后台Admin界面)
Mar 06 Javascript
ES6箭头函数和扩展实例分析
May 23 Javascript
Immutable 在 JavaScript 中的应用
May 02 #Javascript
基于javascript数组实现图片轮播
May 02 #Javascript
Javascript HTML5 Canvas实现的一个画板
Apr 12 #Javascript
bootstrap3 兼容IE8浏览器!
May 02 #Javascript
javascript实现列表切换效果
May 02 #Javascript
基于javascript编写简单日历
May 02 #Javascript
Bootstrap媒体对象的实现
May 01 #Javascript
You might like
PHP个人网站架设连环讲(四)
2006/10/09 PHP
php初学者写及时补给skype用户充话费的小程序
2008/11/02 PHP
php curl post 时出现的问题解决
2014/01/30 PHP
PHP使用Pear发送邮件(Windows环境)
2016/01/05 PHP
php微信高级接口群发 多客服
2016/06/23 PHP
遍历echsop的region表形成缓存的程序实例代码
2016/11/01 PHP
PHP+Mysql+Ajax实现淘宝客服或阿里旺旺聊天功能(前台页面)
2017/06/16 PHP
php实现文章评论系统
2019/02/18 PHP
七种PHP开发环境搭建工具
2020/06/28 PHP
验证用户是否修改过页面的数据的实现方法
2008/09/26 Javascript
ASP SQL防注入的方法
2008/12/25 Javascript
js修改input的type属性及浏览器兼容问题探讨与解决
2013/01/23 Javascript
使用jquery animate创建平滑滚动效果(可以是到顶部、到底部或指定地方)
2014/05/27 Javascript
前端必备神器 Snap.svg 弹动效果
2014/11/10 Javascript
Javascript中数组sort和reverse用法分析
2014/12/30 Javascript
js判断鼠标左、中、右键哪个被点击的方法
2015/01/27 Javascript
jQuery实现的表头固定效果实例【附完整demo源码下载】
2016/08/01 Javascript
jquery Banner轮播选项卡
2016/12/26 Javascript
js使用原型对象(prototype)需要注意的地方
2017/08/28 Javascript
elementUi vue el-radio 监听选中变化的实例代码
2019/06/28 Javascript
vue实现表单录入小案例
2019/09/27 Javascript
Vue 如何使用props、emit实现自定义双向绑定的实现
2020/06/05 Javascript
[20:21]《一刀刀一天》第十六期:TI国际邀请赛正式打响,总奖金超过550万
2014/05/23 DOTA
在Python中使用cookielib和urllib2配合PyQuery抓取网页信息
2015/04/25 Python
Python操作Word批量生成文章的方法
2015/07/28 Python
python飞机大战 pygame游戏创建快速入门详解
2019/12/17 Python
python程序实现BTC(比特币)挖矿的完整代码
2021/01/20 Python
澳大利亚潮流尖端的快时尚品牌:Cotton On
2016/09/26 全球购物
介绍一下Cookie和Session及他们之间的区别
2012/11/20 面试题
运动会广播稿200字
2014/10/18 职场文书
2014年纠风工作总结
2014/12/08 职场文书
五年级学生评语大全
2014/12/26 职场文书
2016年“5.12”护士节致辞
2015/07/31 职场文书
雄兵连:第三季先行图公开,天使恶魔联合,银河之力的新力量
2021/06/11 国漫
如何理解python接口自动化之logging日志模块
2021/06/15 Python
VUE中的v-if与v-show区别介绍
2022/03/13 Vue.js