React.js 是什么?
在相当长的一段时间内,我很努力地去尝试理解 React 是什么以及它在应用架构上的健壮程度。这篇文章解答了我希望别人为我解答的疑惑。
React 是什么?
和 Angular,Ember,Backbone 等等比起来 React 的表现如何?要如何处理数据?要如何连接服务器?JSX 到底是什么?“组件”又是如何定义的?
停。
立刻停下来。
React 仅仅是 VIEW 层。
React 通常和其他的 JavaScript 框架同时被提及,但是说“React 对比 Angular”却讲不通,因为它们之间是不可比较的。Angular 是一个完整的框架(包括一个 view 层),React 却并不是。这也是 React 很难于理解的原因,它虽然抽离自一个具备完整框架的生态系统中,但仅仅是一个 view 层。
React 提供了模板语法以及一些函数钩子用于基本的 HTML 渲染。这就是 React 全部的输出——HTML。你把 HTML / JavaScript 合到一起,被称为“组件”,允许把它们自己内部的状态存到内存中(比如在一个选项卡中哪个被选中),不过最后你只是吐出 HTML。
很明显,你没办法单单使用 React 来创建一个功能完善的动态应用。下面我们详细看看。
好处
使用 React 一段时间后,我发现了三个非常重要的特性。
1. 通过查看一个源文件就可以知道你的组件将会如何渲染。
这是最大的好处,尽管这和 Angular 模板没什么不同。下面看一个真实的应用实例。
假设你需要在用户登录后更新站点头部的用户名。如果没有使用 JavaScript MVC 框架,可能要这么做:
<header>
<div class="name"></div>
</header>
$.post('/login', credentials, function( user ) {
// Modify the DOM here
$('header .name').show().text( user.name );
});
按照我的经验,这些代码要毁掉你的生活甚至你同事的生活。如何对输出调试?谁来更新头部?谁还可以访问头部的 HTML?谁来维护名字的显示隐藏状态?这个 DOM 操作会让你的项目像 GOTO 语句那样糟糕。
在 React 中你可以像下面这样做:
render: function() {
return <header>
{ this.state.name ? <div>this.state.name</div> : null }
</header>;
}
我们会清楚的分辨出这个组件可能会如何渲染。如果你知道这个语句,就会知道渲染后的输出。你没必要去记录程序的流程。在复杂应用中,特别是团队开发中,显得尤为重要。
2. 将 JavaScript 和 HTML 绑定到 JSX 使组件更易懂
上面的那种把 HTML 和 JavaScript 混合在一起的写法可能让你很不适应。我们会很自然地拒绝将 JavaScript 放在 DOM 当中(比如 onClick 事件处理函数)即便我们是小小的开发者。但是,请一定要相信我;JSX 组件真的会让你的工作变得很“nice”。
按照传统,你会把视图(HTML)从功能(JavaScript)中分离开出来。这会产生一个巨大的 JavaScript 文件,包含了一个“页面”的所有功能需求,并且你必须记录复杂的流程,从 JS 到 HTML 到 JS 到悲痛欲绝。
捆绑功能直接标记和打包成一个可移植的,自主控制的“组件”,让你更开心,且减少脏乱的代码。因为 JavaScript 与 HTML 关系密切,揉到一起也正常。
3. 你可以在服务端渲染 React
如果你正在创建一个门户网站或者应用,并且按照 render-it-all-on-the-client 路线,可能已经出错了。只通过客户端渲染使得 Soundcloud 感觉如此慢,相反 Stack Overflow(纯服务端渲染)如此快。你可以在服务端渲染 React,并且你该这么做。
Angular 等促使你做一些恶心的事情,比如使用 PhantomJS 来渲染页面,分析请求头中的 user agent ,把这些页面提供给搜索引擎,或者为此买一个服务。呃。
坏处
不要忘了 React 仅仅是个 view 层。
1. 下面这些都没有:
- 事件系统(除了原生的 DOM 事件)
- AJAX 功能
- 数据层
- Promises
- 应用程序架构
- 实现以上功能的规范
单独的 React 在这个世界上真的没什么用。更糟糕的是,就像我们将要看到的,这迫使每个开发者都要重新造轮子。
2. 官方文档既不是“容易理解的”,也不是“良好的”。重申一遍,这是为笨蛋写的一篇博客。请看文档页侧边栏中第一部分:
有三个独立的、相互矛盾的快速入门指南。我有些不知所措,并且我没有喝多。更下面的侧边栏就像是恶梦一样,很明显一些章节不应该放在那里,像“More About Refs”和“PureRenderMixin”。
3. 相比 React 给你提供的好处,React 实在太大。而且对浏览器的支持也很有限
更新:我之前写到 React 大小不到 144KB。通过 gzip 压缩传输后在 35KB 左右。
这没有包含任何 React 的插件,而你需要使用那些插件才能实现一个真正的应用!
也不包含 ES5 shim 的类库,你需要支持 IE8 的话。
不包含任何类型的应用类库!
React 的大小和 Angular 相当,但 Angular 是一个完整的应用框架。React 显而易见的臃肿,但是你只获得了很少的功能。希望这在将来能得到改善。
不要说 Flux
也许 React 开发中,最让人反感的还是“Flux”。 远比 React 自身混乱。“Flux”这个名字就很让人费解。
Flux 并不是真实存在的。它只是一个概念,而不是个类库。幸运的是,存在一个类库,在某种程度上:
“相比于一个框架,Flux 更像是一种模式。”
呃。一个最不恰当的名字:React 并没有重塑最近 40 年的 UI 体系的知识,也没有为数据管理带来新的概念。
Flux 的概念很简单,view 层触发了一个事件(比如说,用户在文本域中输入了一个姓名),这个事件更新了 model,然后 model 触发了一个事件,view 响应了 model 的事件,使用最新的数据进行渲染。就这样。
这一数据流/解耦观察者模式被设计来保证你的资源总存在于内存/模式中。这是一件好事™。
Flux 的坏处是每个人都会重新发明轮子。由于没有在事件库,model 层,AJAX 层等达成一致,出现了很多种“Flux”的实现方式,并且它们彼此之间相互混杂。
我该用 React 吗?
简单回答:是。
详尽的回答:很不幸,是的,在大多数场景中。
下面是为什么要用 React:
- 对团队开发来说表现的很出色
- 加强了 UI 和 工作流模式 UI 代码的可读和可维护性。
- 组件化的 UI 是 web 开发的趋势,并且你现在应该开始了。
下面是为什么在你选择之前需要再考虑一下:
- 一开始 React 会极大地减慢你的开发。理解props、state以及组件通信如何工作并不是很简单,并且文档信息错综复杂。理论上,这将会被克服,你的整个团队都上道之后,开发速度上就会有一个很大的提升。
- React 不支持 IE8 以下的任何浏览器,以后也绝不会。
- 如果你的应用/站点不需要频繁的动态页面更新,你可能为了很小的功能而编写大量的代码。
- 你会改造很多轮子。React 很年轻,并且因为没有权威的方式来处理事件、组件通信,你必须从零开始创建大量的组件库。你的应用是否有下拉菜单,可调整大小的窗口,或者 lightbox?你同样必须从零开始写这些。
就这些了!
下一篇文章,Flux 傻瓜教程
我希望它可以帮助像我一样笨的人更好地理解 React。如果这篇文章让你的生活更轻松,可以在 Twitter 上关注我。
React.js 是什么?的更多相关文章
- MVC、MVP、MVVM、Angular.js、Knockout.js、Backbone.js、React.js、Ember.js、Avalon.js、Vue.js 概念摘录
注:文章内容都是摘录性文字,自己阅读的一些笔记,方便日后查看. MVC MVC(Model-View-Controller),M 是指业务模型,V 是指用户界面,C 则是控制器,使用 MVC 的目的是 ...
- 再谈React.js实现原生js拖拽效果
前几天写的那个拖拽,自己留下的疑问...这次在热心博友的提示下又修正了一些小小的bug,也加了拖拽的边缘检测部分...就再聊聊拖拽吧 一.不要直接操作dom元素 react中使用了虚拟dom的概念,目 ...
- React.js实现原生js拖拽效果及思考
一.起因&思路 不知不觉,已经好几天没写博客了...近来除了研究React,还做了公司官网... 一直想写一个原生js拖拽效果,又加上近来学react学得比较嗨.所以就用react来实现这个拖 ...
- React.js深入学习详细解析
今天,继续深入学习react.js. 目录: 一.JSX介绍 二.React组件生命周期详解 三.属性.状态的含义和用法 四.React中事件的用法 五.组件的协同使用 六.React中的双向绑定 ...
- React.js入门必须知道的那些事
首先,React.js是facebook在2013年5月开源的一个前端框架,React不是一个MVC框架,它是构建易于可重复调用的web组件,侧重于UI, 也就是view层, React为了更高超的性 ...
- React.js 官网入门教程 分离文件 操作无法正常显示HelloWord
对着React官网的教程练习操作,在做到分离文件练习时,按照官网步骤来却怎么也无法正常显示HelloWord. 经测试,html文件中内容改为: <!DOCTYPE html><ht ...
- React.js入门笔记(再续):评论框的实现
本案例来自React.js中文官网对应内容. 一. 运行环境 <link rel="stylesheet" type="text/css" href=&q ...
- Facebook的Web开发三板斧:React.js、Relay和GraphQL
2015-02-26 孙镜涛 InfoQ Eric Florenzano最近在自己的博客上发表了一篇题为<Facebook教我们如何构建网站>的文章,他认为软件开发有些时候需要比较大的跨 ...
- 移动web端的react.js组件化方案
背景: 随着互联网世界的兴起,web前端开发的方式越来越多,出现了很多种场景开发的前端架构体系,也对前端的要求日益增高,早已经不是靠一个JQuery.js来做前端页面的时代了,而今移动端变化最大,近 ...
- 收集的React.JS资料
主页 http://facebook.github.io/react/ https://github.com/facebook/react 中文站 http://www.reactjs.cn/ h ...
随机推荐
- httpClient download file(爬虫)
package com.opensource.httpclient.bfs; import java.io.DataOutputStream; import java.io.File; import ...
- poj3006---素数筛法
#include <stdio.h> #include <stdlib.h> ];//以后都用宏定义 MAX int main()//如要将包括1000000在内的打表,数组就 ...
- 使用扩展名获取mimetype
在Android中很多时候我们需要计算出文件的mimetype,而我们通常的思路就是通过扩展名来获取对应的mimetype,而如果自行处理,将维护一个比较大的映射表,而实际上大可不必,Android提 ...
- 怎样安装pip--python的包管理工具
pip是python的包管理工具,使用它来安装python的模块很方便. pip支持的操作系统:Unix/Linux, OS X, and Windows. 支持的python版本号:2.6, 2.7 ...
- 依据Path取Json指定节点的值
下面方法为依据Path取json节点值得方法.废话不多说,先上代码: 測试方法例如以下:
- 有关Repeater的事件
Repeater放在Updatepanel中是可以通过右键->属性,双击事件来生成事件的,若能这样的话,那最后是用这种方法吧,最起码不会出错!
- Intellij Idea的一些配置
1.字体 修改IDEA面板字体:Settings->Appearance-> Override default fonts by(not recommended)选中,选择自己喜欢的字体 ...
- 树 -- AVL树
前言 通过之前对二叉查找树的讨论,我们知道在给定节点数目的情况下,二叉树的高度越低,查找所用时间也就越短. 在讨论红黑树的时候,我们说过红黑树并非完全"平衡"的二叉树,只是近似&q ...
- CentOS 配置防火墙操作实例(启、停、开、闭端口)CentOS Linux-FTP/对外开放端口(接口)TomCat相关
链接地址:http://blog.csdn.net/jemlee2002/article/details/7042991 CentOS 配置防火墙操作实例(启.停.开.闭端口): 注:防火墙的基本操作 ...
- std::string转化大小写(C++)
#include <string> #include <algorithm> void test() { std::string strA="QQQQWWWqqqqq ...