搞定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+FSO遍历文件夹下文件并显示
Mar 07 Javascript
JavaScript Cookie 直接浏览网站分网址
Dec 08 Javascript
JavaScript 原型继承之构造函数继承
Aug 26 Javascript
Javascript字符串浏览器兼容问题分析
Dec 01 Javascript
JS组件中bootstrap multiselect两大组件较量
Jan 26 Javascript
javascript轻量级库createjs使用Easel实现拖拽效果
Feb 19 Javascript
完美解决spring websocket自动断开连接再创建引发的问题
Mar 02 Javascript
javascript使用btoa和atob来进行Base64转码和解码
Mar 20 Javascript
EasyUI的DataGrid绑定Json数据源的示例代码
Dec 16 Javascript
JavaScript中的 new 命令
May 22 Javascript
微信小程序与公众号卡券/会员打通的问题
Jul 25 Javascript
JavaScript中数组去重的5种方法
Jul 04 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使用递归函数实现数字累加的方法
2015/03/16 PHP
Yii框架连接mongodb数据库的代码
2016/07/27 PHP
yii通过小物件生成view的方法
2016/10/08 PHP
Yii全局函数用法示例
2017/01/22 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
2019/03/06 PHP
浅谈javascript的数据类型检测
2010/07/10 Javascript
JQuery跨Iframe选择实现代码
2010/08/19 Javascript
jquery简单的拖动效果实现原理及示例
2013/07/26 Javascript
JS简单实现登陆验证附效果图
2013/11/19 Javascript
特殊情况下如何获取span里面的值
2014/05/20 Javascript
深入解析AngularJS框架中$scope的作用与生命周期
2016/03/05 Javascript
noty ? jQuery通知插件全面解析
2016/05/18 Javascript
js判断checkbox是否选中个数的方法(超简单)
2016/08/19 Javascript
JS实战篇之收缩菜单表单布局
2016/12/10 Javascript
微信小程序 网络请求(post请求,get请求)
2017/01/17 Javascript
Bootstrap table简单使用总结
2017/02/15 Javascript
关于jQuery库冲突的完美解决办法
2017/05/20 jQuery
js之切换全屏和退出全屏实现代码实例
2019/09/09 Javascript
javascript设计模式之迭代器模式
2020/01/30 Javascript
Python学习之asyncore模块用法实例教程
2014/09/29 Python
Python可变参数用法实例分析
2017/04/02 Python
浅谈django三种缓存模式的使用及注意点
2018/09/30 Python
python字典嵌套字典的情况下找到某个key的value详解
2019/07/10 Python
Pycharm 字体大小调整设置的方法实现
2019/09/27 Python
python3格式化字符串 f-string的高级用法(推荐)
2020/03/04 Python
Pycharm 设置默认解释器路径和编码格式的操作
2021/02/05 Python
使用 css3 实现圆形进度条的示例
2017/07/05 HTML / CSS
Crocs卡骆驰洞洞鞋日本官方网站:Crocs日本
2016/08/25 全球购物
升旗仪式演讲稿
2014/05/08 职场文书
党的群众路线对照检查材料
2014/08/27 职场文书
农行心得体会
2014/09/02 职场文书
幸福中国演讲稿
2014/09/12 职场文书
食品药品安全责任书
2015/05/11 职场文书
2015年食品安全宣传周活动总结
2015/07/09 职场文书
《自然之道》读后感3篇
2019/12/17 职场文书
MySql 缓存查询原理与缓存监控和索引监控介绍
2021/07/02 MySQL