WXL
3 天以前 9bce51f651aad297ef9eb6df832bfdaf1de05d84
node_modules/webpack/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js
@@ -8,6 +8,7 @@
const { WEBASSEMBLY_MODULE_TYPE_ASYNC } = require("../ModuleTypeConstants");
const RuntimeGlobals = require("../RuntimeGlobals");
const Template = require("../Template");
const AsyncWasmCompileRuntimeModule = require("../wasm-async/AsyncWasmCompileRuntimeModule");
const AsyncWasmLoadingRuntimeModule = require("../wasm-async/AsyncWasmLoadingRuntimeModule");
/** @typedef {import("../Chunk")} Chunk */
@@ -15,9 +16,14 @@
const PLUGIN_NAME = "UniversalCompileAsyncWasmPlugin";
/**
 * Enables async WebAssembly loading that works in both browser-like and Node.js
 * environments by selecting the appropriate binary-loading strategy at runtime.
 */
class UniversalCompileAsyncWasmPlugin {
   /**
    * Apply the plugin
    * Registers compilation hooks that attach the universal async wasm runtime
    * to chunks using `wasmLoading: "universal"`.
    * @param {Compiler} compiler the compiler instance
    * @returns {void}
    */
@@ -25,6 +31,8 @@
      compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => {
         const globalWasmLoading = compilation.outputOptions.wasmLoading;
         /**
          * Determines whether the chunk should use the universal async wasm
          * loading backend.
          * @param {Chunk} chunk chunk
          * @returns {boolean} true, if wasm loading is enabled for the chunk
          */
@@ -36,13 +44,15 @@
                  : globalWasmLoading;
            return wasmLoading === "universal";
         };
         const generateBeforeInstantiateStreaming = () =>
         const generateBeforeStreaming = () =>
            Template.asString([
               "if (!useFetch) {",
               Template.indent(["return fallback();"]),
               "}"
            ]);
         /**
          * Generates setup code that decides whether the current environment can
          * use `fetch` and captures the wasm module URL.
          * @param {string} path path
          * @returns {string} code
          */
@@ -52,6 +62,8 @@
               `var wasmUrl = ${path};`
            ]);
         /**
          * Generates the runtime expression that fetches the binary in browsers
          * or reads it from the filesystem in Node.js.
          * @type {(path: string) => string}
          */
         const generateLoadBinaryCode = () =>
@@ -95,7 +107,30 @@
                  new AsyncWasmLoadingRuntimeModule({
                     generateBeforeLoadBinaryCode,
                     generateLoadBinaryCode,
                     generateBeforeInstantiateStreaming,
                     generateBeforeInstantiateStreaming: generateBeforeStreaming,
                     supportsStreaming: true
                  })
               );
            });
         compilation.hooks.runtimeRequirementInTree
            .for(RuntimeGlobals.compileWasm)
            .tap(PLUGIN_NAME, (chunk, set, { chunkGraph }) => {
               if (!isEnabledForChunk(chunk)) return;
               if (
                  !chunkGraph.hasModuleInGraph(
                     chunk,
                     (m) => m.type === WEBASSEMBLY_MODULE_TYPE_ASYNC
                  )
               ) {
                  return;
               }
               compilation.addRuntimeModule(
                  chunk,
                  new AsyncWasmCompileRuntimeModule({
                     generateBeforeLoadBinaryCode,
                     generateLoadBinaryCode,
                     generateBeforeCompileStreaming: generateBeforeStreaming,
                     supportsStreaming: true
                  })
               );