搞定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 相关文章推荐
JavaScript DOM 添加事件
Feb 14 Javascript
如何使用Javascript获取距今n天前的日期
Jul 08 Javascript
jQuery实现点击文本框弹出热门标签的提示效果
Nov 17 Javascript
一个JavaScript去除字符串末尾的空白实例代码
Sep 22 Javascript
JavaScript插件化开发教程(五)
Feb 01 Javascript
JavaScript使用Prototype实现面向对象的方法
Apr 14 Javascript
json定义及jquery操作json的方法
Sep 29 Javascript
jQuery模拟实现天猫购物车动画效果实例代码
May 25 jQuery
微信小程序 配置顶部导航条标题颜色的实现方法
Sep 20 Javascript
vue请求本地自己编写的json文件的方法
Apr 25 Javascript
使用Easyui实现查询条件的后端传递并自动刷新表格的两种方法
Sep 09 Javascript
Javascript Worker子线程代码实例
Feb 20 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安全性问题中的:Null 字符问题
2013/06/21 PHP
Laravel 5框架学习之数据库迁移(Migrations)
2015/04/08 PHP
php微信公众平台开发(三)订阅事件处理
2016/12/06 PHP
PHP封装的完整分页类示例
2018/08/21 PHP
js 操作css实现代码
2009/06/11 Javascript
利用jquery写的左右轮播图特效
2014/02/12 Javascript
浅谈jquery.fn.extend与jquery.extend区别
2015/07/13 Javascript
JS实现跟随鼠标的链接文字提示框效果
2015/08/06 Javascript
bootstrap-treeview自定义双击事件实现方法
2016/01/09 Javascript
jQuery EasyUI封装简化操作
2016/09/18 Javascript
Javascript中从学习bind到实现bind的过程
2018/01/05 Javascript
node puppeteer(headless chrome)实现网站登录
2018/05/09 Javascript
深入浅析Vue中的 computed 和 watch
2018/06/06 Javascript
vue利用v-for嵌套输出多层对象,分别输出到个表的方法
2018/09/07 Javascript
webpack css加载和图片加载的方法示例
2018/09/11 Javascript
vuex actions传递多参数的处理方法
2018/09/18 Javascript
3分钟读懂移动端rem使用方法(推荐)
2019/05/06 Javascript
Vue 根据条件判断van-tab的显示方式
2020/08/03 Javascript
[02:40]DOTA2英雄基础教程 先知
2013/11/29 DOTA
[02:41]辉夜杯现场一家三口 “我爸玩风行 我玩血魔”
2015/12/27 DOTA
Python功能键的读取方法
2015/05/28 Python
Django 2.0版本的新特性抢先看!
2018/01/05 Python
Python实现的NN神经网络算法完整示例
2018/06/19 Python
transform python环境快速配置方法
2018/09/27 Python
python获取服务器响应cookie的实例
2018/12/28 Python
ORACLE第二个十问
2013/12/14 面试题
优秀乡村医生事迹材料
2014/05/28 职场文书
九一八事变纪念日演讲稿
2014/09/14 职场文书
护理医院见习报告
2014/11/03 职场文书
2014年终个人工作总结
2014/11/07 职场文书
交通事故协议书范本
2014/11/18 职场文书
2015年春训学习心得体会范文
2015/03/09 职场文书
读《教育心理学》心得体会
2016/01/22 职场文书
52条SQL语句教你性能优化
2021/05/25 MySQL
Java elasticsearch安装以及部署教程
2021/06/28 Java/Android
mysql中整数数据类型tinyint详解
2021/12/06 MySQL