我正在使用 quickjs-emscripten 尝试评估 Cloudflare Worker(即无服务器)中的一些 JS。我知道 JS 评估的陷阱,不需要在这里争论。
文档说这应该有效:
import { getQuickJS, shouldInterruptAfterDeadline } from "quickjs-emscripten"
getQuickJS().then((QuickJS) => {
console.log('start'); //<-- never happens
const result = QuickJS.evalCode("1 + 1", {
shouldInterrupt: shouldInterruptAfterDeadline(Date.now() + 1000),
memoryLimitBytes: 1024 * 1024,
})
})
...但是回调永远不会输入,也不会抛出任何错误(尝试将其包装在 try-catch 中)。
有人知道可能出了什么问题吗?
好吧,深入研究这个很有趣!
您正在寻找为 Emscripten 制作自定义 WASM 加载程序。
import { shouldInterruptAfterDeadline } from "quickjs-emscripten";
import type { QuickJSWASMModule } from "quickjs-emscripten";
import {
newQuickJSWASMModule,
DEBUG_SYNC as baseVariant,
newVariant,
} from "quickjs-emscripten";
import cloudflareWasmModule from "./DEBUG_SYNC.wasm";
import cloudflareWasmModuleSourceMap from "./DEBUG_SYNC.wasm.map.txt";
const cloudflareVariant = newVariant(baseVariant, {
wasmModule: cloudflareWasmModule,
wasmSourceMapData: cloudflareWasmModuleSourceMap,
});
let QuickJS: QuickJSWASMModule | undefined;
然后在你的
addEventListener
内
QuickJS = await newQuickJSWASMModule(cloudflareVariant);
我在这里的一篇文章中介绍了我的研究。