Search code examples
javascriptimportwebassemblydenodynamic-import

Dynamically import WebAssembly from variable


It's possible to dynamically import Javascript from a string:

const code = "console.log('Hello, world!');"

import("data:text/javascript;base64," + btoa(code));

I have a Uint8Array containing code compiled to WebAssembly, and I want to dynamically import it in the same way:

import("data:binary/webassembly;base64,..."); // Something like this

Solution

  • You can import WebAssembly code in your imported JavaScript/TypeScript code.

    The following uses the example from Using WebAssembly in Deno | Manual | Deno:

    const code = `\
    const wasmCode = new Uint8Array([
      0, 97, 115, 109, 1, 0, 0, 0, 1, 133, 128, 128, 128, 0, 1, 96, 0, 1, 127,
      3, 130, 128, 128, 128, 0, 1, 0, 4, 132, 128, 128, 128, 0, 1, 112, 0, 0,
      5, 131, 128, 128, 128, 0, 1, 0, 1, 6, 129, 128, 128, 128, 0, 0, 7, 145,
      128, 128, 128, 0, 2, 6, 109, 101, 109, 111, 114, 121, 2, 0, 4, 109, 97,
      105, 110, 0, 0, 10, 138, 128, 128, 128, 0, 1, 132, 128, 128, 128, 0, 0,
      65, 42, 11
    ]);
    
    const wasmModule = new WebAssembly.Module(wasmCode);
    
    const wasmInstance = new WebAssembly.Instance(wasmModule);
    
    const main = wasmInstance.exports.main as CallableFunction;
    console.log(main().toString());
    `;
    
    import("data:text/typescript;base64," + btoa(code));
    

    The same can be done using text/javascript rather than text/typescript as long as you remove the type cast in the code.