WebAssembly,通过AssemblyScript编写wasm
发布于 作者:苏南大叔 来源:程序如此灵动~

对于苏南大叔来说,这个可以在网页里面运行的webassembly
技术,就是对JavaScript
进行代码加密隐藏的新技术。所以,对它展开探索。根据官方文档,这个.wasm
文件是个编译后的结果,编译之前各个主流编程语言都可以对它有所支持。这个就更令人有选择困难症了。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。测试环境:win10
,node@20.18.0
,AssemblyScript@0.27.31
。先说一下本文的结论,并不建议使用AssemblyScript
编写,实在是功能有限。
AssemblyScript
AssemblyScript
是一种将TypeScript
编译为WebAssembly
的编程语言。官方网站:
在众多支持编译为WebAssembly
的各种语言里面,苏南大叔选择了这个AssemblyScript
,因为它宣称是typescript
的子集,使用typescript
的语法。
AssemblyScript 范例
首先,创建一个新的项目文件夹并初始化 npm 项目:
npm init -y
npm install assemblyscript --save-dev
npx asinit .
npx asinit .
命令会在当前目录下生成一些初始文件和文件夹,包括 assembly/
文件夹和 asconfig.json
配置文件。
最简单例子
在 assembly/index.ts
文件里,自带个加法运算的例子。修改index.ts
代码,就可以导出自己的算法了。使用export
来导出即可,可以导出多个函数:
export function add(a: i32, b: i32): i32 {
return a + b;
}
编译 AssemblyScript 代码
可以执行:
npm run asbuild
如果目标明确,只需要wasm
文件的话,也可以执行:
asc assembly/index.ts --outFile build/release.wasm --optimize
这个AssemblyScript
的输出.wasm
文件,构建的命令参数,经常变化。所以,不能盲目的照抄网上教程里面的命令。因为很有可能已经失效了,不能正常构建。
引入wasm文件
build
下面的release.js
文件,也是有参考意义的。
async function instantiate(module, imports = {}) {
const { exports } = await WebAssembly.instantiate(module, imports);
return exports;
}
export const {
memory,
add,
add2,
} = await (async url => instantiate(
await (async () => {
const isNodeOrBun = typeof process != "undefined" && process.versions != null && (process.versions.node != null || process.versions.bun != null);
if (isNodeOrBun) { return globalThis.WebAssembly.compile(await (await import("node:fs/promises")).readFile(url)); }
else { return await globalThis.WebAssembly.compileStreaming(globalThis.fetch(url)); }
})(), {
}
))(new URL("release.wasm", import.meta.url));
index.html
的源码:
<script type="module">
import { add, add2 } from "./build/release.js";
document.body.innerText = add(1, 2);
document.body.innerText += "," + add2(2, 2);
</script>
参考文章:
运行wasm
范例里面自带个serve
,否则的话,就需要nginx
之类的容器进行启动。
npm start
结论
不建议使用AssemblyScript
。所以,继续选择其它的编程语言。不建议使用的原因,是目前只要函数里面出现字符串,就会发生各种各样的问题。虽然可以解决,但是作为一门编程语言来说,这匪夷所思啊。所以,在目前来看,不建议使用。具体可以参考后续文章。


