搞定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 面向对象编程(1) 基础
May 18 Javascript
jQuery jqgrid 对含特殊字符json 数据的 Java 处理方法
Jan 01 Javascript
js获取height和width的方法说明
Jan 06 Javascript
jQuery中document与window以及load与ready 区别详解
Dec 29 Javascript
JQuery学习总结【二】
Dec 01 Javascript
Ionic2调用本地SQlite实例
Apr 22 Javascript
Javascript(es2016) import和require用法和区别详解
Aug 11 Javascript
vue2.0 根据状态值进行样式的改变展示方法
Mar 13 Javascript
Vue 页面跳转不用router-link的实现代码
Apr 12 Javascript
layui点击左侧导航栏,实现不刷新整个页面,只刷新局部的方法
Sep 25 Javascript
微信小程序实现列表滚动头部吸顶的示例代码
Jul 12 Javascript
js实现简单图片拖拽效果
Feb 22 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/05 PHP
给ECShop添加最新评论
2015/01/07 PHP
php实现的一个简单json rpc框架实例
2015/03/30 PHP
PHP技术开发微信公众平台
2015/07/22 PHP
老生常谈PHP 文件写入和读取(必看篇)
2017/05/22 PHP
Laravel接收前端ajax传来的数据的实例代码
2017/07/20 PHP
PHP排序算法之简单选择排序(Simple Selection Sort)实例分析
2018/04/20 PHP
JavaScript 使用技巧精萃(.net html
2009/04/25 Javascript
jQuery动态添加的元素绑定事件处理函数代码
2011/08/02 Javascript
JavaScript 创建运动框架的实现代码
2013/05/08 Javascript
Js表格万条数据瞬间加载实现代码
2014/02/20 Javascript
ECMAScript 5中的属性描述符详解
2015/03/02 Javascript
js实现仿爱微网两级导航菜单效果代码
2015/08/31 Javascript
angularjs学习笔记之三大模块(modal,controller,view)
2015/09/26 Javascript
原生js实现addClass,removeClass,hasClass方法
2016/04/27 Javascript
JavaScript来实现打开链接页面的简单实例
2016/06/02 Javascript
NodeJs之word文件生成与解析的实现代码
2019/04/01 NodeJs
[00:20]TI9不朽观赛名额抽取
2019/08/05 DOTA
Django 多语言教程的实现(i18n)
2018/07/07 Python
Django 中间键和上下文处理器的使用
2019/03/17 Python
Python发展史及网络爬虫
2019/06/19 Python
Python使用tkinter模块实现推箱子游戏
2019/10/08 Python
opencv python图像梯度实例详解
2020/02/04 Python
Python3开发实例之非关系型图数据库Neo4j安装方法及Python3连接操作Neo4j方法实例
2020/03/18 Python
python 使用paramiko模块进行封装,远程操作linux主机的示例代码
2020/12/03 Python
利用css3实现的简单的鼠标悬停按钮
2014/11/04 HTML / CSS
美国办公用品购物网站:Quill.com
2016/09/01 全球购物
波兰数码相机及配件网上商店: Cyfrowe.pl
2017/06/19 全球购物
西班牙语在线票务市场:SuperBoletería
2019/06/10 全球购物
如何写毕业求职自荐信
2013/11/06 职场文书
职业生涯规划书的格式
2013/12/29 职场文书
求职个人评价范文
2014/04/09 职场文书
合作协议书怎么写
2014/04/18 职场文书
关于美容院的活动方案
2014/08/14 职场文书
美德少年事迹材料(2016推荐版)
2016/02/25 职场文书
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
2021/04/27 Python