Herina —— React Native 热更新开发套件,为 iOS 与 Android 提供模块动态加载、代码拆包支持

304 阅读2分钟

Herina

Build bundle with Herina.

GitHub

github.com/Hector-Chon…

介绍

Herina 是为 React Native App 提供动态化能力的开发套件。它提供了简单易用的 JS API 能够让您轻而易举地为您的 App 加入热更新功能。此外,您还可以使用 import() 从外部动态引入模块,此功能无需任何额外配置。

在底层,Herina 使用 Metro 作为 Bundle 构建工具。它就像 Vite 和 Rollup 或 ESBuild 的关系一样。当构建完成后,它生成 Bundle 的 AST 来分析代码并将模块拆分到不同类型的 Chunk。

功能特性

  • 构建 Bundle
  • 将 Bundle 拆分为多个 Chunk
  • 动态引入
  • 构建和应用递增式更新
  • 简单易用的 JS API
  • 自动重置 Bundle 当发生错误
  • 支持 iOS、Android
  • 支持 TypeScript

安装

yarn add @herina-rn/core @herina-rn/client
cd ios && pod install

代码拆分

Herina 将 Bundle 拆分为三种 Chunk:

  • 业务: 包含 App 的业务代码;
  • 动态: 包含使用 import(...) 引入的模块;
  • 小贩: 包含 node_modules 内的依赖与 Herina 运行时

使用方式

有两种更新方式:全量更新、递增式更新。

在更新之前,您必须通过调用 registerUpdateManager 注册 UpdateManager。第一个参数是可选的,它代表被下载资源的基础 URL。若此参数未被定义,它将读取原始 Bundle 内的基础 URL。

import { registerUpdateManager } from "@herina-rn/client";

const manager = registerUpdateManager("https://hector.im");

全量更新

通过全量更新,从您的服务器所下载的新 Bundle 将直接替换原始 Bundle.

import { getUpdateManager } from "@herina-rn/client";

const onUpdateBundle = async () => {
  // 已调用 `registerUpdateManager`
  const manager = getUpdateManager();

  await manager.requestBundleUpdate();

  // 若此参数是真的,App 将在 Bundle 被替换后重新加载。
  manager.applyBundleUpdate(true);
};

递增式更新

通过递增式更新,运行时将发送一个请求获知是否有可用的递增式更新,若有可用的更新,将下载更新然后生成一个新的 Bundle 来替换原始 Bundle。

import { getUpdateManager } from "@herina-rn/client";

const onUpdateByIncremental = async () => {
  const manager = getUpdateManager();

  await manager.requestIncrementalUpdates();

  manager.applyIncrementalUpdate(true);
};

使用要求

为使用 Herina,您需要修改原生代码。若您无 iOS 或 Android 原生开发经验,您可参考文档的 configuration 章节。

使用限制

目前 Herina 仅用于生产模式,并不输出 Sourcemap。若您正在使用如 Sentry 这样的性能监控器,我正在工作为它提供支持。

联系人 & 支持

Herina 按现状被提供。供您参考,Herina 目前是我的工作之一,但这不意味这是永久的。我将努力抽出时间提供技术支持如果我被转移到另一项工作。

不要犹豫打开问题或拉取请求。如果您有想法与我分享,您可联系我,我会尽快回复。

License

MIT