Skip to content
On this page

资源文件更新

Herina 支持对资源文件进行更新。只要是 Metro 支持的资源文件,这些文件都可以进行热更新。

资源文件更新与代码更新方式相同,只需调用 requestUpdate 即可。

原理

所有通过 require 导入的静态文件,都会在 Bundle 构建时,被转为一个 JS 对象,里面记录了文件的名字、 Hash、类型、位置等信息,并注册到 React Native 内置的 AssetRegistry

AssetRegistry 的工作特别简单,它会为注册的资源文件分配一个 Asset ID,通过此 ID 可以向它获取文件信息。(相当于 Key-Value 数据类型)

以 React Native 自带的 Image 组件加载图片为例,当我们使用 require 导入图片并传递到 source prop 时,经过构建后,实际传入 source 的是 Asset ID。

通过 Asset ID,Image 组件会向 AssetRegistry 获取资源文件信息对象,并通过分析信息,向这个对象插入 uri 属性,这个属性代表的资源文件在系统的路径。原生组件将通过 uri 找到图片,并将其进行加载。

Herina 在这里的设计与实现很巧妙,它会在构建更新时,找出发生变化的资源文件,并在它在经过 Bundle 时,拦截向 AssetRegistry 注册的过程,直接返回文件信息对象,而不是 Asset ID。在运行时, @herina-rn/client 会生成 uri 并插入文件信息对象,直接跳过了 Image 组件内部分析 uri 的过程。

Released under the MIT License.