WebAssembly.Instance() コンストラクター

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since October 2017.

WebAssembly.Instance() コンストラクターは、新しい Instance オブジェクトを生成します。これはステートフルで実行可能な WebAssembly.Module のインスタンスです。

構文

警告: 巨大なモジュールのインスタンス化は高コストになる可能性があるので、開発者が同期的な Instance() コンストラクターを使用するのは、絶対に必要な場合のみにするべきです。それ以外の場合はすべて、WebAssembly.instantiateStreaming() メソッドを使用してください。

js
new WebAssembly.Instance(module, importObject);

引数

module

インスタンス化する WebAssembly.Module オブジェクト。

importObject 省略可

新しく生成される Instance にインポートされる値を持つオブジェクトで、例えば関数や WebAssembly.Memory オブジェクトなどです。モジュール内で宣言されたインポートそれぞれに対応するプロパティが存在する必要があります。そうでない場合、 WebAssembly.LinkError が発生します。

WebAssembly モジュールの同期的なインスタンス化

次のように WebAssembly.Instance() コンストラクター関数を呼び出して、渡した WebAssembly.Module オブジェクトを同期的にインスタンス化することができます。

js
const importObject = {
  imports: {
    imported_func: function (arg) {
      console.log(arg);
    },
  },
};

fetch("simple.wasm")
  .then((response) => response.arrayBuffer())
  .then((bytes) => {
    let mod = new WebAssembly.Module(bytes);
    let instance = new WebAssembly.Instance(mod, importObject);
    instance.exports.exported_func();
  });

ただし、Instance を取得する方法としては、次のように、非同期の WebAssembly.instantiateStreaming() 関数を使用することをお勧めします。

js
const importObject = {
  imports: {
    imported_func: function (arg) {
      console.log(arg);
    },
  },
};

WebAssembly.instantiateStreaming(fetch("simple.wasm"), importObject).then(
  (obj) => obj.instance.exports.exported_func(),
);

仕様書

Specification
WebAssembly JavaScript Interface
# dom-instance-instance

ブラウザーの互換性

BCD tables only load in the browser

関連情報