@ghostcdy
2016-01-29T05:42:23.000000Z
字数 3462
阅读 1052
未分类
说到React,已经不是什么新名词了。组件化、单向数据流、虚拟DOM、JSX语法模板,听起来都很高大上,对这些就是React的特性,改变了我们的编码习惯,给我们带来了很多好处:
夸了ReactJS那么多,我们也要用用。目前,我们的移动端业务“公会总大厅”终于上线。duang!duang!duang!坑,用新东西总是有坑嘀。下面总结一下使用ReactJS做业务的一些坑和解决方案:
又到PK的时候了,React好不好?
ReactJS学习成本对比:
框架 | 特性 | 学习成本 |
---|---|---|
ReactJS | 专注UI层,只做渲染,组件化,单向数据流 | API少,有新感念,有门槛 |
AngularJS | 严格的模型层次,双向绑定 | API多,完整的体系,学习曲线陡 |
简单来说,新东西上手有门槛。不过学会的真的很好用,真的很好用,真的很好用。看,React的入门书籍,很薄,快速上手:
由于有生命周期,开发过程分组件,开发成本比使用普通的js模板开发量略大。但组件化思路清晰,开发体验还是不错的。附上,一个组件的大致结构:
ps:React专注渲染层。开发过程中,为了提高开发效率降低维护成本,我们为React制造了身体Reduck。
先看下React的库大小,gzip压缩后为39k
React有虚拟节点,强大的更新对比算法,仅变更实际发生变化的部分。听上去很酷很强大,下面我们来做一下实验。
我们首先来看下渲染10000个结点长列表页面的耗时对比:
渲染用例 | PC端10000个节点 | iPhone 6plus 10000个节点 |
---|---|---|
React | 106ms | 6056ms |
React直出DOM | 137ms | 9784ms |
ejs | 64ms | 905ms |
原生js | 11ms | 325ms |
渲染用例 | PC端10000个节点 | iPhone 6plus 10000个节点 |
---|---|---|
React | 578ms | 6056ms |
React直出DOM | 137ms | 9784ms |
ejs | 64ms | 905ms |
原生js | 517ms | 11049ms |
可见React初次渲染并不是那么的快,在移动端上更加形势更加恶劣。直出React模板,在终端中也还需要生成虚拟DOM。但从用户体验的角度上来说,用户React还没建立虚拟DOM时页面就已经显示了。因此初次渲染我们需要使用直出方式优化渲染。
React实验代码见下图:
var max = 10000;
window.time = [];
//记录第一个时间点,开始执行React代码
time[0] = new Date();
//创建一个React组件(JSX写法)
var List = React.createClass({
//渲染组件
render: function(){
var lis = [];
for(var i=0; i<max; i++){
lis.push(
<li>{i}</li>
);
}
return (
<ul>
{lis}
</ul>
)
},
//React生命周期:渲染完成
componentDidMount: function(){
//打印渲染完成时间点
setTimeout(function(){
time[1] = new Date();
console.log('React渲染完成:'+ (Number(time[1]) - Number(time[0])) );
},0);
}
});
ReactDOM.render(<List />, document.getElementById('container'));
React编译后代码:
var max = 10000;
window.time = [];
time[0] = new Date();
var List = React.createClass({
render: function(){
var lis = [];
for(var i=0; i<max; i++){
lis.push(React.createElement("li",{},i));
}
return (
React.createElement('ul', React.__spread({}), lis)
)
},
componentDidMount: function(){
setTimeout(function(){
time[1] = new Date();
console.log('React渲染完成:'+ (Number(time[1]) - Number(time[0])) );
},0);
}
});
ReactDOM.render(React.createElement(List), document.getElementById('container'));
普通JS生成DOM代码:
var max = 10000;
window.time = [];
time[2] = new Date();
(function(){
var a = '';
for(var i=0; i< max; i++){
a += '<li>' + i + '</li>';
}
document.getElementById('inner').innerHTML = '<ul>' + a + '</ul>';
})();
setTimeout(function(){
time[3] = new Date();
console.log('DOM innerHTML:'+ (Number(time[3]) - Number(time[2])));
},0);
上面说了那么多,ReactJS擅长的是更新组件,但生成一个react组件的成本其实挺高的。
不适合的场景:
适用场景:
优化方法请参考:http://km.oa.com/group/20251/articles/show/248609
公会总大厅使用React后,开发成本和维护成本有一定程度的降低。组件化方便扩展,代码复用提高可维护性。React提供了一套完善的生命周期,让代码结构更加清晰。高效的虚拟DOM对比算法,自动变更变化区域,减少渲染成本。
但是,在移动端项目中使用还存在以下的问题:
当然,在PC的项目中,CPU和网络都比移动端强,上面的问题也将不会成为最痛的痛点。选择适合业务的才是最好的。
PS:我们在开发React的过程中,为了开发更高效,整理出一套新的框架,帮助我们组织代码。我们将它命名为【Reduck】。
框架持续更新中:http://km.oa.com/articles/show/271507
后续,将分享Reduck框架,敬请期待。
最后,React项目能见到初生的太阳,离不开导师jameszuo和PM jingyang的支持,以及小伙伴sesamewen不怕坑往上爬的坚持,感谢他们。