零基础用react-native开发android app

基于雨点儿网,分享react-native开发android app的方法。
这篇博客旨在帮没有任何android或者ios开发经验的开发者体验一把当下热门的react-native。由于我之前也没有native app的开发经验,所以这篇文章中引用了很多我学习过程中碰到的简短有用的资料,方便大家少走些弯路。

我的开源项目托管在github。项目相关的具体内容,可参考下篇《react-native项目结构介绍》。本文只讨论react-native基本的概念及开发流程。

react-native介绍

直接去官网看,不用挂vpn。总而言之,这货就是用写web的方式去写原生应用。布局用css,代码用react的框架。而且不是hybrid app,所以体验很流畅。
关于更多react 及react-native的知识。可以参考汇总知识以及知乎大牛

总而言之,如果要给app分类的话:

  1. webapp:移动端的web页面,纯浏览器应用。

  2. native-app:Java或者oc、swift开发的app,用的本地的组件以及布局。

  3. hybrid-app:介于以上两者之间。即有原生的组件,又封装了webview在里面以便渲染web组件。而这方面有很多框架,典型的如ionic。

而对于react-native,准确的说,应该是属于native app,因为他的渲染完全是本地方式,不靠webview。但是写代码的方式又是web前端。如何做到的呢?参考react原理

上手react-native

QUICK START

如果没有接触过RN(react-native),强烈建议第一件事是去花几十分钟把QUICK START做一遍,遇到不懂的直接照做,不用纠结原因,全当是搭环境。

对于RN android的环境搭建步骤主要有:

  1. react-native部分:主要是npm安装react-native-cli工具。这个可以创建工程,运行工程,打包工程等。按照官网教程一步一步来就行了。

  2. android部分:主要是android SDK,模拟器(推荐Genymotion,方便。)

  3. 运行: 主要原理是,react-native run-android这条命令会编译并打包一个用来debug的apk,并安装到模拟器或者手机。但是debug版本的apk并不是独立的apk,每次运行需要从pc上加载你所写的js代码,所以pc上同时自动运行了一个server。之所以这样做是为了方便调试。每次你改完代码后,watchman会检查到改动。同时模拟器或者真机上的debug版程序会有调试功能,你可以在模拟器中重新加js载脚本,改动就被拉到了移动端。 至于怎么发布独立apk参考下文。

react开发理念

相信做完上面的quick start,你应该已经会自己创建一个RN工程,在模拟器上跑起来了。 如果依旧对react本身的一些概念(如JSX,组件,state)不太了解,可以看下阮一峰的博客

react-native工程

工程结构

react-native init命令可以创建一个RN的工程,初次创建出来结构是这个样子的。

  1. node_modulespackage.json。这个就不必多说了,RN工程也是使用npm去管理依赖的。默认的依赖只有react-native一个包,就是RN自己的代码。

  2. android这个目录。这是一个标准的android工程,Facebook并没有施加什么魔法,去改造android工程。最终代码写完后要发布也只需这个android工程就行了。 ios目录也是一样的, 是个Xcode工程。
    那么RN的代码怎么生效的呢?实际上在根目录下执行react-native run-android后,android工程中gradle的依赖关系会去先编译node_modules下RN的代码,并加入自己的工程中。这也就是第一次跑的时候构建比较慢并且需要装NDK的原因。

  3. index.android.jsindex.ios.js这就是RN工程的主入口,你可以按照自己的组织方式,写很多react的组件组合成自己的app。最终所有的代码会根据这个入口文件加载成一个单一的js文件index.android.bundle加入到android工程中。android的工程有js解释器去执行你的代码。这样一个独立的app就诞生了。

二次开发

当然不是每个工程都需要自己重头去创建空工程然后一步步加各种依赖,创建每个文件。我们很多时候是想用别人的一个开源项目做二次开发。那么如何导出自己的源码给别人用,以及怎么用别人的模板程序做二次开发?

上文介绍了android目录的结构,那么我们发布我们的源码时,实际只要这些依赖关系就行了。android只要工程依赖,不要编译过后的东西。RN本身也只要package.json就行了。这样几百M 的工程只要几M别人就可以使用了。这些不需要拷贝的东西可以参考我的ignore文件

其实这样导出的工程跟react-native init创建的是一样的。只是少了node_modules,同时多了一些android工程的gradle依赖或者js源码。因此使用的时候要先用npm install 安装RN部分的依赖。然后直接react-native run-android就会编译android部分的依赖并在模拟器上跑起来了。

如何装RN的插件

从上文可以看出,RN实际有两套构建系统。

  1. npm用来管理RN的插件。

  2. android或者ios自己的构建系统。

所以装插件比较麻烦。以react-native-icons这个插件举例。除了npm install之外,还需要改gradle文件,并通过改java代码去加载包。明白了原因就行了,麻烦就麻烦点,好在比较好的插件文档都比较详细。

react-native打包

原理

我们的debug程序中,js代码是调试时,不断从server加载到移动端的。但是发布成独立apk时,总不能让app启动的时候远程加载js代码吧。RN的做法是将所有js打成一个bundle文件,作为android的资源,放在assets目录下面。而assets下的文件是会在安装时,随工程一并安装到移动端本地的。这样apk安装好后,RN会负责去加载。

步骤

  • 将js代码导成资源
    目前android版本需要手动去做。参考issues。相信Facebook后面的版本会马上会发布自动导资源的命令。实际现在也挺简单:当react-native的server启动后。把http://localhost:8081/index.android.bundle?platform=android这个地址的js拷出来即可。

    • cd to the project directory

    • Start the react-native packager if not started

    • Download the bundle to the asset folder:
      curl "http://localhost:8081/index.android.bundle?platform=android" -o "android/app/src/main/assets/index.android.bundle"

  • 生成签名apk
    参考官网教程。这里不用android studio,纯命令行就可以,官网教程很详细。最后生成的apk在android/app/build/outputs下面。

  • 嫌麻烦可以把以上步骤放在一个shell脚本中。

示例

如有什么疑问,可以直接在SF或者github的issue提问。
关于RN项目的代码组织,以及raindrop-app开发中遇到的具体问题,可参考下篇《react-native项目结构介绍》

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom