依赖管理
本文档描述了 ffmpeg.wasm 项目中的依赖管理机制,涵盖 monorepo 结构、内部和外部依赖、构建配置以及用于管理 WebAssembly 资源和编解码器库的专用脚本。
Monorepo 结构
ffmpeg.wasm 项目采用 npm workspaces 组织为 monorepo,这使得在单个仓库中能够高效地管理多个包和示例应用程序。
标题:Monorepo 包关系
根目录下的 package.json 配置了如下工作空间:
{
"workspaces": [
"packages/*",
"apps/*"
]
}资源依赖管理
与标准 JavaScript 依赖不同,WebAssembly 二进制文件 (.wasm) 及其对应的胶水代码 (.js) 是重型资源,通过特定的版本锁定和专用下载脚本来管理。
版本锁定
核心 WebAssembly 组件和工具库的版本在 scripts/download-assets.js 脚本中集中定义。这确保了开发环境使用一致版本的预编译二进制文件。
| 变量 | 锁定版本 | 描述 |
|---|---|---|
FFMPEG_VERSION | 0.12.15 | @ffmpeg/ffmpeg 包装器的版本 |
CORE_VERSION | 0.12.10 | 单线程 WASM 核心的版本 |
CORE_MT_VERSION | 0.12.10 | 多线程 WASM 核心的版本 |
UTIL_VERSION | 0.12.2 | @ffmpeg/util 包的版本 |
download-assets.js 脚本
该脚本自动化从 NPM 注册表获取资源的过程。它下载 .tgz 文件,解压它们,并将它们放入 public/assets 目录以供本地开发和测试使用。
标题:资源获取流程
此过程中的关键函数包括:
downloadAndUntar(url, tgzName, dst): 编排获取、写入和解压的生命周期mkdir(dir): 确保目标目录存在
编解码器和库依赖
WebAssembly 核心依赖于几个基于 C 的库(编解码器、容器和工具)。这些库通过 build/ 目录中的 shell 脚本进行管理,这些脚本使用 Emscripten (emconfigure, emmake) 配置并编译每个库。
依赖构建脚本
每个库都有一个专用脚本,定义了其针对 WebAssembly 兼容性的特定编译标志(例如 --disable-asm, --enable-static)。
| 库 | 脚本 | 关键标志 / 逻辑 |
|---|---|---|
| FFmpeg | build/ffmpeg.sh | 设置 --arch=x86_32, --target-os=none,并根据 FFMPEG_ST 切换 pthreads |
| libvpx | build/libvpx.sh | 使用 --target=generic-gnu 并运行 emranlib 以修复库索引 |
| aom | build/aom.sh | 使用带有 EM_TOOLCHAIN_FILE 的 CMake 和 -DAOM_TARGET_CPU=generic |
| harfbuzz | build/harfbuzz.sh | 包含一个 sed 技巧,当 FFMPEG_ST 为 "yes" 时强制禁用 pthreads |
内部包依赖
在 npm workspace 内,包相互引用以确保类型安全和工具共享。
@ffmpeg/ffmpeg依赖于@ffmpeg/types。- 示例应用(例如
apps/vue-vite-app)依赖于@ffmpeg/ffmpeg和@ffmpeg/util
模块格式导出
包在 package.json 中使用 exports 字段来为 ESM、UMD 和 TypeScript 提供不同的入口点。
标题:模块解析映射
此配置确保像 Node.js(不支持 WASM 包装器)这样的环境接收一个空模块,以防止在 Next.js 等框架中进行服务器端渲染 (SSR) 时发生运行时崩溃。