54、说一下webassembly

张开发
2026/4/18 17:57:31 15 分钟阅读

分享文章

54、说一下webassembly
目录为什么会有 WebAssemblyWebAssembly 的特点1. 体积小、加载快2. 执行效率高3. 可移植4. 安全5. 可与 JavaScript 协作WebAssembly 的运行原理一个简单例子JS 加载 wasmWebAssembly 和 JavaScript 的关系WebAssembly 适合哪些场景1. 音视频处理2. 图像处理3. 在线游戏 / 3D 应用4. 在线编辑器 / IDE5. 加密与安全6. 复用现有原生代码WebAssembly 的优势性能更好能复用原生生态下载解析快更适合大型复杂应用WebAssembly 的局限1. 不能直接操作 DOM2. 开发门槛更高3. 不适合普通业务逻辑4. JS 和 Wasm 频繁通信有成本WebAssembly 和 asm.js 的关系常见文件与接口.wasm浏览器中的 APIWebAssembly.instantiateWebAssembly.instantiateStreaming一个面试回答模板和前端的关系怎么理解一句话总结WebAssembly通常缩写成Wasm。你可以先简单理解成一句话WebAssembly 是一种可以在浏览器中高性能运行的二进制指令格式。它不是用来直接手写的主流语言而更像是用C / C / Rust / Go等语言编写代码再编译成.wasm然后在浏览器里运行所以它的核心价值是让前端不仅能跑 JavaScript还能跑接近原生性能的代码。为什么会有 WebAssembly以前浏览器里几乎只有 JavaScript 能执行。但 JavaScript 有几个问题对CPU 密集型计算不够强跑大型应用时性能有限很多已有的 C/C/Rust 代码难以直接复用到 Web比如这些场景视频/音频编解码图像处理3D 游戏CAD科学计算加密解密AI 推理如果全靠 JS可能会比较吃力。所以 WebAssembly 出现就是为了让浏览器具备更强的底层执行能力。WebAssembly 的特点1. 体积小、加载快Wasm 是二进制格式不像 JS 是文本源码。优点文件更紧凑传输更快解析更快2. 执行效率高Wasm 设计目标之一就是高性能。它是可被浏览器高效解析的低层字节码更接近机器执行模型对数值计算、循环、内存操作更友好所以在很多计算密集型任务中性能通常比 JS 更好。3. 可移植只要浏览器支持 WebAssembly同一个.wasm文件就能跨平台运行。也就是说WindowsmacOSLinux移动端浏览器都能用同一份产物。4. 安全Wasm 运行在浏览器沙箱中不会直接获取系统底层权限。它和 JS 一样受浏览器环境约束。所以它不是“随便执行本地代码”而是在一个受控环境中运行。5. 可与 JavaScript 协作Wasm 不是为了取代 JavaScript而是和 JS 配合。一般模式是JS 负责页面交互、DOM 操作、业务逻辑Wasm 负责高性能计算部分也就是说JS 管界面Wasm 管计算WebAssembly 的运行原理大致流程如下C/C/Rust 等源码 - 编译成 .wasm - 浏览器加载 .wasm - JS 调用 Wasm 导出的方法 - Wasm 执行计算 - 返回结果给 JS例如用 Rust 写一个斐波那契函数编译成fib.wasm在浏览器里通过 JS 加载它JS 调fib(40)Wasm 返回计算结果一个简单例子JS 加载 wasmasync function init() { const response await fetch(add.wasm); const bytes await response.arrayBuffer(); const results await WebAssembly.instantiate(bytes); const { add } results.instance.exports; console.log(add(3, 4)); // 7 } init();这里的意思是浏览器下载add.wasm实例化 WebAssembly 模块取出里面导出的add函数然后像普通函数一样调用WebAssembly 和 JavaScript 的关系很多人容易误解Wasm 会不会替代 JS答案是不会。因为 WebAssembly 不擅长做这些事操作 DOM处理页面交互写业务 UI直接替代前端框架前端页面开发依然主要靠JavaScriptTypeScriptReact / Vue / Angular 等Wasm 更适合做“性能热点模块”。比如大文件解析图像滤镜编解码数学计算编辑器底层引擎WebAssembly 适合哪些场景1. 音视频处理例如视频剪辑音频转码FFmpeg Web 版这类工作量大Wasm 很合适。2. 图像处理例如图片压缩滤镜OCR 前处理大图计算3. 在线游戏 / 3D 应用例如浏览器 3D 引擎物理引擎大型游戏逻辑4. 在线编辑器 / IDE例如代码格式化器语法解析器编译器PDF 渲染器5. 加密与安全例如哈希计算加解密零知识证明相关计算6. 复用现有原生代码很多成熟库本来就是 C/C 写的比如FFmpegSQLiteOpenCV可以编译成 Wasm在浏览器中复用。这点非常有价值。WebAssembly 的优势性能更好对 CPU 密集任务更友好。能复用原生生态可以把现有 C/C/Rust 库搬到 Web。下载解析快二进制格式比文本脚本更紧凑。更适合大型复杂应用让浏览器承载更重型的软件成为可能。WebAssembly 的局限1. 不能直接操作 DOMWasm 一般要通过 JS 间接操作 DOM。所以写页面 UI 还是 JS 更方便。2. 开发门槛更高相比 JSWasm 通常涉及Rust / C 等语言编译工具链内存管理JS 与 Wasm 的边界调用复杂度更高。3. 不适合普通业务逻辑如果只是表单列表接口请求页面跳转用 Wasm 反而是过度设计。4. JS 和 Wasm 频繁通信有成本如果频繁在 JS 和 Wasm 之间传大对象、大量数据可能会有额外开销。所以不是所有场景都一定更快。WebAssembly 和 asm.js 的关系在 Wasm 之前有个思路叫asm.js。它本质上是JavaScript 的一个可优化子集让 JS 更接近底层执行WebAssembly 可以看作是 asm.js 的进一步升级版更高效更标准化更接近底层浏览器支持更好常见文件与接口.wasm编译产物文件。浏览器中的 APIWebAssembly.instantiate把 wasm 字节码编译并实例化。WebAssembly.instantiateStreaming边下载边编译通常更高效。例如const { instance } await WebAssembly.instantiateStreaming( fetch(demo.wasm) ); console.log(instance.exports.add(1, 2));一个面试回答模板如果面试官问“说一下 WebAssembly”你可以这样答WebAssembly 是一种运行在浏览器中的二进制指令格式设计目标是让 Web 平台具备接近原生的执行性能。它通常不是手写而是由 C、C、Rust 等语言编译生成。它的主要优势是体积小、加载快、执行效率高并且可以复用很多原生代码库。在实际应用中WebAssembly 不会替代 JavaScript而是和 JavaScript 配合使用JavaScript 负责页面交互和 DOMWebAssembly 负责性能敏感的计算任务比如音视频处理、图像处理、3D、编译器、加密等。它的局限在于不能像 JS 一样方便地直接操作 DOM开发和调试成本也更高所以更适合特定高性能场景。和前端的关系怎么理解你可以把它理解成JavaScript前端主语言负责交互和业务WebAssembly高性能计算插件层类似于前端应用中的“加速器”一句话总结WebAssembly 是一种可在浏览器中高效运行的二进制格式主要用于把高性能计算能力带到 Web通常与 JavaScript 配合使用而不是替代 JavaScript。

更多文章