React Native 性能优化建议

1. 异步逐层渲染。

React Native 虽然一直标榜媲美Native的体验,但实际使用下来,其渲染性还是非常低效,基于ScrollView和ListView两大容器,在渲染上,相当于web端的table布局,需要等整个大table渲染完成才显示页面,也就是说,当容器内有大量的子元素,其白屏时间会非常长。

如何让React Native做到像web端边渲染边加载?可以采用异步渲染的方式,使用requestAnimationFrame 或 setTimeout 定时将单个组件push进ScrollView容器。

基于这个原理,写了个逐层渲染的组件: react-progressive

2. 实现shouldComponentUpdate方法

如上第一点,逐层渲染提升打开时间,但是也会导致component重复渲染,也就是执行了大量无用的diff算法。虽然React里引以为傲的diff算法非常高效,但是执行数量达到一定程度后,也会带来非常大的影响。那么可使用 shouldComponentUpdate 来控制component的渲染次数。

如何做?

  • 如果确定该组件渲染完后无需再次更新,即这个组件是一个静态组件,那么可以直接return false。

shouldComponentUpdate(){
    return false
  • 如果组件比较复杂,自己对RN的更新机制不太熟,可以直接Minxi一下React提供的 PureRenderMixin 组件
mixins: [React.addons.PureRenderMixin]
  • 手动实现或使用第三方组件库,比如 Immutable-js

说白了,就是要确定组件内的不可变数据,让其不再执行diff及render。

3. 使用setNativeProps方法

setNativeProps 方法可以理解为web的直接修改dom。使用该方法修改 View 、 Text 等 RN自带的组件 ,则不会触发组件的componentWillReceiveProps 、 shouldComponentUpdate 、 componentWillUpdate 等组件生命周期中的方法。

建议频繁更新的操作,如slider、tabs切换等拖曳操作时,使用 setNativeProps 来更新属性,会获得意想不到的性能体验。

代码片段:

me.refs.tabView.setNativeProps({
                style : {
                    height : 0,
                    opacity : 0
                }
            });

性能分析工具: React.addons.Perf

4. 不要使用阴影效果

React Native 里面的 shadow 相关的样式,是非常耗性能的css属性。这在web上,以前android 2.0年代,也是一样耗性能的css属性之一。如果需要使用阴影效果,建议使用图片来代替反而性能更好一些。

5. 最小化DOM

React Native里虚拟dom结构越复杂,则越低效。感觉RN的渲染性能,和以前android2.x时代没多大区别,如果层级结构大于5级,则要考虑下优化了。这没啥技巧,纯靠经验及硬实力。

6.组件粒度化

如何更好的划分组件粒度,这需要合理的对组件进行更细粒度的划分,区分出静态组件及动态组件。

Web前端50个创意实用网站(一)

本篇分两部分,另一篇点击这里:Web前端50个创意实用网站(二),主要是web前端技术辅助网站,有些网站的创意和设计都很不错。本文介绍了50个非常强大的工具,你会发现,其中的一些工具会让你感到惊艳在。

LaunchList

站点发布前的工作清单,预设了28个需要检查的事项,也可以自定义。同类工具: Ultimate Website Launch Checklist 以及 The Ultimate Website Prelaunch Checklist

Pencil Project: Sketching and Prototyping with Firefox

一个开源 GUI 原型设计工具。

Zootool

一个非常漂亮的书签工具,可以将你收集的各种素材,图片,文档,链接,视频等在线组织到一起。

Bounce (推荐)

输入一个站点地址,该程序会给该站点截图,然后,你可以在上面批注,加评论,并和朋友分享。非常适合用来和您的客户在线就某个站点的设计进行讨论。

Ninite Batch Installer

这个站点可以将很多免费的流行软件(最好的版本)打包在一起,一次性安装到你的机器,支持 Windows7,Vista 和 XP。

Support Details (强烈推荐)

假如你想让你的用户提供他/她所使用的浏览器环境,比如 Flash 版本,操作系统,屏幕分辨率,Cookie,JavaScript 状态等,可以让他/她访问一下这个站点,这个站点或自动将这些内容探测出来,并允许用户现场通过邮件将报告发送给你。

MugTug’s Darkroom

一个在线图片处理程序,可以调整对比度,白平衡,曝光,饱和度等,可以从 Picasa 及 Flickr 上传图片,同类产品:PixlrSumo Paint

Visual Website Optimizer (强烈推荐)

Visual Website Optimizer 绝对是你所能见到的最好的 A/B 测试工具。

Keyonary

这个简单的在线工具可以帮你列出 Mac OS X, Photoshop 等工具的快捷键清单。

gridr buildrrr

一个在线网格设计工具,选择你希望使用的网格布局,帮你预览并生成 CSS 代码。

Instant Blueprint – Create a web project framework in seconds.

帮你瞬间生成一个 Web 项目框架,基于合法 HTML/XHTML 和 CSS。

Hummingbird

一个实时的(真正的实时,每秒刷新20次)站点流量分析工具,基于 Node.js.

jsFiddle

在线 Web 编辑器,支持 JavaScript, MooTools, jQuery, Prototype, YUI, Glow, Dojo, HTML 以及 CSS。

String: create a multi-language website or app

帮你创建多语种 Web 应用的资源文件,

Titanpad

可以多人同时编辑同一个文档,别的改动会实时以不同颜色标识,可以是同一个办公室的多个用户,也可以是地球另一边的多个用户。

Pixelnovel Timeline: Version Control for Adobe Photoshop

该工具通过插件方式集成 Subversion 客户端,可以在 Photoshop 中实现版本控制。非免费工具。

0to255

给出一种颜色,会帮你列出这种颜色由浅入深的各种颜色变化,并特别针对 Web 做了优化。

Load Impact: Website load/stress test

一个在线压力测试工具,模拟多用户同时访问你的站点,并出具报告以分析你的站点可以支撑的访问者数量。

Ideone: Online IDE & Debugging Tool

一个在线 IDE 和调试工具,支持多达40种语言,包括 C++, Java, JavaScript, Perl, PHP, Python and Ruby,同类产品:PHP Anywhere 以及 CodeRun

Online Dummy Image Generator

快速帮你生成一个在线虚拟图片,以便您进行某些测试。

HiFi RegExp Tool

在线正则表达式工具。

Tableizer (推荐)

将你 Excel 表格中的内容复制粘贴到这个站点,它会帮你生成 HTML 格式的表格(HTML Table)。

FollowUpThen: Easy Email Reminder

-假如你希望有人提醒你什么时候该做什么事,你可以给比如 1day@followupthen.com 一类的地址发个邮件,1day 表示一天后,这样,一天后,你会收到他们的提醒邮件,1day 可以改成人和别的时间间隔。

Divine: Conversion tool from PSD to HTML

这个工具是一个 Photoshop 插件,可以将你的 PSD 转换成 WordPress 主题。(译者:有待验证)