我在 Discord 上的 AssemblyScript 服务器上寻求帮助,贡献者(dcodeIO)能够修复有关UTF-8 encoding的错误。因此,为此需要将AssemblyScript 设为 0.17.7版本,即修复此错误的版本。此外,另一位合作者(MaxGraey)帮助我创建代码并安装软件包。
首先,您必须安装加载程序:
npm i @assemblyscript/loader
在我的情况下,我不能,我不得不全局安装它,因为我安装了操作系统的 USB 上的读取问题:
npm install --force -g @assemblyscript/loader
你要小心,有一个npm
包叫assemblyscript-loader
,注意它的中心有一个减号,你不必做以下事情:
npm install --force -g assemblyscript-loader # Do not do it, it is wrong.
example.ts的代码必须如下:
namespace console {
declare function log(str: string): void;
}
/*
main generally unnecessary if you don't use
the `import` object on the host side,
but in this case it's better to delay the implicit
initialization during module instantiation
*/
export function main(): void {
console.log("1");
}
要使用 编译example.ts,asc
您可以执行以下操作...我添加了优化以减少文件重量:
asc -O3z --converge -b ./example.wasm ./example.ts
这将生成一个3033 字节的文件,相当于3 kb。
要从Node.js执行wasm代码,您必须创建一个文件,例如example.js,它看起来如下所示:
const fs = require("fs")
const loader = require('@assemblyscript/loader/umd');
loader.instantiate( fs.readFileSync("./example.wasm"), {
example: { // if your file called "example.ts"
"console.log"(ptr) {
console.log(exports.__getString(ptr));
}
}
})
.then(module => {
exports = module.exports;
exports.main(); // call entry point
})
.catch(e => {
console.error(e);
})
使用很重要fs.readFileSync("./example.wasm")
,因为仅使用时"./example.wasm"
,它不起作用。这是因为加载程序 AssemblyScript(在Node.js中创建)的实现,大约在第 333 行的index.js文件中,要求作为参数类型的变量,即example.wasm的字节。Buffer
就我而言,当我在全局安装它时,在example.js中我将其更改为以下内容:
const loader = require('/usr/lib/node_modules/@assemblyscript/loader/umd');
要从Node.js运行example.js文件,可以按如下方式完成。我放置了代码跟踪参数以防发生奇怪的事情:
node --trace-warnings --track-heap-objects ./example.js
运行该命令的输出如下:
1
如您所见,它工作正常。