来自:

React and the economics of dynamic web interfaces

自从2000开始我就一直在做web开发,曾见过很多以各种库和框架的起起落落,这些库和框架作为一种时代标志。Ajax时代和JQuery的时代几乎相同,几年后Backbone时代开始了,而React则开始于两年前。

这些时代带来了一种新的实现方式--我们可以通过可用工具提供的手段来创造动态网站接口。JQuery使用浏览器抽象和css查询提高对开发人员友好程度,Backbone介绍了客户端结构的概念,React则开启了创造UI组件来取代之前的模版。

有大量的博客帖子,言论,和视频去宣扬Ract工作方式以及它为什么对web开发有益。有很多讨论围绕虚拟DOM,在JSX文件(javascript)中嵌入HTML代码,将UI转化为组建展开。这些都是React中有趣的技术点,无论怎样,我不相信仅仅是技术方面会让它如此火爆。经过一段事件的深入探究,我意识到React真是太牛逼了:它从根本上改变了N多年前的等式,并且这种思想远比具体的技术实现牛逼多了。

动态web接口的经济学

自从DOM被介绍以及在web浏览器的广泛采用后,web的开发人员都看到过一个相同的建议:DOM是比较慢的。避免DOM更新,你会得到重绘制和重布局。总言之,动态更新网站的耗费是有形的,可以从一下三个角度分解:

关于repaint和reflow具体请参考repaint和reflow讲解l

  1. 执行 - 对DOM做出的改变比较慢原因是重绘和重布局
  2. 效率 - 你可以因为丢失节点参考的情况造成内存泄漏
  3. 复杂性 - 必须保证你可以在正确的位置上绑定和取消事件处理器

我们可以从一下几个方面减少损耗

  • 仅仅做出少量的更改。大量更改是非常慢的,如果你制作少量更改会减少损耗。                              React通过比较获得最小差异来做到
  • 对于大的改变,从文档中解除节点,做出改变然后再重新加到文档里。这样可以避免重绘制和重排版。  React有这种思路,一位html是通过javascript操作的,操作完,才渲染,可以有效避免重绘和重布局
  • 在父节点上使用事件代理,这样就不会在删除子节点的时候意外删除了事件处理程序。

每一个建议都是减小损耗但实际上没有从根本上改变耗费等式。在这样的条件下,你肯定不想用一个命令去反复多次重渲染页面,无疑会带来特别差劲的用户体验。那正是React能够发挥作用的时候。

React改变了这个等式

你不曾怀疑的意识到,React解决了很多问题。他管理了你的事件处理程序,确保他们被添加和解除在正确的事件和正确的节点上;它创造和销毁DOM结构考虑到内存泄漏(效率);它使用虚拟DOM比较去决定哪一个变更组建要更新,并且只更新那些有必要更新的部分。所有的这些解决方案改变了曾经的等式:DOM更新现在很快!

(当然,在React是否有人们所有的那样块上仍有争论[1],争论并没有什么意义,知道这种思想更重要)

在我们开发Web应用程序的时候,改变方程导致了一个连锁效应。这发生在我第一次看React Router[ 2 ]。React Router的基本前提是当网址发生变化时,它被历史状态管理机制[3]拦截,然后整个视图被重新渲染。在React没出现的时候,你永远不会想到动态重新绘制一个完整的页面,这太慢了。确保页面正确工作的复杂性是很高的,虽然有些人会这样做,但它无疑是错误的来源。所以我们只会坚持重新绘制页面的较小部分。

有了React你会想到,在一组相似性的页面中,你没有必要重新渲染一切。仅仅是更新页面中变化了的那部分就可以啦。

反应,具有讽刺意味的是,让我们再次思考编写关于Web应用程序的一个系列的网页,而不是单一的BLOB的JavaScript代码。与传统的服务器模型相同,一个页面被渲染,一些变化被请求,然后一个页面呈现这些变化。唯一不同的是,这一切都可以发生客户端。

结论

我仍然在学习React,而技术细节是有趣的,它改变了动态Web界面方程的方式真的给我留下深刻印象。最后,我问自己这样的问题:“如果没有客户端渲染的成本,你会建立什么?”.我意识到React改变了游戏规则。

参考

  1. React + Performance = ? (aerotwist.com)
  2. React Router (github.com)
  3. History API (developer.mozilla.org)

Disclaimer: Any viewpoints and opinions expressed in this article are those of Nicholas C. Zakas and do not, in any way, reflect those of my employer, my colleagues, Wrox PublishingO'Reilly Publishing, or anyone else. I speak only for myself, not for them.

React和动态网站接口的经济学的更多相关文章

  1. 动态网站技术CGI

    递信息的规程.CGI规范允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器,CGI将Web的一组简单的静三种主流的动态网站技术: ASP JSP PHP 除之外,此还要了解的动态网站技术 ...

  2. 基于React的PC网站前端架构分析

    代码地址如下:http://www.demodashi.com/demo/12252.html 本文适合对象 有过一定开发经验的初级前端工程师: 有过完整项目的开发经验,不论大小: 对node有所了解 ...

  3. 编译LAMP部署动态网站环境

    LAMP动态网站部署架构是由一套 Linux+Apache+MySQL+PHP 组成的动态网站系统解决方案. 以下配置环境为:Linux=RHEL7 --> Apache=2.4.33 --&g ...

  4. 使用JSP开发动态网站基础

    1. 什么是动态网页? 动态网页是指在服务器端运行的程序或者网页,它们会随不同客户.不同时间,返回不同的网页. 注意:在静态网页中插入flash ,虽然flash是在动的,但是并不是说这个网页就是动态 ...

  5. Python监控网站接口值

    Python监控网站接口值: #!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'liudong' import urllib,sy ...

  6. Java EE开发平台随手记5——Mybatis动态代理接口方式的原生用法

    为了说明后续的Mybatis扩展,插播一篇广告,先来简要说明一下Mybatis的一种原生用法,不过先声明:下面说的只是Mybatis的其中一种用法,如需要更深入了解Mybatis,请参考官方文档,或者 ...

  7. 第20章 使用LNMP架构部署动态网站环境

    章节概述: 本章节将从Linux系统的软件安装方式讲起,带领读者分辨RPM软件包与源码安装的区别.并能够理解它们的优缺点. Nginx是一款相当优秀的用于部署动态网站的服务程序,Nginx具有不错的稳 ...

  8. 【鬼脸原创】github搭建动态网站

    a{ color:blue; font-weight:bold; } #cnblogs_post_body ol li { list-style-type: cjk-ideographic; } p[ ...

  9. Mysql 与 php动态网站开发 入门教程

    这个系列的教程由表单开始写,因为表单可以把数据库和web 之间的交互表现得很明显.提交表单 ,数据库记录注册信息. 本教程属于基础教程.大神请略过.        对于php和mysql之间的稳固性很 ...

随机推荐

  1. 成为java高手的八大条件

    1.扎实的基础  数据结构.离散数学.编译原理,这些是所有计算机科学的基础,如果不掌握它们,很难写出高水平的程序.程序人人都会写,但当你发现写到一定程度很难再提高 的时候,就应该想想是不是要回过头来学 ...

  2. this笔记

    在js中,如果this在全局变量和函数中this指window,在在对象中至所挂载的这个对象.

  3. Maze

    Maze 题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5094 BFS+状态压缩 把身上携带钥匙的状态压缩成一个2^10的整数.这道题难在 ...

  4. awstats 日志分析

    /tmp/awstats/awstats.ezrydel.com.conf LogFile="/usr/local/apache/domlogs/ezrydel.com" php版 ...

  5. 关于闭包与for循环的理解

    function createFunction1(){ for(var i=0;i<5;i++){ function s(){ console.log(i); } s(); } } create ...

  6. Eclipse使用Maven tomcat:run命令启动web项目

    Eclipse安装好m2e插件,使用Maven构建项目后,启动web项目就行就非常简单了,你不再需要下载然后在eclipse中配置tomcat. 右键你的项目 -> Run As -> R ...

  7. 简单的interface显式和隐式的实现

    一,新建接口 using System; using System.Collections.Generic; using System.Linq; using System.Web; /// < ...

  8. Qt ImageProvider 的使用

    QQuickImageProvider 是一个可以支持在QML中使用 qpixmap 和 图片加载线程的类. 它支持在qml中使用Image加载的高级特性, 包括 使用 QPixmap 替代实际的im ...

  9. linux命令 awk

    awk的工作流程如下: 读入有 '\n' 换行符分割的一跳记录,然后将记录按指定的域分隔划分域,填充域,$0 表示所有域, $1 表示第一个域, $n 表示第n个域.默认域分隔符为“空白键”或者“[t ...

  10. tomcat下获取当前路径的url中含有空格解决方法

    参考博文(http://www.360doc.com/content/11/1009/17/4602013_154657565.shtml) web项目发布到Tomcat之后,如果tomcat是安装在 ...