/
githubmirror
/
webpack
Обзор
Документация
Войти
/
githubmirror
/
webpack
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
lib/wasm-sync/WebAssemblyModulesPlugin.js
183 строки
5 KB
Alexander Akait
perf: load webpack's own modules only when a build needs them (#21652)
10 авг 2026, 07:32
Не верифицирован
10 авг 2026, 07:32
8e28763
Код
Авторство
О чём код?
/* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ "use strict"; const Generator = require("../Generator"); const { JAVASCRIPT_TYPE, WEBASSEMBLY_TYPE } = require("../ModuleSourceTypeConstants"); const { WEBASSEMBLY_MODULE_TYPE_SYNC } = require("../ModuleTypeConstants"); const WebAssemblyExportImportedDependency = require("../dependencies/WebAssemblyExportImportedDependency"); const WebAssemblyImportDependency = require("../dependencies/WebAssemblyImportDependency"); const { compareModulesByFullName } = require("../util/comparators"); const lazyModule = require("../util/lazyModule"); const preloadModuleType = require("../util/preloadModuleType"); const WebAssemblyInInitialChunkError = require("./WebAssemblyInInitialChunkError"); /** @typedef {import("../Compiler")} Compiler */ /** @typedef {import("../Module")} Module */ const getWebAssemblyGenerator = lazyModule(() => require("./WebAssemblyGenerator") ); const getWebAssemblyJavascriptGenerator = lazyModule(() => require("./WebAssemblyJavascriptGenerator") ); const getWebAssemblyParser = lazyModule(() => require("./WebAssemblyParser")); const getSyncWasmModule = lazyModule(() => require("./SyncWasmModule")); const PLUGIN_NAME = "WebAssemblyModulesPlugin"; /** * Options that influence how synchronous WebAssembly modules are transformed * and emitted. * @typedef {object} WebAssemblyModulesPluginOptions * @property {boolean=} mangleImports mangle imports */ /** * Adds parser, generator, manifest, and validation support for synchronous * WebAssembly modules in the compilation pipeline. */ class WebAssemblyModulesPlugin { /** * Stores options that affect generated synchronous WebAssembly output. * @param {WebAssemblyModulesPluginOptions} options options */ constructor(options) { /** @type {WebAssemblyModulesPluginOptions} */ this.options = options; } /** * Registers compilation hooks that parse and generate sync WebAssembly * modules, emit their binary assets, and report invalid placement in initial * chunks. * @param {Compiler} compiler the compiler instance * @returns {void} */ apply(compiler) { compiler.hooks.compilation.tap( PLUGIN_NAME, (compilation, { normalModuleFactory }) => { compilation.dependencyFactories.set( WebAssemblyImportDependency, normalModuleFactory ); compilation.dependencyFactories.set( WebAssemblyExportImportedDependency, normalModuleFactory ); preloadModuleType(normalModuleFactory, PLUGIN_NAME, [ [ WEBASSEMBLY_MODULE_TYPE_SYNC, [ getSyncWasmModule, getWebAssemblyParser, getWebAssemblyJavascriptGenerator, getWebAssemblyGenerator ] ] ]); normalModuleFactory.hooks.createModuleClass .for(WEBASSEMBLY_MODULE_TYPE_SYNC) .tap(PLUGIN_NAME, (createData, _resolveData) => { const SyncWasmModule = getSyncWasmModule.loaded(); return new SyncWasmModule(createData); }); normalModuleFactory.hooks.createParser .for(WEBASSEMBLY_MODULE_TYPE_SYNC) .tap(PLUGIN_NAME, () => { const WebAssemblyParser = getWebAssemblyParser.loaded(); return new WebAssemblyParser(); }); normalModuleFactory.hooks.createGenerator .for(WEBASSEMBLY_MODULE_TYPE_SYNC) .tap(PLUGIN_NAME, () => { const WebAssemblyJavascriptGenerator = getWebAssemblyJavascriptGenerator.loaded(); const WebAssemblyGenerator = getWebAssemblyGenerator.loaded(); return Generator.byType({ [JAVASCRIPT_TYPE]: new WebAssemblyJavascriptGenerator(), [WEBASSEMBLY_TYPE]: new WebAssemblyGenerator(this.options) }); }); compilation.hooks.renderManifest.tap(PLUGIN_NAME, (result, options) => { const { chunkGraph } = compilation; const { chunk, outputOptions, codeGenerationResults } = options; for (const module of chunkGraph.getOrderedChunkModulesIterable( chunk, compareModulesByFullName(compiler) )) { if (module.type === WEBASSEMBLY_MODULE_TYPE_SYNC) { const filenameTemplate = outputOptions.webassemblyModuleFilename; result.push({ render: () => codeGenerationResults.getSource( module, chunk.runtime, "webassembly" ), filenameTemplate, pathOptions: { module, runtime: chunk.runtime, chunkGraph }, auxiliary: true, identifier: `webassemblyModule${chunkGraph.getModuleId( module )}`, hash: chunkGraph.getModuleHash(module, chunk.runtime) }); } } return result; }); compilation.hooks.afterChunks.tap(PLUGIN_NAME, () => { const chunkGraph = compilation.chunkGraph; /** @type {Set<Module>} */ const initialWasmModules = new Set(); for (const chunk of compilation.chunks) { if (chunk.canBeInitial()) { for (const module of chunkGraph.getChunkModulesIterable(chunk)) { if (module.type === WEBASSEMBLY_MODULE_TYPE_SYNC) { initialWasmModules.add(module); } } } } for (const module of initialWasmModules) { compilation.errors.push( new WebAssemblyInInitialChunkError( module, compilation.moduleGraph, compilation.chunkGraph, compilation.requestShortener ) ); } }); } ); } } module.exports = WebAssemblyModulesPlugin;