搞定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 focus不起作用的解决方法(主要是因为dom元素是否加载完成)
Nov 05 Javascript
初窥JQuery(二)事件机制(2)
Dec 06 Javascript
HTML Color Picker(js拾色器效果)
Aug 27 Javascript
点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
Jan 02 Javascript
javascript实现验证身份证号的有效性并提示
Apr 30 Javascript
BootStrap iCheck插件全选与获取value值的解决方法
Aug 24 Javascript
简单理解js的prototype属性及使用
Dec 07 Javascript
微信小程序封装的HTTP请求示例【附升级版】
May 11 Javascript
解决layui中onchange失效以及form动态渲染失效的问题
Sep 27 Javascript
解决vue-router 切换tab标签关闭时缓存问题
Jul 22 Javascript
js实现点击上传图片并设为模糊背景
Aug 02 Javascript
JS异步堆栈追踪之为什么await胜过Promise
Apr 28 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
Oracle 常见问题解答
2006/10/09 PHP
PHP中获取文件扩展名的N种方法小结
2012/02/27 PHP
php判断ip黑名单程序代码实例
2014/02/24 PHP
php格式化日期实例分析
2014/11/12 PHP
CodeIgniter删除和设置Cookie的方法
2015/04/07 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
360搜索引擎自动收录php改写方案
2018/04/28 PHP
基于jquery的模态div层弹出效果
2010/08/21 Javascript
推荐一款jQuery插件模板
2015/01/09 Javascript
js编写的treeview使用方法
2016/11/11 Javascript
Vue.js学习记录之在元素与template中使用v-if指令实例
2017/06/27 Javascript
浅谈vue项目重构技术要点和总结
2018/01/23 Javascript
jQuery滑动效果实现方法分析
2018/09/05 jQuery
深入浅析JavaScript中的in关键字和for-in循环
2020/04/20 Javascript
在Python的web框架中配置app的教程
2015/04/30 Python
在Python的一段程序中如何使用多次事件循环详解
2017/09/07 Python
caffe binaryproto 与 npy相互转换的实例讲解
2018/07/09 Python
python中使用zip函数出现错误的原因
2018/09/28 Python
Python解析、提取url关键字的实例详解
2018/12/17 Python
解决新django中的path不能使用正则表达式的问题
2018/12/18 Python
Python二叉树的镜像转换实现方法示例
2019/03/06 Python
基于TensorFlow的CNN实现Mnist手写数字识别
2020/06/17 Python
使用html2canvas.js实现页面截图并显示或上传的示例代码
2018/12/18 HTML / CSS
来自美国主售篮球鞋的零售商店:KICKSUSA
2017/11/28 全球购物
手工制作的意大利太阳镜和光学元件:Illesteva
2019/01/19 全球购物
汽车专业毕业生自荐信
2013/11/03 职场文书
初一科学教学反思
2014/01/27 职场文书
酒店总经理助理职责
2014/02/12 职场文书
十八届三中全会宣传方案
2014/02/21 职场文书
选秀节目策划方案
2014/06/06 职场文书
班子查摆四风个人对照检查材料思想汇报
2014/10/04 职场文书
一般基层干部群众路线教育实践活动个人对照检查材料
2014/11/04 职场文书
2016年全国爱眼日宣传教育活动总结
2016/04/05 职场文书
导游词幽默开场白
2019/06/26 职场文书
vue如何实现关闭对话框后刷新列表
2022/04/08 Vue.js
如何使用注解方式实现 Redis 分布式锁
2022/07/23 Redis