这是一个关于 React Native 在鸿蒙系统中资源打包和加载机制的详细说明,涉及三个主要场景:打包场景、沙箱场景和 RAWFILE 场景。这些机制共同构成了 RN 在鸿蒙平台上的完整资源管理体系。

在打包场景中,整个资源管理系统建立在相对路径的基础之上。假设打包路径为根路径 /,RN 代码路径为 /aaa/bbb/c.tsx,这是一个典型的模块化项目结构。图片资源分布在不同的目录中:图片1位于 /aaa/bbb/d.png,在 RN 代码中使用 require(‘./d.png’) 的写法引用,这种相对路径引用方式确保了代码的可移植性。

图片2位于 /eee/f.png,在 RN 代码中使用 require(‘…/…/eee/f.png’) 的写法。这种向上两级目录的引用方式体现了项目结构的深度和复杂性。图片3位于 /aaa/ggg/h.png,使用 require(‘…/ggg/h.png’) 引用。这些相对路径的写法在打包过程中会被正确处理和转换。

图片路径前缀的生成遵循特定的规则。图片1生成的路径前缀为 /aaa/bbb/,这与其在项目中的实际位置保持一致。图片2生成的路径前缀为 /eee/,反映了其相对于 RN 代码文件的位置关系。图片3生成的路径前缀为 /aaa/ggg/,保持了目录结构的完整性。


1 打包场景

1.1 打包路径

假设为打包路径为根路径:/
rn代码路径:/aaa/bbb/c.tsx
图片1所在路径:/aaa/bbb/d.png rn使用写法:require(‘./d.png’)
图片2所在路径:/eee/f.png rn使用写法:require(‘…/…/eee/f.png’)
图片3所在路径:/aaa/ggg/h.png rn使用写法:require(‘…/ggg/h.png’)

1.2 图片路径前缀

图片1生成的路径前缀:/aaa/bbb/
图片2生成的路径前缀:/eee/
图片3生成的路径前缀:/aaa/ggg/

1.3 资源打包结果

assets是在package.json里面指定的目录,开发者可以任意设置目录
assets
|–aaa/bbb/d.png
|–aaa/ggg/h.png
|–eee/f.png

2 沙箱场景图片路径

在沙箱场景下假设bundle所在路径 /data/storage/base/files/dir1/bundle.harmony.js

图片1沙箱场景实际路径: /data/storage/base/files/dir1/aaa/bbb/d.png

图片2沙箱场景实际路径: /data/storage/base/files/dir1/eee/f.png

图片3沙箱场景实际路径: /data/storage/base/files/dir1/aaa/ggg/h.png

重点:沙箱场景下图片的路径是根据bundle路径作为前缀,图片与工程打包路径的相对路径为后缀,合成完整的路径。这里没有assets目录

3 RAWFILE场景图片路径

RAWFILE场景下假设bundle所在路径 resource://RAWFILE/dir1/bundle.harmony.js

图片1rawfile场景实际路径: resource://RAWFILE/assets/aaa/bbb/d.png

图片2rawfile场景实际路径: resource://RAWFILE/assets/eee/f.png

图片3rawfile场景实际路径: resource://RAWFILE/assets/aaa/ggg/h.png

重点:RAWFILE场景下图片路径的前缀指定为resource://RAWFILE/assets/,图片与工程打包路径的相对路径为后缀,合成完整的路径。这里有assets目录

请添加图片描述


资源打包结果展示了最终的文件组织方式。assets 目录是在 package.json 中指定的,开发者可以根据项目需求灵活设置。在 assets 目录下,保持了完整的原始路径结构:aaa/bbb/d.png 对应图片1,aaa/ggg/h.png 对应图片3,eee/f.png 对应图片2。这种设计确保了资源在最终应用包中的正确位置。

沙箱场景下的图片路径处理采用了不同的策略。假设 bundle 所在路径为 /data/storage/base/files/dir1/bundle.harmony.js,这是一个典型的沙箱环境路径。沙箱场景的核心特点是以 bundle 路径作为基础前缀,然后附加图片相对于工程打包路径的相对路径,从而合成完整的访问路径。

图片1在沙箱场景的实际路径为 /data/storage/base/files/dir1/aaa/bbb/d.png。这种路径合成方式确保了在沙箱环境中资源能够被正确访问。

图片2的实际路径为 /data/storage/base/files/dir1/eee/f.png。图片3的实际路径为 /data/storage/base/files/dir1/aaa/ggg/h.png。这些路径的形成都是基于相同的原则:bundle 路径 + 相对路径。

沙箱场景的一个关键特点是直接使用文件系统路径,不包含 assets 目录。这种设计简化了路径结构,提高了访问效率。沙箱环境通常用于应用的运行阶段,此时资源已经被提取到特定的目录结构中。

RAWFILE 场景采用了另一种完全不同的路径处理方式。假设 bundle 所在路径为 resource://RAWFILE/dir1/bundle.harmony.js,这是一个资源协议的路径格式。

图片1在 RAWFILE 场景的实际路径为 resource://RAWFILE/assets/aaa/bbb/d.png。这种路径格式使用了特殊的资源协议,适用于鸿蒙系统中的资源访问。

图片2的实际路径为 resource://RAWFILE/assets/eee/f.png。图片3的实际路径为 resource://RAWFILE/assets/aaa/ggg/h.png。

RAWFILE 场景的核心特点是指定了固定的路径前缀 resource://RAWFILE/assets/,然后附加图片与工程打包路径的相对路径。与沙箱场景不同,RAWFILE 场景明确包含了 assets 目录,这与其在打包时的结构保持一致。

这种多场景的资源管理机制体现了 React Native 在鸿蒙系统中的深度集成和优化。每个场景都有其特定的使用场景和优势:打包场景适用于开发阶段,沙箱场景适用于运行阶段,RAWFILE 场景适用于资源文件访问。

请添加图片描述

欢迎大家加入开源鸿蒙跨平台开发者社区,一起共建开源鸿蒙跨平台生态。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐