gpt4 book ai didi

javascript - 带有模块加载器的 Emscripten

转载 作者:行者123 更新时间:2023-11-29 16:59:30 27 4
gpt4 key购买 nike

我正在尝试使用 Emscripten 将 C 库转换为可移植的 JavaScript 模块,它将由 AMD(例如 Require.JS)加载并提供对其功能和事物的访问:

require("vendor/mylib.js", function(mylib) {
mylib.function1();
});

但是,我发现 Emscripten 使用大量变量污染了全局命名空间,这违背了模块应该独立且不与其他加载模块冲突的前提。

所以问题是:将 Emscrpiten 与 AMD 一起使用的最佳方法是什么?

有没有办法告诉 Emscripten 不要向 global 泄露任何内容?

最佳答案

emcc docs 中有 2 个命令行选项这可以帮助,--pre-js <file>--post-js <file> .它们允许您包装生成的代码,因此允许您与 AMD 集成。

例如,你可以有一个前缀文件

// prefix.js
define(function() {
return function(Module) {

和一个后缀文件

// postfix.js
};
});

你会编译输出到myModule.js使用类似的东西

emcc --pre-js prefix.js --post-js postfix.js -o myModule.js myModule.cpp

然后 require模块,使用 RequireJS 语法:

require(['myModule'], function(myModule) {
myModule({... Module definition object ...});
});

下面是一个更完整的示例,在模块定义对象中设置 Canvas 元素。我还包括 domReady plugin以便能够在 DOM 准备就绪时抓取元素。

<!DOCTYPE html>
<html>
<head>
<script src="require.js"></script>
<script>
require(['domReady', 'myModule'], function(domReady, myModule) {
domReady(function() {
myModule({
canvas: document.getElementById('canvas_1')
});
myModule({
canvas: document.getElementById('canvas_2')
});
});
});
</script>
</head>
<body>
<canvas id="canvas_1"></canvas>
<canvas id="canvas_2"></canvas>
</body>
</html>

这不仅会按照您的要求保留全局命名空间,而且还允许您在页面中一次拥有多个 Emscripten 驱动的 Canvas 元素,如果需要的话。

可以在 http://plnkr.co/edit/8jE3uLwrlszQuHbixU68?p=preview 看到上面的 HTML 页面。 .它加载一个 C++ 程序:

#include <iostream>
using std::cerr;

int main() {
cerr << "In C++ main function";
}

如果您加载 Plunker,那么您应该会看到两次“In C++ main function”,每个加载的模块一次。

如果您需要访问由 Emscripten 修改的 Module 对象,比如调用公开的库函数,您可以执行以下操作,等待 Emscripten 本身使用 monitorRunDependencies 加载的所有依赖项。选项:

require(['myModule'], function(myModule) {
var moduleDef = {
monitorRunDependencies: function(numberOfDependenciesRemaining) {
if (numberOfDependenciesRemaining) return;
// At this point we can call functions added to moduleDef
// such as cwrap or ccall
}
}
myModule(moduleDef);
});

关于javascript - 带有模块加载器的 Emscripten,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29329240/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com