使用MODULARIZE选项编译时,如何访问emscripten的文件系统API?

问题描述

如果我使用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"]'