WASM 和 Node.js 无法在模块外部使用“import.meta”

lor*_*isi 0 javascript node.js emscripten webassembly

我使用提供的 make 文件将FastText C++ 模块构建为 wasm 模块,即使用以下标志:

EMCXX = em++
EMCXXFLAGS = --bind --std=c++11 -s WASM=1 -s ALLOW_MEMORY_GROWTH=1 -s "EXTRA_EXPORTED_RUNTIME_METHODS=['addOnPostRun', 'FS']" -s "DISABLE_EXCEPTION_CATCHING=0" -s "EXCEPTION_DEBUG=1" -s "FORCE_FILESYSTEM=1" -s "MODULARIZE=1" -s "EXPORT_ES6=1" -s 'EXPORT_NAME="FastTextModule"' -Isrc/
EMOBJS = args.bc autotune.bc matrix.bc dictionary.bc loss.bc productquantizer.bc densematrix.bc quantmatrix.bc vector.bc model.bc utils.bc meter.bc fasttext.bc main.bc
Run Code Online (Sandbox Code Playgroud)

已编译的 wasm 模块可在此处获取。当我在提供的示例Predict.js中运行模块时,我得到一个

  var _scriptDir = import.meta.url;
                          ^^^^

SyntaxError: Cannot use 'import.meta' outside a module
    at wrapSafe (internal/modules/cjs/loader.js:1072:16)
    at Module._compile (internal/modules/cjs/loader.js:1122:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1178:10)
    at Module.load (internal/modules/cjs/loader.js:1002:32)
    at Function.Module._load (internal/modules/cjs/loader.js:901:14)
    at Module.require (internal/modules/cjs/loader.js:1044:19)
    at require (internal/modules/cjs/helpers.js:77:18)
Run Code Online (Sandbox Code Playgroud)

引起的

var FastTextModule = (function() {
  var _scriptDir = import.meta.url;
  
  return (
function(FastTextModule) {
  FastTextModule = FastTextModule || {};

...
Run Code Online (Sandbox Code Playgroud)

笔记。

我必须将编译后的模块从原始模块改编为 Node.JS 以支持require而不是import,但这不应该与该错误相关。

更新。

我已经尝试将标志USE_ES6_IMPORT_META添加到描述的 makefile-s "USE_ES6_IMPORT_META=0"广告中:

em++ --bind --std=c++11 -s WASM=1 -s ALLOW_MEMORY_GROWTH=1 -s "EXTRA_EXPORTED_RUNTIME_METHODS=['addOnPostRun', 'FS']" -s "DISABLE_EXCEPTION_CATCHING=0" -s "EXCEPTION_DEBUG=1" -s "FORCE_FILESYSTEM=1" -s "MODULARIZE=1" -s "EXPORT_ES6=1" -s 'EXPORT_NAME="FastTextModule"' -s "USE_ES6_IMPORT_META=0" -Isrc/  src/args.cc -o args.bc
em++: warning: assuming object file output, based on output filename alone.  Add an explict `-c`, `-r` or `-shared` to avoid this warning [-Wemcc]
Run Code Online (Sandbox Code Playgroud)

这次它似乎有效,因为我得到了一个不同的错误,该错误与模块/代码相关:

TypeError: fastTextModule.addOnPostRun is not a function
Run Code Online (Sandbox Code Playgroud)

违规行在这里

fastTextModule.addOnPostRun(() => {
  if (postRunFunc) {
    postRunFunc();
  }
});
Run Code Online (Sandbox Code Playgroud)

而在模块化文件中,该函数在这里定义

Module["addOnPostRun"] = addOnPostRun;
Run Code Online (Sandbox Code Playgroud)

这里提供了这个问题的解决方案。最终的工作模型在这里

Mat*_*eus 5

Emscripten 提供一个USE_ES6_IMPORT_META标志!也许这可以解决你的问题。看一下https://github.com/emscripten-core/emscripten/blob/master/src/settings.js。关于这个标志有一个简单的解释。

更新

使用USE_ES6_IMPORT_META=0