前言

Facebook 在2015.9.15发布了 React Native for Android,把 JavaScript 开发技术扩展到了移动Android平台。基于React的React Native 让前端开发者使用 JavaScript 和 React 编写应用,利用相同的核心代码就可以创建 基于Web,iOS 和 Android 平台的原生应用。在React Native for Android出来之后,本人花了些时间从环境搭建到做出几个demo,从体验来看都挺流畅,具体将此间遇到和问题和具体的新的体会,向大家分享一下。

原理简介

React Native for Android 和 for IOS的基本原理是一致的,通过android的JavaScriptCore来异步解析js代码(jsbundle文件),然后根据引入的支持和配置,渲染成原生native组件。

复用React系统,也减少了一定学习和开发成本,更重要的是利用了React里面的分层和diff机制。js层传给Native层的是一个diff后的json,然后由Native将这个数据映射成真正的布局视图。

环境搭建

环境搭建的话,在网上也找到过很多教程,但是还是推荐还是去看官方文档https://facebook.github.io/react-native/docs/android-setup.html#content,在搭建的过程中可能会遇到一些问题。

在React Native for Android刚出来的时候,官方称是不支持在windows 系统上安装的,只有在mac上才可以使用,但是最新版的React Native for Android已经支持在windows上使用,更新React Native的方法:下载最新版的react-native-cli即npm install -g react-native-cli,并且保证node是最新版的即>4.0。

在执行react-native init AwesomeProject 命令时,由于这个命令会去下载一些node module所以要根据自己的实际情况设置npm的代理和镜像,本人就曾经因为这个问题搞了很久才成功,可以安装nrm(npm install -g nrm)来便捷设置npm的代理和镜像,其次是执行这个命令必须现在机器上装有git,并且设置好git的环境变量,另外这个命令需要等待一些时间,不要提前取消。

在调用react-native run-android的命令时,有时会报出找不到android-sdk环境变量的错误(自己确实已经正确设置环境变量)提示例如

的错误时,可以单独在项目根目录下,也就是AwesomeProject/新建一个local.propertites文件,添加sdk.dir=你的android的sdk目录,然后在运行react-native run-android。

在调用react-native run-android命令时,其实这个命令就是执行的两部分操作一是是构建你的android项目并生成apk,另外一个是打开react-native的package管理工具同时编译你的js文件,其实可以在项目根目录的package.json下找到

其实是执行了另外一条命令node node_modules\react-native\packager\packager.js来打开package的管理工具,有些可能没打开一个新的命令行窗口,自己手动执行这条node命令也是可以的。在这条命令执行完之后,node就会开启一个服务,同时把js文件编译成jsbundle文件,我们可以通过http://localhost:8081/index.android.bundle?platform=android来访问到这个文件,可以简单将这个文件理解成一个html,android就是通过解析这个html来达到渲染的目的,将该文件部署到CDN可供android app从网络获取,即可实现不用发版本让app的UI随时更新,并且可获得接近native的体验,这也是react-native最吸引开发者的亮点之一。

用react native命令生成的android项目是基于gradle构建和部署的(不清楚gradle的可以google),这个以前一些搞用eclipse来android开发的可能不太一样,gradle是用在google主推的一款android开发IDE,android statio里面默认的项目构建方式,所以我们的项目里会看到一些build.gradle的文件,这些都是配置文件。

6 我们在根据教程搭环境时会碰到需要安装android模拟器的步骤,这个步骤会提示你安装一个HAXM的东西可以看到这个安装不是必须的,其实这个是一个android模拟器的加速程序,按了这个你的模拟器可能会跑的更快,但是在安装这个程序时,会遇到的错误是由于CPU的虚拟化未开启,需要重新开机在bios上设置一下,具体怎么设置,可以自行google。

react-native android在本地调试开发时,你只需要修改js文件,然后刷新你的项目,所以在创建android模拟器时要记得选择带有android键盘的模拟器,这样才能在模拟器上刷新你的更改。

与现有的android项目集成

想要在现有的android项目里添加react native支持,你必须要先创建一个基于gradle的android项目,推荐使用android studio来创建项目,要记得创建的项目要高于Android 4.1 (API 16)的android项目。

用android studio创建一个项目 并且能跑起来,这段教程可以直接去网上少,一般配置无误的情况下,很容易跑出一个android helloword来,你只需要保持之前的node package服务开启,程序依然会去寻找http://localhost:8081/index.android.bundle?platform=android这个文件的。只是你的android模拟器是通过android studio来管理了。

在按照http://facebook.github.io/react-native/docs/embedded-app-android.html#content配置你的结合项目时,还要注意在AndroidManifest.xml文件里面添加<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" /> 这样才能开启调试模式。

对于android项目来说,react native的支持也是就在Activity里面创建了一个ReactRootView,对这不是webview,然后将Activity的其他事件生命周期等等都交给react manager来管理,所以对于react native的android页面,就可以简单理解成一个activety里面套一个reactrootview这个view去加载并jsbundle文件,渲染出原生native的ui组件。

远程加载jsbundle文件

目前在react android的官方文档里面,还没有找到如何远程加载jsbundle文件的地方,只能是事先把jsbundle文件放在assets目录下面,一起打包成apk,也就是release apk文件,可以参考https://facebook.github.io/react-native/docs/signed-apk-android.html

样式和布局

react native的代码和react基本一样,组件的生命周期,jsx语法都支持,只是在使用jsx时要经常调用官方提供的组件。

react native里面的样式大部分是可以利用css语法来写的,只有文档里面有的属性才能用,不是所有的css都可以在react native里面用的,采用obj的形式将css属性横杠后面的第一个字母大写即可。

react的宽高度不支持百分比,设置宽高度时不需要带单位,在react native里面默认使用pt为单位,注意在给image设置大小时要根据PixelRatio设置合适的值。

使用dimensions.get("window")可以获取到当前viewport的大小,这个值可能会根据屏幕横竖来动态改变。

react native里面没有float的用法,是根据flex来布局,alignItems和justifyContent分别决定子元素的布局,而flexDirection决定子元素的排列方式垂直还是水平,flex:number决定子元素所占的比例,alignSelf决定元素本事的布局,子view会默认根据父view来absolute,这里有个技巧,如果想让子view实现100%的效果可以设置left:0 ,right :0,同理height可以用top:0,bottom:0。

使用text的numberOfLines可以实现文本截取省略号,即css的text-overflow属性。

默认情况下如果元素超过了父元素,是不可以滚动的,必须在外部套一个<ScrollView>才可以。

react native里面没有z-index的概念,是根据jsx语法里面定义组件的顺序来实现的,后写的组件会覆盖在先写的组件上。

总结

react native android和ios相比,由于出现的还比较晚一些功能还没有非常完善,所以一些文档里面没有写的东西还需要自己摸索,例如android上使用borderTopLeftRadius没起作用。

react native android在性能上要比web来的好很多,毕竟渲染出来的是原生的组件,尤其是在一些低端android机型上,但是跟真正的native相比还是要逊色一些,但是react native的优势在于一套代码可以跨平台复用,而且可以通过更新远端JS,直接更新app,并且对于前端工程师来说用js的语法写native的组件也并没有很难。

本人用react native android做出的demo,大家可以体验一下。http://7jpp2v.com1.z0.glb.clouddn.com/app-release.apk

不断跟新中

React Native for Android 学习的更多相关文章

  1. React Native for Android 学习笔记

    C:\Users\Vic Lee\AwesomeProject>react-native run-android Starting JS server... Running D:\Android ...

  2. React Native For Android 架构初探

    版权声明:本文由王少鸣原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/171 来源:腾云阁 https://www.qclo ...

  3. React Native小白入门学习路径——五

    React Native小白入门学习路径--五 序 "哦天呐!" 这句话成了我在实验室的口头禅, 老师可能觉得我们都是大神吧,都还在看着基础就给布置了那么多任务:写一个RN的TDD ...

  4. React native 之android的图标和启动图片

    哎哎呀呀,上篇说到了react native的IOS的图标和启动图片的设置,其实最主要的是尺寸!相应的尺寸设定好了以后就不会报错了! ok~这篇说的是React native的android的图标和启 ...

  5. 【React Native开发】React Native For Android环境配置以及第一个实例(1)

    年9月15日也公布了ReactNative for Android,尽管Android版本号的项目公布比較迟,可是也没有阻挡了广大开发人员的热情.能够这样讲在2015年移动平台市场上有两个方向技术研究 ...

  6. React Native——我的学习套路

    学习东西都有一定的套路,特别是新的框架,对于React Native,我是这么学的. 第一步 : 这是啥 在各种原因下,需要使用某个框架时,那第一件事就是知道这个框架是用来干什么.React Nati ...

  7. React Native for android 项目驱动教程

    第一节 搭建开发环境 第二节 显示页面标题 第三节 实现页面布局 # React native是什么? React Native,是颠覆性的移动开发技术.它使用js开发,又是原生应用,不同于Hybri ...

  8. 3.React Native在Android中自己定义Component和Module

    React Native终于展示的UI全是Native的UI.将Native的信息封装成React方便的调用. 那么Native是怎样封装成React调用的?Native和React是怎样交互的? V ...

  9. React-Native(五):React Native之Text学习

    本章节主要学习Text的布局,仿照网易新网: 代码: /** * Sample React Native App * https://github.com/facebook/react-native ...

随机推荐

  1. 【bzoj1015】【JSOI2008】【星球大战】【并查集+离线】

    Description 非常久曾经.在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器.并攻下了星系中差点儿全部的星球.这些星球 ...

  2. ubuntu hadoop伪分布式部署

    环境 ubuntu hadoop2.8.1 java1.8 1.配置java1.8 2.配置ssh免密登录 3.hadoop配置 环境变量 配置hadoop环境文件hadoop-env.sh core ...

  3. Android-support-v4源码查看

  4. JS基本特效 -- 常见40个常用的js页面效果图(转载)

    1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键 <table border oncontextmenu ...

  5. vim怎么把一个写的代码文件另存到任意文件夹里?

    比如你要保存到以下路径: D:\my_project\project001\ 那么有两个方法: 1. 直接保存 2. w D:\my_project\project001\xxx.xxx 3. 变更当 ...

  6. div内鼠标坐标位置及绝对和相对坐标获取

    JQuery 获得div绝对,相对位置的坐标方法   1 2 3 4 5 6 获取页面某一元素的绝对X,Y坐标 var X = $('#DivID').offset().top; var Y = $( ...

  7. git lfs

    https://git-lfs.github.com/ 1.从这个网址下载git-lfs-windows-amd64-1.1.0.exe,运行这个安装包 2.然后打开git bash 输入git lf ...

  8. evm指令集手册

    evm指令集手册 Opcodes 结果列为"-"表示没有运算结果(不会在栈上产生值),为"*"是特殊情况,其他都表示运算产生唯一值,并放在栈顶. mem[a.. ...

  9. SWFObject 的基本使用方法

    SWFObject是一个用于在HTML中方面插入Adobe Flash媒体资源(*.swf文件)的独立.敏捷的JavaScript模块.该模块中的JavaScript脚本能够自动检测PC.Mac机器上 ...

  10. Servlet启动运行顺序

    1.web项目执行属性 启动web项目后,web容器首先回去找web.xml文件,读取这个文件. 容器会创建一个 ServletContext ( servlet 上下文),整个 web 项目的所有部 ...