从 1 到圆满,用 js 和 react-native 写一个 APP

从 1 到圆满,用 js 和 react-native 写一个 APP

facebook 在 2013 年开源了 react 后,紧接着在 2015 年就又开源了 react-native,就此翻开了用 js 和前端手艺写原生 android&ios APP 之路。只管到如今为止 react-native 最新版本是 0.56.0,还没有宣布正式 1.0 版,但运用 react-native 开辟原生 APP 的手艺已比较成熟了,许多商业公司和商业软件都在用 react-native 做开辟,比方 facebook, airbnb, uber, skype 等。

别的,除了 react 在做写原生 APP 的尝试以外,vue 也在尝试,详见 vue-native

1. 媒介

  1. 开辟时发起用 mac,由于 mac 上的 ios 模拟器能在开辟时,疾速的重载运用,而 android 就慢许多了
  2. 开辟时发起用 yarn, 假如非要用 npm, 务必运用 npm < 5 版本,不然就能够碰到以下的题目(找不到 node_modules 下面的文件):

    • Cannot find entry file node_modules/react-native-scripts/build/bin/crna-entry.js
    • Unable to resolve "react-navigation" from "App.js"
    • expo xde 中: Metro Bundler failed to start. (code: EMFILE)
    • expo xde 中: Metro Bundler failed to start. (code: EAGAIN)

2. 完成道理

react-native 在 APP 内启动并保护了一个 js UI 历程(有能够另有 js background 历程),然后把 js UI 历程中的组件及其款式映射到 APP 的原生 UI 层,如许 js UI 历程中组件的更新就马上反应到 APP UI 历程中,而其他逻辑和数据等的状况都维持在 js UI 历程中。如许便达到了用 js 和前端手艺写原生 APP 的功用。

对应 web 来看,react-native 顺序只要两个部份,stylejs,而 js 部份则分为组件和 api

|-- react-native
    |-- style 款式部份,对应 web 的 css 部份
    |-- js 部份
        |-- 组件 预定义基本容器
        |-- api 对原生接口的封装

2.1 style

react-nativestyle 用来形貌组件的款式、规划等,用 js 誊写。它自创了 css 的语法,但只支撑部份的语法,而且誊写体式格局和完成体式格局都有很大的差别:

  • 没有 class, id 等之类的 css 挑选器
  • 没有 px, em 等之类的 css 尺寸单元
  • 属性名运用 HTML DOM Style 对象 的语法
  • 运用款式时只要类似于 css 的行内款式如许的写法

比方:

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

export default 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',
  },
});

详见 Style, StyleSheet, View Style Props, Text Style Props, Image Style Props

2.2 js

react-nativejswebjs 都是 javascript,这点没区分;但 react-nativejs 只是纯 js,并不运转在浏览器环境中,也就没有 DOM,统统与 DOM 相干的语法都不可用,如 window, document 等。所以,在 web 端的纯 js 库(无 DOM)在 react-native 中一样实用,如 redux, lodash, immutable-js 等。

react-nativejs 分为组件和接口。

组件是由 react-native 定义好的基本容器,就像 html 的标签一样,如 View, Text, Image, WebView 等。

接口是 react-native 封装好的原生 APP 的功用,如相机、存储、体系信息等。

3. 决议是不是运用 react-native

只管 react-native 供应了运用 js 和前端手艺写原生 APP 的壮大功用,但并不是说就能够用 react-native 替代 java, kotlinandroid APP、objective-c, swiftios APP 了,它只是供应了一个挑选。

实在,从上面的完成道理中,基本上能够看出 react-native APP 是有很明显的劣势的:

  • 机能不及原生的 APP
  • 自在度也不及本来的 APP,由于被束缚的 react-native 形式中
  • apk, ipa 文件变大了

react-native 也有很壮大的上风:

  • 开辟简朴、疾速,入门槛比较低
  • 跨平台,一套代码就能够在多个平台上运转

所以,一种不错的挑选是:

  1. 假如寻求圆满机能和体验的 APP,用原生的体式格局(androi: java, kotlin, ios: objective-c, swift)开辟
  2. 对机能和体验不敏感,但对人力本钱敏感,而且须要疾速开辟的,用 react-native 开辟
  3. 二者能够夹杂开辟,对机能和体验敏感的用原生的体式格局开辟,对人力本钱和时候本钱敏感的用 react-native 开辟

4. 决议运用何种构建体式格局

如今 react-native APP 的构建体式格局有两种:

  1. 运用 Android Studio 或 Xcode 开辟
  2. 运用 expo 体式格局开辟

4.1 运用 Android Studio 或 Xcode 开辟

这类体式格局是如今运用比较多的一种体式格局,不管是纯 react-native APP 照样夹杂型 APP(原生与 react-native 夹杂开辟),都是实用的。

这类体式格局的优点是能够举行原生开辟、自定义打包,但对大部份前端开辟人员来讲,这类体式格局对环境的请求比较高,须要 Android Studio 或 Xcode,而且设置庞杂,入门槛很高。

初始化

# 装置 react-native-cli
npm install -g react-native-cli

# 新建项目
react-native init demo

# 切换到项目根目次
cd demo

开辟

# 开启当地 `js` UI 历程效劳(开辟形式)
npm run start

# 运转 ios 顺序
react-native run-ios

# 运转 android 顺序
react-native run-android

打包 apk, ipa

# 打包 android APP 所需的 js bundle 文件
react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/ 

# 打包 apk
# 根据一般的 android 打包体式格局举行


# 打包 ios APP 所需的 js bundle 文件
react-native bundle --platform ios --dev false --entry-file index.js --bundle-output ios/bundle/index.ios.jsbundle --assets-dest ios/bundle

# 打包 ipa
# 根据一般的 ios 打包体式格局举行

4.2 运用 expo 体式格局开辟

expo 是 facebook 与 expo 协作特地为 react-native 开辟的一套东西,它让 react-native 开辟从 Android Studio 和 Xcode 中解放出来,使开辟者只关注 react-native 开辟部份,而不剖析庞杂的原生开辟。

这类体式格局是如今纯 react-native APP 开辟的引荐体式格局。

这类体式格局的优点是不须要 Android Studio 或 Xcode(包含开辟和打包),对环境的请求低,设置简朴,入门槛低,但不能举行原生开辟、自定义打包。

初始化

# 装置 create-react-native-app
npm install -g create-react-native-app

# 新建项目
create-react-native-app demo

# 切换到项目根目次
cd demo

或许

# 装置 expo
npm install -g expo-cli

# 新建项目
expo init

# 切换到项目根目次
cd demo

开辟

# 运转 ios 顺序
npm run ios

# 运转 android 顺序
npm run android

或许

# 手机上装置 expo 客户端

# 开启当地 `js` UI 历程效劳(开辟形式)
expo start

# 运转 ios 顺序
# 用 expo 客户端扫描二维码

# 运转 android 顺序
# 用 expo 客户端扫描二维码

打包 apk, ipa

# 打包 apk
expo build:android

# 打包 ipa
expo build:ios

能够碰到的题目

  1. 假如构建失足,尝试删除项目根目次下的 .expo 文件夹以后,再试
  2. Packager is not running at ...: 尝试从新翻开一个终端,并尝试删除项目根目次下的 .expo 文件夹以后,再试

5. 挑选适宜的组件库

6. 挑选适宜的模板

运用 react-native initcreate-react-native-app 初始化的项目,只是搭建好了基本的骨架,项目的其他部份须要开辟者本身去搭建,如 storybook 组件预览、enzyme + jest 测试、eslint + prettier 代码矫正与优化等。

所以,挑选一个适宜的、已搭建好大部份架子的模板就很受用了:

ignite 举例:

# 装置 ignite-cli
npm install -g ignite-cli

# 初始化项目
ignite new demo

# 切换目次
cd demo

# 如今就能够对项目举行操作了,如增加 screen,运转顺序等

# 运转 storybook 组件预览
npm run storybook

# 开启当地 `js` UI 历程效劳(开辟形式)
npm run start

# android 打包
npm run android:build

# ios 打包须要用 Xcode

7. 开辟运用

除了 stylecss 的区分和 jsDOM 外,其他与开辟 web 项目一致。

8. 运用实例

diary 就是运用 expo 开辟的一个日志 APP。

9. 后续

更多博客,检察 https://github.com/senntyou/blogs

作者:深予之 (@senntyou)

版权声明:自在转载-非商用-非衍生-坚持签名(创意同享3.0许可证

    原文作者:senntyou
    原文地址: https://segmentfault.com/a/1190000016272845
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞