12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- /*
- MIT License http://www.opensource.org/licenses/mit-license.php
- */
- "use strict";
- const WebpackError = require("../WebpackError");
- /** @typedef {import("../Module")} Module */
- /** @typedef {import("../RequestShortener")} RequestShortener */
- /**
- * @param {Module} module module to get chains from
- * @param {RequestShortener} requestShortener to make readable identifiers
- * @returns {string[]} all chains to the module
- */
- const getInitialModuleChains = (module, requestShortener) => {
- const queue = [
- { head: module, message: module.readableIdentifier(requestShortener) }
- ];
- /** @type {Set<string>} */
- const results = new Set();
- /** @type {Set<string>} */
- const incompleteResults = new Set();
- /** @type {Set<Module>} */
- const visitedModules = new Set();
- for (const chain of queue) {
- const { head, message } = chain;
- let final = true;
- /** @type {Set<Module>} */
- const alreadyReferencedModules = new Set();
- for (const reason of head.reasons) {
- const newHead = reason.module;
- if (newHead) {
- if (!newHead.getChunks().some(c => c.canBeInitial())) continue;
- final = false;
- if (alreadyReferencedModules.has(newHead)) continue;
- alreadyReferencedModules.add(newHead);
- const moduleName = newHead.readableIdentifier(requestShortener);
- const detail = reason.explanation ? ` (${reason.explanation})` : "";
- const newMessage = `${moduleName}${detail} --> ${message}`;
- if (visitedModules.has(newHead)) {
- incompleteResults.add(`... --> ${newMessage}`);
- continue;
- }
- visitedModules.add(newHead);
- queue.push({
- head: newHead,
- message: newMessage
- });
- } else {
- final = false;
- const newMessage = reason.explanation
- ? `(${reason.explanation}) --> ${message}`
- : message;
- results.add(newMessage);
- }
- }
- if (final) {
- results.add(message);
- }
- }
- for (const result of incompleteResults) {
- results.add(result);
- }
- return Array.from(results);
- };
- module.exports = class WebAssemblyInInitialChunkError extends WebpackError {
- /**
- * @param {Module} module WASM module
- * @param {RequestShortener} requestShortener request shortener
- */
- constructor(module, requestShortener) {
- const moduleChains = getInitialModuleChains(module, requestShortener);
- const message = `WebAssembly module is included in initial chunk.
- This is not allowed, because WebAssembly download and compilation must happen asynchronous.
- Add an async splitpoint (i. e. import()) somewhere between your entrypoint and the WebAssembly module:
- ${moduleChains.map(s => `* ${s}`).join("\n")}`;
- super(message);
- this.name = "WebAssemblyInInitialChunkError";
- this.hideStack = true;
- this.module = module;
- Error.captureStackTrace(this, this.constructor);
- }
- };
|