Skip to content

Commit 685cbcd

Browse files
committed
Initial rework per sokra's suggestion
1 parent e483682 commit 685cbcd

File tree

2 files changed

+52
-42
lines changed

2 files changed

+52
-42
lines changed

lib/Chunk.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -607,10 +607,10 @@ class Chunk {
607607
return result;
608608
}
609609

610-
getChildIdsByOrdersMap() {
610+
getChildIdsByOrdersMap(includeImmediateChildren) {
611611
const chunkMaps = Object.create(null);
612612

613-
for (const chunk of this.getAllAsyncChunks()) {
613+
function addChunkChildrenToMap(chunk) {
614614
const data = chunk.getChildIdsByOrders();
615615
for (const key of Object.keys(data)) {
616616
let chunkMap = chunkMaps[key];
@@ -620,6 +620,15 @@ class Chunk {
620620
chunkMap[chunk.id] = data[key];
621621
}
622622
}
623+
624+
for (const chunk of this.getAllAsyncChunks()) {
625+
addChunkChildrenToMap(chunk);
626+
}
627+
628+
if (includeImmediateChildren) {
629+
addChunkChildrenToMap(this);
630+
}
631+
623632
return chunkMaps;
624633
}
625634

lib/web/JsonpMainTemplatePlugin.js

Lines changed: 41 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -310,45 +310,6 @@ class JsonpMainTemplatePlugin {
310310
]);
311311
}
312312
);
313-
mainTemplate.hooks.requireEnsure.tap(
314-
{
315-
name: "JsonpMainTemplatePlugin prefetch",
316-
stage: 20
317-
},
318-
(source, chunk, hash) => {
319-
const chunkMap = chunk.getChildIdsByOrdersMap().prefetch;
320-
if (!chunkMap || Object.keys(chunkMap).length === 0) return source;
321-
return Template.asString([
322-
source,
323-
"",
324-
"// chunk prefetching for javascript",
325-
"",
326-
`var chunkPrefetchMap = ${JSON.stringify(chunkMap, null, "\t")}`,
327-
"",
328-
"var chunkPrefetchData = chunkPrefetchMap[chunkId];",
329-
"if(chunkPrefetchData) {",
330-
Template.indent([
331-
"Promise.all(promises).then(function() {",
332-
Template.indent([
333-
"var head = document.getElementsByTagName('head')[0];",
334-
"chunkPrefetchData.forEach(function(chunkId) {",
335-
Template.indent([
336-
"if(installedChunks[chunkId] === undefined) {",
337-
Template.indent([
338-
"installedChunks[chunkId] = null;",
339-
mainTemplate.hooks.linkPrefetch.call("", chunk, hash),
340-
"head.appendChild(link);"
341-
]),
342-
"}"
343-
]),
344-
"});"
345-
]),
346-
"})"
347-
]),
348-
"}"
349-
]);
350-
}
351-
);
352313
mainTemplate.hooks.requireExtensions.tap(
353314
"JsonpMainTemplatePlugin",
354315
(source, chunk) => {
@@ -369,6 +330,7 @@ class JsonpMainTemplatePlugin {
369330
(source, chunk, hash) => {
370331
if (needChunkLoadingCode(chunk)) {
371332
const withDefer = needEntryDeferringCode(chunk);
333+
const chunkMap = chunk.getChildIdsByOrdersMap(true).prefetch;
372334
return Template.asString([
373335
source,
374336
"",
@@ -417,7 +379,34 @@ class JsonpMainTemplatePlugin {
417379
"// run deferred modules when all chunks ready",
418380
"return checkDeferredModules();"
419381
])
420-
: ""
382+
: "",
383+
"",
384+
"// chunk prefetching for javascript",
385+
"",
386+
`var chunkPrefetchMap = ${JSON.stringify(chunkMap, null, "\t")}`,
387+
"",
388+
"for(let j = 0;j < chunkIds.length; j++) {",
389+
Template.indent([
390+
"chunkId = chunkIds[j];",
391+
"var chunkPrefetchData = chunkPrefetchMap[chunkId];",
392+
"if(chunkPrefetchData) {",
393+
Template.indent([
394+
"var head = document.getElementsByTagName('head')[0];",
395+
"chunkPrefetchData.forEach(function(chunkId) {",
396+
Template.indent([
397+
"if(installedChunks[chunkId] === undefined) {",
398+
Template.indent([
399+
"installedChunks[chunkId] = null;",
400+
mainTemplate.hooks.linkPrefetch.call("", chunk, hash),
401+
"head.appendChild(link);"
402+
]),
403+
"}"
404+
]),
405+
"});"
406+
]),
407+
"}"
408+
]),
409+
"}"
421410
]),
422411
"};",
423412
withDefer
@@ -479,6 +468,18 @@ class JsonpMainTemplatePlugin {
479468
return source;
480469
}
481470
);
471+
mainTemplate.hooks.beforeStartup.tap(
472+
"JsonpMainTemplatePlugin",
473+
(source, chunk, hash) => {
474+
if (needChunkLoadingCode(chunk)) {
475+
return Template.asString([
476+
source,
477+
`webpackJsonpCallback([${JSON.stringify(chunk.ids)}, {}])`
478+
]);
479+
}
480+
return source;
481+
}
482+
);
482483
mainTemplate.hooks.startup.tap(
483484
"JsonpMainTemplatePlugin",
484485
(source, chunk, hash) => {

0 commit comments

Comments
 (0)