我们为啥需要 React( 五 )


■网友
用React这种组件化的模式敲代码让我有一种类似于搭积木一样的创造快感,每一个组件都像是一组搭好的积木,你非常清楚自己做出了什么东西,它长什么样,它有什么用。它对于你来说就是一种独立的存在,但同时,这一组组搭好的组件又可以拼凑成另一个更大的东西,就这样搭搭搭搭。这个敲代码的过程让我觉得非常爽,很符合人脑创造的过程,或者更准确的说,可能更符合现实中人创造东西的过程,很直观,出了问题也很容易定位。每写一个组件,我的脑中仿佛就有了一个形状,或者说一个模子,存放在一个仓库中。每次需要的时候,把这个模子拿出来克隆一份,只要加上不同的参数,它立马就变成你想要的样子,爽到爆炸!如果你要它在不同时刻表现不同的状态,也只要操作state数据。其实,每一个模子的基本结构都定义在jsx和initialState里,这是所有克隆共有的部分,是统一的、抽象的,但却因jsx的语法让它显得非常直观。而各个克隆体区别的部分和动态的部分又是通过简单的操作props和state这两个数据结构来实现的,改变一个数值就可以让你的组件变成另一种样子,避免了原先操作DOM的繁琐和散乱的事件绑定。以上说的是我从无框架转到React的感受,如果题主要的答案是React和其他框架的对比,那抱歉跑题了。另外,所有工具都有它适合与不适合的应用场景,如果你把React用在页面组件不怎么重复的项目、把Flux用在不怎么需要处理数据的项目,那就是画蛇添足了。
■网友
国外现在是React一统世界,不知道上为什么唱衰的比较多。React已经大量得被各个公司各种产品使用,也就是说React已经不是未来的技术,使用React也不能说很潮了。关于React的好处,和Angular的比较之类的文章有非常多,大部分是一两年前写出来的,现在的文章基本上是React最佳实践是什么,React怎么上手之类。可以看出React到底需不需要,到底好不好,和Angular比较起来如何等等都已经算是有定论了。你不用该不用,但是从React社区出来的对前端巨大的影响是没法忽视的,React就像是房间里的大象(Elephant in the room),你不得不面对它,了解它,深入了解过后还选择别的框架是你的选择,不过不了解React及其生态的核心概念(组件化,虚拟DOM,单向数据流,附带es6,webpack等等)会让你觉得你已经out了。至于我个人使用的 经验,刚开始用的时候的确是有很多字疑问的,用Angular我会更快做出来的东西,我为什么要用React。用久了就能感觉Angular很清晰的劣势- Angular的Depency Injection很丑,为了minify还要用array写两遍变量名- Angular的module和es6 module兼容性很不好- Scope chain只能让人越用越糊涂。Controller as也没改善太多- Provider, Factory, Service其实是一样的东西- 目前的最佳实践是页面上所有东西都用Directive,强制组件化(那为啥不直接用React?)- 侵入性太强,需要学很多Angular特有的语法,track by, transclude, $开头的所有变量,scope, promise. http 都必须使用它提供的而React的优势,今年React Europe上Cheng Lou的演讲就很好的说出来: Html完全不能满足我们对于前端app的需求,所以React给了我们全部javascript没有html的方案,这给了我们可以使用完备的程序语言来构建页面的能力,同时对于优化则是做到最底层minimum DOM diff。我觉得程序员需要有一种对一段代码是否是正统的直觉,比如使用setTimeout(fn, 0)来跳出当前执行感觉是Hacky而不正统,比如arr.constructor === Array 就觉得没有 Array.isArray()正统。而使用过这么久React的个人感觉,React中大部分概念是正统的,是rightful的,远比Angular要多。最后还是再强调一下React是当下前端是绕不过去的坎,已经不是不妨了解一下的程度,而是不了解要out了。当你深入了解了React,再挑React的毛病,会让你可信很多(就像Cycle.js作者一样)EDIT:问题更新了,那就更新一下关于React本身和生态吧。React从发布起几年来有过几次变革,基本上React发展的时间和这几年前端工程化迅猛发展有很高的重合。记得当时是用React.creatClass定义组件,还是用着es5,用着mixin。而es6的发展红红火火,万众所归,React也适时得推出es6 class syntax。之后redux带着函数式的概念一统各类flux,顺带函数式呼声越来越高,React也推出了functional stateless component。Build tool方面,记得当初还是grunt的天下,接着gulp取代其位置,和babel browserify一起接管React项目中各种任务(transpile js/css, uglify, sourcemap, concat等等),之后是React和Redux各大神看中webpack能打包多个文件和hot module reloading的特性全部转入webpack,webpack也的确给力,打包起来比gulp方便,debug又有webpack-dev-server这个大杀器。一开始React就是宣传两个概念,组件化和virtual dom,这些基本都被说烂了,而个人看法除了这两点,React最大的贡献一是一直帮助整个前端进入工程化,标准化的时代(使用virtual dom和jsx转换的library是可以替换React的),二是将函数式思想介绍给前端。functional stateless component就是 view=f(state)而redux核心也就是nextState=f(state, action),也催生了很多函数式的最佳实践,比如action creator和reducer必须是没有副作用的pure function,比如使用immutable操作(concat,map替代push,forEach)。要说现在用React做网站设置繁琐吗?当然繁琐,要设置eslint,babel,webpack,用boilerplate最终还是要了解各个不同的东西是干嘛的,不过把这些归罪React也不是太恰当,毕竟是整个前端生态圈都进化了。用Angular 2或者Ember你还是得用到这些。React的繁琐基本都在redux上,得creatStore还得加入middleware还得用connect()连接到store,而带来的高阶组建的概念不好懂也不容易用。React有它自己的缺点,毕竟我们上哪找完美的东西呢?Boilerplate过多,setState是异步的,context api很坑爹,server side reder各种坑(设置hmr,哪些call在服务器做,哪些只能在浏览器运行等等),animation到现在都没什么太好的方案。不过React值得用吗?当然值得,它给你组件化页面,入门函数式,清晰的单向数据流(dispatch(action)-\u0026gt;reducer-\u0026gt;render),深入了还有高阶组件的composability,能发现selector和reducer其实也是composable的,顺带着各个工具的使用(eslint, babel, webpack),不小心还能入Elm和Clojurescript的坑。还有一个经常被提起的好处是React redux做的网站,重构非常方便,在需求永远不固定的世界里也是一大优势。所以,这么多大公司转用React也许不是因为他们都是傻子,也许React确确实实带来了好处。


推荐阅读