RN 音频与静态资源管理
概述
React Native 中播放音频文件涉及一条复杂的管道:Metro bundler 在编译时把 require('./click.mp3') 替换为 asset module ID,运行时由 asset resolver 定位到实际文件(开发模式走 HTTP、生产模式走本地 bundle)。Expo 管理工作流把这条管道完全自动化,而裸 RN 需要手动链接资源文件到原生项目。
工作方式
Metro 静态资源处理
- 编译时:
require('./audio.mp3')→ 数字 ID + 注册到 asset 表 - 开发时:ID → Metro dev server HTTP URL
- 生产时:ID → app bundle 内文件路径
- 图片、音频、视频用完全相同的机制
expo-audio vs expo-av
- expo-av(第一代):音视频合一,基于 Bridge,API 重量级
- expo-audio(SDK 51+):仅音频,基于 Expo Modules API(JSI),API 简洁
- 拆分动机:大部分用户只需音频 + JSI 比 Bridge 延迟更低
裸 RN 的痛点
- 需要
react-native-asset手动链接文件到 Xcode/Android - 热加载不工作(原生文件系统不走 Metro)
- 需要双模式加载工厂(开发用 asset ID,生产用文件名)
参见
- Metro Hermes 与 JSI — Metro bundler 的工作流程
- React Native 新架构概览 — JSI 和 Expo Modules API 的基础