近在尝试一些浏览器 WebGPU 的 API 想看看用 MoonBit 能不能比 TypeScript 写得更舒服一些, 但是绑定 API 遇到一些困惑, 一方面是涉及到了一些 Promise 因为 MoonBit 还没支持 async 只能简化处理, 另一方面是 WebGPU API 包含一些较为复杂的结构, 接受的参数是包含嵌套的 JSON 数据, 还有一些 ArrayBuffer 的场景.
嵌套的数据, 从编码体验我倾向于用 struct, enum 等结构来描述, 这样代码补全的时候配合自动推断 enum construct 或者 struct field 就很方便. 但是最终调用 js API 的时候还是需要转化成 js value 再调用的. 就需要再 MoonBit 里构造 js object 等结构了. 现在我定义一些比如:
JsObject
JsObject::get
JsObject::set
JsObject::delete
一点点拼, 也不是不行, 但还是会有比如用到,
Uint8Array | Float32Array // js 侧接收 ArrayBuffer, 再 instanceof 判断
这样相对动态的情况, 或者有些地方需要 JsValue
这类比较动态的值. 跟另一个帖子说的 any
有点类似.
想问问官方有没有什么推荐的方案?
或者已有的 MoonBit JSON 语法可以用来简化这里的场景吗?
两个略复杂的例子:
https://developer.mozilla.org/en-US/docs/Web/API/GPUDevice/createTexture
cubeTexture = device.createTexture({
size: [imageBitmap.width, imageBitmap.height, 1],
format: "rgba8unorm",
usage:
GPUTextureUsage.TEXTURE_BINDING |
GPUTextureUsage.COPY_DST |
GPUTextureUsage.RENDER_ATTACHMENT,
});
https://developer.mozilla.org/en-US/docs/Web/API/GPUCommandEncoder/beginRenderPass
const renderPassDescriptor = {
colorAttachments: [
{
clearValue: clearColor,
loadOp: "clear",
storeOp: "store",
view: context.getCurrentTexture().createView(),
},
],
};
const passEncoder = commandEncoder.beginRenderPass(renderPassDescriptor);
整个 API 看着还是略复杂的, 虽然平时用到的不多 types/generated/index.d.ts at main · gpuweb/types · GitHub