什么是 WebAssembly?
WebAssembly(Wasm)是一种二进制指令格式,作为 C、C++ 和 Rust 等高级语言的可移植编译目标而设计。它使代码能在网页浏览器中以接近原生的速度运行。2019年成为 W3C 标准后,Wasm 现已被所有主流浏览器支持,包括 Chrome、Firefox、Safari 和 Edge。
对于文件处理来说,WebAssembly 意味着复杂操作——PDF处理、图像压缩、OCR文字识别——可以完全在浏览器中完成,无需将数据发送到服务器。Photopea 和 Figma 等 Web 应用都依赖 WebAssembly。Allin PDF 的本地工具基于同样的浏览器平台:在 Web Worker 中运行 JavaScript 与 WebAssembly 库,文件在你的设备上处理时页面依然流畅。
pdf-lib、PDF.js 和 Tesseract.js 如何在浏览器中处理文件
Allin PDF 的本地工具基于三个开源库。它们并非都是 WebAssembly,但都在你的设备上运行:
pdf-lib — 浏览器中的 PDF 操作
pdf-lib 是一个完全在客户端创建和修改 PDF 文档的 JavaScript 库。它处理页面合并、拆分、文本插入、图片嵌入和表单填写,完全无需服务器调用。pdf-lib 本身是纯 JavaScript,而非 WebAssembly。现代 JavaScript 引擎会把它编译成高效的机器码,放在 Web Worker 中运行,处理大文件时也不会卡住页面。
PDF.js — 渲染 PDF 页面
PDF.js 是 Mozilla 的 PDF 引擎,也是 Firefox 内置的那一个。它负责解析和绘制 PDF 页面,PDF 转图片等工具就依赖它。PDF.js 主要用 JavaScript 编写,新版本在部分图像解码器中使用了 WebAssembly。
Tesseract.js — 无需服务器的 OCR
Tesseract.js 是 Tesseract OCR 引擎的 WebAssembly 移植版本。引擎本身可训练支持多种语言,Allin PDF 的免费 OCR 提供 5 种:英文、简体中文、繁体中文、日文和韩文。语言数据在首次使用时下载,之后识别在浏览器标签页中完成,图片或 PDF 不会上传。
性能对比:WebAssembly vs 原生应用
浏览器端处理与桌面软件相比表现如何?对日常 PDF 操作来说,通常快到几乎感觉不出差别。实际速度取决于设备、浏览器和文件本身。下表列出 Allin PDF 中各项操作由谁处理,以及影响速度的因素:
| 操作 | 由谁处理 | 运行位置 | 影响速度的因素 |
|---|---|---|---|
| 压缩 PDF | pdf-lib + 图片重新编码 | 你的浏览器 | 图片数量和大小、压缩级别 |
| 合并 PDF(2–20 个) | pdf-lib(页面原样复制) | 你的浏览器 | 总文件大小和页数 |
| OCR 单页 | Tesseract.js(WebAssembly) | 你的浏览器 | 图片分辨率、CPU 性能、首次使用时下载语言数据 |
| PDF 加密(AES-256) | 浏览器内 PDF 加密 | 你的浏览器 | 文件大小 |
| PDF 转图片渲染 | PDF.js | 你的浏览器 | 页数、输出分辨率 |
总体而言,WebAssembly 比同一代码的原生编译版本略慢,随着浏览器引擎不断改进 Wasm 编译器,差距还在缩小。对普通 PDF 来说,文件大小、图片占比和设备内存的影响更大。
安全模型:沙箱执行为何重要
WebAssembly 通过沙箱执行模型提供强大的安全保障:
- 内存隔离:Wasm 代码在完全独立于浏览器内存的线性内存空间中运行,无法访问其他标签页、Cookie 或系统资源。
- 无直接系统访问:Wasm 不能读取文件系统、访问网络或调用 OS API,除非通过 JavaScript 桥接显式授权。
- 同源策略:Wasm 模块遵循与 JavaScript 相同的安全约束——没有 CORS 头部则无法跨域访问数据。
- 执行前验证:每个 Wasm 二进制文件在编译时都经过验证,防止原生代码中常见的类型混淆和缓冲区溢出攻击。
浏览器端工具的未来
WebAssembly 持续进化,近期上线和即将推出的新特性将进一步缩小与原生应用的差距:
- WASI(WebAssembly 系统接口):面向文件 I/O 和网络的标准系统接口,主要用于在浏览器之外运行 Wasm
- 多线程和 SIMD:多线程 Wasm 配合 SIMD 指令实现大文件并行处理
- 垃圾回收:内置 GC 支持让 Java、Kotlin、Dart 等语言能高效编译到 Wasm
- 组件模型:允许将不同语言的 Wasm 模块组合成统一应用
趋势很明显:越来越多桌面级应用将迁移到浏览器。对于隐私敏感的文件处理——PDF、文档、图像——本地浏览器工具提供了性能、隐私和便捷性的理想组合。
常见问题
WebAssembly 在手机浏览器上能用吗?
可以。WebAssembly 支持 Android Chrome、iOS Safari 和 Android Firefox。由于移动端 CPU 限制,性能低于桌面端,大文件会更慢,但 PDF 压缩和合并等常见操作在当前的智能手机上运行良好。
WebAssembly 能在未经允许的情况下访问我的文件吗?
不能。WebAssembly 无法直接访问你的文件系统。文件必须由你通过文件选择器或拖放明确选择。Wasm 代码只能处理你主动提供的数据——它无法扫描或读取设备上的其他文件。
WebAssembly 会取代 JavaScript 吗?
不会。WebAssembly 与 JavaScript 互补。JS 仍是 UI 交互、DOM 操作和应用逻辑的理想选择。Wasm 处理需要接近原生速度的计算密集型任务(压缩、解析、渲染)。大多数现代 Web 应用同时使用两者。