Skip to content

Commit

Permalink
fix web worker chunk loadign for non-js chunks
Browse files Browse the repository at this point in the history
  • Loading branch information
sokra committed Mar 11, 2021
1 parent cbcc873 commit cf20878
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 52 deletions.
42 changes: 22 additions & 20 deletions lib/node/RequireChunkLoadingRuntimeModule.js
Expand Up @@ -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",
"",
Expand Down
84 changes: 52 additions & 32 deletions lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js
Expand Up @@ -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 {
Expand All @@ -25,6 +27,7 @@ class ImportScriptsChunkLoadingRuntimeModule extends RuntimeModule {
const {
chunk,
compilation: {
chunkGraph,
runtimeTemplate,
outputOptions: { globalObject, chunkLoadingGlobal, hotUpdateGlobal }
}
Expand All @@ -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),
{
Expand All @@ -51,6 +58,7 @@ class ImportScriptsChunkLoadingRuntimeModule extends RuntimeModule {
}
);
const rootOutputDir = getUndoPath(outputName, false);

return Template.asString([
withBaseURI
? Template.asString([
Expand All @@ -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",
"",
Expand Down

0 comments on commit cf20878

Please sign in to comment.