发布时间:2025-06-24 16:48:40  作者:北方职教升学中心  阅读量:783


  • 灵活性:通过 Bridge,开发者可以轻松扩展并调用原生 API 和组件。

  • 性能优化:通过改进模块间的依赖管理和调用方式,TurboModules 能够更加高效地利用资源,提升应用性能。

    • iOS 平台:JavaScriptCore 作为 iOS 系统的一部分,原生支持,无需额外安装。

  • 原生组件渲染

    • Weex 解析 Vue.js 模板,生成虚拟 DOM 树,并将其映射到原生平台的视图层(iOS 的 UIView,Android 的 View)。以下是 Skia 如何在不同平台上运行的详细解释:

      1. Skia 与平台的集成

        • Android:在 Android 平台上,Skia 与 OpenGL 或 Vulkan 进行交互。Direct3D 等)在屏幕上进行渲染。这个数据包通过异步的方式发送到原生层。

        • Shadow Tree 与 Shadow Nodes:Fabric 引入了 Shadow Tree 结构,用于更高效地管理 UI 元素的布局和渲染。

          更好的性能:同步渲染、例如, <view>组件在微信小程序中映射为 <view>,在 iOS 中映射为 UIView,在 Android 中映射为 View。uniapp 通过将代码编译成各平台的原生代码或 Web 代码,实现跨平台运行。React Native 和 uniapp

          在移动开发中,跨平台开发框架已经成为开发者的首选工具。

        2.1.3 Bridge 的通信方式

        在旧架构中,Bridge 扮演了关键角色,负责 JavaScript 层与原生层的双向通信。

      2. 原生层处理请求:原生层接收到数据包后,反序列化并执行相应的原生操作,随后将结果(若有)再次通过 Bridge 发送回 JavaScript 层。下面将详细探讨它们的原理、

        在理解 React Native 的演进之前,需要先了解其早期架构的工作原理,以及新架构如何解决了旧架构的局限性。

      3. API 适配:uniapp 编译器将通用 API 映射到各个平台的原生 API。

    通过了解这三大跨平台开发框架的原理和特点,可以更好地选择最适合自己项目需求的工具,提升开发效率,优化用户体验。Weex 使用 V8 作为 JavaScript 引擎,将 Weex 代码解析并执行。通过使用 Shadow Nodes,Fabric 可以更快速地计算和更新布局。Skia 渲染引擎、Skia 会将其绘图指令转换为 Metal 或 OpenGL 的命令,通过 iOS 的图形管道进行渲染。

  • JavaScript 引擎的作用
    • JavaScriptCore(iOS):作为 WebKit 的一部分,提供高效的 JavaScript 执行环境,无需额外安装。Metal、

    • 批处理与优先级:Fabric 支持批处理和优先级管理,使得高优先级的任务可以更快地得到处理,从而提升了用户体验。

  • Weex 编译

    • 针对 iOS 和 Android 平台,uniapp 使用 Weex 进行编译。

    • JIT 编译:TurboModules 支持即时编译(JIT),通过提前编译和优化 JavaScript 代码,减少了执行时间。这种方式显著减少了通信延迟,提高了性能。React Native 和 uniapp。

    • 脚本解析:解析 JavaScript 逻辑代码,确保代码符合目标平台的要求。
    • Web:在 Web 平台上,Flutter 使用 WebAssembly 编译 Skia,并通过 WebGL 进行渲染。

    2.2 新架构:Fabric 渲染引擎与 TurboModules

    为了解决旧架构的性能瓶颈和延迟问题,React Native 团队引入了新架构,其中包括 Fabric 渲染引擎和 TurboModules。

    新架构通过引入 Fabric 渲染引擎和 TurboModules,解决了旧架构中的主要问题。

  • 样式表被应用到这些 UIView 控件上,保证了 UI 的一致性。Flutter

    1.1 Flutter 的基本原理

    Flutter 是由 Google 开发的开源 UI 软件开发工具包,使用 Dart 语言。样式和资源文件打包成一个完整的项目结构。Weex 使用 JavaScriptCore 作为 JavaScript 引擎,将 Weex 代码解析并执行。

    深入解析三大跨平台开发框架:Flutter、

  • 渲染层:RenderObject 树会根据布局和绘制逻辑生成绘制指令(Painting Commands)。
  • 打包与优化

    • 资源打包:uniapp 编译器将处理过的代码、
  • 图形渲染流程

    • Dart 层:开发者编写的 Dart 代码会生成一棵 Widget 树(Flutter 的 UI 组件树)。

    3.4 uniapp 的优势与劣势

    优势

    • 多端统一:一个代码库可以同时发布到多个平台,包括 H5、
    • Engine(引擎层):这是 Flutter 的核心部分,包含 Dart 运行时、例如,在 Windows 上使用 Direct3D,在 macOS 上使用 Metal,在 Linux 上使用 Vulkan 或 OpenGL。与旧架构相比,Fabric 引入了一些重要的改进:

      1. 同步渲染:旧架构中的渲染过程是异步的,这会导致渲染的延迟和卡顿。总结

        在选择跨平台开发框架时,需要根据具体项目的需求、

      2. 开发简单:基于熟悉的 Web 技术栈(HTML5、它允许开发者使用 JavaScript 和 React 来构建跨平台的移动应用程序。
  • 桥接通信

    • JavaScript 代码通过 Weex 提供的桥接机制与原生 API 进行通信。
    • 原生功能调用复杂:尽管 Flutter 提供了平台通道(Platform Channels)来与原生代码交互,但与原生 API 的对接仍需要一定的学习和开发成本。
  • 渲染过程

    • Weex 解析 Vue.js 模板,生成虚拟 DOM 树,并将其映射到 View 控件上。WXSS 和 JS 文件。对于开发者来说,理解新旧架构的区别以及新架构带来的改进,是在新架构上开发高性能应用的关键。
    • 丰富的组件库:Flutter 提供了大量的预构建组件,开发效率高。这种架构在一定程度上成功地实现了跨平台开发,但随着移动应用复杂性的增加,逐渐暴露出性能瓶颈和通信延迟等问题。
    • CSS 样式表也被转换为适用于 Weex 的样式描述。

    1.2 核心技术点

    自绘引擎 Skia

    Flutter 使用 Skia 作为其底层的图形渲染引擎。本篇将深入解析三大主流跨平台开发框架:Flutter、自问世以来,React Native 经历了多次重大升级,尤其是最近的架构改进,如 Fabric 渲染引擎和 TurboModules,进一步提升了其性能和灵活性。

  • iOS:在 iOS 平台上,Skia 使用 Metal 或 OpenGL 进行绘图。
  • 生态相对较新:尽管 Flutter 发展迅速,但相较于 React Native 等框架,其生态系统还在不断完善中。
  • 编译器的处理过程详解

    uniapp 编译器的处理过程可以分为以下几个步骤:

    1. 预处理

      • 模板解析:uniapp 编译器首先解析 Vue.js 模板,将其转换为相应的虚拟 DOM 结构。按需加载和 JIT 编译等机制,使得新架构在处理复杂 UI 和高频事件时性能更加出色。

        改进的开发体验:新架构提供了更强大的调试工具和开发者体验,使得开发者能够更轻松地构建高性能的跨平台应用。优势和劣势。例如, uni.request在微信小程序中映射为 wx.request,在 iOS 和 Android 中映射为各自的网络请求库。

    例如,当 JavaScript 代码中调用某个原生功能时,Weex 会通过桥接将该请求发送到原生层,原生层执行相应的操作后再将结果返回给 JavaScript 代码。

    1. 按需加载:在旧架构中,所有的原生模块在应用启动时都会加载,导致启动时间延长。

    2. 直接调用原生方法:Fabric 允许 JavaScript 直接调用原生方法,而不再依赖 Bridge 的异步通信。开发者使用 React 编写组件和业务逻辑,这些代码会在 JavaScriptCore 引擎中运行。

    3. V8(Android):高性能的开源 JavaScript 引擎,由 Google 开发,广泛用于 Chrome 浏览器和 Node.js 中。当 Widget 树发生变化时,Flutter 会生成一棵新的 Element 树和 RenderObject 树。树摇优化(Tree Shaking)和资源合并,以提高应用的性能和加载速度。不同平台有不同的嵌入实现,负责创建窗口、
    4. V8 解释和执行 Weex 编译生成的 JavaScript 代码。

    5. 原生层:iOS 和 Android 平台的原生组件,用于渲染 UI 和处理与设备相关的操作。

    Android 平台
    1. 内嵌方式

      • Weex 容器作为一个 View 控件内嵌在 Android 应用中。Weex 容器实际上是一个 View 控件,负责渲染 Weex 页面。
      • 嵌入层:平台相关代码,用于与操作系统进行交互。其工作流程如下:

        1. JavaScript 调用原生组件:当 JavaScript 层需要调用原生组件时,会通过 Bridge 将调用信息序列化为 JSON 数据包。

    2. 平台适配

      • 组件适配:uniapp 编译器将 Vue.js 组件映射到各个平台的原生组件。Shadow Tree 是一棵轻量级的树结构,包含了 UI 元素的布局信息。

      • JavaScript 处理回调:JavaScript 层接收到原生层的响应后,执行相应的回调函数。整个架构可以分为以下三个部分:

        1. JavaScript 层:负责应用逻辑的编写。Skia 的指令会被转换为 WebGL 命令,在浏览器中执行。

        2. 性能优化:编译器在打包过程中进行代码压缩、团队技术栈和应用的特定要求来权衡:

          • Flutter:适合需要高性能和一致性 UI 表现的应用,尤其是在高度自定义和复杂的 UI 场景中。引擎层负责将 Dart 代码编译为原生代码,并将 UI 元素绘制到屏幕上。

            Skia 在不同平台上的运行原理

            Skia 的跨平台渲染能力是通过与各个平台的图形 API 进行交互来实现的。JavaScript),学习成本低。

          • React Native:适合需要快速开发和良好社区支持的项目,能够在一定程度上平衡开发效率和性能。

          劣势

          • 性能限制:由于底层采用 Web 技术,性能上可能无法与纯原生应用媲美,尤其是在高性能需求的应用中。

            2.3 新旧架构的对比与过渡

            React Native 的旧架构依赖于异步的 Bridge 通信和 JavaScriptCore 引擎。

          劣势

          • 性能瓶颈:Bridge 的异步通信机制会导致性能瓶颈,特别是在处理大量复杂动画或高频事件时。
          • 使用 Java 编写代码,将 Weex 容器添加到视图层次结构中。TurboModules 采用了按需加载机制,只有在实际需要时才会加载模块,从而减少了启动时间。Skia 会将绘制指令转换为 OpenGL 或 Vulkan 的命令,通过 Android 的图形管道进行渲染。

            在过渡到新架构的过程中,React Native 团队采用了渐进式更新的策略,以确保现有的应用能够平稳过渡到新架构。

          • 样式表被应用到这些 View 控件上,保证了 UI 的一致性。React Native

            React Native 是由 Facebook 在2015年推出的跨平台开发框架。

          • Bridge:是 JavaScript 层与原生层之间的通信桥梁。

          • Weex 将开发者的 Vue.js 模板(类似于 HTML)和 JavaScript 逻辑代码转换为 Weex 可执行的格式。React Native 通过 RCTBridge将 JavaScriptCore 嵌入应用中。
          • 这些自定义组件可以使用 Java 或 Kotlin 编写(对于 Android),或者使用 Objective-C 或 Swift 编写(对于 iOS),然后通过 Weex 的接口将其暴露给 JavaScript 层。
        3. JavaScript 引擎

          • Weex 使用 V8 作为 JavaScript 引擎,这是一个高性能的开源 JavaScript 引擎。
        4. Flutter 的架构层次

          • Framework(框架层):开发者使用 Dart 编写应用逻辑和 UI 代码。

        1.3 Flutter 的优势与劣势

        优势

        • 一致性:由于所有控件都是 Flutter 自己绘制的,UI 在不同平台上的表现非常一致。小程序、
        • 样式表被应用到这些原生视图上,保证了 UI 的一致性。
        • uniapp 编译器对这些代码进行处理,生成适用于各个平台的代码包。
        • 引擎层:Skia 渲染引擎和 Dart VM,负责将 Dart 代码编译为原生 ARM 代码,并进行高效的 UI 渲染。

    3.3 实际开发和扩展

    自定义组件
    • 开发者可以编写自定义原生组件或模块,扩展 Weex 的功能。

      一、

    • 延迟:JavaScript 和原生层之间的通信延迟可能会导致 UI 响应不够流畅。Flutter 提供了丰富的 UI 组件库,开发者可以使用这些组件构建应用。
    • 原生功能支持有限:虽然 uniapp 提供了很多原生 API,但在某些复杂原生功能调用上可能需要额外处理。
    • Android 平台:在 Android 上,Weex 容器通过 Java 嵌入应用。与操作系统的图形 API 进行交互等。Flutter 的架构分为三个层次:

      • 框架层:Flutter SDK 提供了丰富的 UI 组件,这些组件构建在 Dart 语言之上。
      • iOS 平台:在 iOS 上,Weex 容器通过 Objective-C 或 Swift 嵌入应用。
      • 插件丰富:uniapp 拥有大量的插件和扩展,能够快速集成常见功能。文本排版引擎等。

      劣势

      • 包体积较大:由于包含了自绘引擎和 Dart VM,Flutter 应用的初始包体积相对较大。CSS 样式和 JavaScript 逻辑转换为小程序的 WXML、

      四、

    • 高性能:Flutter 的自绘机制和 Dart 语言的 AOT 编译,使得应用运行速度接近原生。通过 Bridge,JavaScript 可以调用原生组件,原生组件的状态和事件也可以通过 Bridge 传递给 JavaScript。
    运行阶段
    1. 内嵌的 Weex 容器
      • 编译后的应用在 iOS 和 Android 上运行时,会包含一个内嵌的 Weex 容器。

        3.2 uniapp 的编译和运行过程

        编译阶段
        1. 代码处理

          • 开发者使用 HTML、
          • 社区和生态:相比 React Native 和 Flutter,uniapp 的国际化社区和生态相对较小。

            三、CSS、

          • 原生代码生成:对于 iOS 和 Android 平台,uniapp 编译器使用 Weex 将 Vue.js 模板和 JavaScript 逻辑转换为 Weex 格式,生成可以运行在 Weex 容器中的代码包。

          • Android 平台:由于 Android 系统并不内置 JavaScriptCore,React Native 会将 JavaScriptCore 捆绑到应用中,并通过 JNI(Java Native Interface)进行调用。uniapp

            3.1 uniapp 的基本原理

            uniapp 是 DCloud 推出的跨平台前端框架,使用 HTML5、

          • 调试复杂:由于涉及跨语言调试,开发者在调试时可能会遇到困难。
        2. 渲染过程

          • Weex 解析 Vue.js 模板,生成虚拟 DOM 树,并将其映射到 UIView 控件上。在 React Native 中,JavaScriptCore 负责解释和执行 JavaScript 代码。CSS 和 JavaScript 来开发跨平台应用。
          • 使用 Objective-C 或 Swift 编写代码,将 Weex 容器添加到视图层次结构中。
        3. JavaScript 引擎

          • Weex 使用 JavaScriptCore 作为 JavaScript 引擎,这是 iOS 系统中内置的引擎。Skia 是一个 2D 图形库,支持多种平台的高性能图形绘制。其核心在于自绘引擎 Skia,这使得 Flutter 不依赖于平台原生的控件,而是直接绘制所有 UI 元素。处理输入事件、
          • uniapp:适合希望通过 Web 技术快速开发多平台应用的项目,特别是当项目需要覆盖 H5 和小程序时。

        2.1.2 JavaScriptCore 的工作机制

        JavaScriptCore 是一个轻量级的 JavaScript 引擎,最初由 Apple 开发,并在 WebKit 中使用。

      1. JavaScript 引擎

        • Weex 容器内嵌了一个 JavaScript 引擎(如 JavaScriptCore 或 V8),用于解释和执行 JavaScript 代码。

      2.1.4 旧架构的优势与劣势

      优势

      • 跨平台一致性:开发者可以编写一次 JavaScript 代码,并在 iOS 和 Android 上共享大部分逻辑。

    Weex 容器在各平台的存在方式

    iOS 平台
    1. 内嵌方式

      • Weex 容器作为一个 UIView 控件内嵌在 iOS 应用中。

      二、Weex 容器实际上是一个 UIView 控件,负责渲染 Weex 页面。

      2.2.1 Fabric 渲染引擎

      Fabric 是 React Native 新架构中的核心组件之一,负责重新设计渲染引擎。

    2.2.3 新架构的优势

    更低的通信延迟:通过直接调用原生方法和减少 Bridge 的使用,Fabric 和 TurboModules 显著降低了通信延迟,使得用户界面响应更加及时。具体来说,新架构减少了通信延迟,提升了渲染性能,使得 React Native 在面对复杂 UI 和高性能需求时表现得更加出色。

  • Skia 渲染引擎:这些绘制指令会被传递给 Skia,Skia 将这些指令转换为平台特定的图形 API 命令。CSS 和 JavaScript 编写应用代码,描述 UI 和业务逻辑。
  • 代码生成

    • 小程序代码生成:对于小程序平台,uniapp 编译器将 Vue.js 模板、
    • 样式解析:解析 CSS 样式,将其转换为适用于各个平台的样式表。
    • JavaScriptCore 解释和执行 Weex 编译生成的 JavaScript 代码。
    • 桌面(Windows, macOS, Linux):在桌面平台上,Skia 使用不同的平台 API。iOS 和 Android 应用。新架构显著提升了 React Native 的性能,并减少了通信延迟,使得应用体验更加流畅。

    • 2.2.2 TurboModules

      TurboModules 是 React Native 新架构中的另一个重要组件,用于优化模块的加载和执行方式。

    插件机制
    • uniapp 提供了丰富的插件,可以通过插件快速集成各种原生功能,这些插件通常也封装了大量的原生代码。
    • Embedder(嵌入层):这是 Flutter 与操作系统交互的部分。

      2.1 旧架构:JavaScriptCore 和桥接机制

      2.1.1 架构概述

      React Native 的旧架构主要依赖于 JavaScriptCore 引擎和桥接机制(Bridge)。

    • 平台图形 API:最终,这些命令通过平台图形 API(如 OpenGL、Fabric 通过引入同步渲染机制,大幅减少了渲染延迟,提升了用户界面的流畅度。