搞定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 相关文章推荐
FireFox与IE 下js兼容触发click事件的代码
Nov 20 Javascript
图像替换新技术 状态域方法
Jan 28 Javascript
JavaScript 浏览器验证代码(来自discuz)
Jul 17 Javascript
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
Oct 11 Javascript
两种常用的javascript数组去重方法思路及代码
Mar 26 Javascript
node.js版本管理工具n无效的原理和解决方法
Nov 24 Javascript
jQuery插件版本冲突的处理方法分析
Jan 16 Javascript
JavaScript中的遍历详解(多种遍历)
Apr 07 Javascript
node.js操作mysql简单实例
May 25 Javascript
微信小程序tabBar底部导航中文注解api详解
Aug 16 Javascript
这15个Vue指令,让你的项目开发爽到爆
Oct 11 Javascript
Vuex模块化应用实践示例
Feb 03 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
phplock(php进程锁) v1.0 beta1
2009/11/24 PHP
一个简单的php加密解密函数(动态加密)
2013/06/19 PHP
php使用smtp发送支持附件的邮件示例
2014/04/13 PHP
解决出现SoapFault (looks like we got no XML document)的问题
2017/06/24 PHP
laravel自定义分页效果
2017/07/23 PHP
激活 ActiveX 控件
2006/10/09 Javascript
为原生js Array增加each方法
2012/04/07 Javascript
window.showModalDialog参数传递中含有特殊字符的处理方法
2013/06/06 Javascript
Javascript浅谈之this
2013/12/17 Javascript
JavaScript实现将数组中所有元素连接成一个字符串的方法
2015/04/06 Javascript
JavaScript和HTML DOM的区别与联系及Javascript和DOM的关系
2015/11/15 Javascript
Markdown与Bootstrap相结合实现图片自适应属性
2016/05/04 Javascript
jQuery原理系列-常用Dom操作详解
2016/06/07 Javascript
require.js+vue开发微信上传图片组件
2016/10/27 Javascript
JS实现点击网页判断是否安装app并打开否则跳转app store
2016/11/18 Javascript
用jQuery实现可输入多选下拉组合框实例代码
2017/01/18 Javascript
Node.js对MongoDB数据库实现模糊查询的方法
2017/05/03 Javascript
详解jQuery如何实现模糊搜索
2019/05/10 jQuery
优化Vue中date format的性能详解
2020/01/13 Javascript
详解详解Python中writelines()方法的使用
2015/05/25 Python
Python3内置模块之json编解码方法小结【推荐】
2020/12/09 Python
Python基本数据结构之字典类型dict用法分析
2019/06/08 Python
Python如何通过Flask-Mail发送电子邮件
2020/01/29 Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
2021/01/22 Python
如何用Matlab和Python读取Netcdf文件
2021/02/19 Python
JOSEPH官网:英国奢侈时尚品牌
2018/01/31 全球购物
澳洲女装时尚在线:Blue Bungalow
2018/05/05 全球购物
马歇尔耳机官网:Marshall Headphones
2020/02/04 全球购物
Weblogc domain问题
2014/01/27 面试题
三维科技面试题
2013/07/27 面试题
会计专业毕业自荐书范文
2014/02/08 职场文书
2015年材料员工作总结
2015/04/30 职场文书
农民工工资保障承诺书
2015/05/04 职场文书
2016大学生诚信考试承诺书
2016/03/25 职场文书
2019年世界儿童日宣传标语
2019/11/22 职场文书
利用For循环遍历Python字典的三种方法实例
2022/03/25 Python