Gulp browserify管道中的Emscripten模块

Gulp browserify管道中的Emscripten模块,gulp,browserify,amd,emscripten,Gulp,Browserify,Amd,Emscripten,我正在尝试在我们的网站中添加一个emscripten编译模块。为了实现这一点,我使用了browserify(带babelify转换) 创建包时会出现问题:emscripten代码被包装在生成的js文件中,但模块是一个空对象。代码实际上正在被解析,如下图所示: 长话短说: import Module from "./main"; console.log(Module._int_sqrt(9)); 返回此错误: _main2.default._int_sqrt is not a function

我正在尝试在我们的网站中添加一个emscripten编译模块。为了实现这一点,我使用了browserify(带babelify转换)

创建包时会出现问题:emscripten代码被包装在生成的js文件中,但模块是一个空对象。代码实际上正在被解析,如下图所示:

长话短说:

import Module from "./main";
console.log(Module._int_sqrt(9));
返回此错误:

_main2.default._int_sqrt is not a function
我的工作有一些限制:无法将脚本直接添加到html页面。此构建步骤的输出必须是一个包含其所有依赖项的js文件

我已经创建了一个最小的测试用例,所以任何人都可以复制这个问题

我非常感谢您的指导,因为我认为这不是emscripten或browserify中的bug


最后一句话:源cpp代码工作正常。您可以通过运行用mocha编写的测试来检查它

多亏了emscripten工具的贡献者,我终于找到了解决方案

如果在emcc编译阶段添加编译标志
-s modulate=1
,则问题得到解决。然后,在js代码中,创建模块的一个实例。该实例将具有可访问的函数

js代码应该如下所示:

import Module from "./main";

let m = new Module();
console.log(m._int_sqrt(9))

我已经更新了,以防有人想检查它,如果我强制使用Emscripten
Module.ENVIRONMENT='NODE'
,Browserify生成的输出在Chrome中对我有效。这可以通过两种方式实现:

  • Prepend
    var模块={ENVIRONMENT:'NODE'}添加到Emscripten Javascript输出
  • 将emcc的
    --pre js
    选项用于包含与上面1中相同代码的文件

  • 我对uglify npm模块也有类似的问题,错误是我在js中有一个错误代码,结果是一个空文件,检查js文件,尤其是返回文本对象而不是变量,好运气如果你检查js文件,我只导入模块,并打印导入结果。这个错误与js本身无关。emscripten模块在节点环境中得到正确处理(如mocha测试演示)。问题源于browserify完成的自动绑定,它检测到环境是一个浏览器,因此我希望它的行为像一个nodejs模块(将自身绑定到module.exports变量)我要做的是:1)在没有优化的情况下编译模块2)检查使用browserify设置了哪些变量3)尝试查看已编译模块中的流4)变量是否正确?1)没有设置优化2)正在创建模块,并且实际调用了run()函数3)流是否正确,直到require(由“5”引用))4)变量是正确的,但是正在评估它们的闭包是lostI-get
    未捕获引用错误:未定义模块
    ;C