问题描述
如果我使用emcc
而不使用-s MODULARIZE=1 -s 'EXPORT_NAME="createMyModule"'
编译C ++代码,则可以加载WebAssembly并访问File System API,如下所示:
HTML:
<script type="text/javascript">
var Module = {
onRuntimeInitialized: function() {
console.log('Module loaded!');
if (FS.mkdir) {
console.log('File System API available!');
}
}
};
</script>
<script type="text/javascript" src="myWebAssemblyModule.js"></script>
<script type="module" src="my.js"></script>
日志:
Module loaded!
File System API available!
但是,如果我添加-s MODULARIZE=1 -s 'EXPORT_NAME="createMyModule"'
作为编译器选项,并尝试基于Promise访问File System API,则它不起作用:
HTML:
<script type="text/javascript" src="myWebAssemblyModule.js"></script>
<script type="module" src="my.js"></script>
my.js:
createMyModule().then(MyModule => {
console.log('Module loaded!');
if (MyModule.FS.mkdir) {
console.log('File System API available!');
}
});
日志:
Module loaded!
那么我该如何使用“基于Modularized /基于承诺”的方法访问文件系统API?
MyModule.FS
可以访问,但MyModule.FS.mkdir
不可访问。
解决方法
要使FS
在模块化版本中可用,必须显式导出它:
emcc ... -s 'EXPORTED_RUNTIME_METHODS=["FS"]'