依赖管理

本文档描述了 ffmpeg.wasm 项目中的依赖管理机制,涵盖 monorepo 结构、内部和外部依赖、构建配置以及用于管理 WebAssembly 资源和编解码器库的专用脚本。

Monorepo 结构

ffmpeg.wasm 项目采用 npm workspaces 组织为 monorepo,这使得在单个仓库中能够高效地管理多个包和示例应用程序。

标题:Monorepo 包关系

Monorepo 包关系图

根目录下的 package.json 配置了如下工作空间:

{
 "workspaces": [
 "packages/*",
 "apps/*"
 ]
}

资源依赖管理

与标准 JavaScript 依赖不同,WebAssembly 二进制文件 (.wasm) 及其对应的胶水代码 (.js) 是重型资源,通过特定的版本锁定和专用下载脚本来管理。

版本锁定

核心 WebAssembly 组件和工具库的版本在 scripts/download-assets.js 脚本中集中定义。这确保了开发环境使用一致版本的预编译二进制文件。

变量锁定版本描述
FFMPEG_VERSION0.12.15@ffmpeg/ffmpeg 包装器的版本
CORE_VERSION0.12.10单线程 WASM 核心的版本
CORE_MT_VERSION0.12.10多线程 WASM 核心的版本
UTIL_VERSION0.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)。

库脚本关键标志 / 逻辑
FFmpegbuild/ffmpeg.sh设置 --arch=x86_32, --target-os=none,并根据 FFMPEG_ST 切换 pthreads
libvpxbuild/libvpx.sh使用 --target=generic-gnu 并运行 emranlib 以修复库索引
aombuild/aom.sh使用带有 EM_TOOLCHAIN_FILE 的 CMake 和 -DAOM_TARGET_CPU=generic
harfbuzzbuild/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) 时发生运行时崩溃。