Why React Native
React Native 和前端技术生态重合度很高,学习成本低, 一份源码可以同时编译成 Android 和 iOS 原生应用. 适合更新迭代较快的项目
同时 其底层架构师根植于移动端原生API 可以自定义原生模块 以及优化性能
本质(nature)
>
在 Android 开发中是使用 Kotlin 或 Java 来编写视图;在 iOS 开发中是使用 Swift 或 Objective-C 来编写视图。在 React Native 中,则使用 React 组件通过 JavaScript 来调用这些视图。在运行时,React Native 为这些组件创建相应的 Android 和 iOS 视图。由于 React Native 组件就是对原生视图的封装,因此使用 React Native 编写的应用外观、感觉和性能与其他任何原生应用一样。我们将这些平台支持的组件称为原生组件。
在较早的React Native中通过称为Bridge的异步机制完成js与原生代码之间的通信,0.74版本开始默认使用Bridgeless mode,调用JSI访问原生代码从而提高性能和响应速度
React Native 允许您为 Android 和 iOS 构建自己的 Native Components(原生组件),以满足您开发应用程序的独特需求。React Native 还包括一组基本的,随时可用的原生组件,您可以使用它们来构建您的应用程序。这些是 React Native 的核心组件。
环境配置
node & jdk
1
choco install -y nodejs-lts microsoft-openjdk17
- Android SDK及路径其环境变量
参考Environment Setup
React Native项目
1 | npx @react-native-community/cli@latest init AwesomeProject |
Android设备
- USB连接Android手机
- AVD(Android Virtual Device)模拟器
Android Studio—>工具栏Device Manager—>Add a new device—>Create Virtual Device—>选择任意设备—>Next—>UpsideDownCake API Level 34 image
开发
Android Studio开发js/ts很不习惯,可以使用vscode调试,添加react-native-tool,配置emulator到环境变量以使能被vscode调起
1 | npm i -g react-native |
项目终端执行 npm run android 输出
1 | $ react-native run-android |
安装完毕后
会另外启动四个窗口
- NodeJS 窗口
- emulator\crashpad_handle.exe
- emulator\qemu\windows-x86_64\qemu-system-x86_64.exe
- Android Emulator 移动设备界面
调试
在Android Emulator界面上按 Ctrl + M 弹出Emulator菜单,在菜单中点击Open DevTools启动React Native Cli自带DevTools
打包
1 | cd android |
android emulator
命令行输入emulator —help查看工具参数手册
1 | emulator -list-avds |
对于应用crash导致系统崩溃,尝试不加载snapshot后冷启动
1 | emulator -avd myavd -no-snapshot-load -no-snapshot-save |
将本地文件放入虚拟设备
1 | avd push D:\Download\Game.apk /sdcard/Download/Game.apk |
Internet
Platform
1 | import {Platform, StyleSheet} from 'react-native'; |
Platform.OS返回’ios’ 或者’android’
Platform.version返回OS版本号
Platform.select根据平台返回以平台字符串为key的map中对应的value
1 | const Component = Platform.select({ |
Metro
The JavaScript bundler for React Native 打包器
视图
视图是React Native UI的基本组成。视图的概念可以小到屏幕上的一个小矩形元素、可用于显示文本、图像或响应用户输入。甚至应用程序最小的视觉元素(例如一行文本或一个按钮)也都是各种视图。View可以嵌套View。全部都是视图。
核心组件
- View
- Text
- Image
- ScrollView
- TextInput
- StyleSheet
- Button
- Switch
- FlatList
- SectionList
样式
与网页的不同
- 子元素不继承样式
- 驼峰命名fontSize
- 不使用单位(px等)
StyleSheet:
1 | import { StyleSheet, Text } from 'reat-native' |
css px是逻辑像素,物理像素/逻辑像素叫设备像素比 这里css省略px,强调逻辑像素,具体显示的物理像素数量由设备根据屏幕种类换算
PPI(pixels per inch)每英寸物理像素点
RN中的Flexbox规则和Web中Css FlexBox基本一致,主要的不同就是flex-direction默认不同,css中默认是水平方向,rn中默认是垂直方向。
阴影样式
1 | shadowBorder:{ |
对应css
1 | box-shadow: '0 0 8px 8px #000a' |
即iOS 通过 shadowOffset shadowOpacity shadowRadius 来实现阴影,而 Android 则通过 elevation 来实现阴影,
ios
Navigator
React Native Navigation
React Native 中导航变得很复杂,原因在于页面url不会加入window.history
- Stack Navigator
- Tab Navigator
- Drawer Navigator
1 | yarn add @react-navigation/native |
编辑位于 android/app/src/main/java/
添加以下代码
1 | //... |
Example:
1 | const Stack = createNativeStackNavigator(); |
响应式
Dimensions API
1 | import { Dimensions } from 'react-native' |
监听屏幕尺寸改变(横竖屏切换,折叠屏)
1 | useEffect(() => { |
AndroidManifest.xml
声明安卓应用版本信息,元数据,权限声明等,相应的ios应用是Info.plist
1 | <uses-permission android:name="android.permission.CAMERA" /> |
build.gradle
配置应用的构建过程,包含依赖的仓库和插件等等
使用react-native-vector-icons需要配置build.gradle
1 | apply from: file("../../node_modules/react-native-vector-icons/fonts.gradle") |
使用icons:
1 | import Icon from "react-native-vector-icons/FontAwesome" |
从命令行安装安卓模拟器
不使用Android Studio IDE, 从命令行安装安卓模拟器
下载cmdline-tools其中包含 sdkmanager 工具和 avdmanager 工具
cmdline-tools解压到一个D:/Environment/android-sdk目录(实际上要再加一层latest),并配置到环境变量
1 | export ANDROID_HOME=D:/Environment/android-sdk |
使用sdkmanager安装 platform-tools、emulator、platforms、system-images,(注sdkmanager依赖 jdk 17)
1 | sdkmanager --sdk_root="D:\Environment\android-sdk" "platform-tools" "emulator" "platforms;android-34" "system-images;android-34;google_apis;x86_64" |