搞定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 装载iframe子页面,自适应高度
Mar 20 Javascript
疯狂Jquery第一天(Jquery学习笔记)
May 11 Javascript
Jquery+asp.net后台数据传到前台js进行解析的方法
May 11 Javascript
setinterval()与clearInterval()JS函数的调用方法
Jan 21 Javascript
jQuery中ajax的load()与post()方法实例详解
Jan 05 Javascript
jQuery与js实现颜色渐变的方法
Dec 30 Javascript
Extjs让combobox写起来简洁又漂亮
Jan 05 Javascript
jQuery实现动态生成表格并为行绑定单击变色动作的方法
Apr 17 jQuery
jQuery复合事件结合toggle()方法的用法示例
Jun 10 jQuery
小程序实现页面顶部选项卡效果
Nov 06 Javascript
简单实现节流函数和防抖函数过程解析
Oct 08 Javascript
js实现移动端图片滑块验证功能
Sep 29 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 各种排序算法实现代码
2009/08/20 PHP
Look And Say 序列php实现代码
2011/05/22 PHP
通过chrome浏览器控制台(Console)进行PHP Debug的方法
2016/10/19 PHP
php实现将二维关联数组转换成字符串的方法详解
2017/07/31 PHP
jquery ajax 同步异步的执行示例代码
2010/06/23 Javascript
Prototype源码浅析 Enumerable部分(二)
2012/01/18 Javascript
div模拟滚动条效果示例代码
2013/10/16 Javascript
jQuery对Select的操作大集合(收藏)
2013/12/28 Javascript
JS cookie中文乱码解决方法
2014/01/28 Javascript
js检测浏览器版本、核心、是否移动端示例
2014/04/24 Javascript
js实现匹配时换色的输入提示特效代码
2015/08/17 Javascript
require.js 加载 vue组件 r.js 合并压缩的实例
2016/10/14 Javascript
微信小程序 获取当前地理位置和经纬度实例代码
2016/12/05 Javascript
利用Node.js编写跨平台的spawn语句详解
2017/02/12 Javascript
SVG描边动画
2017/02/23 Javascript
Node.js dgram模块实现UDP通信示例代码
2017/09/26 Javascript
React Router v4 入坑指南(小结)
2018/04/08 Javascript
js实现简单选项卡功能
2020/03/23 Javascript
vue通过滚动行为实现从列表到详情,返回列表原位置的方法
2018/08/31 Javascript
vuejs router history 配置到iis的方法
2018/09/20 Javascript
详解Angular Karma测试的持续集成实践
2019/11/15 Javascript
JS数组进阶示例【数组的几种函数用法】
2020/01/16 Javascript
JS组件库AlloyTouch实现图片轮播过程解析
2020/05/29 Javascript
Vue父子组件传值的一些坑
2020/09/16 Javascript
Python MD5文件生成码
2009/01/12 Python
python中类变量与成员变量的使用注意点总结
2017/04/29 Python
python利用requests库进行接口测试的方法详解
2018/07/06 Python
python3人脸识别的两种方法
2019/04/25 Python
详解Django将秒转换为xx天xx时xx分
2019/09/27 Python
将世界上最美丽的摄影作品转化为艺术作品:Photos.com
2017/11/28 全球购物
澳大利亚购买健身器材网站:Gym Direct
2019/12/19 全球购物
营业员个人总结的自我评价
2013/10/25 职场文书
普通员工辞职信
2014/01/17 职场文书
汽车维修求职信
2014/06/15 职场文书
大学副班长竞选稿
2015/11/21 职场文书
mysql事务隔离级别详情
2021/10/24 MySQL