搞定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 相关文章推荐
15款优秀的jQuery导航菜单插件分享
Jul 19 Javascript
解决ExtJS在chrome或火狐中正常显示在ie中不显示的浏览器兼容问题
Jan 11 Javascript
学习JavaScript设计模式(单例模式)
Nov 26 Javascript
JQuery日期插件datepicker的使用方法
Mar 03 Javascript
基于JS实现发送短信验证码后的倒计时功能(无视页面刷新,页面关闭不进行倒计时功能)
Sep 02 Javascript
AngularJS  $on、$emit和$broadcast的使用
Sep 05 Javascript
AJAX和jQuery动态加载数据的实现方法
Dec 05 Javascript
Vue 2.0学习笔记之Vue中的computed属性
Oct 16 Javascript
Bootstrap导航菜单点击后无法自动添加active的处理方法
Aug 10 Javascript
webpack4打包vue前端多页面项目
Sep 17 Javascript
Vuejs学习笔记之使用指令v-model完成表单的数据双向绑定
Apr 29 Javascript
vue quill editor 使用富文本添加上传音频功能
Jan 14 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警告错误信息的解决方法
2013/06/03 PHP
php随机显示指定文件夹下图片的方法
2015/07/13 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
2016/02/15 PHP
PHP的Yii框架中YiiBase入口类的扩展写法示例
2016/03/17 PHP
php cli模式下获取参数的方法
2017/05/05 PHP
javascript instanceof 与typeof使用说明
2010/01/11 Javascript
js中top/parent/frame概述及案例应用
2013/02/06 Javascript
再次谈论React.js实现原生js拖拽效果引起的一系列问题
2016/04/03 Javascript
Vue.js学习笔记之 helloworld
2016/08/14 Javascript
node.js 发布订阅模式的实例
2017/09/10 Javascript
Vue自定义指令封装节流函数的方法示例
2018/07/09 Javascript
微信小程序动态生成二维码的实现代码
2018/07/25 Javascript
vue 使用自定义指令实现表单校验的方法
2018/08/28 Javascript
VueCli4项目配置反向代理proxy的方法步骤
2020/05/17 Javascript
vue实现div单选多选功能
2020/07/16 Javascript
[02:41]DOTA2英雄基础教程 冥魂大帝
2014/01/16 DOTA
python使用win32com在百度空间插入html元素示例
2014/02/20 Python
把MySQL表结构映射为Python中的对象的教程
2015/04/07 Python
举例讲解Python中的死锁、可重入锁和互斥锁
2015/11/05 Python
常用python编程模板汇总
2016/02/12 Python
pandas修改DataFrame列名的方法
2018/04/08 Python
详解Python Matplot中文显示完美解决方案
2019/03/07 Python
树莓派使用python-librtmp实现rtmp推流h264的方法
2019/07/22 Python
Django中F函数的使用示例代码详解
2020/07/06 Python
解决python3.6用cx_Oracle库连接Oracle的问题
2020/12/07 Python
I.T中国官网:精选时尚设计师单品网购平台
2018/03/26 全球购物
受希腊女神灵感的晚礼服、鸡尾酒礼服和婚纱:THEIA
2018/04/15 全球购物
工程师求职简历的自我评价分享
2013/10/10 职场文书
阳光体育活动方案
2014/02/16 职场文书
廉洁自律承诺书
2014/03/27 职场文书
我爱幼儿园演讲稿
2014/09/11 职场文书
教师查摆问题自查报告
2014/10/11 职场文书
2016年师德先进个人事迹材料
2016/02/29 职场文书
动画《新网球王子 U-17 WORLD CUP》希腊队PV公开
2022/04/02 日漫
一文了解Java动态代理的原理及实现
2022/07/07 Java/Android
Spring boot实现上传文件到本地服务器
2022/08/14 Java/Android