这两天 React 16 发布了,同时, React 16 与 15.6.x 都已经切换到 MIT 协议。版权的热议与一些公司的决断对于整个社区而言看起来是个好事,同时,也给前端的组件化带来了更多的思考。
对于 React 16 的相关信息,有几个内容可以去看下:
React 16 大致有以下改变:新的 Fiber render 引擎:以支持许多原来做不到的关于 render 的特性
支持非阻塞式渲染
render 支持 fragments (数组) 与字符串类型
支持 Error 边界捕获
添加 ReactDOM.createPortal 方法来进行组件 DOM 节点之外的渲染,这个特性使得模态框、popover、tooltip 之类的渲染变得更加方便。BTW, 这个本来是另一个开源库的思路: tajo/react-portal
支持 stream 的 server side render
减少的体积:大致减少了 30% 的文件体积
可能需要关注的 Breaking Changes:unstable_renderIntoContainer, unstable_handleError 等之前的内部特性有改变,如果有依赖库用到了的话可能需要注意
生命周期的顺序更加稳定,尤其是子节点的 componentWillMount 总会发生在父节点的 componentWillUnmount 之前
componentDidUpdate 方法不再能够获取 prevContext 参数
Shallow Renderer 不再调用 componentDidUpdate 方法,并且不再提供 unstable_batchedUpdates 方法(这个似乎会影响到一些之前的测试代码)
不再有 react-with-addons.js 这个库。目测这个之后会有开源库来提供类似功能,但 React 官方提倡的是分别引用不同的 npm 库来做 addons 的事情
Rewrite 的过程
其中有些内容感觉还是挺值得借鉴学习的:并没有 fork branch,而是用了一个 useFiber 的布尔值作为 Flag 来在运行时决定使用那个引擎。关于多人维护的代码在版本管理时使用什么策略这个问题也是老生常谈了,我跟小伙伴们也讨论过 flag 的方式,虽然挺理想的但还真不是什么团队都玩得来的。
最开始的开发流程,基本上是实现最基础的 API subset ,然后跑单元测试
测试过程中也在调整 test case,因为有可能有些问题之前没测到,或者是之前的测试依赖了一些内部方法
Dogfooding:在 Facebook 的内部工具以及对外产品上灰发新版本 React 作为测试,对外的大型产品主要从 http://messenger.com 开始。说实话这个对于 UI 框架而言真够大胆的……
作为开发者
反正我是不会这么快迁移到 React 16 的……尤其是对于现有产品平台。
反而,之前的版权事件让我有些去 React 化的倾向,或者更确切的说,弱化 UI 框架对于项目的影响的倾向。具体怎么做可能还值得进一步探讨,比如更多使用 Web 标准的方案比如 CSS 而非与框架绑定的 CSS in JS;比如基础组件更多考虑纯粹 Vanilla JS 实现,然后再用框架封装;有哪些逻辑可以进一步分离,如何分离,等等。
React 之后会怎样也还真不好说,这一次版权事件感觉并没有就这么终结,应该还会潜移默化地进一步对社区造成长久影响,需要进一步观望。