搞定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 相关文章推荐
javacript使用break内层跳出外层循环分析
Jan 12 Javascript
JQuery记住用户名密码实现下次自动登录功能
Apr 27 Javascript
jquery专业的导航菜单特效代码分享
Aug 29 Javascript
js实现左侧网页tab滑动门效果代码
Sep 06 Javascript
jquery实现右侧栏菜单选择操作
Mar 04 Javascript
Vue.js实现分页查询功能
Nov 15 Javascript
JS实现碰撞检测的方法分析
Jan 19 Javascript
JS实现获取进今年第几天是周几的方法分析
Jun 27 Javascript
小程序云开发获取不到数据库记录的解决方法
May 18 Javascript
Vue中图片Src使用变量的方法
Oct 30 Javascript
js实现tab栏切换效果
Aug 02 Javascript
详解jQuery的核心函数和事件处理
Feb 18 jQuery
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运行出现Call to undefined function curl_init()的解决方法
2010/11/02 PHP
PHP中$_SERVER的详细参数与说明介绍
2013/10/26 PHP
PHP获取本周第一天和最后一天示例代码
2014/02/24 PHP
Zend Framework动作助手Url用法详解
2016/03/05 PHP
php实现二叉树中和为某一值的路径方法
2018/10/14 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
分享20款好玩的jQuery游戏
2011/04/17 Javascript
浅析ajax请求json数据并用js解析(示例分析)
2013/07/13 Javascript
JavaScript中的数学运算介绍
2014/12/29 Javascript
jQuery实现跨域iframe接口方法调用
2015/03/14 Javascript
js检测判断日期大于多少天的方法
2015/05/04 Javascript
自己编写的支持Ajax验证的JS表单验证插件
2015/05/15 Javascript
js控制TR的显示隐藏
2016/03/04 Javascript
React Native 集成jpush-react-native的示例代码
2017/08/16 Javascript
ionic3实战教程之随机布局瀑布流的实现方法
2017/12/28 Javascript
vue中的模态对话框组件实现过程
2018/05/01 Javascript
vue 指令之气泡提示效果的实现代码
2018/10/18 Javascript
vue 返回上一页,页面样式错乱的解决
2019/11/14 Javascript
vue 动态表单开发方法案例详解
2019/12/02 Javascript
[03:24]2014DOTA2国际邀请赛 神秘商店生意火爆
2014/07/18 DOTA
Python写入CSV文件的方法
2015/07/08 Python
对Python的多进程锁的使用方法详解
2019/02/18 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
2019/06/04 Python
运用PyTorch动手搭建一个共享单车预测器
2019/08/06 Python
python中通过selenium简单操作及元素定位知识点总结
2019/09/10 Python
解决pycharm同一目录下无法import其他文件
2020/02/12 Python
HTML5几个设计和修改的页面范例分享
2015/09/29 HTML / CSS
利用 Canvas实现绘画一个未闭合的带进度条的圆环
2019/07/26 HTML / CSS
美国转售二手商品的电子商务平台:BLINQ
2018/12/13 全球购物
学习群众路线的心得体会
2014/11/05 职场文书
优秀教师单行材料
2014/12/16 职场文书
《当代神农氏》教学反思
2016/02/23 职场文书
Golang 编译成DLL文件的操作
2021/05/06 Golang
MySQL 分页查询的优化技巧
2021/05/12 MySQL
Python 的演示平台支持 WSGI 接口的应用
2022/04/20 Python
uniapp 微信小程序 自定义tabBar 导航
2022/04/22 Javascript