搞定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高级程序设计》阅读笔记(一) ECMAScript基础
Feb 27 Javascript
toggle()隐藏问题的解决方法
Feb 17 Javascript
jquery预加载图片的方法
May 27 Javascript
纯js实现手风琴效果
Apr 17 Javascript
JS使用JSON作为参数实例分析
Jun 23 Javascript
Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解
Aug 01 jQuery
vuex学习之Actions的用法详解
Aug 29 Javascript
Node实战之不同环境下配置文件使用教程
Jan 02 Javascript
vue中使用heatmapjs的示例代码(结合百度地图)
Sep 05 Javascript
js中的闭包实例展示
Nov 01 Javascript
简单了解JavaScript中常见的反模式
Jun 21 Javascript
解决Vue 刷新页面导航显示高亮位置不对问题
Dec 25 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脚本监控Nginx 502错误并自动重启php-fpm
2015/05/13 PHP
PHP 芝麻信用接入的注意事项
2016/12/01 PHP
jQuery探测位置的提示弹窗(toolTip box)详细解析
2013/11/14 Javascript
简单的jquery左侧导航栏和页面选中效果
2014/08/21 Javascript
SeaJS 与 RequireJS 的差异对比
2014/12/08 Javascript
如何高效率去掉js数组中的重复项
2016/04/12 Javascript
Javascript自执行匿名函数(function() { })()的原理浅析
2016/05/15 Javascript
移动端 一个简单易懂的弹出框
2016/07/06 Javascript
Ajax验证用户名或昵称是否已被注册
2017/04/05 Javascript
详解微信小程序 登录获取unionid
2017/06/27 Javascript
JS代码实现电脑配置检测功能
2018/03/21 Javascript
jQuery时间戳和日期相互转换操作示例
2018/12/07 jQuery
JavaScript两种计时器的实例讲解
2019/01/31 Javascript
ES6 Map结构的应用实例分析
2019/06/26 Javascript
微信小程序地图绘制线段并且测量(实例代码)
2020/01/02 Javascript
加速vue组件渲染之性能优化
2020/04/09 Javascript
[34:56]Ti4冒泡赛LGD vs Liquid 1
2014/07/14 DOTA
[04:29]2014DOTA2国际邀请赛 主赛事第三日TOPPLAY
2014/07/21 DOTA
讲解Python中运算符使用时的优先级
2015/05/14 Python
PyQt4编程之让状态栏显示信息的方法
2019/06/18 Python
Python编写通讯录通过数据库存储实现模糊查询功能
2019/07/18 Python
Saucony澳大利亚官网:美国跑鞋品牌,运动鞋中的劳斯莱斯
2018/05/05 全球购物
XMLHttpRequest对象在IE和Firefox中创建方式有没有不同
2016/03/23 面试题
财务助理岗位职责
2013/11/10 职场文书
节能环保演讲稿
2014/08/28 职场文书
普通话演讲稿
2014/09/03 职场文书
村主任个人对照检查材料
2014/10/01 职场文书
法人身份证明书
2014/10/08 职场文书
捐助倡议书
2015/01/19 职场文书
端午节活动总结报告
2015/02/11 职场文书
酒店保洁员岗位职责
2015/02/26 职场文书
公司的力量观后感
2015/06/05 职场文书
Python基于Tkinter开发一个爬取B站直播弹幕的工具
2021/05/06 Python
整理Python中常用的conda命令操作
2021/06/15 Python
JavaScript实现简单计时器
2021/06/22 Javascript
浅谈sql_@SelectProvider及使用注意说明
2021/08/04 Java/Android