React Native初探
转自:博客园 叶小钗
前言
很久之前就想研究React Native了,但是一直没有落地的机会,我一直认为一个技术要有落地的场景才有研究的意义,刚好最近迎来了新的APP,在可控的范围内,我们可以在上面做任何想做的事情。
PS:任何新技术的尝鲜都一定要控制在自己能控制的范围内,失败了会有可替换方案,不要引起不可逆的问题,这样会给团队造成灾难性的后果。
事实上,RN经过一段时间发展,已经有充分数量的人尝试过了,就我身边就有几批,褒贬也不一:
① 做UI快
② 还是有很多限制,不如原生Native
③ 入门简单,能让前端快速开发App
④ iOS&Android大部分代码通用
⑤ code-push能做热更新,但是用不好依旧坑
......
在得到一些信息后,可以看出,要用RN高效率的做出比较不错的App是有可能的,单看投入度与最初设计是否合理,而且现在关于React Native的各种文档是相当丰富的,所以这个阶段想切入RN可能是一个不错的选择。
带着试试不吃亏的想法,我们开始今天的学习,这里是一些比较优质的学习资料:
https://github.com/reactnativecn/react-native-guide
准备阶段
搭建开发环境
http://reactnative.cn/docs/0.36/getting-started.html
官方的例子其实写的很好了,我照着官方的例子能很好的跑起来,大家自己去看看吧
这里在运行时候要注意一下,我因为开启了FQ工具,一运行就crash,这里猜测是翻(科学上网法)墙工具对localhost造成了影响,导致不能读取文件,这个可能涉及到RN底层实现,我们后面深入了再去做研究,这里关闭FQ工具即可。
然后第二个问题,是http的图片展示不出来,这里折腾了很久,却发现后面的章节有了说明,app默认只支持https的链接,这里大家改下配置即可:
https://segmentfault.com/a/1190000002933776
RN中的js使用的是比较新的语法,这里也需要大家进行学习,我学习的感受是ES6提供了很多语法糖,但是有几个东西也要注意。
Class
JavaScript之前的继承全部是复写原型链模拟实现的,作为大型应用框架,继承是必不可少的,所以ES6直接将这块API化了,我这里写一个简单的demo:
1 class Animal { 2 constructor(name) { 3 this.name = name; 4 } 5 say() { 6 console.log('我是' + this.name); 7 } 8 } 9 10 class Person extends Animal { 11 say() { 12 console.log('我是人类'); 13 super.say(); 14 } 15 } 16 17 var p = new Person('叶小钗') 18 p.say();
1 /* 2 我是人类 3 我是叶小钗 4 */
Module
我们一般使用requireJS解决模块化的问题,在ES6里面提出了Module功能在官方解决了模块化的问题,这里优缺点不是我们考虑的重点,简单了解下语法,两个核心为:
① export
② import
ES6以一个文件为单位,一个文件可以多个输出,这里以RN的一个引用为例:
1 import React, { Component } from 'react'; 2 import { 3 AppRegistry, 4 StyleSheet, 5 Text, 6 View 7 } from 'react-native'; 8 import styles from './static/style/styles.js';
可以假想,这里一定会有一个react文件,并且里面可能是这个样式的:
export default class React...... expoet class Component ......
PS:一个文件只能有一个default
输出的default一定会出现,不使用大括号包裹,其余部分随意输出,这里与我们使用require或有不同,需要注意。
应该说ES6提供了很多语法糖,有人喜欢,有人不喜欢,这个看爱好使用吧,比如=>箭头函数。了解了以上关系,再配合ES6的一些文档,基本可以写RN的代码了。
城市列表
拆分目录
这里,我们做一个城市列表,真实的访问接口获取数据,然后渲染页面,看看做出来效果如何。
首先,我们初始化一个RN项目:
react-native init Citylist
然后使用Xcode打开iOS中的项目,编译运行:
View Code
这里除了index.io.js,其他文件我们不必理睬,我们做的第一件事情是,将样式文件剥离出去,新建static文件夹,加入images和style,将样式文件移入style文件,新建style.js:
1 import { 2 StyleSheet 3 } from 'react-native'; 4 5 export let styles = StyleSheet.create({ 6 container: { 7 flex: 1, 8 justifyContent: 'center', 9 alignItems: 'center', 10 backgroundColor: '#F5FCFF', 11 }, 12 welcome: { 13 fontSize: 20, 14 textAlign: 'center', 15 margin: 10, 16 }, 17 instructions: { 18 textAlign: 'center', 19 color: '#333333', 20 marginBottom: 5, 21 }, 22 });
然后首页代码再做一些改动:
1 import React, { Component } from 'react'; 2 import { 3 AppRegistry, 4 Text, 5 View 6 } from 'react-native'; 7 8 import {styles} from './static/style/style'; 9 10 11 export default class Citylist extends Component { 12 render() { 13 return ( 14 <View style={styles.container}> 15 <Text style={styles.welcome}> 16 Welcome to React Native! 17 </Text> 18 <Text style={styles.instructions}> 19 To get started, edit index.ios.js 20 </Text> 21 <Text style={styles.instructions}> 22 Press Cmd+R to reload,{'\n'} 23 Cmd+D or shake for dev menu 24 </Text> 25 </View> 26 ); 27 } 28 } 29 30 AppRegistry.registerComponent('Citylist', () => Citylist);
PS:这里有一个箭头函数
1 () => Citylist 2 //===> 3 function () { 4 return Citylist; 5 }
静态资源剥离后,我们先不处理其它的,我们来做数据请求。
数据请求
RN虽然内置了ajax库,但是一般推荐使用RN自带的Fetch,最简单的使用是:
fetch('https://mywebsite.com/mydata.json')
PS:我们在学习RN的时候,也是在学习神马方式是适合的,或者说熟悉使用合适的组件
请求一个接口是这样写的(使用promise):
1 fetch('https://apikuai.baidu.com/city/getstartcitys') 2 .then((response) => response.json()) 3 .then((jsonData) => { 4 console.log(jsonData); 5 }) 6 .catch((e) => { 7 console.log(e) 8 })
这里打开调试环境一看,输出了我们要的数据:
一般来说,我们需要对数据请求应该封装为一个底层库,这里只做一些简单改造,真实项目不会这样做:
1 export default class Citylist extends Component { 2 getdata(url, suc, err) { 3 return fetch(url) 4 .then((response) => response.json()) 5 .then((data) => { 6 if(data.errno == 0) { 7 suc && suc(data.data) 8 } 9 }) 10 .catch((e) => { 11 console.log(e) 12 }); 13 } 14 render() { 15 16 this.getdata('https://apikuai.baidu.com/city/getstartcitys', function(data) { 17 s = '' 18 }); 19 20 return ( 21 <View style={styles.container}> 22 <Text style={styles.welcome}> 23 Welcome to React Native! 24 </Text> 25 <Text style={styles.instructions}> 26 To get started, edit index.ios.js 27 </Text> 28 <Text style={styles.instructions}> 29 Press Cmd+R to reload,{'\n'} 30 Cmd+D or shake for dev menu 31 </Text> 32 </View> 33 ); 34 } 35 }
PS:这里的使用不一定正确,先完成功能再改进吧
我们取所有的城市cities,这个数据量很大,有1000多条记录,也可以测试下拖动效率了,这里为类加入构造函数,因为列表是可变的,暂时把列表数据归为state(react也不是太熟,如果有问题后续优化,先完成功能):
1 constructor(props) { 2 super(props); 3 this.state = { 4 cities: [] 5 }; 6 }
1 var scope = this; 2 //本来想使用箭头函数的,但是了解不太清楚,demo时候暂时这样吧 3 this.getdata('https://apikuai.baidu.com/city/getstartcitys', function(data) { 4 scope.state.citys = data.cities; 5 });
列表渲染
处理了数据问题后,我们开始做列表渲染,这里使用ListView组件,这个组件用以显示一个垂直滚动列表,适合长列表,两个必须的属性是datasource和renderRow:
dataSource:列表数据源
renderRow:逐个解析数据源中的数据,然后返回一个设定好的格式来渲染
简单书写代码:
View Code
然后就这样了,虽然丑是丑点,但是还能看嘛,这里我们先不去理睬城市的排序,也不做搜索功能,我们先把布局处理下,他的丑陋我已经受不了了
样式处理
现在我们开始处理这段样式:
View Code
View Code
事件绑定
然后,我们再为每行数据加上点击事件,这里也做简单一点,打印出当前行的值即可:
1 onPressAction(data){ 2 alert(data.cnname) 3 } 4 render() { 5 return ( 6 <View style={styles.container}> 7 <ListView style={styles.listView} enableEmptySections={true} 8 dataSource={this.state.cities} 9 renderRow={(rowData) => 10 <View style={styles.listItem} > 11 <Text onPress={() => this.onPressAction(rowData)}>{rowData.cnname}</Text> 12 </View> 13 } 14 /> 15 </View> 16 ); 17 }
PS:我尼玛,这个RN的学习,很大程度就是一个个API或者组件的熟悉,这块不熟悉的话,做起来恼火的很
我这里开始想给Text设置边框,怎么都不能成功,后面就加了一层View就好了,这种小细节需要多摸索,这个是最终的结构:
结语
作为一个demo的话,这个例子基本可以说明一些问题的,虽然我本意是想做成这个样子的:)
通过这个例子,我们简单的学习了下RN的开发模式,做出来的感受是Facebook很强大,做了一个体系性的东西,举个例子来说(个人感受)
之前我们做Hybrid的时候Header是Native提供的,大概做法是这样的:
1 //Native以及前端框架会对特殊tagname的标识做默认回调,如果未注册callback,或者点击回调callback无返回则执行默认方法 2 //back前端默认执行History.back,如果不可后退则回到指定URL,Native如果检测到不可后退则返回Naive大首页 3 //home前端默认返回指定URL,Native默认返回大首页 4 this.header.set({ 5 left: [ 6 { 7 //如果出现value字段,则默认不使用icon 8 tagname: 'back', 9 value: '回退', 10 //如果设置了lefticon或者righticon,则显示icon 11 //native会提供常用图标icon映射,如果找不到,便会去当前业务频道专用目录获取图标 12 lefticon: 'back', 13 callback: function () { } 14 } 15 ], 16 right: [ 17 { 18 //默认icon为tagname,这里为icon 19 tagname: 'search', 20 callback: function () { } 21 }, 22 //自定义图标 23 { 24 tagname: 'me', 25 //会去hotel频道存储静态header图标资源目录搜寻该图标,没有便使用默认图标 26 icon: 'hotel/me.png', 27 callback: function () { } 28 } 29 ], 30 title: 'title', 31 //显示主标题,子标题的场景 32 title: ['title', 'subtitle'], 33 34 //定制化title 35 title: { 36 value: 'title', 37 //标题右边图标 38 righticon: 'down', //也可以设置lefticon 39 //标题类型,默认为空,设置的话需要特殊处理 40 //type: 'tabs', 41 //点击标题时的回调,默认为空 42 callback: function () { } 43 } 44 });
通过这个约定,我们的Native就会生成一系列headerUI:
而RN做了什么呢,他可能是实现了一个这样的标签(或者说是语法糖):
<Header title="" right="[]" ></Header>
然后RN会自己去解析这个标签,生成上述的对象,然后生成Native的UI,这个我们其实也能做到,但是我们一个能做到,10个就不一定做得到了,RN牛的地方就牛在他提供了这么大一坨东西:
然后还有他一整套的样式体系,非常之大手笔,而通过RN的完善约定,生成了一套NativeUI,应该说来体验是非常高的,开发效率因为可以做到大部分iOS Android通用,虽然整体开发效率无法与Hybrid比肩,但绝对有其应用场景。
我们也有一些同事说了一些RN的问题,但是框架在发展,容器在优化,这些问题在某个时间点应该能解决的,总的说来,RN还是很有学习的价值,后面我可能会花很多功夫去进行落地!!!
为了汇集资源,这里引用这里的学习资源:https://github.com/reactnativecn/react-native-guide
React Native
-
构建 Facebook F8 2016 App / React Native 开发指南 http://f8-app.liaohuqiu.net/
-
React-Native入门指南 https://github.com/vczero/react-native-lesson
-
30天学习React Native教程 https://github.com/fangwei716/30-days-of-react-native
-
React-Native视频教程(部分免费) https://egghead.io/technologies/react
-
React Native 开发培训视频教程(中文|免费) https://www.gitbook.com/book/unbug/react-native-training/details
-
react-native 官方api文档 http://facebook.github.io/react-native/docs/getting-started.html
-
react-native中文文档(极客学院) http://wiki.jikexueyuan.com/project/react-native/
-
react-native中文文档(react native中文网,人工翻译,官网完全同步) http://react-native.cn/docs/getting-started.html
-
react-native第一课 http://html-js.com/article/2783
-
深入浅出 React Native:使用 JavaScript 构建原生应用 http://zhuanlan.zhihu.com/FrontendMagazine/19996445
-
React Native通信机制详解 http://blog.cnbang.net/tech/2698/
-
React Native布局篇 https://segmentfault.com/a/1190000002658374
-
React Native 基础练习指北(一) https://segmentfault.com/a/1190000002645929
-
React Native 基础练习指北(二) https://segmentfault.com/a/1190000002647733
-
Diary of Building an iOS App with React Native http://herman.asia/building-a-flashcard-app-with-react-native
-
React Native For Beginners – The Next Big Thing? https://devdactic.com/react-native-for-beginners/
-
How To Implement A Tab Bar With React Native https://devdactic.com/react-native-tab-bar/
-
tcomb-form-native使用视频教程(需FQ) https://react.rocks/example/tcomb-form-native
-
React Native分享记录 https://segmentfault.com/a/1190000002678782
-
React Native构建本地视图组件 https://www.dobest.me/article/11
-
react-native-android-lession(安卓系列教程) https://github.com/yipengmu/react-native-android-lession
-
React Native模块桥接详解 https://www.dobest.me/article/14
-
React Native: 配置和起步 http://www.liaohuqiu.net/cn/posts/react-native-1/
-
React Native: Android 的打包 http://www.liaohuqiu.net/cn/posts/react-native-android-package/
-
ReactNative之原生模块开发并发布——iOS篇 http://www.liuchungui.com/blog/2016/05/02/reactnativezhi-yuan-sheng-mo-kuai-kai-fa-bing-fa-bu-iospian/
-
ReactNative之原生模块开发并发布——android篇 http://www.liuchungui.com/blog/2016/05/08/reactnativezhi-yuan-sheng-mo-kuai-kai-fa-bing-fa-bu-androidpian/
-
react-native的第一课 https://github.com/coderyi/blog/blob/master/articles/2016/0122_react-native_first_lesson.md
-
React-Native专题系列文章 http://www.lcode.org/react-native/
React.js
-
react.js中文文档 http://reactjs.cn/
-
react.js入门教程(gitbook) https://hulufei.gitbooks.io/react-tutorial/content/introduction.html
-
react.js快速入门教程 - 阮一峰 http://www.ruanyifeng.com/blog/2015/03/react.html
-
react.js视频教程 http://react-china.org/t/reactjs/584
-
React Native之React速学教程https://github.com/crazycodeboy/RNStudyNotes/tree/master/React%20Native%E4%B9%8BReact%E9%80%9F%E5%AD%A6%E6%95%99%E7%A8%8B
ES6
-
深入浅出ES6(一):ES6是什么 http://www.infoq.com/cn/articles/es6-in-depth-an-introduction
-
深入浅出ES6(二):迭代器和for-of循环 http://www.infoq.com/cn/articles/es6-in-depth-iterators-and-the-for-of-loop
-
深入浅出ES6(三):生成器 Generators http://www.infoq.com/cn/articles/es6-in-depth-generators
-
深入浅出ES6(四):模板字符串 http://www.infoq.com/cn/articles/es6-in-depth-template-string
-
深入浅出ES6(五):不定参数和默认参数 http://www.infoq.com/cn/articles/es6-in-depth-rest-parameters-and-defaults
系列教程
-
深入浅出React(一):React的设计哲学 - 简单之美 http://www.infoq.com/cn/articles/react-art-of-simplity
-
深入浅出React(二):React开发神器Webpack http://www.infoq.com/cn/articles/react-and-webpack
-
深入浅出React(三):理解JSX和组件 http://www.infoq.com/cn/articles/react-jsx-and-component
-
深入浅出React(四):虚拟DOM Diff算法解析 http://www.infoq.com/cn/articles/react-dom-diff
-
深入浅出React(五):使用Flux搭建React应用程序架构 http://www.infoq.com/cn/articles/react-flux
-
react-webpack-cookbook中文版 http://fakefish.github.io/react-webpack-cookbook/
-
Flex 布局语法教程 http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html
-
React虚拟DOM浅析 http://www.alloyteam.com/2015/10/react-virtual-analysis-of-the-dom/
-
react组件间通信 http://www.alloyteam.com/2015/07/react-zu-jian-jian-tong-xin/
-
React 数据流管理架构之 Redux 介绍 http://www.alloyteam.com/2015/09/react-redux/
-
React服务器端渲染实践小结 http://www.alloyteam.com/2015/10/8783/
-
React Native Android 踩坑之旅 http://www.alloyteam.com/2015/10/react-native-android-steps-on-tour/
-
React Native 之 JSBridge http://www.alloyteam.com/2015/05/react-native-zhi-jsbridge/
-
React Native 研究与实践教程 https://github.com/crazycodeboy/RNStudyNotes
React Native探索系列教程
-
React Native探索(一):背景、规划和风险 http://www.infoq.com/cn/articles/react-native-overview
-
React Native探索(二):布局篇 http://www.infoq.com/cn/articles/react-native-layout
-
React Native探索(三):与 react-web 的融合 http://www.infoq.com/cn/articles/react-native-web
开源APP
研究源码也是一个很好的学习方式
-
官方演示App https://github.com/facebook/react-native/tree/master/Examples
-
Facebook F8 App https://github.com/fbsamples/f8app
-
GitHub Popular(一个用来查看GitHub最受欢迎与最热项目的App)已上架https://github.com/crazycodeboy/GitHubPopular
-
奇舞周刊 iOS 版(上架应用) https://github.com/fakefish/Weekly75
-
react-native-dribbble-app https://github.com/catalinmiron/react-native-dribbble-app
-
Gank.io客户端 https://github.com/Bob1993/React-Native-Gank
-
Mdcc客户端(优质) https://github.com/Bob1993/mdcc-client
-
Leanote for iOS(云笔记) https://github.com/leanote/leanote-ios-rn
-
ReactNativeRubyChina https://github.com/henter/ReactNativeRubyChina
-
HackerNews-React-Native https://github.com/iSimar/HackerNews-React-Native
-
React-Native新闻客户端 https://github.com/tabalt/ReactNativeNews
-
newswatch(新闻客户端) https://github.com/bradoyler/newswatch-react-native
-
buyscreen(购买页面) https://github.com/appintheair/react-native-buyscreen
-
react-native-todo https://github.com/joemaddalone/react-native-todo
-
react-native-beer https://github.com/muratsu/react-native-beer
-
react-native-stars https://github.com/86/react-native-stars
-
模仿天猫首页的app https://github.com/hugohua/react-native-demo
-
ReactNativeChess https://github.com/csarsam/ReactNativeChess
-
react native 编写的音乐软件 https://github.com/Johnqing/miumiu
-
react-native-pokedex https://github.com/ababol/react-native-pokedex
-
CNode-React-Native https://github.com/SFantasy/CNode-React-Native
-
8tracks电台客户端 https://github.com/voronianski/EightTracksReactNative
-
React-Native实现的计算器 https://github.com/yoxisem544/Calculator-using-React-Native
-
房产搜索app https://github.com/jawee/react-native-PropertyFinder
-
ForeignExchangeApp https://github.com/peralmq/ForeignExchangeApp
-
Segmentfault 客户端 https://github.com/fakefish/sf-react-native
-
Den - 房屋销售app* https://github.com/asamiller/den
-
Noder-cnodejs客户端 https://github.com/soliury/noder-react-native
-
知乎日报Android版 https://github.com/race604/ZhiHuDaily-React-Native
-
ziliun-react-native https://github.com/sonnylazuardi/ziliun-react-native
-
react-native-weather-app https://github.com/shevawen/react-native-weather-app
-
React Native Sample App(Navigation,Flux) https://github.com/taskrabbit/ReactNativeSampleApp
-
TesterHome社区app https://github.com/qddegtya/A-ReactNative-TesterHome
-
Finance - 股票报价app https://github.com/7kfpun/FinanceReactNative
-
shopping - 购物app https://github.com/bigsui/shopping-react-native
-
zhuiyuan - 追源cms app https://github.com/kazaff/ZhuiYuanDemo
-
uestc-bbs-react-native - UESTC清水河畔RN客户端(with Redux) https://github.com/just4fun/uestc-bbs-react-native
-
react-native-nw-react-calculator(iOS/Android、Web、桌面多端) https://github.com/benoitvallon/react-native-nw-react-calculator
-
react-native-nba-app https://github.com/wwayne/react-native-nba-app
-
开源中国的Git@OSC客户端 http://git.oschina.net/rplees/react-native-gitosc
-
rn_bycloud 帮瀛律师端app https://github.com/liuchungui/rn_bycloud
-
ReactNativeRollingExamples - react-native的一些example https://github.com/joggerplus/ReactNativeRollingExamples
-
Reading App Write In React-Native(Studying and Programing https://github.com/attentiveness/reading
-
数独 - 重拾纯粹数独的乐趣 https://github.com/nihgwu/react-native-sudoku
-
Shop-React-Native https://github.com/EleTeam/Shop-React-Native
图书
-
《React Native入门与实战》 http://item.jd.com/11844102.html
-
《React Native开发指南》 http://www.ituring.com.cn/book/1846
-
《React Native跨平台移动应用开发》 http://item.jd.com/10372998311.html
-
《React Native:用JavaScript开发移动应用》 http://item.jd.com/11785195.html
组件
由于已经有较好的组件库网站,这里就不做总结。可以直接查看如下网站,过后可能精选一部分优质组件出来 :P
-
React-native组件库(比较全的组件库) https://js.coach/
-
React Native Modules http://reactnativemodules.com/
-
react-native-simple-router https://github.com/react-native-simple-router-community/react-native-simple-router
-
react-native-router-flux https://github.com/aksonov/react-native-router-flux
-
下拉刷新组件 https://github.com/jsdf/react-native-refreshable-listview
-
react-native-navbar https://github.com/react-native-fellowship/react-native-navbar
-
滚动轮播组件 https://github.com/appintheair/react-native-looped-carousel
-
Material React Native (MRN) - Material Design组件库 https://github.com/binggg/mrn
-
react-native-gitfeed - GitHub客户端(iOS/Android) https://github.com/xiekw2010/react-native-gitfeed
-
React-Native-Elements - React Native样式组件库 https://github.com/react-native-community/React-Native-Elements
-
Shoutem UI - React Native样式组件库 https://github.com/shoutem/ui
工具
-
react-native-snippets(代码提示) https://github.com/Shrugs/react-native-snippets
-
react-native-babel(使用ES6+) https://github.com/roman01la/react-native-babel
-
sqlite for react-native https://github.com/almost/react-native-sqlite
-
gulp-react-native-css(就像写css一样写React Style) https://github.com/soliury/gulp-react-native-css
-
rnpm(React Native Package Manager) https://github.com/rnpm/rnpm
-
Pepperoni - React Native项目初始化套件 https://github.com/futurice/pepperoni-app-kit
-
Deco IDE - React Native IDE https://www.decosoftware.com/
-
ignite - React Native CLI项目生成器 https://github.com/infinitered/ignite
资源网站
-
React-native官网 http://facebook.github.io/react-native/
-
React-China社区 http://react-china.org/
-
React Native中文社区 http://bbs.react-native.cn/
-
React-native组件库(比较全的组件库) http://react.parts/
-
React Native Modules http://reactnativemodules.com/
-
Use React Native 资讯站(使用技巧及新闻) http://www.reactnative.com/
-
11款React Native开源移动 UI 组件 http://www.oschina.net/news/61214/11-react-native-ui-components
-
稀土掘金的 React 标签 http://gold.xitu.io/#/tag/React.js http://gold.xitu.io/#/tag/React%20Native
业界讨论
-
跨平台开发时代的 (再次) 到来?( Xamarin,NativeScript 和 React Native 对比)http://onevcat.com/2015/03/cross-platform/
-
谈谈 React Native - 唐巧 http://blog.devtang.com/blog/2015/02/01/talk-about-react-native/
-
如何评价React-Native? https://www.zhihu.com/question/27852694/answer/43990708
-
React Native概述:背景、规划和风险 http://div.io/topic/938
-
Native与Web的融合 - Qcon中React-Native演讲 http://www.infoq.com/cn/presentations/the-fusion-of-native-and-web
-
使用React Native一年后的感受http://www.dobest.me/blog/2016/06/12/%E4%BD%BF%E7%94%A8React%20Native%E4%B8%80%E5%B9%B4%E5%90%8E%E7%9A%84%E6%84%9F%E5%8F%97/
-
Weex & ReactNative & JSPatch大对比 http://awhisper.github.io/2016/07/22/Weex-ReactNative-JSPatch/
- weex&ReactNative对比 https://zhuanlan.zhihu.com/p/21677103
您可以考虑给小钗发个小额微信红包以资鼓励
使用React Native一年后的感受
转载自;http://www.dobest.me/blog/2016/06/12/%E4%BD%BF%E7%94%A8React%20Native%E4%B8%80%E5%B9%B4%E5%90%8E%E7%9A%84%E6%84%9F%E5%8F%97/
当我在面试Discord的时候,技术主管Stanislav跟我说:
React Native代表着未来。等它一发布,我们就会用它从零构建iOS应用。
作为一名原生iOS开发者,基于先前使用PhoneGap的经验,我非常怀疑使用Web技术构建移动应用的这种方式。但是当我学习并使用React Native一段时间之后,我非常庆幸我们做了这个决定。
开发效率
虽然iOS“团队”只有我自己一个人,但是iOS应用开发依然可以赶上Web和桌面应用开发闪电般的速度。Apple公司已经允许开发者使用JavaScriptCore
进行应用的升级,而无需等待App Store的审核流程。这对于那些缺乏专业的iOS QA(质量保障)团队的小公司来说是非常便利的,因为iOS团队可以在发布新功能之后进行热更新。
使用React Native一年之后,我们的iOS开发周期明显变快了,这得益于很高的开发效率。比如:
-
基于现有的前端架构,我们在两周之内就发布了V1.0的版本。
-
相比于
Auto Layout
,基于Flexbox的样式可以节省一半的代码,并且更容易理解。 -
使用Flux设计模式,iOS和Web应用共享了
store
和action
的98%的代码。
性能
React Native在后台线程运行JavaScript并发送极小的代码到主线程中。事实证明,React Native相比于Objective-C或Swift编写的原生iOS应用来说有一些性能差异!
Reactiflux小组的性能演示,该组有超过1.1万个会员 —— UI和JS线程大多数都是60FPS
然而,我们当初开始构建iOS应用时发现聊天滚动视图的性能并不令人满意,尤其是一些活跃的聊天分组。于是,我们决定使用ComponentKit构建聊天视图并编写必要的桥接代码代替原有的方案。当JS线程在完成一些繁重任务的时候,类库也无法提供原生那样流畅的动画(译注:之前动画是在JS线程执行,目前有人提交了一份代码,有望使用原生iOS动画接口),因此我们在抽屉侧滑动画上继续使用PopAnimation。
注: 作者称该应用仅聊天视图和抽屉动画是原生代码实现的,其他均由React Native实现。
当React Native Android版本发布时,我们也尝试在Android设备上运行应用,但遗憾的是,我们遇到了一些性能问题,只好暂时放弃。Android开发主管Miguel是这样说的:
很遗憾,不同Android设备的性能差异很大,这点明显落后于iOS。我们可以让应用运行地很快,但是性能——尤其是触摸事件,即使在更高端设备上也不能令人满意。并且在早期,由于React Native Android缺乏完善的功能,我们从产品原型过渡到成品应用比iOS花费了更多时间。
可用性
React Native让开发工作更简洁,使得开发者可以专注于每个新版本核心功能的开发。应用内自带的开发者菜单为我节省了大量的时间。
其中我最喜欢的一个功能是Show Inspector
(审查工具),它可以即时展现交互视图的层级结构以及被选组件中所有必要的样式信息,这无疑是我用过的最棒的iOS审查工具。
社区
React Native项目每两周会发布一个新版本,其中包含一些新的特性以及修复的bug。这有利有弊,好比iOS几个月的稳定版本的发布,新的代码需要额外的时间进行升级,尤其是生产环境中的应用。因此,这也是到目前为止我们fork的React Native仓库只有四次主要升级的原因。
由于React Native还不太成熟,资源有限,也不完整。但随着它越来越流行,在不久之后一定能赶上其他成熟的技术。下面列出了一些实用的资源,我也经常在它的仓库上提问和获取最新的信息:
-
Reactiflux上的#react-native。
-
js.coach—React Native开源组件列表。
-
awesome-react-native—大量的React Native文章、教程和示例。
译注:中文资源:React Native学习指南
总的来说,React Native很有潜力,它把我们团队的移动应用开发带上了一个新的台阶。像我这样原生的iOS开发者可以平滑地过渡到React Native,这有些出乎我的意料。同时,它也帮助我扩展职业技能,因为我也可以很轻松地向React编写的Web应用贡献代码了。