@@ -115,7 +115,11 @@
),
"};",
"",
- needEntryDeferringCode(chunk) ? "var deferredModules = [];" : ""
+ needEntryDeferringCode(chunk)
+ ? needPrefetchingCode(chunk)
+ ? "var deferredModules = [], deferredPrefetch = [];"
+ : "var deferredModules = [];"
+ : ""
);
}
if (needChunkOnDemandLoadingCode(chunk)) {
@@ -169,6 +173,8 @@
"}"
])
: "",
+ "// create error before stack unwound to get useful stacktrace later",
+ "var error = new Error();",
"onScriptComplete = function (event) {",
Template.indent([
"// avoid mem leaks in IE.",
@@ -181,7 +187,7 @@
Template.indent([
"var errorType = event && (event.type === 'load' ? 'missing' : event.type);",
"var realSrc = event && event.target && event.target.src;",
- "var error = new Error('Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')');",
+ "error.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';",
"error.type = errorType;",
"error.request = realSrc;",
"chunk[1](error);"
@@ -384,7 +390,9 @@
"}",
"if(parentJsonpFunction) parentJsonpFunction(data);",
withPrefetch
- ? Template.asString([
+ ? withDefer
+ ? "deferredPrefetch.push.apply(deferredPrefetch, prefetchChunks);"
+ : Template.asString([
"// chunk prefetching for javascript",
"prefetchChunks.forEach(function(chunkId) {",
Template.indent([
@@ -441,6 +449,31 @@
"}"
]),
"}",
+ withPrefetch
+ ? Template.asString([
+ "if(deferredModules.length === 0) {",
+ Template.indent([
+ "// chunk prefetching for javascript",
+ "deferredPrefetch.forEach(function(chunkId) {",
+ Template.indent([
+ "if(installedChunks[chunkId] === undefined) {",
+ Template.indent([
+ "installedChunks[chunkId] = null;",
+ mainTemplate.hooks.linkPrefetch.call(
+ "",
+ chunk,
+ hash
+ ),
+ "document.head.appendChild(link);"
+ ]),
+ "}"
+ ]),
+ "});",
+ "deferredPrefetch.length = 0;"
+ ]),
+ "}"
+ ])
+ : "",
"return result;"
]),
"}"
@@ -473,7 +506,7 @@
return source;
}
);
- mainTemplate.hooks.beforeStartup.tap(
+ mainTemplate.hooks.afterStartup.tap(
"JsonpMainTemplatePlugin",
(source, chunk, hash) => {
const prefetchChunks = chunk.getChildIdsByOrders().prefetch;