【发布时间】:2023-01-16 13:20:16
【问题描述】:
我正在尝试将我的简单碰撞检测库从 JavaScript 移植到 WebAssembly 以提高速度。在查找了可编译为 WASM 的语言后,AssemblyScript 似乎是完美的,因为我只需要将类型添加到我的 JS 文件中。整个库是 Class,在添加类型后我尝试编译它,但编译不正确。例如,使用命令 npx asc path/to/main.ts -o wasm.wasm --exportRuntime -t wasm.wat --bindings esm 编译它:
export class Test {
constructor() {
console.log('Successful!');
}
};
导致此错误:
WARNING AS235: Only variables, functions and enums become WebAssembly module exports.
export class Test {
~~~~
in main.ts(1,14)
看到错误后,我尝试通过以下方式修复它:
class Test {
constructor() {
console.log('Successful!');
}
};
export function getTest(): Test {
return Test;
};
但这导致了另一个错误:
ERROR AS234: Expression does not compile to a value at runtime.
return Test;
~~~~
in main.ts(8,12)
FAILURE 1 compile error(s)
所以我试着这样做:
class Test {
constructor() {
console.log('Successful!');
}
};
export function getTest(): Test {
return new Test();
};
编译成功,在从 JavaScript 调用 getTest 后,我在控制台中得到了一个输出 Successful!,但它没有返回启动的类,而是得到了这个:[Number (Internref): 18624]。
所以我在互联网上搜索解决方案并找到this。但公认的解决方案是使用 AssemblyScript Loader,已弃用。我也知道 as-bind 但它声明它环绕 AssemblyScript Loader 因此,间接地,它也被弃用了。那么如何从 AssemblyScript 中导出类呢?
【问题讨论】:
-
您不导出类,就这么简单。您只能导出将在传递给它们的实例上调用方法的函数。
-
@Bergi 我想我可以将我的类拆分为一个包含所有属性的对象,并将所有方法作为独立函数来修改和使用对象中的值。但是我需要运行该库的多个实例,所以我想我会处理 WASM 中的原始计算和一个 JS 类来处理其他事情。感谢您的澄清!
标签: javascript webassembly assemblyscript