You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.6 KiB
62 lines
1.6 KiB
/* |
|
MIT License http://www.opensource.org/licenses/mit-license.php |
|
Author Tobias Koppers @sokra |
|
*/ |
|
|
|
"use strict"; |
|
|
|
const RuntimeGlobals = require("../RuntimeGlobals"); |
|
const AsyncWasmLoadingRuntimeModule = require("../wasm-async/AsyncWasmLoadingRuntimeModule"); |
|
|
|
/** @typedef {import("../Compiler")} Compiler */ |
|
|
|
class FetchCompileAsyncWasmPlugin { |
|
/** |
|
* Apply the plugin |
|
* @param {Compiler} compiler the compiler instance |
|
* @returns {void} |
|
*/ |
|
apply(compiler) { |
|
compiler.hooks.thisCompilation.tap( |
|
"FetchCompileAsyncWasmPlugin", |
|
compilation => { |
|
const globalWasmLoading = compilation.outputOptions.wasmLoading; |
|
const isEnabledForChunk = chunk => { |
|
const options = chunk.getEntryOptions(); |
|
const wasmLoading = |
|
options && options.wasmLoading !== undefined |
|
? options.wasmLoading |
|
: globalWasmLoading; |
|
return wasmLoading === "fetch"; |
|
}; |
|
const generateLoadBinaryCode = path => |
|
`fetch(${RuntimeGlobals.publicPath} + ${path})`; |
|
|
|
compilation.hooks.runtimeRequirementInTree |
|
.for(RuntimeGlobals.instantiateWasm) |
|
.tap("FetchCompileAsyncWasmPlugin", (chunk, set) => { |
|
if (!isEnabledForChunk(chunk)) return; |
|
const chunkGraph = compilation.chunkGraph; |
|
if ( |
|
!chunkGraph.hasModuleInGraph( |
|
chunk, |
|
m => m.type === "webassembly/async" |
|
) |
|
) { |
|
return; |
|
} |
|
set.add(RuntimeGlobals.publicPath); |
|
compilation.addRuntimeModule( |
|
chunk, |
|
new AsyncWasmLoadingRuntimeModule({ |
|
generateLoadBinaryCode, |
|
supportsStreaming: true |
|
}) |
|
); |
|
}); |
|
} |
|
); |
|
} |
|
} |
|
|
|
module.exports = FetchCompileAsyncWasmPlugin;
|
|
|