转载-浅谈React

Part 1 | 移动端开发方案

目前移动端开发方案可谓百家齐鸣,以至于很难使用单一条件对所有移动端开发方案进行划分,在此我分成三大类来引导各位了解主要的开发方式。

  1. Web开发

简介:基于 Web 相关技术来实现界面及功能

a. 基于浏览器
简介:功能由服务器提供,界面的显示基于浏览器,如有道云笔记 web 版,google docs。
优点:“write once,run anywhere”,适配多个移动平台,同时功能的升级改版过程对用户而言透明。
缺点:Android 端 WebView 的性能不佳,功能受限,大量原生功能无法实现,操作体验较差。

b. 基于应用
简介:套一层原生的壳,主要功能实现基于 WebView。
优点:可以通过开发框架调用移动端 native api,可以实现 WebView 不支持的功能。
缺点:性能依旧低下,原生功能的支持依赖于开发框架。
开发平台示例:Phonegap。

  1. 非 Web 开发

a. 原生
简介:基于标准的 Android SDK 进行开发。
优点:可以轻松调用 SDK 提供的所有软硬件功能,性能佳。
缺点:开发速度慢,应用升级繁琐,往往需要对不同平台提供不同版本。

b. 编译
简介:直接将某个语言编译为移动平台下的二进制文件,常见的如 C++,因为 Android,IOS 都提供了对 C++ 的支持,所有界面无关的功能理论上完全可以使用 C++ 实现的。
优点:可以重用实现复杂的代码,同时编译后的代码反编译困难。
缺点:如果这个工具本身有 Bug 或性能问题,定位和修改成本很高,如果要支持 ARMv8 和 x86 的话会增大编译后应用体积。
开发平台示例:RoboVM,Xamarin(IOS),Apportable,Silver,Go,Xojo。

c. 虚拟机
简介:首先我们了解一下这里的虚拟机代表什么,提到虚拟机我们脑海出现的往往是系统虚拟机或者 JVM,但这里的虚拟机自然没有那么强大,主要功能是提供目标语言的即时编译引擎或即时解释引擎。
优点:支持热更新,拥有对应语言经验的开发者可快速上手移动开发。
缺点:大多数虚拟机提供的原生功能受限,而功能不受限的虚拟机如 NativeScript,编译生成的文件体积过大,同时如果移动端系统升级,要支持新特性需要等新的开发版本。
开发平台示例:Xamarin(Android),LuaView,Titanium/Hyperloop,NativeScript。

  1. 混合式

简介:上述开发方案往往是可以协同的,比如原生+Web,原生+编译,虚拟机+原生,原生+Web+虚拟机+编译,我称这些多种开发方式并存的开发方案为混合式。
优点:相互弥补对方的缺点,比如发版后频繁修改的模块可以使用 WebView 实现,大大降低发版频次,而性能要求高的可使用原生实现,提高用户体验,保密性高的可以使用编译,增加反编译难度。
缺点:未在根本上解决问题,应用的性能,开发速度,平台兼容性等问题依旧是一道难以逾越的难关。

Part 2 | 开发方案评估

我个人评估目前决定 Android 端软件开发方案选型的主要指标是以下五项:
功能实现
用户体验
开发速度
平台兼容性
快速更新的能力

Part 3 | React Native

目前三大类开发方式在这些方面各有所长。
我个人观点纯 Web 开发是未来的方向,可惜在当下,它还在胜利的道路上艰难前行着,我怀疑就算再过五年,它依旧不能走到道路的终点。
介绍这么多,那么现在也到了今天的重点:React Native。

React Native 是什么?在 Facebook 的 React Native 主页上如是写到:「LEARN ONCE, WRITE ANYWHERE: BUILD MOBILE APPS WITH REACT」

这里的「LEARN ONCE」代表着 Facebook 的 React 前端体系。「WRITE ANYWHERE」并非「run anywhere」,虽然在 Android 与 IOS 采用相同的开发语法,但两个不同的平台还是存在不同,对于部分模块还是需要两套代码,不过如果熟练掌握 React 的开发的方式,那么 Android 和 IOS 的开发就很容易上手。
我们来看一段来自 React 示例代码:

var CommentList = React.createClass({
render: function() {
return (
<div className="commentList">
<Comment author="Pete Hunt">This is one comment</Comment>
<Comment author="Jordan Walke">This is another comment</Comment>
</div>
);
}
});

var CommentBox = React.createClass({
loadCommentsFromServer: function() {
$.ajax({
url: this.props.url,
dataType: 'json',
cache: false,
success: function(data) {
this.setState({data: data});
}.bind(this),
error: function(xhr, status, err) {
console.error(this.props.url, status, err.toString());
}.bind(this)
});
},
getInitialState: function() {
return {data: []};
},
componentDidMount: function() {
this.loadCommentsFromServer();
setInterval(this.loadCommentsFromServer, this.props.pollInterval);
},
render: function() {
return (
<div className="commentBox">
<h1>Comments</h1>
<CommentList data={this.state.data} />
<CommentForm />
</div>
);
}
});

React 的界面是通过调用 Class 的 render 方法将模板语言转化为 html 标签,进而通过浏览器对 html 标签的解释实现显示的目的。

从上述代码中我们可以很轻松的看出来,React 的代码编写如同堆积木一般,不同的类是不同的模块,通过组合实现功能需求。

归根到底 React Native 究竟属于哪种开发方式,拥有什么样的优势和缺点呢。

看到它支持的开发语言是JS,大家很容易认为它是 Web 开发,与 WebView 相关,事实上它并不基于 WebView,它提供了一套JS的解释器,将 Android SDK 隐藏起来,是基于虚拟机的开发方式。

那么它又有什么优势呢:

  1. JS 是开发语言,但解释后的界面由 Android 原生视图构成,解释完成后用户实际操作体验接近原生。

  2. 使用 JS 作为开发语言,大大提高应用开发速度,同时使前端开发可以轻松接入开发。

import React, { Component } from 'react';
import { AppRegistry, StyleSheet, Text, View } from 'react-native';

class LotsOfStyles extends Component {
render() {
return (
<View>
<Text style={styles.red}>just red</Text>
<Text style={styles.bigblue}>just bigblue</Text>
<Text style={[styles.bigblue, styles.red]}>bigblue, then red</Text>
<Text style={[styles.red, styles.bigblue]}>red, then bigblue</Text>
</View>
);
}
}

const styles = StyleSheet.create({
bigblue: {
color: 'blue',
fontWeight: 'bold',
fontSize: 30,
},
red: {
color: 'red',
},
});

AppRegistry.registerComponent('LotsOfStyles', () => LotsOfStyles);

这一段代码很轻松的实现了一个含有四个 TextView 的容器,而放到原生代码,我们首先要新建一个 Activity,然后在清单文件中注册 Activity,接着新建一个 xml 编写界面代码,或者使用 java 代码自生成界面代码,而使用 React Native 的话,上述的操作都不需要,只需要写下这段代码,并保存到项目中的 index.android.js 即可。

同时我们将这段代码和前文中的 React 代码作对比,我们可以看到语法是完全相同的,唯一的区别是 React 代码基于 html 标签,而 React Native 代码基于新的一套更贴近移动端开发的标签。

  1. 相比于其他虚拟机,它提供了 Android 原生良好的接口,对于 React Native 不支持但原生支持的功能,开发者可以轻松的添加进自己的应用。

  2. 轻松的版本更新,当对应用做好配置,新的应用打包上传到服务器后,用户应用就可以下载并在下次启动时更新。

  3. 开源,开发者可以轻松的下载下来并对特定功能进行改写和优化。

  4. 轻松的调试,JS 层代码的修改只需要在应用界面 Reload 一次应用代码即可,想比于原生繁琐的更新轻松许多。

那么它又有什么缺点呢:

  1. 极大增加安装包体积,仅显示一个界面的应用编译出来的 apk 大小已经为7.5MB。(基于 React Native 0.33)

  2. JS 层将开发者和原生分割开了,极大增加了开发者直接进行线程调度,内存控制类似操作的难度,提高优化应用性能的难度。

  3. 依旧不是正式稳定版,开发过程中会出现一些奇怪的异常,同时不同版本之间差异较大,仍然处于快速迭代期并没有良好的向前兼容。

备注:本文参考资料 聊聊移动端跨平台开发的各种技术

本文作者:郑童宇,GrowingIO Android 工程师,原敲敲科技 Android 软件负责人。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容