Emscripten:自定义生成的 js,以便它以自定义方式加载 .wasm 文件
Emscripten: Customize the generated js so it loads the .wasm file in a custom way
通过使用以下选项进行编译,
emcc -s WASM=1 main.cpp -o index.js
emscripten 生成一个 index.wasm
和一个 js 包装器 index.js
。
js 包装器加载位于同一目录中的 .wasm
文件,当它在浏览器中为 运行 时使用 XMLHttpRequest
。
那么如果需要手动加载.wasm
文件怎么办呢?加载部分似乎硬编码在包装器中。
以下是我需要的一些情况:
- 我需要从另一个 url(例如从 CDN)提供
.wasm
文件。
- 下载
.wasm
文件的url是动态生成的。
- 代码是 运行 在不允许
XMLHttpRequest
的沙箱中,只有 API 像 getMyData('some_file')
。
- 我需要将所有文件嵌入为 base64 字符串。
我知道我只能通过
生成.wasm
文件
emcc -s WASM=1 main.cpp -o index.wasm
但后来我丢失了包装器,这在使用 SDL 和 GLES 等 emscripten APIs 时并不是微不足道的。
AFIK,JS 包装器调用 fetch() 而不是 XHR。如果可用,您可以使用 Service Worker 来拦截该请求和 return 任何您想要的东西。
您还可以修改 Emscripten 源代码(我有 v1.39.13)以重写默认加载行为。在文件 $EMSDK/upstream/emscripten/src/preamble.js
中,根据您的喜好修改函数 getBinaryPromise()
and getBinary()
,然后使用 emcc
构建以在 WASM JS 包装器中拥有您的自定义加载行为。
通过使用以下选项进行编译,
emcc -s WASM=1 main.cpp -o index.js
emscripten 生成一个 index.wasm
和一个 js 包装器 index.js
。
js 包装器加载位于同一目录中的 .wasm
文件,当它在浏览器中为 运行 时使用 XMLHttpRequest
。
那么如果需要手动加载.wasm
文件怎么办呢?加载部分似乎硬编码在包装器中。
以下是我需要的一些情况:
- 我需要从另一个 url(例如从 CDN)提供
.wasm
文件。 - 下载
.wasm
文件的url是动态生成的。 - 代码是 运行 在不允许
XMLHttpRequest
的沙箱中,只有 API 像getMyData('some_file')
。 - 我需要将所有文件嵌入为 base64 字符串。
我知道我只能通过
生成.wasm
文件
emcc -s WASM=1 main.cpp -o index.wasm
但后来我丢失了包装器,这在使用 SDL 和 GLES 等 emscripten APIs 时并不是微不足道的。
AFIK,JS 包装器调用 fetch() 而不是 XHR。如果可用,您可以使用 Service Worker 来拦截该请求和 return 任何您想要的东西。
您还可以修改 Emscripten 源代码(我有 v1.39.13)以重写默认加载行为。在文件 $EMSDK/upstream/emscripten/src/preamble.js
中,根据您的喜好修改函数 getBinaryPromise()
and getBinary()
,然后使用 emcc
构建以在 WASM JS 包装器中拥有您的自定义加载行为。