如何在 Web Worker 中使用 emscripted .js 库

zzm*_*zmp 5 javascript web-worker emscripten

我已将程序编译为单个program.js文件,并在工作程序中调用:

importScripts('program.js');
Module.callMain();
Run Code Online (Sandbox Code Playgroud)

然而,尽管callMain正在执行,但在该函数调用的堆栈中我收到了错误Undefined is not a function

我的预感是我还没有阅读一些必要的emscripten文档、wiki 或源代码。

我知道的:

  • emscripten具有与工作程序一起使用的绑定,但仅当主线程上有 emscripted 进程才能使用这些绑定时(请参阅emscripten.h
  • 为了将任务(在主线程上运行的库内)编译给工作人员,需要在编译时为该任务emcc传递特殊选项(请参阅settings.js

我的猜测是:

  • 我可能需要传递一些标志来让 emcc 知道不要在不存在的对象上调用函数,例如window
  • /dev/tty在查看了与 by 链接的 的实现/dev/stdin以及 的实现之后/dev/stdout,我相信可能会有输出到console,我不认为工作人员支持该输出

我要问的是:

  • 如何在工作人员中使用我的库(单个 js 文件)?
    • 我的库从一个文件加载其他文件program.data(如果这有影响的话)

提前致谢。如果我可以添加任何详细信息,请告诉我。


注意:顶部的代码经过简化 - 它似乎不是语法错误。

更新:

  • stacktrace( Error.stack) 仅告诉我错误发生在Module.callMain. 它没有告诉我任何有关可能导致该问题的导入脚本的信息。:(

小智 3

Emscripten 输出应该在网站、Web Worker 或节点上运行,所有这些都无需修改。可能存在一些限制(例如,worker 中没有可渲染的画布),但除此之外,它只是可以在这三种环境中运行的纯 JS。

emscripten 生成的完全相同的 JS 文件是否可以在工作器之外工作?

如果callMain()失败,请检查您的项目是否具有main()功能。