hippy的主要原理

Hippy 框架能够将 Web 语言(如 React 或 Vue)编写的界面转换为原生控件进行渲染,其核心在于一个分层、跨语言协作的架构。它大致通过 JS 引擎驱动、C++ 中间层桥接、以及原生渲染层协作来完成。下面这个流程图概括了其主要过程:

flowchart TD A["Web开发语言<br>(React/Vue组件与逻辑)"] --> B["JS引擎层<br>(JSC/Hermes/V8)"] B --> C["Hippy Core (C++)<br>NAPI桥接与布局引擎"] C --> D["原生渲染层<br>(iOS/Android)"] B -->|执行JS代码| E["JS Bundle"] E -->|调用| F["Hippy JS SDK<br>基础模块与通信"] F -->|通过NAPI与C++ Module交互| C C -->|计算布局| G["Layout Engine<br>(Flex布局)"] G -->|传递布局信息| D C -->|映射组件| H["Native UI Components<br>(TextView/ImageView等)"] H -->|原生API渲染| I["最终原生界面"]

下面我们来分步解析这个过程。

🧠 1. JS 引擎执行与通信

Hippy 使用 ​JavaScript 引擎​(如 JavaScriptCore、V8 或 Hermes)来解析和执行开发者编写的 React 或 Vue 代码及其打包后的 JS Bundle。

  • 前端框架适配层 : Hippy 提供了 hippy-reacthippy-vue包。这些包将 React 或 Vue 的组件结构和生命周期映射为 Hippy 自身能够理解的结构。
  • 双向通信 : 传统的 JS-Native 通信(如 React Native 中使用的 Bridge)可能存在性能瓶颈。Hippy 在此基础上进行了优化,支持 NAPI(Native API)​JSI(JavaScript Interface)​ 等方式。JSI 允许 JS 和 Native 代码直接通信,避免了传统的异步编解码过程,显著提升了通信效率。

🌉 2. Hippy Core 与 C++ 桥接

这是连接 JavaScript 世界和原生世界的关键中间层,由 C++ 编写,实现了 ​NAPI

  • 模块绑定 : 通过 NAPI,Hippy 将 C++ ModuleTurboModule 中声明的功能直接暴露给 JS 层。JS 代码可以同步调用这些模块暴露的方法,这些方法最终会调用原生平台(iOS/Android)的具体实现,例如网络请求、文件操作等。
  • 布局计算 : Hippy 内置了一个强大的 自研布局引擎 (早期基于 Yoga,但目前已超越)。这个引擎接收来自 JS 层传递的样式属性(如 width, height, flex等),并依据 CSS Flexbox 规则计算出每个控件在屏幕上的精确位置和尺寸。计算好的布局信息会传递给原生渲染层。

🎨 3. 原生控件渲染

最终,由 iOS 和 Android 的原生平台负责将计算好的布局和属性转换为真实的用户界面。

  • 组件映射 : Hippy 的核心组件(如 <View>, <Text>, <Image>)在 JS 层中的标签会分别映射到 iOS 的 UIView/UILabel/UIImageView和 Android 的 View/TextView/ImageView等原生控件。
  • 属性传递 : 设置在 JSX 或 Vue 模板中的样式和属性(如 color, fontSize, backgroundColor),会通过 Hippy Core 层传递到原生端,并调用原生控件的对应方法进行设置(例如在 Android 上调用 TextView.setText()View.setBackground())。
  • 扩展性 : Hippy 允许开发者封装自定义的原生 UI 组件。通过在原生端继承 HippyViewController(Android)或 RCTViewManager(iOS),并注册到 Hippy 中,就可以在 JS 代码中使用这些自定义组件。

⚙️ 4. 一致性保障与性能优化

Hippy 在架构设计上注重保证双端一致性和提升性能。

  • 双端一致性 : Hippy 3.0 将动画等关键逻辑下沉到 C++ 层统一实现,确保了不同平台上动画效果和行为的一致性,减少了开发者为双端差异做适配的工作量。

  • 高性能: Hippy 采用了多种性能优化策略,例如:

    • 引擎预加载: 提前初始化 Hippy 引擎和上下文,大幅减少页面启动时间。
    • Hermes 引擎与 Bytecode: 集成 Hermes 引擎并支持预编译 JS 为 Bytecode,直接加载 Bytecode 可以跳过引擎编译阶段,极大提升 JS 代码的加载和执行速度。
    • 列表优化: 提供高性能的可回收列表组件,用于流畅渲染长列表。

💎 总结

Hippy 的转换渲染过程可以概括为:​JS 引擎执行前端框架代码 → 通过 C++ 核心层(NAPI)进行桥接和布局计算 → 调用原生平台 API 进行控件渲染。这种设计力图在开发效率(使用熟悉的 Web 技术栈)、性能(接近原生的体验)和一致性(减少双端差异)之间取得平衡。

希望以上解释能帮助你理解 Hippy 的工作原理。如果你对某个特定部分(比如自定义原生组件,或 JSI 的工作原理)感兴趣,我很乐意提供更详细的信息。

相关推荐
乱码三千8 分钟前
密码管理工具站正式上线啦
前端·html·github
IMPYLH13 分钟前
HTML 的 <rt> 元素
前端·html
单线程_0119 分钟前
从案例分析 Vue3 Tokenizer+Parser 源码五
前端·javascript·vue.js
mldong8 小时前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
2分钟速写快排8 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
passerby60619 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角10 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!10 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰10 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
mayaairi12 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js