From cf208782e6cbfd2949ada7584d2c05bb81077b53 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Thu, 11 Mar 2021 18:32:32 +0100 Subject: [PATCH] fix web worker chunk loadign for non-js chunks --- lib/node/RequireChunkLoadingRuntimeModule.js | 42 +++++----- .../ImportScriptsChunkLoadingRuntimeModule.js | 84 ++++++++++++------- 2 files changed, 74 insertions(+), 52 deletions(-) diff --git a/lib/node/RequireChunkLoadingRuntimeModule.js b/lib/node/RequireChunkLoadingRuntimeModule.js index 365d2ce5230..0ca33c75812 100644 --- a/lib/node/RequireChunkLoadingRuntimeModule.js +++ b/lib/node/RequireChunkLoadingRuntimeModule.js @@ -93,28 +93,30 @@ class RequireChunkLoadingRuntimeModule extends RuntimeModule { withLoading ? Template.asString([ "// require() chunk loading for javascript", - `${fn}.require = function(chunkId, promises) {`, - hasJsMatcher !== false - ? Template.indent([ - "", - '// "1" is the signal for "already loaded"', - "if(!installedChunks[chunkId]) {", - Template.indent([ - hasJsMatcher === true - ? "if(true) { // all chunks have JS" - : `if(${hasJsMatcher("chunkId")}) {`, + `${fn}.require = ${runtimeTemplate.basicFunction( + "chunkId, promises", + hasJsMatcher !== false + ? [ + '// "1" is the signal for "already loaded"', + "if(!installedChunks[chunkId]) {", Template.indent([ - `installChunk(require(${JSON.stringify( - rootOutputDir - )} + ${RuntimeGlobals.getChunkScriptFilename}(chunkId)));` + hasJsMatcher === true + ? "if(true) { // all chunks have JS" + : `if(${hasJsMatcher("chunkId")}) {`, + Template.indent([ + `installChunk(require(${JSON.stringify( + rootOutputDir + )} + ${ + RuntimeGlobals.getChunkScriptFilename + }(chunkId)));` + ]), + "} else installedChunks[chunkId] = 1;", + "" ]), - "} else installedChunks[chunkId] = 1;", - "" - ]), - "}" - ]) - : "installedChunks[chunkId] = 1;", - "};" + "}" + ] + : "installedChunks[chunkId] = 1;" + )};` ]) : "// no chunk loading", "", diff --git a/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js b/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js index 1080b82261e..5a99f1cf2c4 100644 --- a/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +++ b/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js @@ -8,8 +8,10 @@ const RuntimeGlobals = require("../RuntimeGlobals"); const RuntimeModule = require("../RuntimeModule"); const Template = require("../Template"); const { - getChunkFilenameTemplate + getChunkFilenameTemplate, + chunkHasJs } = require("../javascript/JavascriptModulesPlugin"); +const compileBooleanMatcher = require("../util/compileBooleanMatcher"); const { getUndoPath } = require("../util/identifier"); class ImportScriptsChunkLoadingRuntimeModule extends RuntimeModule { @@ -25,6 +27,7 @@ class ImportScriptsChunkLoadingRuntimeModule extends RuntimeModule { const { chunk, compilation: { + chunkGraph, runtimeTemplate, outputOptions: { globalObject, chunkLoadingGlobal, hotUpdateGlobal } } @@ -43,6 +46,10 @@ class ImportScriptsChunkLoadingRuntimeModule extends RuntimeModule { const chunkLoadingGlobalExpr = `${globalObject}[${JSON.stringify( chunkLoadingGlobal )}]`; + const hasJsMatcher = compileBooleanMatcher( + chunkGraph.getChunkConditionMap(chunk, chunkHasJs) + ); + const outputName = this.compilation.getPath( getChunkFilenameTemplate(chunk, this.compilation.outputOptions), { @@ -51,6 +58,7 @@ class ImportScriptsChunkLoadingRuntimeModule extends RuntimeModule { } ); const rootOutputDir = getUndoPath(outputName, false); + return Template.asString([ withBaseURI ? Template.asString([ @@ -71,42 +79,54 @@ class ImportScriptsChunkLoadingRuntimeModule extends RuntimeModule { withLoading ? Template.asString([ "// importScripts chunk loading", - `var chunkLoadingCallback = ${runtimeTemplate.basicFunction( - "data", - [ - runtimeTemplate.destructureArray( - ["chunkIds", "moreModules", "runtime"], - "data" - ), - "for(var moduleId in moreModules) {", - Template.indent([ - `if(${RuntimeGlobals.hasOwnProperty}(moreModules, moduleId)) {`, - Template.indent( - `${RuntimeGlobals.moduleFactories}[moduleId] = moreModules[moduleId];` - ), - "}" - ]), - "}", - "if(runtime) runtime(__webpack_require__);", - "while(chunkIds.length)", - Template.indent("installedChunks[chunkIds.pop()] = 1;"), - "parentChunkLoadingFunction(data);" - ] - )};`, - `${fn}.i = ${runtimeTemplate.basicFunction("chunkId, promises", [ - '// "1" is the signal for "already loaded"', - "if(!installedChunks[chunkId]) {", + `var installChunk = ${runtimeTemplate.basicFunction("data", [ + runtimeTemplate.destructureArray( + ["chunkIds", "moreModules", "runtime"], + "data" + ), + "for(var moduleId in moreModules) {", Template.indent([ - `importScripts(${JSON.stringify(rootOutputDir)} + ${ - RuntimeGlobals.getChunkScriptFilename - }(chunkId));` + `if(${RuntimeGlobals.hasOwnProperty}(moreModules, moduleId)) {`, + Template.indent( + `${RuntimeGlobals.moduleFactories}[moduleId] = moreModules[moduleId];` + ), + "}" ]), - "}" - ])};`, + "}", + "if(runtime) runtime(__webpack_require__);", + "while(chunkIds.length)", + Template.indent("installedChunks[chunkIds.pop()] = 1;"), + "parentChunkLoadingFunction(data);" + ])};` + ]) + : "// no chunk install function needed", + withLoading + ? Template.asString([ + `${fn}.i = ${runtimeTemplate.basicFunction( + "chunkId, promises", + hasJsMatcher !== false + ? [ + '// "1" is the signal for "already loaded"', + "if(!installedChunks[chunkId]) {", + Template.indent([ + hasJsMatcher === true + ? "if(true) { // all chunks have JS" + : `if(${hasJsMatcher("chunkId")}) {`, + Template.indent( + `importScripts(${JSON.stringify(rootOutputDir)} + ${ + RuntimeGlobals.getChunkScriptFilename + }(chunkId));` + ), + "}" + ]), + "}" + ] + : "installedChunks[chunkId] = 1;" + )};`, "", `var chunkLoadingGlobal = ${chunkLoadingGlobalExpr} = ${chunkLoadingGlobalExpr} || [];`, "var parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);", - "chunkLoadingGlobal.push = chunkLoadingCallback;" + "chunkLoadingGlobal.push = installChunk;" ]) : "// no chunk loading", "",