【问题标题】:How to export classes from AssemblyScript?如何从 AssemblyScript 导出类?
【发布时间】: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


【解决方案1】:

所以,目前没有办法导出类。 但是,您可以从 JavaScript 调用类的方法或调用 get 或 set 方法来修改数据。 我相信计划将函数命名为 Vec3#constructor Vec3#magnitude 等..

Exporting classes from WebAssembly to JavaScript with Assemblyscript?

【讨论】:

  • 我放弃了从 AssemblyScript 导出类的尝试。我现在只处理 AssemblyScript 中的原始计算和 JS 中的包装类。感谢您尝试帮助我。
  • 老实说,我会在实践中做同样的事情。
猜你喜欢
  • 2019-10-25
  • 2021-03-05
  • 2021-09-05
  • 2019-07-11
  • 2019-10-27
  • 1970-01-01
  • 2022-07-15
  • 2023-02-19
  • 2015-12-21
相关资源
最近更新 更多