写给前端的 react-native 入门指南

前言

本文主要介绍 react-native(下称 RN) 的入门, 和前端的异同点

文章不涉及功能的具体实现

选择优势

我们先说说, 为什么很多人会选择使用 RN 、他对应的特性和普通 Web 的区别

  1. 前端资源, 生态的互通

因为使用的语言是 JS 和 react, 对于前端来说可以无缝切换, 并且他还能使用前端的各类包

在 JS 端, 安卓和 iOS 是同一套代码

  1. 热更新

很多选择使用 RN 的原因就是有热更新

简单解释下热更新, 在运行 APP 时, js 层我们可以通过接受到的通知, 来进行实时替换, 替换完毕之后一般是要重启 APP 的, 这个时候可以询问用户, 也可以在下次重启时重新载入新的 JS 代码

这样可以保证用户使用的 js 环境, 可以是较新的, 如果是原生 APP 的更新则需要让用户去应用商店重新下载

  1. 支持原生

RN 通过桥接与原生进行交互, 页面级别的融入原生 APP

他的许多组件, 方法都是调用了原生方法/组件, 相对 webview 来说性能更好

跨端框架横向对比

RN 和 Flutter 的简单对比

环境

无论是 RN 还是 Flutter ,都需要 Android 和 IOS 的开发环境,也就是 JDK 、Android SDKXcode 等环境配置,而不同点在于:

  • RN 需要 npm 、node 、react-native-cli 等配置 。
  • Flutter 需要 flutter sdk 和 Android Studio / VSCode 上的 Dart 与 Flutter 插件。

针对前端来说 RN 环境相对友好一点

实现原理

在 Android 和 IOS 上,默认情况下 Flutter 和 React Native 都需要一个原生平台的
Activity / ViewController 支持,且在原生层面属于一个“单页面应用”,
 而它们之间最大的不同点其实在于 UI 构建 :

  • RN:

React Native 是一套 UI 框架,默认情况下 React Native 会在 Activity 下加载 JS 文件,然后运行在 JavaScriptCore 中解析 Bundle 文件布局,最终堆叠出一系列的原生控件进行渲染。

简单来说就是 通过写 JS 代码配置页面布局,然后 React Native 最终会解析渲染成原生控件,如 <View> 标签对应 ViewGroup/UIView ,<ScrollView> 标签对应 ScrollView/UIScrollView ,<Image> 标签对应 ImageView/UIImageView 等。

  • Flutter :

Flutter 中绝大部分的 Widget 都与平台无关, 开发者基于 Framework 开发 App ,而 Framework 运行在 Engine 之上,由 Engine 进行适配和跨平台支持。这个跨平台的支持过程,其实就是将 Flutter UI 中的 Widget “数据化” ,然后通过 Engine 上的 Skia 直接绘制到屏幕上 。

类似于前端的 canvas 绘图

缺点

  • RN:
    • 不能完全兼容W3C的规范,比如W3C里面,可以轻易设置圆角的大小,粗细,边框是实现和虚线,但是在客户端,这个实现起来都比较难。所以这类技术都只能有限的支持W3C的标准。
    • js运行性能瓶颈。
    • 数据通信的性能瓶颈。
  • Flutter:
    • 无法动态更新。
    • 内存和包大小占用。
    • 学习成本高,生态不足。
此条目发表在前端分类目录。将固定链接加入收藏夹。