什么是WebAssembly
WebAssembly/wasm WebAssembly 或者 wasm 是一个可移植、体积小、加载快并且兼容 Web 的全新格式
特点
高效
WebAssembly 有一套完整的语义,实际上 wasm 是体积小且加载快的二进制格式, 其目标就是充分发挥硬件能力以达到原生执行效率
安全
WebAssembly 运行在一个沙箱化的执行环境中,甚至可以在现有的 JavaScript 虚拟机中实现。在web环境中,WebAssembly将会严格遵守同源策略以及浏览器安全策略。
开放
WebAssembly 设计了一个非常规整的文本格式用来、调试、测试、实验、优化、学习、教学或者编写程序。可以以这种文本格式在web页面上查看wasm模块的源码。
标准
WebAssembly 在 web 中被设计成无版本、特性可测试、向后兼容的。WebAssembly 可以被 JavaScript 调用,进入 JavaScript 上下文,也可以像 Web API 一样调用浏览器的功能。当然,WebAssembly 不仅可以运行在浏览器上,也可以运行在非web环境下。
关键概念
模块(Module)
概念:
对象包含已经由浏览器编译的无状态 WebAssembly 代码,可以高效地与 Workers 共享、缓存在 IndexedDB 中,和多次实例化。
语法:
WebAssembly.Module()构造函数可以用来同步编译给定的 WebAssembly 二进制代码。- 获取
Module对象的主要方法是通过异步编译函数,如WebAssembly.compile(),或者是通过 IndexedDB 读取 Module 对象.
注:由于大型模块的编译可能很消耗资源,开发人员只有在绝对需要同步编译时,才使用
Module()构造函数;其他情况下,应该使用异步WebAssembly.compile()方法
全局(Global)
概念:
WebAssembly.Global 对象表示一个全局变量实例, 可以被JavaScript 和importable/exportable 访问 ,跨越一个或多个WebAssembly.Module 实例. 他允许被多个modules动态连接.
实例(Instance)
概念
WebAssembly.Module的一个可执行实例,本身就具有状态,实例中有一个 exports 对象包含了所有 WebAssembly 的导出,可以使用 JavaScript 调用 WebAssembly 代码。
备注:由于大型模块的实例化代价极高, 开发人员应只在必须同步实例化的时候,才使用
Instance();绝大多数情况应该使用异步方法WebAssembly.instantiate()
内存(Memory)
WebAssembly.Memory() 构造函数创建一个新的 Memory 对象。该对象的 buffer 属性是一个可调整大小的 ArrayBuffer ,其内存储的是 WebAssembly 实例 所访问内存的原始字节码。
表格(Table)
具有类数组结构,存储了多个函数引用。在Javascript或者WebAssemble中创建Table 对象可以同时被Javascript或WebAssemble 访问和更改
方法
下面的方法除了
WebAssembly.validate()都是返回的Promise,主要看一下WebAssembly.instantiate()和WebAssembly.instantiateStreaming()两个方法,一般都是使用这两个方法加载 wbsm 模块
WebAssembly.compile()
WebAssembly.compile() 方法编译 WebAssembly 二进制代码到一个WebAssembly.Module 对象。如果在实例化之前有必要去编译一个模块,那么这个方法是有用的(否则,将会使用WebAssembly.instantiate() 方法)。
WebAssembly.compileStreaming()
WebAssembly.compileStreaming() 方法用来从一个流式源中直接编译一个 WebAssembly.Module。当模块需要在被实例化前被编译时,这个方法会很有用。如果要从流式源实例化一个模块应采用 WebAssembly.instantiateStreaming()方法。
WebAssembly.validate()
WebAssembly.validate() 方法用于验证包含 WebAssembly 二进制码的一个 typed array 是否合法,如果这些字节能构成一个合法的 wasm 模块则返回 true ,否则返回 false。
WebAssembly.instantiate()
用于编译和实例化 WebAssembly 代码的主 API,返回一个 Module 和它的第一个Instance实例。这个方法有两个重载方式:
- 第一种主要重载方式使用 WebAssembly 二进制代码的
typed array或ArrayBuffer,一并进行编译和实例化。返回的Promise会携带已编译的WebAssembly.Module和它的第一个实例化对象WebAssembly.Instance。 - 第二种重载使用已编译的
WebAssembly.Module, 返回的Promise携带一个Module的实例化对象Instance. 如果这个Module已经被编译了或者是从缓存中获取的, 那么这种重载方式是非常有用的。
注: 此方法不是获取(fetch)和实例化wasm模块的最具效率方法。 如果可能的话,应该改用较新的WebAssembly.instantiateStreaming()方法,该方法直接从原始字节码中直接获取,编译和实例化模块,因此不需要转换为ArrayBuffer。
WebAssembly.instantiateStreaming()
直接从流式底层源编译和实例化 WebAssembly 模块,同时返回Module及其第一个Instance实例。
总结
本文用于记录WebAssembly使用以及学习心得,将不断持续更新~~~