React Native 混合开发与实现

React Native与Godot混合开发实战:架构设计与通信实现 在跨平台应用与游戏开发中,混合架构常被用于整合不同技术栈的优势。其核心原理是通过原生桥接层,实现不同运行时环境(如JavaScript与C++/GDScript)间的进程间通信(IPC)与数据序列化。这种架构的技术价值在于,它能将高性能的游戏渲染引擎与高效的声明式UI框架相结合,从而在保证核心玩法性能的同时,大幅提升复杂业务界面的开发效率与跨平台一致性。典型的应用场景包括需要精美3D画面但外围系统(如商城、社交)需频繁迭代的移动游戏。本文以React Native与Godot的混合开发为例,深入剖析了基于N 阅读详情

(点击上方公众号,可快速关注)

前言

随着 React 的盛行,其移动开发框架 React Native 也收到了广大开发者的青睐,以下简称 RN。通过 RN 我们能够使用 JavaScript 语言来实现跨平台移动应用的开发,打开了前端工程师通往移动平台的大门。用 RN 官方的介绍来概括它的特点就是:Learn once, write anywhere。

如果你了解 React,那么学习 RN 的话应该会非常轻松。因为 RN 和 React 使用了相同的开发语言 JavaScript 和相同的设计理念 React,在 React 的基础上添加了原生平台的底层支持。这样,不同平台的适配就交由 RN 去处理,而开发者只需要关注 RN 平台应用开发本身。

本文将从 RN 混合开发(与 iOS、Android 平台交互)的原理和实现进行介绍,结合流程图的方式让大家进一步的了解 RN 开发的思想和底层逻辑。

原理与实现

1. 从 Hello world 开始

先来看一个使用 RN 实现的简单的 Hello world 展示:

0525defd333065b540d4ae87c7cc515e.png

上方我们不难看到一些很熟悉的 React 语法,但除此之外我们还能看到其引入了 react-native 库中的 AppRegistry API 和 Text (文本)组件,这便是 RN 提供给我们用于调用原生平台的 APIs 和 组件,其能够在不同移动设备上实现一致的功能和逻辑。最后展示在 APP 中的便是 Hello world 文本,而至于 AppRegistry API 后面会做相应介绍。

2. 解刨 React Native 应用的结构

那么看完 Hello world 示例后,我们应该大致知道了 RN 应用的一个结构,我们用图例的方式进行解刨说明,如下图所示:

a7b2b4f999048be0614c290d2bff8154.png

从图中可以看到,我们整个的 RN 应用可以分为两层展示:

  • JavaScript Code 层

  • Native Code 层

也可以理解为所谓的应用层和底层。应用层通过 JavaScript 桥接层 与底层平台进行交互,获取底层平台的原生 APIs、UI 组件及一些自定义组件等。比如 Hello world 示例中引入的 AppRegistry API 和 Text 组件便是很好的说明。

这样的分层能够使应用层的开发变得简单、高效和跨平台,对于应用的稳定性、运行时的性能来说将和原生平台保持接近。

3. 原生平台调用 React Native 组件

大致了解完 React Native 应用的结构后,我们不妨再来认识下原生平台是如何调用 React Native 组件的。我们 RN 的代码要跑在原生 APP 中那必然需要原生 APP 加载运行对应的 RN 组件,以实现混合开发和交互的功能。这里就要来介绍下刚刚搁置的 AppRegistry API 了。

8e94d17cf3f71e627cbf95b61cbb05bf.png

一般我们的 RN 项目都会有一个入口文件,比如 index.js(老版本会存在两个:index.ios.js 和 index.android.js)用于注册根组件并提供给原生平台运行。这里的注册根组件就要通过 AppRegistry API 来实现。

我们需要在根组件里调用 AppRegistry 中的 registerComponent 方法进行组件的注册。注册完之后原生平台便可以通过 runApplication 方法来运行注册过的根组件。需要注意的是注册和运行的组件名称两者必须保持一致,这样才能够实现加载对应的组件。比如 Hello world 示例中我们注册的根组件名为 HelloWorldApp,并且注入相应的组件模块。另外同时一个入口文件中,我们也可以注册多个根组件。

4. 原生加载 React Native 界面

刚刚在介绍原生平台调用 RN 组件时提到了加载对应根组件的功能。那么是不是原生平台只有通过不断的调用运行 RN 注册的根组件才能实现不同页面的首次加载呢(这里的加载指原生打开 RN 页面)?答案是否定的。

3ac31fd16588ab9ab342fe36e206a2a0.png

除了上述通过调用不同的根组件来实现原生打开不同的 RN 界面外(图中第二点),我们还可以调用一个根组件来实现。唯一的区别在于我们需要调用时在 initialProperties 中添加区分不同界面的标识位来渲染不同的组件,就好比在 URL 上携带不同参数跳转到同一路由一样,根据路由上的参数在应用层进行对应组件的渲染。

在 RN 根组件中我们可以通过 this.props 获取原生平台携带过来的参数对象,如示例中的 viewName,再根据 viewName 实现 RN 内部组件的渲染,当然也可以结合 react-navigation 来实现路由模块的切换。至于最终选择哪种方式加载,决定权还是要看业务的划分和功能的定义。相比较而言第一种可能更加灵活和便捷。

5. React Native 与原生平台通信原理

在混合开发模式下,我们不可避免的需要和原生平台进行数据的通信,那么在 RN 中,我们如何与原生平台进行通信呢?如何获取原生平台提供的数据或将数据传递给原生平台呢?下面这张图便介绍了这一流程。

3772b110dee1473e00f9c4673a76b59b.png

在 RN 中,我们可以引用 react-native 模块中的 NativeModules API 来进行数据通信,调用的方法是 NativeModules.模块名称.接口名称,而原生平台返回数据到 RN 平台是基于回调,代码如下:

import { NativeModules } from 'react-native';


const userInfo = NativeModules.UserInfo; // 获取自定义用户信息模块
console.log(userInfo.userName); // 打印用户名


const router = NativeModules.Router; // 获取自定义路由模块


// 调用原生路由跳转方法
router.openHome('参数', (res) => {
    console.log(res); // 打印返回数据
});

通过 NativeModules 我们可以灵活的获取或传递数据给原生平台,同时我们也可以根据业务需要编写不同的 Bridge 方法来实现数据通信模块的封装,比如用户信息模块、路由跳转模块及网络请求模块等。

6. Redux 架构

在 RN 项目中,除了与原生平台通信和交互的功能外,RN 平台自身也需要实现一些数据状态的管理。这里我们还得认识下 Redux 架构。

f1d936ac60996210946b53c1b60cba9a.jpeg

Redux 是一个用于管理 React 应用状态的容器,在 RN 中也同样适用。其采用单一数据流的方式来实现数据的管理,唯一改变 state 的方法是提交 action 操作。这样的架构使得我们的 RN 项目数据易于维护或扩容,改变数据的流程容易追踪和捕获。需要了解的具体关键字如下:

bc82264c53961c5db680dcdb9f1869be.png

具体文档可以参考:http://cn.redux.js.org/

当然你也可以使用其他第三方库实现类似的架构,比如 mobx、dva 等。

7. CSS-in-JS

除了 Redux 架构,RN 中还加入了 CSS in JS 的概念,将原本关注点分离的理念转移到了关注点混合上,使得我们可以在 JS 中写 CSS 代码,但这并不违背之前关注点分离的理念。

6ad92963b83e43f4f5ae182ebab229e9.jpeg

现在随着组件化概念的流行,对从组件层面维护 CSS 样式的需求日益增大,CSS-in-JS 就是在组件内部使用 JavaScript 对 CSS 进行了抽象,可以对其声明和加以维护。这样不仅降低了编写 CSS 样式带来的风险,也让开发变得更加轻松。它和 CSS Modules 的区别是不再需要 CSS 样式文件。

结合 JSX 语法,在 RN 中书写和维护 CSS 变得更加便捷,也是 Web 组件化不断发展的必然产物。

8. React Native 中 的 Flex 布局

另外,在开发 RN 项目时,官方推荐使用的布局方式是 Flex 布局,因为 Flexbox 可以在不同屏幕尺寸上提供一致的布局结构,这也解决了跨平台布局呈现的问题。

a372f94dbde4c939fc844d40f6618580.jpeg

相比我们客户端使用的 Flex 布局,RN 中的 Flex 布局有稍许的不同,比如 flexDirection 的默认值是 column 而不是 row,flex 也只能指定一个数字值等。关于 Flex 布局的介绍可以参考:Flex 布局教程:语法篇、Flex 布局教程:实例篇

9. React Native 的热部署

最后我们介绍下 RN 中的热部署,这也是选择 RN 开发 APP 的一个重要原因之一。相比传统 APP 更新,大都需要第三方审核的流程,而这个流程可能会很慢或者不及时,遇到需要紧急修复的 bug 无法及时更新而导致直接的经济损失是很常见的问题,而 RN 的热部署可以一定程度上解决或减轻这一问题的影响。那么其实现原理是怎样的呢?

7d8ce22126d819c4ba6a233475aadce8.png

上图左侧部分便展现了用户访问 RN 应用的热部署流程。首先用户访问 APP,APP 会向 RN 服务器请求资源包,如果资源包未更新则读取本地缓存资源,如果开发者为了解决 bug 重新更新了服务器上的资源包,那么 APP 拉去后会缓存起来,待用户下次进入后再进行更新。这便是 RN 热部署的流程。

在本地开发时,我们不难发现当我们在运行起来的 RN 项目中修改代码时,再次从 APP 进入 RN 页面,本地终端会再次加载一次更新后的资源数据,这也是 RN 热部署的体现。

同样线上的热部署则需要将我们打包后的 RN 资源上传到服务器上供 APP 读取来实现。

1c5c827b86c11e2c75b145f06006dccb.png

我们可以手动执行打包、上传发布流程,当然为了减少人为干预,实现前端自动化,我们也可以把这块流程交给构建平台去自动打包部署,这便需要搭建一个后台系统进行管理。

结语

本文介绍了 React Native 混合开发的原理与实现逻辑。只有先了解原理,才能高效的投入项目的开发中,而关于 RN 自身的功能实现大家可以直接阅读官方文档,这里我也额外提供一些关于 RN 的参考资料:

  • React-Native学习指南

  • 分享 50 个完整的 React Native 项目

  • 给所有开发者的React Native详细入门指南

  • 30天学习React Native教程

注:本文部分图例参考自《React Native 移动开发实战》一书

a99a60d28d7c32b25439e4b2fdda84d9.jpeg

好看就点 「在看」a06303cec67b9a242a2afb2b03cae0e5.gif

React-Native与安卓原生的混合开发 写在前面 目前很多大厂APP(如淘宝、饿了么、美团等等)并不是纯原生Android&IOS,也不是纯JS开发,而是Hybird APP开发,混合型优势很多:比如热更新,保证在一些类似双十一的活动到来时能够快速上线活动页面,用户不必再去更新APP。再来有效地减小了安装包的体积大小,大部分的界面都位于服务器端,本地只需要进行绘制。 1. 新建Android项目 我这里使用之前的项目 2. 在... 阅读详情

相关推荐

React Native与小程序混合开发:跨平台框架的结合

React Native是由Facebook开发的一种基于React的开发框架,它通过使用JavaScript和React的组件模型来构建原生移动应用。React Native允许开发者使用JavaScript编写应用逻辑,并通过React Native的桥接层将代码转换为原生组件。这意味着开发者可以使用相同的代码库来构建iOS和Android应用,从而提高开发效率和代码重用性。小程序是一种轻量级的应用形式,由微信和其他主流应用平台提供支持。

TiCrystal的博客 1138

React Nactive混合APP开发

React Nactive混合APP开发教程,该课程主要教大家如何利用react Nactive 构建一个APP,详细介绍各个APP中各个组件的用法及使用。

MMRotate 详细使用教程

MMRotate 详细使用教程 做旋转目标检测,怎么可以不知道如何使用MMRotate呢! github链接: https://github.com/open-mmlab/mmrotate 1 安装 创建虚拟环境并激活 conda create -n mmrotate python=3.7 -y conda activate mmrotate 安装 PyTorch 和 torchvision conda install pytorch torchvision -c pytorch 注意:确保

Sylvia_Lan的博客 1万+

混合框架ReactNative之 环境搭建

环境搭建

qq_29848853的博客 1028

ROS2初级面试题汇总

总结和收集了一些关于ros2的问题和解答记录

qq_57633442的博客 5552

打造会自主学习的 AI 助手:OpenClaw 记忆系统完全指南

这不是科幻,这是我正在使用的系统。我的 AI 助手「小琳」已经运行了一段时间,积累了大量的知识和经验,而且还在不断学习成长。心跳(Heartbeat)是 OpenClaw 的定时轮询机制,可以让 AI 主动做一些事情。你有没有遇到过这样的困扰:每次和 AI 对话,它都像失忆了一样,之前聊过的内容完全不记得?设置定时任务:每天早上 8 点,查询天气和热点新闻,通过钉钉推送给我。让你的 AI 助手拥有持久记忆,能够自主学习、总结经验、不断成长。这不仅仅是一个「能记住事情的 AI」,而是一个。

Honmaple的博客 1633

React Native 混合开发(Android篇)

React Native 混合开发-Android篇创建一个React Native 项目1. 通过npm安装react-native的方式添加一个React Native项目2. 通过react-native init来初始化一个React Native项目二、添加React Native所需要的依赖第一步:配置maven第二步:配置权限第三步: 指定要ndk需要兼容的架构(重要)三、创建ind...

邓惠子飞吧 8814

国内主流AI编程工具使用实例及总结

AI编程辅助工具是利用人工智能技术来帮助程序员进行软件开发的工具。它们可以在代码编写、代码审查、错误检测、代码优化等多个编程环节发挥作用,提高编程效率和代码质量。通义灵码,基于通义大模型的AI研发辅助工具,提供代码智能生成、研发智能问答、任务自主执行等能力,为开发者带来智能化研发体验,引领AI原生研发新范式。包含智能编码助手和AI程序员。

技术博客 1万+

React Native 混合ios android开发 及常用框架

在集成过程中,需要修改package.json 和 Podfile,按文档中的内容,如果pod install过不了的话,先修改package.json,然后执行命名。再修改Podfile,执行命令。

1699

Converting Phase Noise to Random Jitter(Period)

推导了Phase Noise to Random Jitter(Period)的转换过程,解释了分频对Phase Noise & Spur(每2分频改善6dB)的影响,每N分频,TIE RJ(1𝜎)不变(之前已推导),而Period RJ(1𝜎)增加√N倍。

u010486560的博客 2037

从零玩转Vitis裸机开发:手把手教你创建、移植与实战优化

✅ Vitis裸机开发全流程✅ 中断系统配置技巧✅ 跨平台移植方法论✅ 性能优化实战经验研究FreeRTOS移植探索AMP(非对称多处理)架构学习使用Vitis Analyzer进行性能分析技术雷达:关注Xilinx最新推出的Vitis Unified IDE,其集成了更强大的调试和分析工具。立即动手实践吧!

QQ_778132974的博客 584

FlutterBoost与React Native混合开发:可能吗?如何实现?

FlutterBoost是阿里巴巴开源的下一代Flutter-Native混合解决方案,它能够帮助开发者在现有的原生应用中轻松集成Flutter页面。但很多开发者都在问:FlutterBoost能否与React Native混合开发?如何实现Flutter、React Native和原生应用的完美融合?本文将为你详细解答这些问题,并提供实用的实现指南。 ## FlutterBoost是什么?🤔

gitblog_00753的博客 813

Unity 热更新技术 | (二) AssetBundle - 完整系列教程学习

开始学习热更新方面系列知识,就从这一篇开始吧! 本系列教程 会从热更新基本概念出发,详细介绍热更新相关的全套知识点。 如热更新技术基本原理、热更新主流方案、AssetBundle系列教程、Lua语言编程、Lua与Unity交互教程、Xlua框架使用、热更新实战教程等方面。 热更新作为一个开发者必备技能,如果想学习的话,可以从现在开始了哦~ 接下来从 AssetBundle - 完整系列教程学习 开始学习吧!

努力前行,总会成为自己心中的那道光 1万+

react-native实现混合开发

在 React Native 应用中嵌入 H5 页面可以通过以下步骤实现,主要使用WebView。

m0_51429350的博客 807

python全栈入门到实战【基础篇 02】环境搭建:Python解释器与PyCharm、VSCode编辑器安装配置详解

本文详解Python环境搭建步骤。首先安装解释器(运行代码核心),需从官网下载,选3.8及以上版本(勿选2.x)。Windows安装必勾“Add Python.exe to PATH”,验证用`python --version`;Mac选universal2安装包,验证用`python3 --version`。 编辑器二选一:PyCharm社区版(免费,新手推荐),安装后需配置解释器路径;VSCode轻量,需装Python插件并选择解释器。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 5万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

OpenHarmony与React Native混合开发中的通知系统实现

通知系统是现代移动应用开发中的基础功能模块,其核心原理是通过系统级服务向用户推送实时信息。在跨平台开发场景下,需要解决原生能力与JavaScript运行时的桥接问题。React Native作为流行的跨平台框架,通过Native Modules机制与OpenHarmony原生层通信,实现高性能通知服务。本文以Steam游戏资讯应用为例,详细解析了如何利用Redux Toolkit进行状态管理,结合OpenHarmony的@ohos.notification模块,构建支持多级分类、用户偏好设置的可配置通知系统

weixin_33417488的博客 294

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

React Native与Godot引擎混合开发:架构设计与通信实现

跨平台应用开发中,React Native凭借其声明式UI和丰富生态,成为构建高性能移动应用界面的主流选择。其核心原理是通过JavaScript桥接原生组件,实现一套代码多端运行。在需要复杂图形渲染和物理模拟的场景,如游戏或交互式可视化,游戏引擎的能力不可或缺。Godot作为轻量开源引擎,在2D/3D渲染和游戏逻辑处理上具有优势。将两者结合,可以构建兼具流畅应用体验和强大图形能力的混合应用,实现“应用外壳+游戏核心”的架构模式。这种混合架构通过原生模块桥接技术,让React Native作为应用主框架管理U

weixin_29016315的博客 256

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

iOS React Native 混合开发集成React Native

序:    有时候我们并不是需要全部使用React Native,我们想和原生混合开发,那我们应该怎么办呢。 先看一下我集成完之后的项目目录: 首先安装React Native node组件        1、新建一个文件夹如目录中的RN,这个文件夹用于存放React Native相关内容        2、新建一个package.

星宇大前端 4971

react native 比 java_react-native 与 java 混合开发 1/3 框架搭建

有哪些场景是需要混合开发呢?react-native 原生android的UI的支持react-native 的一些交互逻辑需要java处理(比如APP跳转微信小程序)根据 单一职责的原则 ,文章分为三篇,此篇为react-native 与 java 混合开发 1/3 框架搭建关键关键是js与java的通信搭建步骤一. 新建一个react-native项目和android项目。新建一个react-...

weixin_34081553的博客 466

Android混合开发实战案例

混合开发是指将原生应用开发与Web技术相结合,充分发挥两者的优势,提高开发效率和应用性能。在Android混合开发中,常见的框架有React Native、Flutter和Cordova等。本文通过对“Android混合开发实战案例”的详细阐述,展示了混合开发在技术选型、实践步骤、优势与挑战等方面的内容。混合开发作为一种高效的开发方式,在当前移动互联网时代具有广泛的应用前景。然而,在实践过程中,开发者仍需关注性能和兼容性问题,以实现更好的用户体验。探索更多优秀的混合开发框架,如Flutter等。

2501_92489088的博客 501

从零学React Native之05混合开发

本篇文章,我们主要讨论如何实现Android平台的混合开发.RN给Android端发送消息首先打开Android Studio, Open工程, 在React Native项目目录下选择android子目录下的build.gradle文件打开。React Native已经默认帮我们创建好了两个类MainApplication和MainActivitypublic class MainApplicat

老于的笔记的专栏 2271

react native与Android混合开发

想要进行混合开发你需要一定的android基础,废话不多说,直接上图:在index.android.js 中注册3个组件,分别为A、B、C,其中代码基本相同:点击text控件调到下一个activity,跳转activity需要原生的支持,我们创建3个activity,分别加载A、B、C,MainActivity加载A,BActivity加载B,CActivity加载C,3个Activity在main

老孟Flutter 1670

《React Native 精解与实战》书籍连载「iOS 平台与 React Native 混合开发」

此文是我的出版书籍《React Native 精解与实战》连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理、React Native 组件布局、组件与 API 的介绍与代码实战,以及 React Native 与 iOS、Android 平台的混合开发底层原理讲解与代码实战演示,精选了大量实例代码,方便读者快速学习。 书籍还配套了视频教程「80 节实...

weixin_30443075的博客 75
上一篇: 新书发售 | Vue 项目构建与开发入门
下一篇: 前端面试遇到笔试,是种什么体验?
劳卜
博客等级 码龄10年 5粉丝 23原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值