From 4bc0aae40e82f8b73139a517029cd96ed0f1f621 Mon Sep 17 00:00:00 2001 From: Ori Date: Thu, 13 Jul 2023 13:42:15 +0300 Subject: [PATCH 1/8] feat: add webpackPrefetch support for css files --- src/index.js | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index b40d0e10..f07afeac 100644 --- a/src/index.js +++ b/src/index.js @@ -4,6 +4,11 @@ const path = require("path"); const { validate } = require("schema-utils"); +// @ts-ignore +const JsonpChunkLoadingRuntimeModule = require("webpack/lib/web/JsonpChunkLoadingRuntimeModule"); +// @ts-ignore +const compileBooleanMatcher = require("webpack/lib/util/compileBooleanMatcher"); + const schema = require("./plugin-options.json"); const { trueFn, @@ -807,6 +812,22 @@ class MiniCssExtractPlugin { return obj; }; + // @ts-ignore + function chunkHasCss(chunk, chunkGraph) { + // this function replace: + // const chunkHasCss = require("webpack/lib/css/CssModulesPlugin").chunkHasCss; + return ( + !!chunkGraph.getChunkModulesIterableBySourceType(chunk, "css") || + !!chunkGraph.getChunkModulesIterableBySourceType( + chunk, + "css-import" + ) || + !!chunkGraph.getChunkModulesIterableBySourceType( + chunk, + "css/mini-extract" + ) + ); + } class CssLoadingRuntimeModule extends RuntimeModule { /** @@ -821,12 +842,19 @@ class MiniCssExtractPlugin { } generate() { - const { chunk, runtimeRequirements } = this; + const { chunkGraph, chunk, runtimeRequirements } = this; const { runtimeTemplate, outputOptions: { crossOriginLoading }, } = this.compilation; const chunkMap = getCssChunkObject(chunk, this.compilation); + const { linkPrefetch } = + JsonpChunkLoadingRuntimeModule.getCompilationHooks(compilation); + const conditionMap = chunkGraph.getChunkConditionMap( + chunk, + chunkHasCss + ); + const hasCssMatcher = compileBooleanMatcher(conditionMap); const withLoading = runtimeRequirements.has(RuntimeGlobals.ensureChunkHandlers) && @@ -834,6 +862,9 @@ class MiniCssExtractPlugin { const withHmr = runtimeRequirements.has( RuntimeGlobals.hmrDownloadUpdateHandlers ); + const withPrefetch = runtimeRequirements.has( + RuntimeGlobals.prefetchChunkHandlers + ); if (!withLoading && !withHmr) { return ""; @@ -1037,6 +1068,42 @@ class MiniCssExtractPlugin { )}`, ]) : "// no hmr", + "", + withPrefetch && hasCssMatcher !== false + ? `${ + RuntimeGlobals.prefetchChunkHandlers + }.miniCss = ${runtimeTemplate.basicFunction("chunkId", [ + `if((!${ + RuntimeGlobals.hasOwnProperty + }(installedCssChunks, chunkId) || installedCssChunks[chunkId] === undefined) && ${ + hasCssMatcher === true ? "true" : hasCssMatcher("chunkId") + }) {`, + Template.indent([ + "installedCssChunks[chunkId] = null;", + linkPrefetch.call( + Template.asString([ + "var link = document.createElement('link');", + crossOriginLoading + ? `link.crossOrigin = ${JSON.stringify( + crossOriginLoading + )};` + : "", + `if (${RuntimeGlobals.scriptNonce}) {`, + Template.indent( + `link.setAttribute("nonce", ${RuntimeGlobals.scriptNonce});` + ), + "}", + 'link.rel = "prefetch";', + 'link.as = "style";', + `link.href = ${RuntimeGlobals.publicPath} + ${RuntimeGlobals.require}.miniCssF(chunkId);`, + ]), + chunk + ), + "document.head.appendChild(link);", + ]), + "}", + ])};` + : "// no prefetching", ]); } } From 978b5fa65939c78e31ab9cc47711be3f5f8025e8 Mon Sep 17 00:00:00 2001 From: Ori Date: Thu, 13 Jul 2023 14:00:07 +0300 Subject: [PATCH 2/8] feat: add webpackPreload support for css files --- src/index.js | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index f07afeac..3a867785 100644 --- a/src/index.js +++ b/src/index.js @@ -848,7 +848,7 @@ class MiniCssExtractPlugin { outputOptions: { crossOriginLoading }, } = this.compilation; const chunkMap = getCssChunkObject(chunk, this.compilation); - const { linkPrefetch } = + const { linkPreload, linkPrefetch } = JsonpChunkLoadingRuntimeModule.getCompilationHooks(compilation); const conditionMap = chunkGraph.getChunkConditionMap( chunk, @@ -865,6 +865,9 @@ class MiniCssExtractPlugin { const withPrefetch = runtimeRequirements.has( RuntimeGlobals.prefetchChunkHandlers ); + const withPreload = runtimeRequirements.has( + RuntimeGlobals.preloadChunkHandlers + ); if (!withLoading && !withHmr) { return ""; @@ -1104,6 +1107,51 @@ class MiniCssExtractPlugin { "}", ])};` : "// no prefetching", + "", + withPreload && hasCssMatcher !== false + ? `${ + RuntimeGlobals.preloadChunkHandlers + }.miniCss = ${runtimeTemplate.basicFunction("chunkId", [ + `if((!${ + RuntimeGlobals.hasOwnProperty + }(installedCssChunks, chunkId) || installedCssChunks[chunkId] === undefined) && ${ + hasCssMatcher === true ? "true" : hasCssMatcher("chunkId") + }) {`, + Template.indent([ + "installedCssChunks[chunkId] = null;", + linkPreload.call( + Template.asString([ + "var link = document.createElement('link');", + "link.charset = 'utf-8';", + `if (${RuntimeGlobals.scriptNonce}) {`, + Template.indent( + `link.setAttribute("nonce", ${RuntimeGlobals.scriptNonce});` + ), + "}", + 'link.rel = "preload";', + 'link.as = "style";', + `link.href = ${RuntimeGlobals.publicPath} + ${RuntimeGlobals.require}.miniCssF(chunkId);`, + crossOriginLoading + ? crossOriginLoading === "use-credentials" + ? 'link.crossOrigin = "use-credentials";' + : Template.asString([ + "if (link.href.indexOf(window.location.origin + '/') !== 0) {", + Template.indent( + `link.crossOrigin = ${JSON.stringify( + crossOriginLoading + )};` + ), + "}", + ]) + : "", + ]), + chunk + ), + "document.head.appendChild(link);", + ]), + "}", + ])};` + : "// no preloaded", ]); } } From d14f62c9d382b5cbaa7df12436bf236bfa42de82 Mon Sep 17 00:00:00 2001 From: Ori Date: Thu, 13 Jul 2023 14:01:13 +0300 Subject: [PATCH 3/8] fix: avoid prefetch/preload of loaded CSS files --- src/index.js | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index 3a867785..370f9c76 100644 --- a/src/index.js +++ b/src/index.js @@ -845,9 +845,10 @@ class MiniCssExtractPlugin { const { chunkGraph, chunk, runtimeRequirements } = this; const { runtimeTemplate, - outputOptions: { crossOriginLoading }, + outputOptions: { chunkLoadingGlobal, crossOriginLoading }, } = this.compilation; const chunkMap = getCssChunkObject(chunk, this.compilation); + const globalObject = runtimeTemplate.globalObject; const { linkPreload, linkPrefetch } = JsonpChunkLoadingRuntimeModule.getCompilationHooks(compilation); const conditionMap = chunkGraph.getChunkConditionMap( @@ -868,6 +869,9 @@ class MiniCssExtractPlugin { const withPreload = runtimeRequirements.has( RuntimeGlobals.preloadChunkHandlers ); + const chunkLoadingGlobalExpr = `${globalObject}[${JSON.stringify( + chunkLoadingGlobal + )}]`; if (!withLoading && !withHmr) { return ""; @@ -993,6 +997,23 @@ class MiniCssExtractPlugin { ), "};", "", + `var webpackJsonpCallback = ${runtimeTemplate.basicFunction( + "parentChunkLoadingFunction, data", + [ + runtimeTemplate.destructureArray(["chunkIds"], "data"), + "for(var i=0;i < chunkIds.length; i++) {", + Template.indent([ + "var chunkId = chunkIds[i];", + "installedCssChunks[chunkId] = 0;", + ]), + "}", + ] + )}`, + "", + `var chunkLoadingGlobal = ${chunkLoadingGlobalExpr} = ${chunkLoadingGlobalExpr} || [];`, + "chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));", + "chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));", + "", `${ RuntimeGlobals.ensureChunkHandlers }.miniCss = ${runtimeTemplate.basicFunction( @@ -1213,6 +1234,12 @@ class MiniCssExtractPlugin { compilation.hooks.runtimeRequirementInTree .for(RuntimeGlobals.hmrDownloadUpdateHandlers) .tap(pluginName, handler); + compilation.hooks.runtimeRequirementInTree + .for(RuntimeGlobals.prefetchChunkHandlers) + .tap(pluginName, handler); + compilation.hooks.runtimeRequirementInTree + .for(RuntimeGlobals.preloadChunkHandlers) + .tap(pluginName, handler); }); } From b785fd8eff6e09073f5d79f7dae498a3a2f62c32 Mon Sep 17 00:00:00 2001 From: Ori Date: Thu, 13 Jul 2023 14:02:34 +0300 Subject: [PATCH 4/8] fix: skip webpackPrefetch if preloaded --- src/index.js | 68 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 20 deletions(-) diff --git a/src/index.js b/src/index.js index 370f9c76..c01f5299 100644 --- a/src/index.js +++ b/src/index.js @@ -1103,27 +1103,55 @@ class MiniCssExtractPlugin { hasCssMatcher === true ? "true" : hasCssMatcher("chunkId") }) {`, Template.indent([ - "installedCssChunks[chunkId] = null;", - linkPrefetch.call( - Template.asString([ - "var link = document.createElement('link');", - crossOriginLoading - ? `link.crossOrigin = ${JSON.stringify( - crossOriginLoading - )};` - : "", - `if (${RuntimeGlobals.scriptNonce}) {`, - Template.indent( - `link.setAttribute("nonce", ${RuntimeGlobals.scriptNonce});` - ), - "}", - 'link.rel = "prefetch";', - 'link.as = "style";', - `link.href = ${RuntimeGlobals.publicPath} + ${RuntimeGlobals.require}.miniCssF(chunkId);`, + `var getLinkElements = function (rel, as) {`, + Template.indent([ + `var links = document.getElementsByTagName("link");`, + `var loadedLinks = [];`, + `for (var i = 0; i < links.length; i++) {`, + Template.indent([ + `if (`, + Template.indent([ + `links[i].getAttribute("rel") === rel &&`, + `links[i].getAttribute("as") === as`, + ]), + `) {`, + Template.indent([ + `loadedLinks.push(links[i].getAttribute("href"));`, + ]), + `}`, ]), - chunk - ), - "document.head.appendChild(link);", + `}`, + `return loadedLinks;`, + ]), + `};`, + "", + `var loadedPreloadLinkElements = getLinkElements("preload", "style");`, + `var chunkIdHref = ${RuntimeGlobals.publicPath} + ${RuntimeGlobals.require}.miniCssF(chunkId);`, + `if(!loadedPreloadLinkElements.includes(chunkIdHref)) {`, + Template.indent([ + "installedCssChunks[chunkId] = null;", + linkPrefetch.call( + Template.asString([ + "var link = document.createElement('link');", + crossOriginLoading + ? `link.crossOrigin = ${JSON.stringify( + crossOriginLoading + )};` + : "", + `if (${RuntimeGlobals.scriptNonce}) {`, + Template.indent( + `link.setAttribute("nonce", ${RuntimeGlobals.scriptNonce});` + ), + "}", + 'link.rel = "prefetch";', + 'link.as = "style";', + `link.href = ${RuntimeGlobals.publicPath} + ${RuntimeGlobals.require}.miniCssF(chunkId);`, + ]), + chunk + ), + "document.head.appendChild(link);", + ]), + `}`, ]), "}", ])};` From 64518339d71c70c03e52d1d8c8a8891268839aa2 Mon Sep 17 00:00:00 2001 From: Ori Date: Tue, 12 Mar 2024 23:18:18 +0200 Subject: [PATCH 5/8] refactor: add type annotations --- src/index.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/index.js b/src/index.js index f304fd90..5d81e36b 100644 --- a/src/index.js +++ b/src/index.js @@ -845,7 +845,12 @@ class MiniCssExtractPlugin { return obj; }; - // @ts-ignore + + /** + * @param {Chunk} chunk chunk + * @param {ChunkGraph} chunkGraph chunk graph + * @returns {boolean} true, when the chunk has css + */ function chunkHasCss(chunk, chunkGraph) { // this function replace: // const chunkHasCss = require("webpack/lib/css/CssModulesPlugin").chunkHasCss; @@ -884,13 +889,12 @@ class MiniCssExtractPlugin { /** @type {Chunk} */ (chunk), /** @type {Compilation} */ (this.compilation) ); - const globalObject = runtimeTemplate.globalObject; + const { globalObject } = runtimeTemplate; const { linkPreload, linkPrefetch } = JsonpChunkLoadingRuntimeModule.getCompilationHooks(compilation); - const conditionMap = chunkGraph.getChunkConditionMap( - chunk, - chunkHasCss - ); + const conditionMap = /** @type {ChunkGraph} */ ( + chunkGraph + ).getChunkConditionMap(/** @type {Chunk} */ (chunk), chunkHasCss); const hasCssMatcher = compileBooleanMatcher(conditionMap); const withLoading = From c0ec939492b5e848ec328d07789b6d7f8f56bed4 Mon Sep 17 00:00:00 2001 From: Ori Date: Wed, 13 Mar 2024 12:08:59 +0200 Subject: [PATCH 6/8] test: add preload and prefetch tests --- test/cases/prefetch-preload-mixed/a.js | 2 + test/cases/prefetch-preload-mixed/a1.js | 0 test/cases/prefetch-preload-mixed/a2.js | 0 test/cases/prefetch-preload-mixed/b.js | 3 + test/cases/prefetch-preload-mixed/b1.js | 0 test/cases/prefetch-preload-mixed/b2.js | 0 test/cases/prefetch-preload-mixed/b3.js | 0 test/cases/prefetch-preload-mixed/c.js | 2 + test/cases/prefetch-preload-mixed/c1.js | 0 test/cases/prefetch-preload-mixed/c2.js | 0 .../prefetch-preload-mixed/expected/a.js | 1 + .../prefetch-preload-mixed/expected/a1.js | 1 + .../prefetch-preload-mixed/expected/a2.js | 1 + .../prefetch-preload-mixed/expected/b.js | 1 + .../prefetch-preload-mixed/expected/b1.js | 1 + .../prefetch-preload-mixed/expected/b2.js | 1 + .../prefetch-preload-mixed/expected/b3.js | 1 + .../prefetch-preload-mixed/expected/c.js | 1 + .../prefetch-preload-mixed/expected/c1.js | 1 + .../prefetch-preload-mixed/expected/c2.js | 1 + .../prefetch-preload-mixed/expected/main.js | 1 + test/cases/prefetch-preload-mixed/index.js | 3 + .../prefetch-preload-mixed/webpack.config.js | 10 + test/cases/prefetch/expected/inner.js | 10 + test/cases/prefetch/expected/inner2.js | 17 + test/cases/prefetch/expected/main.js | 411 ++++++++++++++++++ test/cases/prefetch/expected/normal.js | 10 + test/cases/prefetch/expected/prefetched.js | 15 + test/cases/prefetch/expected/prefetched2.js | 10 + test/cases/prefetch/expected/prefetched3.js | 10 + test/cases/prefetch/index.js | 7 + test/cases/prefetch/inner.js | 0 test/cases/prefetch/inner2.js | 0 test/cases/prefetch/inner3.js | 0 test/cases/prefetch/normal.js | 0 test/cases/prefetch/prefetched.js | 5 + test/cases/prefetch/prefetched2.js | 0 test/cases/prefetch/prefetched3.js | 0 test/cases/prefetch/webpack.config.js | 18 + test/cases/prefetch/with-nested.js | 9 + test/cases/preload/expected/inner.js | 10 + test/cases/preload/expected/inner2.js | 17 + test/cases/preload/expected/main.js | 372 ++++++++++++++++ test/cases/preload/expected/normal.js | 10 + test/cases/preload/expected/preloaded.js | 15 + test/cases/preload/expected/preloaded2.js | 10 + test/cases/preload/expected/preloaded3.js | 10 + test/cases/preload/index.js | 7 + test/cases/preload/inner.js | 0 test/cases/preload/inner2.js | 0 test/cases/preload/inner3.js | 0 test/cases/preload/normal.js | 0 test/cases/preload/preloaded.js | 5 + test/cases/preload/preloaded2.js | 0 test/cases/preload/preloaded3.js | 0 test/cases/preload/webpack.config.js | 18 + test/cases/preload/with-nested.js | 7 + 57 files changed, 1034 insertions(+) create mode 100644 test/cases/prefetch-preload-mixed/a.js create mode 100644 test/cases/prefetch-preload-mixed/a1.js create mode 100644 test/cases/prefetch-preload-mixed/a2.js create mode 100644 test/cases/prefetch-preload-mixed/b.js create mode 100644 test/cases/prefetch-preload-mixed/b1.js create mode 100644 test/cases/prefetch-preload-mixed/b2.js create mode 100644 test/cases/prefetch-preload-mixed/b3.js create mode 100644 test/cases/prefetch-preload-mixed/c.js create mode 100644 test/cases/prefetch-preload-mixed/c1.js create mode 100644 test/cases/prefetch-preload-mixed/c2.js create mode 100644 test/cases/prefetch-preload-mixed/expected/a.js create mode 100644 test/cases/prefetch-preload-mixed/expected/a1.js create mode 100644 test/cases/prefetch-preload-mixed/expected/a2.js create mode 100644 test/cases/prefetch-preload-mixed/expected/b.js create mode 100644 test/cases/prefetch-preload-mixed/expected/b1.js create mode 100644 test/cases/prefetch-preload-mixed/expected/b2.js create mode 100644 test/cases/prefetch-preload-mixed/expected/b3.js create mode 100644 test/cases/prefetch-preload-mixed/expected/c.js create mode 100644 test/cases/prefetch-preload-mixed/expected/c1.js create mode 100644 test/cases/prefetch-preload-mixed/expected/c2.js create mode 100644 test/cases/prefetch-preload-mixed/expected/main.js create mode 100644 test/cases/prefetch-preload-mixed/index.js create mode 100644 test/cases/prefetch-preload-mixed/webpack.config.js create mode 100644 test/cases/prefetch/expected/inner.js create mode 100644 test/cases/prefetch/expected/inner2.js create mode 100644 test/cases/prefetch/expected/main.js create mode 100644 test/cases/prefetch/expected/normal.js create mode 100644 test/cases/prefetch/expected/prefetched.js create mode 100644 test/cases/prefetch/expected/prefetched2.js create mode 100644 test/cases/prefetch/expected/prefetched3.js create mode 100644 test/cases/prefetch/index.js create mode 100644 test/cases/prefetch/inner.js create mode 100644 test/cases/prefetch/inner2.js create mode 100644 test/cases/prefetch/inner3.js create mode 100644 test/cases/prefetch/normal.js create mode 100644 test/cases/prefetch/prefetched.js create mode 100644 test/cases/prefetch/prefetched2.js create mode 100644 test/cases/prefetch/prefetched3.js create mode 100644 test/cases/prefetch/webpack.config.js create mode 100644 test/cases/prefetch/with-nested.js create mode 100644 test/cases/preload/expected/inner.js create mode 100644 test/cases/preload/expected/inner2.js create mode 100644 test/cases/preload/expected/main.js create mode 100644 test/cases/preload/expected/normal.js create mode 100644 test/cases/preload/expected/preloaded.js create mode 100644 test/cases/preload/expected/preloaded2.js create mode 100644 test/cases/preload/expected/preloaded3.js create mode 100644 test/cases/preload/index.js create mode 100644 test/cases/preload/inner.js create mode 100644 test/cases/preload/inner2.js create mode 100644 test/cases/preload/inner3.js create mode 100644 test/cases/preload/normal.js create mode 100644 test/cases/preload/preloaded.js create mode 100644 test/cases/preload/preloaded2.js create mode 100644 test/cases/preload/preloaded3.js create mode 100644 test/cases/preload/webpack.config.js create mode 100644 test/cases/preload/with-nested.js diff --git a/test/cases/prefetch-preload-mixed/a.js b/test/cases/prefetch-preload-mixed/a.js new file mode 100644 index 00000000..55e53491 --- /dev/null +++ b/test/cases/prefetch-preload-mixed/a.js @@ -0,0 +1,2 @@ +import(/* webpackPrefetch: true, webpackChunkName: "a1" */ "./a1"); +import(/* webpackPrefetch: true, webpackChunkName: "a2" */ "./a2"); diff --git a/test/cases/prefetch-preload-mixed/a1.js b/test/cases/prefetch-preload-mixed/a1.js new file mode 100644 index 00000000..e69de29b diff --git a/test/cases/prefetch-preload-mixed/a2.js b/test/cases/prefetch-preload-mixed/a2.js new file mode 100644 index 00000000..e69de29b diff --git a/test/cases/prefetch-preload-mixed/b.js b/test/cases/prefetch-preload-mixed/b.js new file mode 100644 index 00000000..756debf2 --- /dev/null +++ b/test/cases/prefetch-preload-mixed/b.js @@ -0,0 +1,3 @@ +import(/* webpackPrefetch: true, webpackChunkName: "b1" */ "./b1"); +import(/* webpackPreload: true, webpackChunkName: "b2" */ "./b2"); +import(/* webpackPrefetch: true, webpackChunkName: "b3" */ "./b3"); diff --git a/test/cases/prefetch-preload-mixed/b1.js b/test/cases/prefetch-preload-mixed/b1.js new file mode 100644 index 00000000..e69de29b diff --git a/test/cases/prefetch-preload-mixed/b2.js b/test/cases/prefetch-preload-mixed/b2.js new file mode 100644 index 00000000..e69de29b diff --git a/test/cases/prefetch-preload-mixed/b3.js b/test/cases/prefetch-preload-mixed/b3.js new file mode 100644 index 00000000..e69de29b diff --git a/test/cases/prefetch-preload-mixed/c.js b/test/cases/prefetch-preload-mixed/c.js new file mode 100644 index 00000000..33838a29 --- /dev/null +++ b/test/cases/prefetch-preload-mixed/c.js @@ -0,0 +1,2 @@ +import(/* webpackPreload: true, webpackChunkName: "c1" */ "./c1"); +import(/* webpackPreload: true, webpackChunkName: "c2" */ "./c2"); diff --git a/test/cases/prefetch-preload-mixed/c1.js b/test/cases/prefetch-preload-mixed/c1.js new file mode 100644 index 00000000..e69de29b diff --git a/test/cases/prefetch-preload-mixed/c2.js b/test/cases/prefetch-preload-mixed/c2.js new file mode 100644 index 00000000..e69de29b diff --git a/test/cases/prefetch-preload-mixed/expected/a.js b/test/cases/prefetch-preload-mixed/expected/a.js new file mode 100644 index 00000000..2e9bcdc2 --- /dev/null +++ b/test/cases/prefetch-preload-mixed/expected/a.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[996],{670:(e,n,h)=>{h.e(341).then(h.t.bind(h,907,23)),h.e(150).then(h.t.bind(h,694,23))}}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/expected/a1.js b/test/cases/prefetch-preload-mixed/expected/a1.js new file mode 100644 index 00000000..d927658d --- /dev/null +++ b/test/cases/prefetch-preload-mixed/expected/a1.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[341],{907:()=>{}}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/expected/a2.js b/test/cases/prefetch-preload-mixed/expected/a2.js new file mode 100644 index 00000000..1c583cf7 --- /dev/null +++ b/test/cases/prefetch-preload-mixed/expected/a2.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[150],{694:()=>{}}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/expected/b.js b/test/cases/prefetch-preload-mixed/expected/b.js new file mode 100644 index 00000000..faad7a85 --- /dev/null +++ b/test/cases/prefetch-preload-mixed/expected/b.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[199],{899:(e,n,h)=>{h.e(364).then(h.t.bind(h,372,23)),h.e(567).then(h.t.bind(h,109,23)),h.e(758).then(h.t.bind(h,190,23))}}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/expected/b1.js b/test/cases/prefetch-preload-mixed/expected/b1.js new file mode 100644 index 00000000..fa99aeac --- /dev/null +++ b/test/cases/prefetch-preload-mixed/expected/b1.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[364],{372:()=>{}}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/expected/b2.js b/test/cases/prefetch-preload-mixed/expected/b2.js new file mode 100644 index 00000000..1702bdda --- /dev/null +++ b/test/cases/prefetch-preload-mixed/expected/b2.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[567],{109:()=>{}}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/expected/b3.js b/test/cases/prefetch-preload-mixed/expected/b3.js new file mode 100644 index 00000000..f2ef3b00 --- /dev/null +++ b/test/cases/prefetch-preload-mixed/expected/b3.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[758],{190:()=>{}}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/expected/c.js b/test/cases/prefetch-preload-mixed/expected/c.js new file mode 100644 index 00000000..e86156ab --- /dev/null +++ b/test/cases/prefetch-preload-mixed/expected/c.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[390],{964:(e,n,h)=>{h.e(907).then(h.t.bind(h,813,23)),h.e(896).then(h.t.bind(h,884,23))}}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/expected/c1.js b/test/cases/prefetch-preload-mixed/expected/c1.js new file mode 100644 index 00000000..1b55008a --- /dev/null +++ b/test/cases/prefetch-preload-mixed/expected/c1.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[907],{813:()=>{}}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/expected/c2.js b/test/cases/prefetch-preload-mixed/expected/c2.js new file mode 100644 index 00000000..0d47e5d8 --- /dev/null +++ b/test/cases/prefetch-preload-mixed/expected/c2.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[896],{884:()=>{}}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/expected/main.js b/test/cases/prefetch-preload-mixed/expected/main.js new file mode 100644 index 00000000..3d4b978a --- /dev/null +++ b/test/cases/prefetch-preload-mixed/expected/main.js @@ -0,0 +1 @@ +(()=>{var e,r,t,n,o,a={},i={};function c(e){var r=i[e];if(void 0!==r)return r.exports;var t=i[e]={exports:{}};return a[e](t,t.exports,c),t.exports}c.m=a,e=[],c.O=(r,t,n,o)=>{if(!t){var a=1/0;for(p=0;p=o)&&Object.keys(c.O).every((e=>c.O[e](t[l])))?t.splice(l--,1):(i=!1,o0&&e[p-1][2]>o;p--)e[p]=e[p-1];e[p]=[t,n,o]},c.F={},c.E=e=>{Object.keys(c.F).map((r=>{c.F[r](e)}))},c.H={},c.G=e=>{Object.keys(c.H).map((r=>{c.H[r](e)}))},t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,c.t=function(e,n){if(1&n&&(e=this(e)),8&n)return e;if("object"==typeof e&&e){if(4&n&&e.__esModule)return e;if(16&n&&"function"==typeof e.then)return e}var o=Object.create(null);c.r(o);var a={};r=r||[null,t({}),t([]),t(t)];for(var i=2&n&&e;"object"==typeof i&&!~r.indexOf(i);i=t(i))Object.getOwnPropertyNames(i).forEach((r=>a[r]=()=>e[r]));return a.default=()=>e,c.d(o,a),o},c.d=(e,r)=>{for(var t in r)c.o(r,t)&&!c.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},c.f={},c.e=e=>Promise.all(Object.keys(c.f).reduce(((r,t)=>(c.f[t](e,r),r)),[])),c.u=e=>({150:"a2",199:"b",341:"a1",364:"b1",390:"c",567:"b2",758:"b3",896:"c2",907:"c1",996:"a"}[e]+".js"),c.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),c.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),n={},c.l=(e,r,t,o)=>{if(n[e])n[e].push(r);else{var a,i;if(void 0!==t)for(var l=document.getElementsByTagName("script"),u=0;u{a.onerror=a.onload=null,clearTimeout(s);var o=n[e];if(delete n[e],a.parentNode&&a.parentNode.removeChild(a),o&&o.forEach((e=>e(t))),r)return r(t)},s=setTimeout(f.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=f.bind(null,a.onerror),a.onload=f.bind(null,a.onload),i&&document.head.appendChild(a)}},c.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;c.g.importScripts&&(e=c.g.location+"");var r=c.g.document;if(!e&&r&&(r.currentScript&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");if(t.length)for(var n=t.length-1;n>-1&&(!e||!/^http(s?):/.test(e));)e=t[n--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),c.p=e})(),(()=>{var e={792:0};c.f.j=(r,t)=>{var n=c.o(e,r)?e[r]:void 0;if(0!==n)if(n)t.push(n[2]);else{var o=new Promise(((t,o)=>n=e[r]=[t,o]));t.push(n[2]=o);var a=c.p+c.u(r),i=new Error;c.l(a,(t=>{if(c.o(e,r)&&(0!==(n=e[r])&&(e[r]=void 0),n)){var o=t&&("load"===t.type?"missing":t.type),a=t&&t.target&&t.target.src;i.message="Loading chunk "+r+" failed.\n("+o+": "+a+")",i.name="ChunkLoadError",i.type=o,i.request=a,n[1](i)}}),"chunk-"+r,r)}},c.F.j=r=>{if(!c.o(e,r)||void 0===e[r]){e[r]=null;var t=document.createElement("link");c.nc&&t.setAttribute("nonce",c.nc),t.rel="prefetch",t.as="script",t.href=c.p+c.u(r),document.head.appendChild(t)}},c.H.j=r=>{if(!c.o(e,r)||void 0===e[r]){e[r]=null;var t=document.createElement("link");t.charset="utf-8",c.nc&&t.setAttribute("nonce",c.nc),t.rel="preload",t.as="script",t.href=c.p+c.u(r),document.head.appendChild(t)}},c.O.j=r=>0===e[r];var r=(r,t)=>{var n,o,[a,i,l]=t,u=0;if(a.some((r=>0!==e[r]))){for(n in i)c.o(i,n)&&(c.m[n]=i[n]);if(l)var p=l(c)}for(r&&r(t);uPromise.all(r).then((()=>{var r=o[e];Array.isArray(r)&&r.map(c.E)})),(()=>{var e={199:[567],390:[907,896]};c.f.preload=r=>{var t=e[r];Array.isArray(t)&&t.map(c.G)}})(),c.O(0,[792],(()=>{[996,199,390].map(c.E)}),5);var l={};c.e(996).then(c.t.bind(c,670,23)),c.e(199).then(c.t.bind(c,899,23)),c.e(390).then(c.t.bind(c,964,23)),l=c.O(l)})(); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/index.js b/test/cases/prefetch-preload-mixed/index.js new file mode 100644 index 00000000..f25d6fea --- /dev/null +++ b/test/cases/prefetch-preload-mixed/index.js @@ -0,0 +1,3 @@ +import(/* webpackPrefetch: true, webpackChunkName: "a" */ "./a"); +import(/* webpackPrefetch: true, webpackChunkName: "b" */ "./b"); +import(/* webpackPrefetch: true, webpackChunkName: "c" */ "./c"); diff --git a/test/cases/prefetch-preload-mixed/webpack.config.js b/test/cases/prefetch-preload-mixed/webpack.config.js new file mode 100644 index 00000000..1f2ec144 --- /dev/null +++ b/test/cases/prefetch-preload-mixed/webpack.config.js @@ -0,0 +1,10 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + mode: "production", + entry: "./index", + stats: { + all: false, + chunkRelations: true, + chunks: true, + }, +}; diff --git a/test/cases/prefetch/expected/inner.js b/test/cases/prefetch/expected/inner.js new file mode 100644 index 00000000..49ef065a --- /dev/null +++ b/test/cases/prefetch/expected/inner.js @@ -0,0 +1,10 @@ +(self["webpackChunk"] = self["webpackChunk"] || []).push([[0],{ + +/***/ 6: +/***/ (() => { + + + +/***/ }) + +}]); \ No newline at end of file diff --git a/test/cases/prefetch/expected/inner2.js b/test/cases/prefetch/expected/inner2.js new file mode 100644 index 00000000..9eff91f7 --- /dev/null +++ b/test/cases/prefetch/expected/inner2.js @@ -0,0 +1,17 @@ +(self["webpackChunk"] = self["webpackChunk"] || []).push([[1],{ + +/***/ 7: +/***/ (() => { + + + +/***/ }), + +/***/ 8: +/***/ (() => { + + + +/***/ }) + +}]); \ No newline at end of file diff --git a/test/cases/prefetch/expected/main.js b/test/cases/prefetch/expected/main.js new file mode 100644 index 00000000..6541c8c3 --- /dev/null +++ b/test/cases/prefetch/expected/main.js @@ -0,0 +1,411 @@ +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ([ +/* 0 */, +/* 1 */ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__.e(/* import() | prefetched2 */ 5).then(__webpack_require__.t.bind(__webpack_require__, 4, 23)); +__webpack_require__.e(/* import() | prefetched2 */ 5).then(__webpack_require__.t.bind(__webpack_require__, 4, 23)); +__webpack_require__.e(/* import() | prefetched3 */ 6).then(__webpack_require__.t.bind(__webpack_require__, 5, 23)); + + +/***/ }) +/******/ ]); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/chunk loaded */ +/******/ (() => { +/******/ var deferred = []; +/******/ __webpack_require__.O = (result, chunkIds, fn, priority) => { +/******/ if(chunkIds) { +/******/ priority = priority || 0; +/******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1]; +/******/ deferred[i] = [chunkIds, fn, priority]; +/******/ return; +/******/ } +/******/ var notFulfilled = Infinity; +/******/ for (var i = 0; i < deferred.length; i++) { +/******/ var [chunkIds, fn, priority] = deferred[i]; +/******/ var fulfilled = true; +/******/ for (var j = 0; j < chunkIds.length; j++) { +/******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) { +/******/ chunkIds.splice(j--, 1); +/******/ } else { +/******/ fulfilled = false; +/******/ if(priority < notFulfilled) notFulfilled = priority; +/******/ } +/******/ } +/******/ if(fulfilled) { +/******/ deferred.splice(i--, 1) +/******/ var r = fn(); +/******/ if (r !== undefined) result = r; +/******/ } +/******/ } +/******/ return result; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/chunk prefetch function */ +/******/ (() => { +/******/ __webpack_require__.F = {}; +/******/ __webpack_require__.E = (chunkId) => { +/******/ Object.keys(__webpack_require__.F).map((key) => { +/******/ __webpack_require__.F[key](chunkId); +/******/ }); +/******/ } +/******/ })(); +/******/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => (module['default']) : +/******/ () => (module); +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/create fake namespace object */ +/******/ (() => { +/******/ var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__); +/******/ var leafPrototypes; +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 16: return value when it's Promise-like +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = this(value); +/******/ if(mode & 8) return value; +/******/ if(typeof value === 'object' && value) { +/******/ if((mode & 4) && value.__esModule) return value; +/******/ if((mode & 16) && typeof value.then === 'function') return value; +/******/ } +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ var def = {}; +/******/ leafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)]; +/******/ for(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) { +/******/ Object.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key]))); +/******/ } +/******/ def['default'] = () => (value); +/******/ __webpack_require__.d(ns, def); +/******/ return ns; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/ensure chunk */ +/******/ (() => { +/******/ __webpack_require__.f = {}; +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = (chunkId) => { +/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { +/******/ __webpack_require__.f[key](chunkId, promises); +/******/ return promises; +/******/ }, [])); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.u = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return "" + {"0":"inner","1":"inner2","3":"normal","4":"prefetched","5":"prefetched2","6":"prefetched3"}[chunkId] + ".js"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get mini-css chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.miniCssF = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return undefined; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/global */ +/******/ (() => { +/******/ __webpack_require__.g = (function() { +/******/ if (typeof globalThis === 'object') return globalThis; +/******/ try { +/******/ return this || new Function('return this')(); +/******/ } catch (e) { +/******/ if (typeof window === 'object') return window; +/******/ } +/******/ })(); +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/load script */ +/******/ (() => { +/******/ var inProgress = {}; +/******/ // data-webpack is not used as build has no uniqueName +/******/ // loadScript function to load a script via script tag +/******/ __webpack_require__.l = (url, done, key, chunkId) => { +/******/ if(inProgress[url]) { inProgress[url].push(done); return; } +/******/ var script, needAttach; +/******/ if(key !== undefined) { +/******/ var scripts = document.getElementsByTagName("script"); +/******/ for(var i = 0; i < scripts.length; i++) { +/******/ var s = scripts[i]; +/******/ if(s.getAttribute("src") == url) { script = s; break; } +/******/ } +/******/ } +/******/ if(!script) { +/******/ needAttach = true; +/******/ script = document.createElement('script'); +/******/ +/******/ script.charset = 'utf-8'; +/******/ script.timeout = 120; +/******/ if (__webpack_require__.nc) { +/******/ script.setAttribute("nonce", __webpack_require__.nc); +/******/ } +/******/ +/******/ +/******/ script.src = url; +/******/ } +/******/ inProgress[url] = [done]; +/******/ var onScriptComplete = (prev, event) => { +/******/ // avoid mem leaks in IE. +/******/ script.onerror = script.onload = null; +/******/ clearTimeout(timeout); +/******/ var doneFns = inProgress[url]; +/******/ delete inProgress[url]; +/******/ script.parentNode && script.parentNode.removeChild(script); +/******/ doneFns && doneFns.forEach((fn) => (fn(event))); +/******/ if(prev) return prev(event); +/******/ } +/******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000); +/******/ script.onerror = onScriptComplete.bind(null, script.onerror); +/******/ script.onload = onScriptComplete.bind(null, script.onload); +/******/ needAttach && document.head.appendChild(script); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ var scriptUrl; +/******/ if (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + ""; +/******/ var document = __webpack_require__.g.document; +/******/ if (!scriptUrl && document) { +/******/ if (document.currentScript) +/******/ scriptUrl = document.currentScript.src; +/******/ if (!scriptUrl) { +/******/ var scripts = document.getElementsByTagName("script"); +/******/ if(scripts.length) { +/******/ var i = scripts.length - 1; +/******/ while (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src; +/******/ } +/******/ } +/******/ } +/******/ // When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration +/******/ // or pass an empty string ("") and set the __webpack_public_path__ variable from your code to use your own logic. +/******/ if (!scriptUrl) throw new Error("Automatic publicPath is not supported in this browser"); +/******/ scriptUrl = scriptUrl.replace(/#.*$/, "").replace(/\?.*$/, "").replace(/\/[^\/]+$/, "/"); +/******/ __webpack_require__.p = scriptUrl; +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ 2: 0 +/******/ }; +/******/ +/******/ __webpack_require__.f.j = (chunkId, promises) => { +/******/ // JSONP chunk loading for javascript +/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[2]); +/******/ } else { +/******/ if(true) { // all chunks have JS +/******/ // setup Promise in chunk cache +/******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject])); +/******/ promises.push(installedChunkData[2] = promise); +/******/ +/******/ // start chunk loading +/******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId); +/******/ // create error before stack unwound to get useful stacktrace later +/******/ var error = new Error(); +/******/ var loadingEnded = (event) => { +/******/ if(__webpack_require__.o(installedChunks, chunkId)) { +/******/ installedChunkData = installedChunks[chunkId]; +/******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined; +/******/ if(installedChunkData) { +/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); +/******/ var realSrc = event && event.target && event.target.src; +/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; +/******/ error.name = 'ChunkLoadError'; +/******/ error.type = errorType; +/******/ error.request = realSrc; +/******/ installedChunkData[1](error); +/******/ } +/******/ } +/******/ }; +/******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId); +/******/ } +/******/ } +/******/ } +/******/ }; +/******/ +/******/ __webpack_require__.F.j = (chunkId) => { +/******/ if((!__webpack_require__.o(installedChunks, chunkId) || installedChunks[chunkId] === undefined) && true) { +/******/ installedChunks[chunkId] = null; +/******/ var link = document.createElement('link'); +/******/ +/******/ if (__webpack_require__.nc) { +/******/ link.setAttribute("nonce", __webpack_require__.nc); +/******/ } +/******/ link.rel = "prefetch"; +/******/ link.as = "script"; +/******/ link.href = __webpack_require__.p + __webpack_require__.u(chunkId); +/******/ document.head.appendChild(link); +/******/ } +/******/ }; +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ __webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0); +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); +/******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ return __webpack_require__.O(result); +/******/ } +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ +/******/ /* webpack/runtime/chunk prefetch trigger */ +/******/ (() => { +/******/ var chunkToChildrenMap = { +/******/ "4": [ +/******/ 1, +/******/ 0 +/******/ ] +/******/ }; +/******/ __webpack_require__.f.prefetch = (chunkId, promises) => (Promise.all(promises).then(() => { +/******/ var chunks = chunkToChildrenMap[chunkId]; +/******/ Array.isArray(chunks) && chunks.map(__webpack_require__.E); +/******/ })); +/******/ })(); +/******/ +/******/ /* webpack/runtime/startup prefetch */ +/******/ (() => { +/******/ __webpack_require__.O(0, [2], () => { +/******/ [5,4,6].map(__webpack_require__.E); +/******/ }, 5); +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be in strict mode. +(() => { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _with_nested__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1); +/* harmony import */ var _with_nested__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_with_nested__WEBPACK_IMPORTED_MODULE_0__); +// eslint-disable-next-line import/no-unresolved + + +__webpack_require__.e(/* import() | prefetched */ 4).then(__webpack_require__.t.bind(__webpack_require__, 2, 23)); +setTimeout(() => { + __webpack_require__.e(/* import() | normal */ 3).then(__webpack_require__.t.bind(__webpack_require__, 3, 23)); +}, 500); + +})(); + +__webpack_exports__ = __webpack_require__.O(__webpack_exports__); +/******/ })() +; \ No newline at end of file diff --git a/test/cases/prefetch/expected/normal.js b/test/cases/prefetch/expected/normal.js new file mode 100644 index 00000000..25608459 --- /dev/null +++ b/test/cases/prefetch/expected/normal.js @@ -0,0 +1,10 @@ +(self["webpackChunk"] = self["webpackChunk"] || []).push([[3],{ + +/***/ 3: +/***/ (() => { + + + +/***/ }) + +}]); \ No newline at end of file diff --git a/test/cases/prefetch/expected/prefetched.js b/test/cases/prefetch/expected/prefetched.js new file mode 100644 index 00000000..17c45d61 --- /dev/null +++ b/test/cases/prefetch/expected/prefetched.js @@ -0,0 +1,15 @@ +(self["webpackChunk"] = self["webpackChunk"] || []).push([[4],{ + +/***/ 2: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +setTimeout(() => { + __webpack_require__.e(/* import() | inner */ 0).then(__webpack_require__.t.bind(__webpack_require__, 6, 23)); + __webpack_require__.e(/* import() | inner2 */ 1).then(__webpack_require__.t.bind(__webpack_require__, 7, 23)); + __webpack_require__.e(/* import() | inner2 */ 1).then(__webpack_require__.t.bind(__webpack_require__, 8, 23)); +}, 5000); + + +/***/ }) + +}]); \ No newline at end of file diff --git a/test/cases/prefetch/expected/prefetched2.js b/test/cases/prefetch/expected/prefetched2.js new file mode 100644 index 00000000..12cf8614 --- /dev/null +++ b/test/cases/prefetch/expected/prefetched2.js @@ -0,0 +1,10 @@ +(self["webpackChunk"] = self["webpackChunk"] || []).push([[5],{ + +/***/ 4: +/***/ (() => { + + + +/***/ }) + +}]); \ No newline at end of file diff --git a/test/cases/prefetch/expected/prefetched3.js b/test/cases/prefetch/expected/prefetched3.js new file mode 100644 index 00000000..93a9146a --- /dev/null +++ b/test/cases/prefetch/expected/prefetched3.js @@ -0,0 +1,10 @@ +(self["webpackChunk"] = self["webpackChunk"] || []).push([[6],{ + +/***/ 5: +/***/ (() => { + + + +/***/ }) + +}]); \ No newline at end of file diff --git a/test/cases/prefetch/index.js b/test/cases/prefetch/index.js new file mode 100644 index 00000000..34275c6b --- /dev/null +++ b/test/cases/prefetch/index.js @@ -0,0 +1,7 @@ +// eslint-disable-next-line import/no-unresolved +import "./with-nested"; + +import(/* webpackPrefetch: 1, webpackChunkName: "prefetched" */ "./prefetched"); +setTimeout(() => { + import(/* webpackChunkName: "normal" */ "./normal"); +}, 500); diff --git a/test/cases/prefetch/inner.js b/test/cases/prefetch/inner.js new file mode 100644 index 00000000..e69de29b diff --git a/test/cases/prefetch/inner2.js b/test/cases/prefetch/inner2.js new file mode 100644 index 00000000..e69de29b diff --git a/test/cases/prefetch/inner3.js b/test/cases/prefetch/inner3.js new file mode 100644 index 00000000..e69de29b diff --git a/test/cases/prefetch/normal.js b/test/cases/prefetch/normal.js new file mode 100644 index 00000000..e69de29b diff --git a/test/cases/prefetch/prefetched.js b/test/cases/prefetch/prefetched.js new file mode 100644 index 00000000..b895d1e3 --- /dev/null +++ b/test/cases/prefetch/prefetched.js @@ -0,0 +1,5 @@ +setTimeout(() => { + import(/* webpackPrefetch: 10, webpackChunkName: "inner" */ "./inner"); + import(/* webpackPrefetch: 20, webpackChunkName: "inner2" */ "./inner2"); + import(/* webpackChunkName: "inner2" */ "./inner3"); +}, 5000); diff --git a/test/cases/prefetch/prefetched2.js b/test/cases/prefetch/prefetched2.js new file mode 100644 index 00000000..e69de29b diff --git a/test/cases/prefetch/prefetched3.js b/test/cases/prefetch/prefetched3.js new file mode 100644 index 00000000..e69de29b diff --git a/test/cases/prefetch/webpack.config.js b/test/cases/prefetch/webpack.config.js new file mode 100644 index 00000000..cf55c08c --- /dev/null +++ b/test/cases/prefetch/webpack.config.js @@ -0,0 +1,18 @@ +import Self from "../../../src"; + +module.exports = { + entry: "./index.js", + module: { + rules: [ + { + test: /\.css$/, + use: [Self.loader, "css-loader"], + }, + ], + }, + plugins: [ + new Self({ + filename: "[name].css", + }), + ], +}; diff --git a/test/cases/prefetch/with-nested.js b/test/cases/prefetch/with-nested.js new file mode 100644 index 00000000..a8d638ad --- /dev/null +++ b/test/cases/prefetch/with-nested.js @@ -0,0 +1,9 @@ +import( + /* webpackPrefetch: -20, webpackChunkName: "prefetched2" */ "./prefetched2" +); +import( + /* webpackPrefetch: 3, webpackChunkName: "prefetched2" */ "./prefetched2" +); +import( + /* webpackPrefetch: -10, webpackChunkName: "prefetched3" */ "./prefetched3" +); diff --git a/test/cases/preload/expected/inner.js b/test/cases/preload/expected/inner.js new file mode 100644 index 00000000..49ef065a --- /dev/null +++ b/test/cases/preload/expected/inner.js @@ -0,0 +1,10 @@ +(self["webpackChunk"] = self["webpackChunk"] || []).push([[0],{ + +/***/ 6: +/***/ (() => { + + + +/***/ }) + +}]); \ No newline at end of file diff --git a/test/cases/preload/expected/inner2.js b/test/cases/preload/expected/inner2.js new file mode 100644 index 00000000..9eff91f7 --- /dev/null +++ b/test/cases/preload/expected/inner2.js @@ -0,0 +1,17 @@ +(self["webpackChunk"] = self["webpackChunk"] || []).push([[1],{ + +/***/ 7: +/***/ (() => { + + + +/***/ }), + +/***/ 8: +/***/ (() => { + + + +/***/ }) + +}]); \ No newline at end of file diff --git a/test/cases/preload/expected/main.js b/test/cases/preload/expected/main.js new file mode 100644 index 00000000..597eae1b --- /dev/null +++ b/test/cases/preload/expected/main.js @@ -0,0 +1,372 @@ +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ([ +/* 0 */, +/* 1 */ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__.e(/* import() | preloaded2 */ 5).then(__webpack_require__.t.bind(__webpack_require__, 4, 23)); +__webpack_require__.e(/* import() | preloaded2 */ 5).then(__webpack_require__.t.bind(__webpack_require__, 4, 23)); +__webpack_require__.e(/* import() | preloaded3 */ 6).then(__webpack_require__.t.bind(__webpack_require__, 5, 23)); + + +/***/ }) +/******/ ]); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/chunk preload function */ +/******/ (() => { +/******/ __webpack_require__.H = {}; +/******/ __webpack_require__.G = (chunkId) => { +/******/ Object.keys(__webpack_require__.H).map((key) => { +/******/ __webpack_require__.H[key](chunkId); +/******/ }); +/******/ } +/******/ })(); +/******/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => (module['default']) : +/******/ () => (module); +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/create fake namespace object */ +/******/ (() => { +/******/ var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__); +/******/ var leafPrototypes; +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 16: return value when it's Promise-like +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = this(value); +/******/ if(mode & 8) return value; +/******/ if(typeof value === 'object' && value) { +/******/ if((mode & 4) && value.__esModule) return value; +/******/ if((mode & 16) && typeof value.then === 'function') return value; +/******/ } +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ var def = {}; +/******/ leafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)]; +/******/ for(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) { +/******/ Object.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key]))); +/******/ } +/******/ def['default'] = () => (value); +/******/ __webpack_require__.d(ns, def); +/******/ return ns; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/ensure chunk */ +/******/ (() => { +/******/ __webpack_require__.f = {}; +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = (chunkId) => { +/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { +/******/ __webpack_require__.f[key](chunkId, promises); +/******/ return promises; +/******/ }, [])); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.u = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return "" + {"0":"inner","1":"inner2","3":"normal","4":"preloaded","5":"preloaded2","6":"preloaded3"}[chunkId] + ".js"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get mini-css chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.miniCssF = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return undefined; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/global */ +/******/ (() => { +/******/ __webpack_require__.g = (function() { +/******/ if (typeof globalThis === 'object') return globalThis; +/******/ try { +/******/ return this || new Function('return this')(); +/******/ } catch (e) { +/******/ if (typeof window === 'object') return window; +/******/ } +/******/ })(); +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/load script */ +/******/ (() => { +/******/ var inProgress = {}; +/******/ // data-webpack is not used as build has no uniqueName +/******/ // loadScript function to load a script via script tag +/******/ __webpack_require__.l = (url, done, key, chunkId) => { +/******/ if(inProgress[url]) { inProgress[url].push(done); return; } +/******/ var script, needAttach; +/******/ if(key !== undefined) { +/******/ var scripts = document.getElementsByTagName("script"); +/******/ for(var i = 0; i < scripts.length; i++) { +/******/ var s = scripts[i]; +/******/ if(s.getAttribute("src") == url) { script = s; break; } +/******/ } +/******/ } +/******/ if(!script) { +/******/ needAttach = true; +/******/ script = document.createElement('script'); +/******/ +/******/ script.charset = 'utf-8'; +/******/ script.timeout = 120; +/******/ if (__webpack_require__.nc) { +/******/ script.setAttribute("nonce", __webpack_require__.nc); +/******/ } +/******/ +/******/ +/******/ script.src = url; +/******/ } +/******/ inProgress[url] = [done]; +/******/ var onScriptComplete = (prev, event) => { +/******/ // avoid mem leaks in IE. +/******/ script.onerror = script.onload = null; +/******/ clearTimeout(timeout); +/******/ var doneFns = inProgress[url]; +/******/ delete inProgress[url]; +/******/ script.parentNode && script.parentNode.removeChild(script); +/******/ doneFns && doneFns.forEach((fn) => (fn(event))); +/******/ if(prev) return prev(event); +/******/ } +/******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000); +/******/ script.onerror = onScriptComplete.bind(null, script.onerror); +/******/ script.onload = onScriptComplete.bind(null, script.onload); +/******/ needAttach && document.head.appendChild(script); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ var scriptUrl; +/******/ if (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + ""; +/******/ var document = __webpack_require__.g.document; +/******/ if (!scriptUrl && document) { +/******/ if (document.currentScript) +/******/ scriptUrl = document.currentScript.src; +/******/ if (!scriptUrl) { +/******/ var scripts = document.getElementsByTagName("script"); +/******/ if(scripts.length) { +/******/ var i = scripts.length - 1; +/******/ while (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src; +/******/ } +/******/ } +/******/ } +/******/ // When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration +/******/ // or pass an empty string ("") and set the __webpack_public_path__ variable from your code to use your own logic. +/******/ if (!scriptUrl) throw new Error("Automatic publicPath is not supported in this browser"); +/******/ scriptUrl = scriptUrl.replace(/#.*$/, "").replace(/\?.*$/, "").replace(/\/[^\/]+$/, "/"); +/******/ __webpack_require__.p = scriptUrl; +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ 2: 0 +/******/ }; +/******/ +/******/ __webpack_require__.f.j = (chunkId, promises) => { +/******/ // JSONP chunk loading for javascript +/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[2]); +/******/ } else { +/******/ if(true) { // all chunks have JS +/******/ // setup Promise in chunk cache +/******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject])); +/******/ promises.push(installedChunkData[2] = promise); +/******/ +/******/ // start chunk loading +/******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId); +/******/ // create error before stack unwound to get useful stacktrace later +/******/ var error = new Error(); +/******/ var loadingEnded = (event) => { +/******/ if(__webpack_require__.o(installedChunks, chunkId)) { +/******/ installedChunkData = installedChunks[chunkId]; +/******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined; +/******/ if(installedChunkData) { +/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); +/******/ var realSrc = event && event.target && event.target.src; +/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; +/******/ error.name = 'ChunkLoadError'; +/******/ error.type = errorType; +/******/ error.request = realSrc; +/******/ installedChunkData[1](error); +/******/ } +/******/ } +/******/ }; +/******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId); +/******/ } +/******/ } +/******/ } +/******/ }; +/******/ +/******/ // no prefetching +/******/ +/******/ __webpack_require__.H.j = (chunkId) => { +/******/ if((!__webpack_require__.o(installedChunks, chunkId) || installedChunks[chunkId] === undefined) && true) { +/******/ installedChunks[chunkId] = null; +/******/ var link = document.createElement('link'); +/******/ +/******/ link.charset = 'utf-8'; +/******/ if (__webpack_require__.nc) { +/******/ link.setAttribute("nonce", __webpack_require__.nc); +/******/ } +/******/ link.rel = "preload"; +/******/ link.as = "script"; +/******/ link.href = __webpack_require__.p + __webpack_require__.u(chunkId); +/******/ document.head.appendChild(link); +/******/ } +/******/ }; +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ // no on chunks loaded +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); +/******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ +/******/ } +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ +/******/ /* webpack/runtime/chunk preload trigger */ +/******/ (() => { +/******/ var chunkToChildrenMap = { +/******/ "4": [ +/******/ 1, +/******/ 0 +/******/ ] +/******/ }; +/******/ __webpack_require__.f.preload = (chunkId) => { +/******/ var chunks = chunkToChildrenMap[chunkId]; +/******/ Array.isArray(chunks) && chunks.map(__webpack_require__.G); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be in strict mode. +(() => { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _with_nested__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1); +/* harmony import */ var _with_nested__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_with_nested__WEBPACK_IMPORTED_MODULE_0__); +// eslint-disable-next-line import/no-unresolved + + +__webpack_require__.e(/* import() | preloaded */ 4).then(__webpack_require__.t.bind(__webpack_require__, 2, 23)); +setTimeout(() => { + __webpack_require__.e(/* import() | normal */ 3).then(__webpack_require__.t.bind(__webpack_require__, 3, 23)); +}, 500); + +})(); + +/******/ })() +; \ No newline at end of file diff --git a/test/cases/preload/expected/normal.js b/test/cases/preload/expected/normal.js new file mode 100644 index 00000000..25608459 --- /dev/null +++ b/test/cases/preload/expected/normal.js @@ -0,0 +1,10 @@ +(self["webpackChunk"] = self["webpackChunk"] || []).push([[3],{ + +/***/ 3: +/***/ (() => { + + + +/***/ }) + +}]); \ No newline at end of file diff --git a/test/cases/preload/expected/preloaded.js b/test/cases/preload/expected/preloaded.js new file mode 100644 index 00000000..17c45d61 --- /dev/null +++ b/test/cases/preload/expected/preloaded.js @@ -0,0 +1,15 @@ +(self["webpackChunk"] = self["webpackChunk"] || []).push([[4],{ + +/***/ 2: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +setTimeout(() => { + __webpack_require__.e(/* import() | inner */ 0).then(__webpack_require__.t.bind(__webpack_require__, 6, 23)); + __webpack_require__.e(/* import() | inner2 */ 1).then(__webpack_require__.t.bind(__webpack_require__, 7, 23)); + __webpack_require__.e(/* import() | inner2 */ 1).then(__webpack_require__.t.bind(__webpack_require__, 8, 23)); +}, 5000); + + +/***/ }) + +}]); \ No newline at end of file diff --git a/test/cases/preload/expected/preloaded2.js b/test/cases/preload/expected/preloaded2.js new file mode 100644 index 00000000..12cf8614 --- /dev/null +++ b/test/cases/preload/expected/preloaded2.js @@ -0,0 +1,10 @@ +(self["webpackChunk"] = self["webpackChunk"] || []).push([[5],{ + +/***/ 4: +/***/ (() => { + + + +/***/ }) + +}]); \ No newline at end of file diff --git a/test/cases/preload/expected/preloaded3.js b/test/cases/preload/expected/preloaded3.js new file mode 100644 index 00000000..93a9146a --- /dev/null +++ b/test/cases/preload/expected/preloaded3.js @@ -0,0 +1,10 @@ +(self["webpackChunk"] = self["webpackChunk"] || []).push([[6],{ + +/***/ 5: +/***/ (() => { + + + +/***/ }) + +}]); \ No newline at end of file diff --git a/test/cases/preload/index.js b/test/cases/preload/index.js new file mode 100644 index 00000000..bba8e969 --- /dev/null +++ b/test/cases/preload/index.js @@ -0,0 +1,7 @@ +// eslint-disable-next-line import/no-unresolved +import "./with-nested"; + +import(/* webpackPreload: 1, webpackChunkName: "preloaded" */ "./preloaded"); +setTimeout(() => { + import(/* webpackChunkName: "normal" */ "./normal"); +}, 500); diff --git a/test/cases/preload/inner.js b/test/cases/preload/inner.js new file mode 100644 index 00000000..e69de29b diff --git a/test/cases/preload/inner2.js b/test/cases/preload/inner2.js new file mode 100644 index 00000000..e69de29b diff --git a/test/cases/preload/inner3.js b/test/cases/preload/inner3.js new file mode 100644 index 00000000..e69de29b diff --git a/test/cases/preload/normal.js b/test/cases/preload/normal.js new file mode 100644 index 00000000..e69de29b diff --git a/test/cases/preload/preloaded.js b/test/cases/preload/preloaded.js new file mode 100644 index 00000000..c676cd7a --- /dev/null +++ b/test/cases/preload/preloaded.js @@ -0,0 +1,5 @@ +setTimeout(() => { + import(/* webpackPreload: 10, webpackChunkName: "inner" */ "./inner"); + import(/* webpackPreload: 20, webpackChunkName: "inner2" */ "./inner2"); + import(/* webpackChunkName: "inner2" */ "./inner3"); +}, 5000); diff --git a/test/cases/preload/preloaded2.js b/test/cases/preload/preloaded2.js new file mode 100644 index 00000000..e69de29b diff --git a/test/cases/preload/preloaded3.js b/test/cases/preload/preloaded3.js new file mode 100644 index 00000000..e69de29b diff --git a/test/cases/preload/webpack.config.js b/test/cases/preload/webpack.config.js new file mode 100644 index 00000000..cf55c08c --- /dev/null +++ b/test/cases/preload/webpack.config.js @@ -0,0 +1,18 @@ +import Self from "../../../src"; + +module.exports = { + entry: "./index.js", + module: { + rules: [ + { + test: /\.css$/, + use: [Self.loader, "css-loader"], + }, + ], + }, + plugins: [ + new Self({ + filename: "[name].css", + }), + ], +}; diff --git a/test/cases/preload/with-nested.js b/test/cases/preload/with-nested.js new file mode 100644 index 00000000..8f23fcf1 --- /dev/null +++ b/test/cases/preload/with-nested.js @@ -0,0 +1,7 @@ +import( + /* webpackPreload: -20, webpackChunkName: "preloaded2" */ "./preloaded2" +); +import(/* webpackPreload: 3, webpackChunkName: "preloaded2" */ "./preloaded2"); +import( + /* webpackPreload: -10, webpackChunkName: "preloaded3" */ "./preloaded3" +); From 16a7d327c7d595e630f75b3648d86cccf0d8ac07 Mon Sep 17 00:00:00 2001 From: Ori Date: Wed, 13 Mar 2024 12:24:42 +0200 Subject: [PATCH 7/8] test: update prefetch-preload-mixed --- .../prefetch-preload-mixed/expected/a.js | 12 +- .../prefetch-preload-mixed/expected/a1.js | 11 +- .../prefetch-preload-mixed/expected/a2.js | 11 +- .../prefetch-preload-mixed/expected/b.js | 14 +- .../prefetch-preload-mixed/expected/b1.js | 11 +- .../prefetch-preload-mixed/expected/b2.js | 11 +- .../prefetch-preload-mixed/expected/b3.js | 11 +- .../prefetch-preload-mixed/expected/c.js | 13 +- .../prefetch-preload-mixed/expected/c1.js | 11 +- .../prefetch-preload-mixed/expected/c2.js | 11 +- .../prefetch-preload-mixed/expected/main.js | 422 +++++++++++++++++- .../prefetch-preload-mixed/webpack.config.js | 22 +- 12 files changed, 542 insertions(+), 18 deletions(-) diff --git a/test/cases/prefetch-preload-mixed/expected/a.js b/test/cases/prefetch-preload-mixed/expected/a.js index 2e9bcdc2..4a566fe5 100644 --- a/test/cases/prefetch-preload-mixed/expected/a.js +++ b/test/cases/prefetch-preload-mixed/expected/a.js @@ -1 +1,11 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[996],{670:(e,n,h)=>{h.e(341).then(h.t.bind(h,907,23)),h.e(150).then(h.t.bind(h,694,23))}}]); \ No newline at end of file +(self["webpackChunk"] = self["webpackChunk"] || []).push([[0],[ +/* 0 */, +/* 1 */ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__.e(/* import() | a1 */ 1).then(__webpack_require__.t.bind(__webpack_require__, 4, 23)); +__webpack_require__.e(/* import() | a2 */ 2).then(__webpack_require__.t.bind(__webpack_require__, 5, 23)); + + +/***/ }) +]]); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/expected/a1.js b/test/cases/prefetch-preload-mixed/expected/a1.js index d927658d..3d384b68 100644 --- a/test/cases/prefetch-preload-mixed/expected/a1.js +++ b/test/cases/prefetch-preload-mixed/expected/a1.js @@ -1 +1,10 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[341],{907:()=>{}}]); \ No newline at end of file +(self["webpackChunk"] = self["webpackChunk"] || []).push([[1],{ + +/***/ 4: +/***/ (() => { + + + +/***/ }) + +}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/expected/a2.js b/test/cases/prefetch-preload-mixed/expected/a2.js index 1c583cf7..ed050c04 100644 --- a/test/cases/prefetch-preload-mixed/expected/a2.js +++ b/test/cases/prefetch-preload-mixed/expected/a2.js @@ -1 +1,10 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[150],{694:()=>{}}]); \ No newline at end of file +(self["webpackChunk"] = self["webpackChunk"] || []).push([[2],{ + +/***/ 5: +/***/ (() => { + + + +/***/ }) + +}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/expected/b.js b/test/cases/prefetch-preload-mixed/expected/b.js index faad7a85..e4268efb 100644 --- a/test/cases/prefetch-preload-mixed/expected/b.js +++ b/test/cases/prefetch-preload-mixed/expected/b.js @@ -1 +1,13 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[199],{899:(e,n,h)=>{h.e(364).then(h.t.bind(h,372,23)),h.e(567).then(h.t.bind(h,109,23)),h.e(758).then(h.t.bind(h,190,23))}}]); \ No newline at end of file +(self["webpackChunk"] = self["webpackChunk"] || []).push([[3],{ + +/***/ 2: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__.e(/* import() | b1 */ 4).then(__webpack_require__.t.bind(__webpack_require__, 6, 23)); +__webpack_require__.e(/* import() | b2 */ 5).then(__webpack_require__.t.bind(__webpack_require__, 7, 23)); +__webpack_require__.e(/* import() | b3 */ 6).then(__webpack_require__.t.bind(__webpack_require__, 8, 23)); + + +/***/ }) + +}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/expected/b1.js b/test/cases/prefetch-preload-mixed/expected/b1.js index fa99aeac..b21b7aba 100644 --- a/test/cases/prefetch-preload-mixed/expected/b1.js +++ b/test/cases/prefetch-preload-mixed/expected/b1.js @@ -1 +1,10 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[364],{372:()=>{}}]); \ No newline at end of file +(self["webpackChunk"] = self["webpackChunk"] || []).push([[4],{ + +/***/ 6: +/***/ (() => { + + + +/***/ }) + +}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/expected/b2.js b/test/cases/prefetch-preload-mixed/expected/b2.js index 1702bdda..1837f395 100644 --- a/test/cases/prefetch-preload-mixed/expected/b2.js +++ b/test/cases/prefetch-preload-mixed/expected/b2.js @@ -1 +1,10 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[567],{109:()=>{}}]); \ No newline at end of file +(self["webpackChunk"] = self["webpackChunk"] || []).push([[5],{ + +/***/ 7: +/***/ (() => { + + + +/***/ }) + +}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/expected/b3.js b/test/cases/prefetch-preload-mixed/expected/b3.js index f2ef3b00..af88c7bc 100644 --- a/test/cases/prefetch-preload-mixed/expected/b3.js +++ b/test/cases/prefetch-preload-mixed/expected/b3.js @@ -1 +1,10 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[758],{190:()=>{}}]); \ No newline at end of file +(self["webpackChunk"] = self["webpackChunk"] || []).push([[6],{ + +/***/ 8: +/***/ (() => { + + + +/***/ }) + +}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/expected/c.js b/test/cases/prefetch-preload-mixed/expected/c.js index e86156ab..d64a9865 100644 --- a/test/cases/prefetch-preload-mixed/expected/c.js +++ b/test/cases/prefetch-preload-mixed/expected/c.js @@ -1 +1,12 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[390],{964:(e,n,h)=>{h.e(907).then(h.t.bind(h,813,23)),h.e(896).then(h.t.bind(h,884,23))}}]); \ No newline at end of file +(self["webpackChunk"] = self["webpackChunk"] || []).push([[7],{ + +/***/ 3: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__.e(/* import() | c1 */ 8).then(__webpack_require__.t.bind(__webpack_require__, 9, 23)); +__webpack_require__.e(/* import() | c2 */ 9).then(__webpack_require__.t.bind(__webpack_require__, 10, 23)); + + +/***/ }) + +}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/expected/c1.js b/test/cases/prefetch-preload-mixed/expected/c1.js index 1b55008a..7d4179c9 100644 --- a/test/cases/prefetch-preload-mixed/expected/c1.js +++ b/test/cases/prefetch-preload-mixed/expected/c1.js @@ -1 +1,10 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[907],{813:()=>{}}]); \ No newline at end of file +(self["webpackChunk"] = self["webpackChunk"] || []).push([[8],{ + +/***/ 9: +/***/ (() => { + + + +/***/ }) + +}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/expected/c2.js b/test/cases/prefetch-preload-mixed/expected/c2.js index 0d47e5d8..5d880e16 100644 --- a/test/cases/prefetch-preload-mixed/expected/c2.js +++ b/test/cases/prefetch-preload-mixed/expected/c2.js @@ -1 +1,10 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[896],{884:()=>{}}]); \ No newline at end of file +(self["webpackChunk"] = self["webpackChunk"] || []).push([[9],{ + +/***/ 10: +/***/ (() => { + + + +/***/ }) + +}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/expected/main.js b/test/cases/prefetch-preload-mixed/expected/main.js index 3d4b978a..9a0c0f74 100644 --- a/test/cases/prefetch-preload-mixed/expected/main.js +++ b/test/cases/prefetch-preload-mixed/expected/main.js @@ -1 +1,421 @@ -(()=>{var e,r,t,n,o,a={},i={};function c(e){var r=i[e];if(void 0!==r)return r.exports;var t=i[e]={exports:{}};return a[e](t,t.exports,c),t.exports}c.m=a,e=[],c.O=(r,t,n,o)=>{if(!t){var a=1/0;for(p=0;p=o)&&Object.keys(c.O).every((e=>c.O[e](t[l])))?t.splice(l--,1):(i=!1,o0&&e[p-1][2]>o;p--)e[p]=e[p-1];e[p]=[t,n,o]},c.F={},c.E=e=>{Object.keys(c.F).map((r=>{c.F[r](e)}))},c.H={},c.G=e=>{Object.keys(c.H).map((r=>{c.H[r](e)}))},t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,c.t=function(e,n){if(1&n&&(e=this(e)),8&n)return e;if("object"==typeof e&&e){if(4&n&&e.__esModule)return e;if(16&n&&"function"==typeof e.then)return e}var o=Object.create(null);c.r(o);var a={};r=r||[null,t({}),t([]),t(t)];for(var i=2&n&&e;"object"==typeof i&&!~r.indexOf(i);i=t(i))Object.getOwnPropertyNames(i).forEach((r=>a[r]=()=>e[r]));return a.default=()=>e,c.d(o,a),o},c.d=(e,r)=>{for(var t in r)c.o(r,t)&&!c.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},c.f={},c.e=e=>Promise.all(Object.keys(c.f).reduce(((r,t)=>(c.f[t](e,r),r)),[])),c.u=e=>({150:"a2",199:"b",341:"a1",364:"b1",390:"c",567:"b2",758:"b3",896:"c2",907:"c1",996:"a"}[e]+".js"),c.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),c.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),n={},c.l=(e,r,t,o)=>{if(n[e])n[e].push(r);else{var a,i;if(void 0!==t)for(var l=document.getElementsByTagName("script"),u=0;u{a.onerror=a.onload=null,clearTimeout(s);var o=n[e];if(delete n[e],a.parentNode&&a.parentNode.removeChild(a),o&&o.forEach((e=>e(t))),r)return r(t)},s=setTimeout(f.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=f.bind(null,a.onerror),a.onload=f.bind(null,a.onload),i&&document.head.appendChild(a)}},c.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;c.g.importScripts&&(e=c.g.location+"");var r=c.g.document;if(!e&&r&&(r.currentScript&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");if(t.length)for(var n=t.length-1;n>-1&&(!e||!/^http(s?):/.test(e));)e=t[n--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),c.p=e})(),(()=>{var e={792:0};c.f.j=(r,t)=>{var n=c.o(e,r)?e[r]:void 0;if(0!==n)if(n)t.push(n[2]);else{var o=new Promise(((t,o)=>n=e[r]=[t,o]));t.push(n[2]=o);var a=c.p+c.u(r),i=new Error;c.l(a,(t=>{if(c.o(e,r)&&(0!==(n=e[r])&&(e[r]=void 0),n)){var o=t&&("load"===t.type?"missing":t.type),a=t&&t.target&&t.target.src;i.message="Loading chunk "+r+" failed.\n("+o+": "+a+")",i.name="ChunkLoadError",i.type=o,i.request=a,n[1](i)}}),"chunk-"+r,r)}},c.F.j=r=>{if(!c.o(e,r)||void 0===e[r]){e[r]=null;var t=document.createElement("link");c.nc&&t.setAttribute("nonce",c.nc),t.rel="prefetch",t.as="script",t.href=c.p+c.u(r),document.head.appendChild(t)}},c.H.j=r=>{if(!c.o(e,r)||void 0===e[r]){e[r]=null;var t=document.createElement("link");t.charset="utf-8",c.nc&&t.setAttribute("nonce",c.nc),t.rel="preload",t.as="script",t.href=c.p+c.u(r),document.head.appendChild(t)}},c.O.j=r=>0===e[r];var r=(r,t)=>{var n,o,[a,i,l]=t,u=0;if(a.some((r=>0!==e[r]))){for(n in i)c.o(i,n)&&(c.m[n]=i[n]);if(l)var p=l(c)}for(r&&r(t);uPromise.all(r).then((()=>{var r=o[e];Array.isArray(r)&&r.map(c.E)})),(()=>{var e={199:[567],390:[907,896]};c.f.preload=r=>{var t=e[r];Array.isArray(t)&&t.map(c.G)}})(),c.O(0,[792],(()=>{[996,199,390].map(c.E)}),5);var l={};c.e(996).then(c.t.bind(c,670,23)),c.e(199).then(c.t.bind(c,899,23)),c.e(390).then(c.t.bind(c,964,23)),l=c.O(l)})(); \ No newline at end of file +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({}); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/chunk loaded */ +/******/ (() => { +/******/ var deferred = []; +/******/ __webpack_require__.O = (result, chunkIds, fn, priority) => { +/******/ if(chunkIds) { +/******/ priority = priority || 0; +/******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1]; +/******/ deferred[i] = [chunkIds, fn, priority]; +/******/ return; +/******/ } +/******/ var notFulfilled = Infinity; +/******/ for (var i = 0; i < deferred.length; i++) { +/******/ var [chunkIds, fn, priority] = deferred[i]; +/******/ var fulfilled = true; +/******/ for (var j = 0; j < chunkIds.length; j++) { +/******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) { +/******/ chunkIds.splice(j--, 1); +/******/ } else { +/******/ fulfilled = false; +/******/ if(priority < notFulfilled) notFulfilled = priority; +/******/ } +/******/ } +/******/ if(fulfilled) { +/******/ deferred.splice(i--, 1) +/******/ var r = fn(); +/******/ if (r !== undefined) result = r; +/******/ } +/******/ } +/******/ return result; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/chunk prefetch function */ +/******/ (() => { +/******/ __webpack_require__.F = {}; +/******/ __webpack_require__.E = (chunkId) => { +/******/ Object.keys(__webpack_require__.F).map((key) => { +/******/ __webpack_require__.F[key](chunkId); +/******/ }); +/******/ } +/******/ })(); +/******/ +/******/ /* webpack/runtime/chunk preload function */ +/******/ (() => { +/******/ __webpack_require__.H = {}; +/******/ __webpack_require__.G = (chunkId) => { +/******/ Object.keys(__webpack_require__.H).map((key) => { +/******/ __webpack_require__.H[key](chunkId); +/******/ }); +/******/ } +/******/ })(); +/******/ +/******/ /* webpack/runtime/create fake namespace object */ +/******/ (() => { +/******/ var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__); +/******/ var leafPrototypes; +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 16: return value when it's Promise-like +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = this(value); +/******/ if(mode & 8) return value; +/******/ if(typeof value === 'object' && value) { +/******/ if((mode & 4) && value.__esModule) return value; +/******/ if((mode & 16) && typeof value.then === 'function') return value; +/******/ } +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ var def = {}; +/******/ leafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)]; +/******/ for(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) { +/******/ Object.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key]))); +/******/ } +/******/ def['default'] = () => (value); +/******/ __webpack_require__.d(ns, def); +/******/ return ns; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/ensure chunk */ +/******/ (() => { +/******/ __webpack_require__.f = {}; +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = (chunkId) => { +/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { +/******/ __webpack_require__.f[key](chunkId, promises); +/******/ return promises; +/******/ }, [])); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.u = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return "" + {"0":"a","1":"a1","2":"a2","3":"b","4":"b1","5":"b2","6":"b3","7":"c","8":"c1","9":"c2"}[chunkId] + ".js"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get mini-css chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.miniCssF = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return undefined; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/global */ +/******/ (() => { +/******/ __webpack_require__.g = (function() { +/******/ if (typeof globalThis === 'object') return globalThis; +/******/ try { +/******/ return this || new Function('return this')(); +/******/ } catch (e) { +/******/ if (typeof window === 'object') return window; +/******/ } +/******/ })(); +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/load script */ +/******/ (() => { +/******/ var inProgress = {}; +/******/ // data-webpack is not used as build has no uniqueName +/******/ // loadScript function to load a script via script tag +/******/ __webpack_require__.l = (url, done, key, chunkId) => { +/******/ if(inProgress[url]) { inProgress[url].push(done); return; } +/******/ var script, needAttach; +/******/ if(key !== undefined) { +/******/ var scripts = document.getElementsByTagName("script"); +/******/ for(var i = 0; i < scripts.length; i++) { +/******/ var s = scripts[i]; +/******/ if(s.getAttribute("src") == url) { script = s; break; } +/******/ } +/******/ } +/******/ if(!script) { +/******/ needAttach = true; +/******/ script = document.createElement('script'); +/******/ +/******/ script.charset = 'utf-8'; +/******/ script.timeout = 120; +/******/ if (__webpack_require__.nc) { +/******/ script.setAttribute("nonce", __webpack_require__.nc); +/******/ } +/******/ +/******/ +/******/ script.src = url; +/******/ } +/******/ inProgress[url] = [done]; +/******/ var onScriptComplete = (prev, event) => { +/******/ // avoid mem leaks in IE. +/******/ script.onerror = script.onload = null; +/******/ clearTimeout(timeout); +/******/ var doneFns = inProgress[url]; +/******/ delete inProgress[url]; +/******/ script.parentNode && script.parentNode.removeChild(script); +/******/ doneFns && doneFns.forEach((fn) => (fn(event))); +/******/ if(prev) return prev(event); +/******/ } +/******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000); +/******/ script.onerror = onScriptComplete.bind(null, script.onerror); +/******/ script.onload = onScriptComplete.bind(null, script.onload); +/******/ needAttach && document.head.appendChild(script); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ var scriptUrl; +/******/ if (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + ""; +/******/ var document = __webpack_require__.g.document; +/******/ if (!scriptUrl && document) { +/******/ if (document.currentScript) +/******/ scriptUrl = document.currentScript.src; +/******/ if (!scriptUrl) { +/******/ var scripts = document.getElementsByTagName("script"); +/******/ if(scripts.length) { +/******/ var i = scripts.length - 1; +/******/ while (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src; +/******/ } +/******/ } +/******/ } +/******/ // When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration +/******/ // or pass an empty string ("") and set the __webpack_public_path__ variable from your code to use your own logic. +/******/ if (!scriptUrl) throw new Error("Automatic publicPath is not supported in this browser"); +/******/ scriptUrl = scriptUrl.replace(/#.*$/, "").replace(/\?.*$/, "").replace(/\/[^\/]+$/, "/"); +/******/ __webpack_require__.p = scriptUrl; +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ 10: 0 +/******/ }; +/******/ +/******/ __webpack_require__.f.j = (chunkId, promises) => { +/******/ // JSONP chunk loading for javascript +/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[2]); +/******/ } else { +/******/ if(true) { // all chunks have JS +/******/ // setup Promise in chunk cache +/******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject])); +/******/ promises.push(installedChunkData[2] = promise); +/******/ +/******/ // start chunk loading +/******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId); +/******/ // create error before stack unwound to get useful stacktrace later +/******/ var error = new Error(); +/******/ var loadingEnded = (event) => { +/******/ if(__webpack_require__.o(installedChunks, chunkId)) { +/******/ installedChunkData = installedChunks[chunkId]; +/******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined; +/******/ if(installedChunkData) { +/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); +/******/ var realSrc = event && event.target && event.target.src; +/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; +/******/ error.name = 'ChunkLoadError'; +/******/ error.type = errorType; +/******/ error.request = realSrc; +/******/ installedChunkData[1](error); +/******/ } +/******/ } +/******/ }; +/******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId); +/******/ } +/******/ } +/******/ } +/******/ }; +/******/ +/******/ __webpack_require__.F.j = (chunkId) => { +/******/ if((!__webpack_require__.o(installedChunks, chunkId) || installedChunks[chunkId] === undefined) && true) { +/******/ installedChunks[chunkId] = null; +/******/ var link = document.createElement('link'); +/******/ +/******/ if (__webpack_require__.nc) { +/******/ link.setAttribute("nonce", __webpack_require__.nc); +/******/ } +/******/ link.rel = "prefetch"; +/******/ link.as = "script"; +/******/ link.href = __webpack_require__.p + __webpack_require__.u(chunkId); +/******/ document.head.appendChild(link); +/******/ } +/******/ }; +/******/ +/******/ __webpack_require__.H.j = (chunkId) => { +/******/ if((!__webpack_require__.o(installedChunks, chunkId) || installedChunks[chunkId] === undefined) && true) { +/******/ installedChunks[chunkId] = null; +/******/ var link = document.createElement('link'); +/******/ +/******/ link.charset = 'utf-8'; +/******/ if (__webpack_require__.nc) { +/******/ link.setAttribute("nonce", __webpack_require__.nc); +/******/ } +/******/ link.rel = "preload"; +/******/ link.as = "script"; +/******/ link.href = __webpack_require__.p + __webpack_require__.u(chunkId); +/******/ document.head.appendChild(link); +/******/ } +/******/ }; +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ __webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0); +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); +/******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ return __webpack_require__.O(result); +/******/ } +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ +/******/ /* webpack/runtime/chunk prefetch trigger */ +/******/ (() => { +/******/ var chunkToChildrenMap = { +/******/ "0": [ +/******/ 1, +/******/ 2 +/******/ ], +/******/ "3": [ +/******/ 4, +/******/ 6 +/******/ ] +/******/ }; +/******/ __webpack_require__.f.prefetch = (chunkId, promises) => (Promise.all(promises).then(() => { +/******/ var chunks = chunkToChildrenMap[chunkId]; +/******/ Array.isArray(chunks) && chunks.map(__webpack_require__.E); +/******/ })); +/******/ })(); +/******/ +/******/ /* webpack/runtime/chunk preload trigger */ +/******/ (() => { +/******/ var chunkToChildrenMap = { +/******/ "3": [ +/******/ 5 +/******/ ], +/******/ "7": [ +/******/ 8, +/******/ 9 +/******/ ] +/******/ }; +/******/ __webpack_require__.f.preload = (chunkId) => { +/******/ var chunks = chunkToChildrenMap[chunkId]; +/******/ Array.isArray(chunks) && chunks.map(__webpack_require__.G); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/startup prefetch */ +/******/ (() => { +/******/ __webpack_require__.O(0, [10], () => { +/******/ [0,3,7].map(__webpack_require__.E); +/******/ }, 5); +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +__webpack_require__.e(/* import() | a */ 0).then(__webpack_require__.t.bind(__webpack_require__, 1, 23)); +__webpack_require__.e(/* import() | b */ 3).then(__webpack_require__.t.bind(__webpack_require__, 2, 23)); +__webpack_require__.e(/* import() | c */ 7).then(__webpack_require__.t.bind(__webpack_require__, 3, 23)); + +__webpack_exports__ = __webpack_require__.O(__webpack_exports__); +/******/ })() +; \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/webpack.config.js b/test/cases/prefetch-preload-mixed/webpack.config.js index 1f2ec144..cf55c08c 100644 --- a/test/cases/prefetch-preload-mixed/webpack.config.js +++ b/test/cases/prefetch-preload-mixed/webpack.config.js @@ -1,10 +1,18 @@ -/** @type {import("../../../").Configuration} */ +import Self from "../../../src"; + module.exports = { - mode: "production", - entry: "./index", - stats: { - all: false, - chunkRelations: true, - chunks: true, + entry: "./index.js", + module: { + rules: [ + { + test: /\.css$/, + use: [Self.loader, "css-loader"], + }, + ], }, + plugins: [ + new Self({ + filename: "[name].css", + }), + ], }; From c47bd0f6080cccc1001b81b84fd89c885f3dfeb3 Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Tue, 16 Apr 2024 18:56:36 +0300 Subject: [PATCH 8/8] refactor: logic --- src/index.js | 140 ++---- src/utils.js | 260 +++++++++++ ...a909943.css => 0.ec6b19ad9e5afccf41ed.css} | 0 ...d1a909943.css => ec6b19ad9e5afccf41ed.css} | 0 .../expected/webpack-5-importModule/main.js | 6 +- test/cases/hmr/expected/main.js | 4 + test/cases/insert-function/expected/main.js | 4 + test/cases/insert-string/expected/main.js | 4 + test/cases/insert-undefined/expected/main.js | 4 + test/cases/prefetch-preload-mixed/a.js | 2 - test/cases/prefetch-preload-mixed/a1.js | 0 test/cases/prefetch-preload-mixed/a2.js | 0 test/cases/prefetch-preload-mixed/b1.js | 0 test/cases/prefetch-preload-mixed/b2.js | 0 test/cases/prefetch-preload-mixed/c.js | 2 - test/cases/prefetch-preload-mixed/c1.js | 0 test/cases/prefetch-preload-mixed/c2.js | 0 .../prefetch-preload-mixed/expected/a.js | 11 - .../prefetch-preload-mixed/expected/a1.js | 10 - .../prefetch-preload-mixed/expected/a2.js | 10 - .../prefetch-preload-mixed/expected/b.js | 13 - .../prefetch-preload-mixed/expected/b1.js | 10 - .../prefetch-preload-mixed/expected/b2.js | 10 - .../prefetch-preload-mixed/expected/b3.js | 10 - .../prefetch-preload-mixed/expected/c.js | 12 - .../prefetch-preload-mixed/expected/c1.js | 10 - .../prefetch-preload-mixed/expected/c2.js | 10 - test/cases/prefetch-preload/a.css | 3 + .../b.js | 4 +- test/cases/prefetch-preload/b1.css | 3 + test/cases/prefetch-preload/b2.css | 3 + .../b3.js | 0 test/cases/prefetch-preload/c.js | 2 + test/cases/prefetch-preload/c1.css | 3 + test/cases/prefetch-preload/c2.css | 3 + test/cases/prefetch-preload/expected/a.css | 4 + test/cases/prefetch-preload/expected/b.js | 13 + test/cases/prefetch-preload/expected/b1.css | 4 + test/cases/prefetch-preload/expected/b2.css | 4 + test/cases/prefetch-preload/expected/c.js | 12 + test/cases/prefetch-preload/expected/c1.css | 4 + test/cases/prefetch-preload/expected/c2.css | 4 + .../expected/main.js | 148 ++++++- .../index.js | 2 +- .../webpack.config.js | 0 test/cases/prefetch/expected/inner.js | 10 - test/cases/prefetch/expected/inner2.js | 17 - test/cases/prefetch/expected/main.js | 411 ------------------ test/cases/prefetch/expected/normal.js | 10 - test/cases/prefetch/expected/prefetched.js | 15 - test/cases/prefetch/expected/prefetched2.js | 10 - test/cases/prefetch/expected/prefetched3.js | 10 - test/cases/prefetch/index.js | 7 - test/cases/prefetch/inner.js | 0 test/cases/prefetch/inner2.js | 0 test/cases/prefetch/inner3.js | 0 test/cases/prefetch/normal.js | 0 test/cases/prefetch/prefetched.js | 5 - test/cases/prefetch/prefetched2.js | 0 test/cases/prefetch/prefetched3.js | 0 test/cases/prefetch/webpack.config.js | 18 - test/cases/prefetch/with-nested.js | 9 - test/cases/preload/expected/inner.js | 10 - test/cases/preload/expected/inner2.js | 17 - test/cases/preload/expected/main.js | 372 ---------------- test/cases/preload/expected/normal.js | 10 - test/cases/preload/expected/preloaded.js | 15 - test/cases/preload/expected/preloaded2.js | 10 - test/cases/preload/expected/preloaded3.js | 10 - test/cases/preload/index.js | 7 - test/cases/preload/inner.js | 0 test/cases/preload/inner2.js | 0 test/cases/preload/inner3.js | 0 test/cases/preload/normal.js | 0 test/cases/preload/preloaded.js | 5 - test/cases/preload/preloaded2.js | 0 test/cases/preload/preloaded3.js | 0 test/cases/preload/webpack.config.js | 18 - test/cases/preload/with-nested.js | 7 - test/manual/index.html | 24 + test/manual/src/index.js | 13 + test/manual/src/prefetch.css | 3 + test/manual/src/preload.css | 3 + test/manual/src/preload.js | 7 + types/index.d.ts | 6 +- 85 files changed, 572 insertions(+), 1235 deletions(-) rename test/cases/chunkFilename-fullhash/expected/webpack-5-importModule/{0.bb74e774207d1a909943.css => 0.ec6b19ad9e5afccf41ed.css} (100%) rename test/cases/chunkFilename-fullhash/expected/webpack-5-importModule/{bb74e774207d1a909943.css => ec6b19ad9e5afccf41ed.css} (100%) delete mode 100644 test/cases/prefetch-preload-mixed/a.js delete mode 100644 test/cases/prefetch-preload-mixed/a1.js delete mode 100644 test/cases/prefetch-preload-mixed/a2.js delete mode 100644 test/cases/prefetch-preload-mixed/b1.js delete mode 100644 test/cases/prefetch-preload-mixed/b2.js delete mode 100644 test/cases/prefetch-preload-mixed/c.js delete mode 100644 test/cases/prefetch-preload-mixed/c1.js delete mode 100644 test/cases/prefetch-preload-mixed/c2.js delete mode 100644 test/cases/prefetch-preload-mixed/expected/a.js delete mode 100644 test/cases/prefetch-preload-mixed/expected/a1.js delete mode 100644 test/cases/prefetch-preload-mixed/expected/a2.js delete mode 100644 test/cases/prefetch-preload-mixed/expected/b.js delete mode 100644 test/cases/prefetch-preload-mixed/expected/b1.js delete mode 100644 test/cases/prefetch-preload-mixed/expected/b2.js delete mode 100644 test/cases/prefetch-preload-mixed/expected/b3.js delete mode 100644 test/cases/prefetch-preload-mixed/expected/c.js delete mode 100644 test/cases/prefetch-preload-mixed/expected/c1.js delete mode 100644 test/cases/prefetch-preload-mixed/expected/c2.js create mode 100644 test/cases/prefetch-preload/a.css rename test/cases/{prefetch-preload-mixed => prefetch-preload}/b.js (62%) create mode 100644 test/cases/prefetch-preload/b1.css create mode 100644 test/cases/prefetch-preload/b2.css rename test/cases/{prefetch-preload-mixed => prefetch-preload}/b3.js (100%) create mode 100644 test/cases/prefetch-preload/c.js create mode 100644 test/cases/prefetch-preload/c1.css create mode 100644 test/cases/prefetch-preload/c2.css create mode 100644 test/cases/prefetch-preload/expected/a.css create mode 100644 test/cases/prefetch-preload/expected/b.js create mode 100644 test/cases/prefetch-preload/expected/b1.css create mode 100644 test/cases/prefetch-preload/expected/b2.css create mode 100644 test/cases/prefetch-preload/expected/c.js create mode 100644 test/cases/prefetch-preload/expected/c1.css create mode 100644 test/cases/prefetch-preload/expected/c2.css rename test/cases/{prefetch-preload-mixed => prefetch-preload}/expected/main.js (75%) rename test/cases/{prefetch-preload-mixed => prefetch-preload}/index.js (65%) rename test/cases/{prefetch-preload-mixed => prefetch-preload}/webpack.config.js (100%) delete mode 100644 test/cases/prefetch/expected/inner.js delete mode 100644 test/cases/prefetch/expected/inner2.js delete mode 100644 test/cases/prefetch/expected/main.js delete mode 100644 test/cases/prefetch/expected/normal.js delete mode 100644 test/cases/prefetch/expected/prefetched.js delete mode 100644 test/cases/prefetch/expected/prefetched2.js delete mode 100644 test/cases/prefetch/expected/prefetched3.js delete mode 100644 test/cases/prefetch/index.js delete mode 100644 test/cases/prefetch/inner.js delete mode 100644 test/cases/prefetch/inner2.js delete mode 100644 test/cases/prefetch/inner3.js delete mode 100644 test/cases/prefetch/normal.js delete mode 100644 test/cases/prefetch/prefetched.js delete mode 100644 test/cases/prefetch/prefetched2.js delete mode 100644 test/cases/prefetch/prefetched3.js delete mode 100644 test/cases/prefetch/webpack.config.js delete mode 100644 test/cases/prefetch/with-nested.js delete mode 100644 test/cases/preload/expected/inner.js delete mode 100644 test/cases/preload/expected/inner2.js delete mode 100644 test/cases/preload/expected/main.js delete mode 100644 test/cases/preload/expected/normal.js delete mode 100644 test/cases/preload/expected/preloaded.js delete mode 100644 test/cases/preload/expected/preloaded2.js delete mode 100644 test/cases/preload/expected/preloaded3.js delete mode 100644 test/cases/preload/index.js delete mode 100644 test/cases/preload/inner.js delete mode 100644 test/cases/preload/inner2.js delete mode 100644 test/cases/preload/inner3.js delete mode 100644 test/cases/preload/normal.js delete mode 100644 test/cases/preload/preloaded.js delete mode 100644 test/cases/preload/preloaded2.js delete mode 100644 test/cases/preload/preloaded3.js delete mode 100644 test/cases/preload/webpack.config.js delete mode 100644 test/cases/preload/with-nested.js create mode 100644 test/manual/src/prefetch.css create mode 100644 test/manual/src/preload.css create mode 100644 test/manual/src/preload.js diff --git a/src/index.js b/src/index.js index 5d81e36b..d2a19637 100644 --- a/src/index.js +++ b/src/index.js @@ -5,11 +5,6 @@ const path = require("path"); const { validate } = require("schema-utils"); const { SyncWaterfallHook } = require("tapable"); -// @ts-ignore -const JsonpChunkLoadingRuntimeModule = require("webpack/lib/web/JsonpChunkLoadingRuntimeModule"); -// @ts-ignore -const compileBooleanMatcher = require("webpack/lib/util/compileBooleanMatcher"); - const schema = require("./plugin-options.json"); const { trueFn, @@ -20,6 +15,7 @@ const { compareModulesByIdentifier, getUndoPath, BASE_URI, + compileBooleanMatcher, } = require("./utils"); /** @typedef {import("schema-utils/declarations/validate").Schema} Schema */ @@ -110,6 +106,8 @@ const CODE_GENERATION_RESULT = { /** * @typedef {Object} MiniCssExtractPluginCompilationHooks * @property {import("tapable").SyncWaterfallHook<[string, VarNames], string>} beforeTagInsert + * @property {SyncWaterfallHook<[string, Chunk]>} linkPreload + * @property {SyncWaterfallHook<[string, Chunk]>} linkPrefetch */ /** @@ -531,7 +529,8 @@ class MiniCssExtractPlugin { /** * Returns all hooks for the given compilation - * @param {Compilation} compilation + * @param {Compilation} compilation the compilation + * @returns {MiniCssExtractPluginCompilationHooks} hooks */ static getCompilationHooks(compilation) { let hooks = compilationHooksMap.get(compilation); @@ -542,6 +541,8 @@ class MiniCssExtractPlugin { ["source", "varNames"], "string" ), + linkPreload: new SyncWaterfallHook(["source", "chunk"]), + linkPrefetch: new SyncWaterfallHook(["source", "chunk"]), }; compilationHooksMap.set(compilation, hooks); } @@ -854,16 +855,9 @@ class MiniCssExtractPlugin { function chunkHasCss(chunk, chunkGraph) { // this function replace: // const chunkHasCss = require("webpack/lib/css/CssModulesPlugin").chunkHasCss; - return ( - !!chunkGraph.getChunkModulesIterableBySourceType(chunk, "css") || - !!chunkGraph.getChunkModulesIterableBySourceType( - chunk, - "css-import" - ) || - !!chunkGraph.getChunkModulesIterableBySourceType( - chunk, - "css/mini-extract" - ) + return !!chunkGraph.getChunkModulesIterableBySourceType( + chunk, + "css/mini-extract" ); } @@ -883,39 +877,36 @@ class MiniCssExtractPlugin { const { chunkGraph, chunk, runtimeRequirements } = this; const { runtimeTemplate, - outputOptions: { chunkLoadingGlobal, crossOriginLoading }, + outputOptions: { crossOriginLoading }, } = /** @type {Compilation} */ (this.compilation); const chunkMap = getCssChunkObject( /** @type {Chunk} */ (chunk), /** @type {Compilation} */ (this.compilation) ); - const { globalObject } = runtimeTemplate; - const { linkPreload, linkPrefetch } = - JsonpChunkLoadingRuntimeModule.getCompilationHooks(compilation); - const conditionMap = /** @type {ChunkGraph} */ ( - chunkGraph - ).getChunkConditionMap(/** @type {Chunk} */ (chunk), chunkHasCss); - const hasCssMatcher = compileBooleanMatcher(conditionMap); - const withLoading = runtimeRequirements.has(RuntimeGlobals.ensureChunkHandlers) && Object.keys(chunkMap).length > 0; const withHmr = runtimeRequirements.has( RuntimeGlobals.hmrDownloadUpdateHandlers ); + + if (!withLoading && !withHmr) { + return ""; + } + + const conditionMap = /** @type {ChunkGraph} */ ( + chunkGraph + ).getChunkConditionMap(/** @type {Chunk} */ (chunk), chunkHasCss); + const hasCssMatcher = compileBooleanMatcher(conditionMap); const withPrefetch = runtimeRequirements.has( RuntimeGlobals.prefetchChunkHandlers ); const withPreload = runtimeRequirements.has( RuntimeGlobals.preloadChunkHandlers ); - const chunkLoadingGlobalExpr = `${globalObject}[${JSON.stringify( - chunkLoadingGlobal - )}]`; + const { linkPreload, linkPrefetch } = + MiniCssExtractPlugin.getCompilationHooks(compilation); - if (!withLoading && !withHmr) { - return ""; - } return Template.asString([ 'if (typeof document === "undefined") return;', `var createStylesheet = ${runtimeTemplate.basicFunction( @@ -1052,23 +1043,6 @@ class MiniCssExtractPlugin { ), "};", "", - `var webpackJsonpCallback = ${runtimeTemplate.basicFunction( - "parentChunkLoadingFunction, data", - [ - runtimeTemplate.destructureArray(["chunkIds"], "data"), - "for(var i=0;i < chunkIds.length; i++) {", - Template.indent([ - "var chunkId = chunkIds[i];", - "installedCssChunks[chunkId] = 0;", - ]), - "}", - ] - )}`, - "", - `var chunkLoadingGlobal = ${chunkLoadingGlobalExpr} = ${chunkLoadingGlobalExpr} || [];`, - "chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));", - "chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));", - "", `${ RuntimeGlobals.ensureChunkHandlers }.miniCss = ${runtimeTemplate.basicFunction( @@ -1158,55 +1132,27 @@ class MiniCssExtractPlugin { hasCssMatcher === true ? "true" : hasCssMatcher("chunkId") }) {`, Template.indent([ - `var getLinkElements = function (rel, as) {`, - Template.indent([ - `var links = document.getElementsByTagName("link");`, - `var loadedLinks = [];`, - `for (var i = 0; i < links.length; i++) {`, - Template.indent([ - `if (`, - Template.indent([ - `links[i].getAttribute("rel") === rel &&`, - `links[i].getAttribute("as") === as`, - ]), - `) {`, - Template.indent([ - `loadedLinks.push(links[i].getAttribute("href"));`, - ]), - `}`, + "installedCssChunks[chunkId] = null;", + linkPrefetch.call( + Template.asString([ + "var link = document.createElement('link');", + crossOriginLoading + ? `link.crossOrigin = ${JSON.stringify( + crossOriginLoading + )};` + : "", + `if (${RuntimeGlobals.scriptNonce}) {`, + Template.indent( + `link.setAttribute("nonce", ${RuntimeGlobals.scriptNonce});` + ), + "}", + 'link.rel = "prefetch";', + 'link.as = "style";', + `link.href = ${RuntimeGlobals.publicPath} + ${RuntimeGlobals.require}.miniCssF(chunkId);`, ]), - `}`, - `return loadedLinks;`, - ]), - `};`, - "", - `var loadedPreloadLinkElements = getLinkElements("preload", "style");`, - `var chunkIdHref = ${RuntimeGlobals.publicPath} + ${RuntimeGlobals.require}.miniCssF(chunkId);`, - `if(!loadedPreloadLinkElements.includes(chunkIdHref)) {`, - Template.indent([ - "installedCssChunks[chunkId] = null;", - linkPrefetch.call( - Template.asString([ - "var link = document.createElement('link');", - crossOriginLoading - ? `link.crossOrigin = ${JSON.stringify( - crossOriginLoading - )};` - : "", - `if (${RuntimeGlobals.scriptNonce}) {`, - Template.indent( - `link.setAttribute("nonce", ${RuntimeGlobals.scriptNonce});` - ), - "}", - 'link.rel = "prefetch";', - 'link.as = "style";', - `link.href = ${RuntimeGlobals.publicPath} + ${RuntimeGlobals.require}.miniCssF(chunkId);`, - ]), - chunk - ), - "document.head.appendChild(link);", - ]), - `}`, + /** @type {Chunk} */ (chunk) + ), + "document.head.appendChild(link);", ]), "}", ])};` @@ -1249,7 +1195,7 @@ class MiniCssExtractPlugin { ]) : "", ]), - chunk + /** @type {Chunk} */ (chunk) ), "document.head.appendChild(link);", ]), diff --git a/src/utils.js b/src/utils.js index 68ab5f08..fc1c238f 100644 --- a/src/utils.js +++ b/src/utils.js @@ -214,6 +214,265 @@ function stringifyLocal(value) { return typeof value === "function" ? value.toString() : JSON.stringify(value); } +/** + * @param {string} str string + * @returns {string} string + */ +const toSimpleString = (str) => { + if (`${+str}` === str) { + return str; + } + return JSON.stringify(str); +}; + +/** + * @param {string} str string + * @returns {string} quoted meta + */ +const quoteMeta = (str) => str.replace(/[-[\]\\/{}()*+?.^$|]/g, "\\$&"); + +/** + * @param {Array} items items + * @returns {string} common prefix + */ +const getCommonPrefix = (items) => { + let prefix = items[0]; + + for (let i = 1; i < items.length; i++) { + const item = items[i]; + for (let p = 0; p < prefix.length; p++) { + if (item[p] !== prefix[p]) { + prefix = prefix.slice(0, p); + break; + } + } + } + + return prefix; +}; + +/** + * @param {Array} items items + * @returns {string} common suffix + */ +const getCommonSuffix = (items) => { + let suffix = items[0]; + + for (let i = 1; i < items.length; i++) { + const item = items[i]; + for (let p = item.length - 1, s = suffix.length - 1; s >= 0; p--, s--) { + if (item[p] !== suffix[s]) { + suffix = suffix.slice(s + 1); + break; + } + } + } + + return suffix; +}; + +/** + * @param {Set} itemsSet items set + * @param {(str: string) => string | false} getKey get key function + * @param {(str: Array) => boolean} condition condition + * @returns {Array>} list of common items + */ +const popCommonItems = (itemsSet, getKey, condition) => { + /** @type {Map>} */ + const map = new Map(); + + for (const item of itemsSet) { + const key = getKey(item); + if (key) { + let list = map.get(key); + if (list === undefined) { + /** @type {Array} */ + list = []; + map.set(key, list); + } + list.push(item); + } + } + + /** @type {Array>} */ + const result = []; + + for (const list of map.values()) { + if (condition(list)) { + for (const item of list) { + itemsSet.delete(item); + } + result.push(list); + } + } + + return result; +}; + +/** + * @param {Array} itemsArr array of items + * @returns {string} regexp + */ +const itemsToRegexp = (itemsArr) => { + if (itemsArr.length === 1) { + return quoteMeta(itemsArr[0]); + } + + /** @type {Array} */ + const finishedItems = []; + + // merge single char items: (a|b|c|d|ef) => ([abcd]|ef) + let countOfSingleCharItems = 0; + + for (const item of itemsArr) { + if (item.length === 1) { + // eslint-disable-next-line no-plusplus + countOfSingleCharItems++; + } + } + + // special case for only single char items + if (countOfSingleCharItems === itemsArr.length) { + return `[${quoteMeta(itemsArr.sort().join(""))}]`; + } + + const items = new Set(itemsArr.sort()); + + if (countOfSingleCharItems > 2) { + let singleCharItems = ""; + for (const item of items) { + if (item.length === 1) { + singleCharItems += item; + items.delete(item); + } + } + finishedItems.push(`[${quoteMeta(singleCharItems)}]`); + } + + // special case for 2 items with common prefix/suffix + if (finishedItems.length === 0 && items.size === 2) { + const prefix = getCommonPrefix(itemsArr); + const suffix = getCommonSuffix( + itemsArr.map((item) => item.slice(prefix.length)) + ); + + if (prefix.length > 0 || suffix.length > 0) { + return `${quoteMeta(prefix)}${itemsToRegexp( + itemsArr.map((i) => i.slice(prefix.length, -suffix.length || undefined)) + )}${quoteMeta(suffix)}`; + } + } + + // special case for 2 items with common suffix + if (finishedItems.length === 0 && items.size === 2) { + /** @type {Iterator} */ + const it = items[Symbol.iterator](); + const a = it.next().value; + const b = it.next().value; + if (a.length > 0 && b.length > 0 && a.slice(-1) === b.slice(-1)) { + return `${itemsToRegexp([a.slice(0, -1), b.slice(0, -1)])}${quoteMeta( + a.slice(-1) + )}`; + } + } + + // find common prefix: (a1|a2|a3|a4|b5) => (a(1|2|3|4)|b5) + const prefixed = popCommonItems( + items, + (item) => (item.length >= 1 ? item[0] : false), + (list) => { + if (list.length >= 3) return true; + if (list.length <= 1) return false; + return list[0][1] === list[1][1]; + } + ); + for (const prefixedItems of prefixed) { + const prefix = getCommonPrefix(prefixedItems); + finishedItems.push( + `${quoteMeta(prefix)}${itemsToRegexp( + prefixedItems.map((i) => i.slice(prefix.length)) + )}` + ); + } + + // find common suffix: (a1|b1|c1|d1|e2) => ((a|b|c|d)1|e2) + const suffixed = popCommonItems( + items, + (item) => (item.length >= 1 ? item.slice(-1) : false), + (list) => { + if (list.length >= 3) return true; + if (list.length <= 1) return false; + return list[0].slice(-2) === list[1].slice(-2); + } + ); + for (const suffixedItems of suffixed) { + const suffix = getCommonSuffix(suffixedItems); + finishedItems.push( + `${itemsToRegexp( + suffixedItems.map((i) => i.slice(0, -suffix.length)) + )}${quoteMeta(suffix)}` + ); + } + + // TODO further optimize regexp, i. e. + // use ranges: (1|2|3|4|a) => [1-4a] + const conditional = finishedItems.concat(Array.from(items, quoteMeta)); + if (conditional.length === 1) return conditional[0]; + return `(${conditional.join("|")})`; +}; + +/** + * @param {string[]} positiveItems positive items + * @param {string[]} negativeItems negative items + * @returns {function(string): string} a template function to determine the value at runtime + */ +const compileBooleanMatcherFromLists = (positiveItems, negativeItems) => { + if (positiveItems.length === 0) { + return () => "false"; + } + + if (negativeItems.length === 0) { + return () => "true"; + } + + if (positiveItems.length === 1) { + return (value) => `${toSimpleString(positiveItems[0])} == ${value}`; + } + + if (negativeItems.length === 1) { + return (value) => `${toSimpleString(negativeItems[0])} != ${value}`; + } + + const positiveRegexp = itemsToRegexp(positiveItems); + const negativeRegexp = itemsToRegexp(negativeItems); + + if (positiveRegexp.length <= negativeRegexp.length) { + return (value) => `/^${positiveRegexp}$/.test(${value})`; + } + + return (value) => `!/^${negativeRegexp}$/.test(${value})`; +}; + +// TODO simplify in the next major release and use it from webpack +/** + * @param {Record} map value map + * @returns {boolean|(function(string): string)} true/false, when unconditionally true/false, or a template function to determine the value at runtime + */ +const compileBooleanMatcher = (map) => { + const positiveItems = Object.keys(map).filter((i) => map[i]); + const negativeItems = Object.keys(map).filter((i) => !map[i]); + + if (positiveItems.length === 0) { + return false; + } + + if (negativeItems.length === 0) { + return true; + } + + return compileBooleanMatcherFromLists(positiveItems, negativeItems); +}; + module.exports = { trueFn, findModuleById, @@ -227,4 +486,5 @@ module.exports = { stringifyRequest, stringifyLocal, getUndoPath, + compileBooleanMatcher, }; diff --git a/test/cases/chunkFilename-fullhash/expected/webpack-5-importModule/0.bb74e774207d1a909943.css b/test/cases/chunkFilename-fullhash/expected/webpack-5-importModule/0.ec6b19ad9e5afccf41ed.css similarity index 100% rename from test/cases/chunkFilename-fullhash/expected/webpack-5-importModule/0.bb74e774207d1a909943.css rename to test/cases/chunkFilename-fullhash/expected/webpack-5-importModule/0.ec6b19ad9e5afccf41ed.css diff --git a/test/cases/chunkFilename-fullhash/expected/webpack-5-importModule/bb74e774207d1a909943.css b/test/cases/chunkFilename-fullhash/expected/webpack-5-importModule/ec6b19ad9e5afccf41ed.css similarity index 100% rename from test/cases/chunkFilename-fullhash/expected/webpack-5-importModule/bb74e774207d1a909943.css rename to test/cases/chunkFilename-fullhash/expected/webpack-5-importModule/ec6b19ad9e5afccf41ed.css diff --git a/test/cases/chunkFilename-fullhash/expected/webpack-5-importModule/main.js b/test/cases/chunkFilename-fullhash/expected/webpack-5-importModule/main.js index e288a56b..699df42d 100644 --- a/test/cases/chunkFilename-fullhash/expected/webpack-5-importModule/main.js +++ b/test/cases/chunkFilename-fullhash/expected/webpack-5-importModule/main.js @@ -73,7 +73,7 @@ __webpack_require__.r(__webpack_exports__); /******/ /******/ /* webpack/runtime/getFullHash */ /******/ (() => { -/******/ __webpack_require__.h = () => ("bb74e774207d1a909943") +/******/ __webpack_require__.h = () => ("ec6b19ad9e5afccf41ed") /******/ })(); /******/ /******/ /* webpack/runtime/global */ @@ -253,6 +253,10 @@ __webpack_require__.r(__webpack_exports__); /******/ }; /******/ /******/ // no hmr +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded /******/ })(); /******/ /******/ /* webpack/runtime/jsonp chunk loading */ diff --git a/test/cases/hmr/expected/main.js b/test/cases/hmr/expected/main.js index 39fc3d64..ff182fd7 100644 --- a/test/cases/hmr/expected/main.js +++ b/test/cases/hmr/expected/main.js @@ -1029,6 +1029,10 @@ __webpack_require__.r(__webpack_exports__); /******/ })); /******/ }); /******/ } +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded /******/ })(); /******/ /******/ /* webpack/runtime/jsonp chunk loading */ diff --git a/test/cases/insert-function/expected/main.js b/test/cases/insert-function/expected/main.js index 0f7f4ea5..bb3fbf19 100644 --- a/test/cases/insert-function/expected/main.js +++ b/test/cases/insert-function/expected/main.js @@ -238,6 +238,10 @@ /******/ }; /******/ /******/ // no hmr +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded /******/ })(); /******/ /******/ /* webpack/runtime/jsonp chunk loading */ diff --git a/test/cases/insert-string/expected/main.js b/test/cases/insert-string/expected/main.js index faf5ef4c..d2550a28 100644 --- a/test/cases/insert-string/expected/main.js +++ b/test/cases/insert-string/expected/main.js @@ -234,6 +234,10 @@ /******/ }; /******/ /******/ // no hmr +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded /******/ })(); /******/ /******/ /* webpack/runtime/jsonp chunk loading */ diff --git a/test/cases/insert-undefined/expected/main.js b/test/cases/insert-undefined/expected/main.js index eef6572b..ae8118ca 100644 --- a/test/cases/insert-undefined/expected/main.js +++ b/test/cases/insert-undefined/expected/main.js @@ -237,6 +237,10 @@ /******/ }; /******/ /******/ // no hmr +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded /******/ })(); /******/ /******/ /* webpack/runtime/jsonp chunk loading */ diff --git a/test/cases/prefetch-preload-mixed/a.js b/test/cases/prefetch-preload-mixed/a.js deleted file mode 100644 index 55e53491..00000000 --- a/test/cases/prefetch-preload-mixed/a.js +++ /dev/null @@ -1,2 +0,0 @@ -import(/* webpackPrefetch: true, webpackChunkName: "a1" */ "./a1"); -import(/* webpackPrefetch: true, webpackChunkName: "a2" */ "./a2"); diff --git a/test/cases/prefetch-preload-mixed/a1.js b/test/cases/prefetch-preload-mixed/a1.js deleted file mode 100644 index e69de29b..00000000 diff --git a/test/cases/prefetch-preload-mixed/a2.js b/test/cases/prefetch-preload-mixed/a2.js deleted file mode 100644 index e69de29b..00000000 diff --git a/test/cases/prefetch-preload-mixed/b1.js b/test/cases/prefetch-preload-mixed/b1.js deleted file mode 100644 index e69de29b..00000000 diff --git a/test/cases/prefetch-preload-mixed/b2.js b/test/cases/prefetch-preload-mixed/b2.js deleted file mode 100644 index e69de29b..00000000 diff --git a/test/cases/prefetch-preload-mixed/c.js b/test/cases/prefetch-preload-mixed/c.js deleted file mode 100644 index 33838a29..00000000 --- a/test/cases/prefetch-preload-mixed/c.js +++ /dev/null @@ -1,2 +0,0 @@ -import(/* webpackPreload: true, webpackChunkName: "c1" */ "./c1"); -import(/* webpackPreload: true, webpackChunkName: "c2" */ "./c2"); diff --git a/test/cases/prefetch-preload-mixed/c1.js b/test/cases/prefetch-preload-mixed/c1.js deleted file mode 100644 index e69de29b..00000000 diff --git a/test/cases/prefetch-preload-mixed/c2.js b/test/cases/prefetch-preload-mixed/c2.js deleted file mode 100644 index e69de29b..00000000 diff --git a/test/cases/prefetch-preload-mixed/expected/a.js b/test/cases/prefetch-preload-mixed/expected/a.js deleted file mode 100644 index 4a566fe5..00000000 --- a/test/cases/prefetch-preload-mixed/expected/a.js +++ /dev/null @@ -1,11 +0,0 @@ -(self["webpackChunk"] = self["webpackChunk"] || []).push([[0],[ -/* 0 */, -/* 1 */ -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - -__webpack_require__.e(/* import() | a1 */ 1).then(__webpack_require__.t.bind(__webpack_require__, 4, 23)); -__webpack_require__.e(/* import() | a2 */ 2).then(__webpack_require__.t.bind(__webpack_require__, 5, 23)); - - -/***/ }) -]]); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/expected/a1.js b/test/cases/prefetch-preload-mixed/expected/a1.js deleted file mode 100644 index 3d384b68..00000000 --- a/test/cases/prefetch-preload-mixed/expected/a1.js +++ /dev/null @@ -1,10 +0,0 @@ -(self["webpackChunk"] = self["webpackChunk"] || []).push([[1],{ - -/***/ 4: -/***/ (() => { - - - -/***/ }) - -}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/expected/a2.js b/test/cases/prefetch-preload-mixed/expected/a2.js deleted file mode 100644 index ed050c04..00000000 --- a/test/cases/prefetch-preload-mixed/expected/a2.js +++ /dev/null @@ -1,10 +0,0 @@ -(self["webpackChunk"] = self["webpackChunk"] || []).push([[2],{ - -/***/ 5: -/***/ (() => { - - - -/***/ }) - -}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/expected/b.js b/test/cases/prefetch-preload-mixed/expected/b.js deleted file mode 100644 index e4268efb..00000000 --- a/test/cases/prefetch-preload-mixed/expected/b.js +++ /dev/null @@ -1,13 +0,0 @@ -(self["webpackChunk"] = self["webpackChunk"] || []).push([[3],{ - -/***/ 2: -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - -__webpack_require__.e(/* import() | b1 */ 4).then(__webpack_require__.t.bind(__webpack_require__, 6, 23)); -__webpack_require__.e(/* import() | b2 */ 5).then(__webpack_require__.t.bind(__webpack_require__, 7, 23)); -__webpack_require__.e(/* import() | b3 */ 6).then(__webpack_require__.t.bind(__webpack_require__, 8, 23)); - - -/***/ }) - -}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/expected/b1.js b/test/cases/prefetch-preload-mixed/expected/b1.js deleted file mode 100644 index b21b7aba..00000000 --- a/test/cases/prefetch-preload-mixed/expected/b1.js +++ /dev/null @@ -1,10 +0,0 @@ -(self["webpackChunk"] = self["webpackChunk"] || []).push([[4],{ - -/***/ 6: -/***/ (() => { - - - -/***/ }) - -}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/expected/b2.js b/test/cases/prefetch-preload-mixed/expected/b2.js deleted file mode 100644 index 1837f395..00000000 --- a/test/cases/prefetch-preload-mixed/expected/b2.js +++ /dev/null @@ -1,10 +0,0 @@ -(self["webpackChunk"] = self["webpackChunk"] || []).push([[5],{ - -/***/ 7: -/***/ (() => { - - - -/***/ }) - -}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/expected/b3.js b/test/cases/prefetch-preload-mixed/expected/b3.js deleted file mode 100644 index af88c7bc..00000000 --- a/test/cases/prefetch-preload-mixed/expected/b3.js +++ /dev/null @@ -1,10 +0,0 @@ -(self["webpackChunk"] = self["webpackChunk"] || []).push([[6],{ - -/***/ 8: -/***/ (() => { - - - -/***/ }) - -}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/expected/c.js b/test/cases/prefetch-preload-mixed/expected/c.js deleted file mode 100644 index d64a9865..00000000 --- a/test/cases/prefetch-preload-mixed/expected/c.js +++ /dev/null @@ -1,12 +0,0 @@ -(self["webpackChunk"] = self["webpackChunk"] || []).push([[7],{ - -/***/ 3: -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - -__webpack_require__.e(/* import() | c1 */ 8).then(__webpack_require__.t.bind(__webpack_require__, 9, 23)); -__webpack_require__.e(/* import() | c2 */ 9).then(__webpack_require__.t.bind(__webpack_require__, 10, 23)); - - -/***/ }) - -}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/expected/c1.js b/test/cases/prefetch-preload-mixed/expected/c1.js deleted file mode 100644 index 7d4179c9..00000000 --- a/test/cases/prefetch-preload-mixed/expected/c1.js +++ /dev/null @@ -1,10 +0,0 @@ -(self["webpackChunk"] = self["webpackChunk"] || []).push([[8],{ - -/***/ 9: -/***/ (() => { - - - -/***/ }) - -}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload-mixed/expected/c2.js b/test/cases/prefetch-preload-mixed/expected/c2.js deleted file mode 100644 index 5d880e16..00000000 --- a/test/cases/prefetch-preload-mixed/expected/c2.js +++ /dev/null @@ -1,10 +0,0 @@ -(self["webpackChunk"] = self["webpackChunk"] || []).push([[9],{ - -/***/ 10: -/***/ (() => { - - - -/***/ }) - -}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload/a.css b/test/cases/prefetch-preload/a.css new file mode 100644 index 00000000..5451a331 --- /dev/null +++ b/test/cases/prefetch-preload/a.css @@ -0,0 +1,3 @@ +.a { + color: red; +} diff --git a/test/cases/prefetch-preload-mixed/b.js b/test/cases/prefetch-preload/b.js similarity index 62% rename from test/cases/prefetch-preload-mixed/b.js rename to test/cases/prefetch-preload/b.js index 756debf2..68eec89d 100644 --- a/test/cases/prefetch-preload-mixed/b.js +++ b/test/cases/prefetch-preload/b.js @@ -1,3 +1,3 @@ -import(/* webpackPrefetch: true, webpackChunkName: "b1" */ "./b1"); -import(/* webpackPreload: true, webpackChunkName: "b2" */ "./b2"); +import(/* webpackPrefetch: true, webpackChunkName: "b1" */ "./b1.css"); +import(/* webpackPreload: true, webpackChunkName: "b2" */ "./b2.css"); import(/* webpackPrefetch: true, webpackChunkName: "b3" */ "./b3"); diff --git a/test/cases/prefetch-preload/b1.css b/test/cases/prefetch-preload/b1.css new file mode 100644 index 00000000..effc583c --- /dev/null +++ b/test/cases/prefetch-preload/b1.css @@ -0,0 +1,3 @@ +.b1 { + color: red; +} diff --git a/test/cases/prefetch-preload/b2.css b/test/cases/prefetch-preload/b2.css new file mode 100644 index 00000000..e0331e1a --- /dev/null +++ b/test/cases/prefetch-preload/b2.css @@ -0,0 +1,3 @@ +.b2 { + color: red; +} diff --git a/test/cases/prefetch-preload-mixed/b3.js b/test/cases/prefetch-preload/b3.js similarity index 100% rename from test/cases/prefetch-preload-mixed/b3.js rename to test/cases/prefetch-preload/b3.js diff --git a/test/cases/prefetch-preload/c.js b/test/cases/prefetch-preload/c.js new file mode 100644 index 00000000..ce96cadc --- /dev/null +++ b/test/cases/prefetch-preload/c.js @@ -0,0 +1,2 @@ +import(/* webpackPreload: true, webpackChunkName: "c1" */ "./c1.css"); +import(/* webpackPreload: true, webpackChunkName: "c2" */ "./c2.css"); diff --git a/test/cases/prefetch-preload/c1.css b/test/cases/prefetch-preload/c1.css new file mode 100644 index 00000000..8725bcb0 --- /dev/null +++ b/test/cases/prefetch-preload/c1.css @@ -0,0 +1,3 @@ +.c1 { + color: red; +} diff --git a/test/cases/prefetch-preload/c2.css b/test/cases/prefetch-preload/c2.css new file mode 100644 index 00000000..a124f6df --- /dev/null +++ b/test/cases/prefetch-preload/c2.css @@ -0,0 +1,3 @@ +.c2 { + color: red; +} diff --git a/test/cases/prefetch-preload/expected/a.css b/test/cases/prefetch-preload/expected/a.css new file mode 100644 index 00000000..98f445d8 --- /dev/null +++ b/test/cases/prefetch-preload/expected/a.css @@ -0,0 +1,4 @@ +.a { + color: red; +} + diff --git a/test/cases/prefetch-preload/expected/b.js b/test/cases/prefetch-preload/expected/b.js new file mode 100644 index 00000000..7b97d9e9 --- /dev/null +++ b/test/cases/prefetch-preload/expected/b.js @@ -0,0 +1,13 @@ +(self["webpackChunk"] = self["webpackChunk"] || []).push([[1],{ + +/***/ 2: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__.e(/* import() | b1 */ 2).then(__webpack_require__.bind(__webpack_require__, 4)); +__webpack_require__.e(/* import() | b2 */ 3).then(__webpack_require__.bind(__webpack_require__, 5)); +__webpack_require__.e(/* import() | b3 */ 4).then(__webpack_require__.t.bind(__webpack_require__, 6, 23)); + + +/***/ }) + +}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload/expected/b1.css b/test/cases/prefetch-preload/expected/b1.css new file mode 100644 index 00000000..4ba3041c --- /dev/null +++ b/test/cases/prefetch-preload/expected/b1.css @@ -0,0 +1,4 @@ +.b1 { + color: red; +} + diff --git a/test/cases/prefetch-preload/expected/b2.css b/test/cases/prefetch-preload/expected/b2.css new file mode 100644 index 00000000..3bc21aa1 --- /dev/null +++ b/test/cases/prefetch-preload/expected/b2.css @@ -0,0 +1,4 @@ +.b2 { + color: red; +} + diff --git a/test/cases/prefetch-preload/expected/c.js b/test/cases/prefetch-preload/expected/c.js new file mode 100644 index 00000000..45d60ccc --- /dev/null +++ b/test/cases/prefetch-preload/expected/c.js @@ -0,0 +1,12 @@ +(self["webpackChunk"] = self["webpackChunk"] || []).push([[5],{ + +/***/ 3: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__.e(/* import() | c1 */ 6).then(__webpack_require__.bind(__webpack_require__, 7)); +__webpack_require__.e(/* import() | c2 */ 7).then(__webpack_require__.bind(__webpack_require__, 8)); + + +/***/ }) + +}]); \ No newline at end of file diff --git a/test/cases/prefetch-preload/expected/c1.css b/test/cases/prefetch-preload/expected/c1.css new file mode 100644 index 00000000..b10e79dd --- /dev/null +++ b/test/cases/prefetch-preload/expected/c1.css @@ -0,0 +1,4 @@ +.c1 { + color: red; +} + diff --git a/test/cases/prefetch-preload/expected/c2.css b/test/cases/prefetch-preload/expected/c2.css new file mode 100644 index 00000000..a17ea975 --- /dev/null +++ b/test/cases/prefetch-preload/expected/c2.css @@ -0,0 +1,4 @@ +.c2 { + color: red; +} + diff --git a/test/cases/prefetch-preload-mixed/expected/main.js b/test/cases/prefetch-preload/expected/main.js similarity index 75% rename from test/cases/prefetch-preload-mixed/expected/main.js rename to test/cases/prefetch-preload/expected/main.js index 9a0c0f74..7fc8edd5 100644 --- a/test/cases/prefetch-preload-mixed/expected/main.js +++ b/test/cases/prefetch-preload/expected/main.js @@ -141,7 +141,7 @@ /******/ // This function allow to reference async chunks /******/ __webpack_require__.u = (chunkId) => { /******/ // return url for filenames based on template -/******/ return "" + {"0":"a","1":"a1","2":"a2","3":"b","4":"b1","5":"b2","6":"b3","7":"c","8":"c1","9":"c2"}[chunkId] + ".js"; +/******/ return "" + {"0":"a","1":"b","2":"b1","3":"b2","4":"b3","5":"c","6":"c1","7":"c2"}[chunkId] + ".js"; /******/ }; /******/ })(); /******/ @@ -150,7 +150,7 @@ /******/ // This function allow to reference async chunks /******/ __webpack_require__.miniCssF = (chunkId) => { /******/ // return url for filenames based on template -/******/ return undefined; +/******/ return "" + {"0":"a","2":"b1","3":"b2","6":"c1","7":"c2"}[chunkId] + ".css"; /******/ }; /******/ })(); /******/ @@ -251,6 +251,118 @@ /******/ __webpack_require__.p = scriptUrl; /******/ })(); /******/ +/******/ /* webpack/runtime/css loading */ +/******/ (() => { +/******/ if (typeof document === "undefined") return; +/******/ var createStylesheet = (chunkId, fullhref, oldTag, resolve, reject) => { +/******/ var linkTag = document.createElement("link"); +/******/ +/******/ linkTag.rel = "stylesheet"; +/******/ linkTag.type = "text/css"; +/******/ if (__webpack_require__.nc) { +/******/ linkTag.nonce = __webpack_require__.nc; +/******/ } +/******/ var onLinkComplete = (event) => { +/******/ // avoid mem leaks. +/******/ linkTag.onerror = linkTag.onload = null; +/******/ if (event.type === 'load') { +/******/ resolve(); +/******/ } else { +/******/ var errorType = event && event.type; +/******/ var realHref = event && event.target && event.target.href || fullhref; +/******/ var err = new Error("Loading CSS chunk " + chunkId + " failed.\n(" + errorType + ": " + realHref + ")"); +/******/ err.name = "ChunkLoadError"; +/******/ err.code = "CSS_CHUNK_LOAD_FAILED"; +/******/ err.type = errorType; +/******/ err.request = realHref; +/******/ if (linkTag.parentNode) linkTag.parentNode.removeChild(linkTag) +/******/ reject(err); +/******/ } +/******/ } +/******/ linkTag.onerror = linkTag.onload = onLinkComplete; +/******/ linkTag.href = fullhref; +/******/ +/******/ +/******/ if (oldTag) { +/******/ oldTag.parentNode.insertBefore(linkTag, oldTag.nextSibling); +/******/ } else { +/******/ document.head.appendChild(linkTag); +/******/ } +/******/ return linkTag; +/******/ }; +/******/ var findStylesheet = (href, fullhref) => { +/******/ var existingLinkTags = document.getElementsByTagName("link"); +/******/ for(var i = 0; i < existingLinkTags.length; i++) { +/******/ var tag = existingLinkTags[i]; +/******/ var dataHref = tag.getAttribute("data-href") || tag.getAttribute("href"); +/******/ if(tag.rel === "stylesheet" && (dataHref === href || dataHref === fullhref)) return tag; +/******/ } +/******/ var existingStyleTags = document.getElementsByTagName("style"); +/******/ for(var i = 0; i < existingStyleTags.length; i++) { +/******/ var tag = existingStyleTags[i]; +/******/ var dataHref = tag.getAttribute("data-href"); +/******/ if(dataHref === href || dataHref === fullhref) return tag; +/******/ } +/******/ }; +/******/ var loadStylesheet = (chunkId) => { +/******/ return new Promise((resolve, reject) => { +/******/ var href = __webpack_require__.miniCssF(chunkId); +/******/ var fullhref = __webpack_require__.p + href; +/******/ if(findStylesheet(href, fullhref)) return resolve(); +/******/ createStylesheet(chunkId, fullhref, null, resolve, reject); +/******/ }); +/******/ } +/******/ // object to store loaded CSS chunks +/******/ var installedCssChunks = { +/******/ 8: 0 +/******/ }; +/******/ +/******/ __webpack_require__.f.miniCss = (chunkId, promises) => { +/******/ var cssChunks = {"0":1,"2":1,"3":1,"6":1,"7":1}; +/******/ if(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]); +/******/ else if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) { +/******/ promises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(() => { +/******/ installedCssChunks[chunkId] = 0; +/******/ }, (e) => { +/******/ delete installedCssChunks[chunkId]; +/******/ throw e; +/******/ })); +/******/ } +/******/ }; +/******/ +/******/ // no hmr +/******/ +/******/ __webpack_require__.F.miniCss = (chunkId) => { +/******/ if((!__webpack_require__.o(installedCssChunks, chunkId) || installedCssChunks[chunkId] === undefined) && !/^[1458]$/.test(chunkId)) { +/******/ installedCssChunks[chunkId] = null; +/******/ var link = document.createElement('link'); +/******/ +/******/ if (__webpack_require__.nc) { +/******/ link.setAttribute("nonce", __webpack_require__.nc); +/******/ } +/******/ link.rel = "prefetch"; +/******/ link.as = "style"; +/******/ link.href = __webpack_require__.p + __webpack_require__.miniCssF(chunkId); +/******/ document.head.appendChild(link); +/******/ } +/******/ }; +/******/ +/******/ __webpack_require__.H.miniCss = (chunkId) => { +/******/ if((!__webpack_require__.o(installedCssChunks, chunkId) || installedCssChunks[chunkId] === undefined) && !/^[1458]$/.test(chunkId)) { +/******/ installedCssChunks[chunkId] = null; +/******/ var link = document.createElement('link'); +/******/ link.charset = 'utf-8'; +/******/ if (__webpack_require__.nc) { +/******/ link.setAttribute("nonce", __webpack_require__.nc); +/******/ } +/******/ link.rel = "preload"; +/******/ link.as = "style"; +/******/ link.href = __webpack_require__.p + __webpack_require__.miniCssF(chunkId); +/******/ document.head.appendChild(link); +/******/ } +/******/ }; +/******/ })(); +/******/ /******/ /* webpack/runtime/jsonp chunk loading */ /******/ (() => { /******/ // no baseURI @@ -259,7 +371,7 @@ /******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched /******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded /******/ var installedChunks = { -/******/ 10: 0 +/******/ 8: 0 /******/ }; /******/ /******/ __webpack_require__.f.j = (chunkId, promises) => { @@ -371,13 +483,9 @@ /******/ /* webpack/runtime/chunk prefetch trigger */ /******/ (() => { /******/ var chunkToChildrenMap = { -/******/ "0": [ -/******/ 1, -/******/ 2 -/******/ ], -/******/ "3": [ -/******/ 4, -/******/ 6 +/******/ "1": [ +/******/ 2, +/******/ 4 /******/ ] /******/ }; /******/ __webpack_require__.f.prefetch = (chunkId, promises) => (Promise.all(promises).then(() => { @@ -389,12 +497,12 @@ /******/ /* webpack/runtime/chunk preload trigger */ /******/ (() => { /******/ var chunkToChildrenMap = { -/******/ "3": [ -/******/ 5 +/******/ "1": [ +/******/ 3 /******/ ], -/******/ "7": [ -/******/ 8, -/******/ 9 +/******/ "5": [ +/******/ 6, +/******/ 7 /******/ ] /******/ }; /******/ __webpack_require__.f.preload = (chunkId) => { @@ -405,16 +513,16 @@ /******/ /******/ /* webpack/runtime/startup prefetch */ /******/ (() => { -/******/ __webpack_require__.O(0, [10], () => { -/******/ [0,3,7].map(__webpack_require__.E); +/******/ __webpack_require__.O(0, [8], () => { +/******/ [0,1,5].map(__webpack_require__.E); /******/ }, 5); /******/ })(); /******/ /************************************************************************/ var __webpack_exports__ = {}; -__webpack_require__.e(/* import() | a */ 0).then(__webpack_require__.t.bind(__webpack_require__, 1, 23)); -__webpack_require__.e(/* import() | b */ 3).then(__webpack_require__.t.bind(__webpack_require__, 2, 23)); -__webpack_require__.e(/* import() | c */ 7).then(__webpack_require__.t.bind(__webpack_require__, 3, 23)); +__webpack_require__.e(/* import() | a */ 0).then(__webpack_require__.bind(__webpack_require__, 1)); +__webpack_require__.e(/* import() | b */ 1).then(__webpack_require__.t.bind(__webpack_require__, 2, 23)); +__webpack_require__.e(/* import() | c */ 5).then(__webpack_require__.t.bind(__webpack_require__, 3, 23)); __webpack_exports__ = __webpack_require__.O(__webpack_exports__); /******/ })() diff --git a/test/cases/prefetch-preload-mixed/index.js b/test/cases/prefetch-preload/index.js similarity index 65% rename from test/cases/prefetch-preload-mixed/index.js rename to test/cases/prefetch-preload/index.js index f25d6fea..e1c87500 100644 --- a/test/cases/prefetch-preload-mixed/index.js +++ b/test/cases/prefetch-preload/index.js @@ -1,3 +1,3 @@ -import(/* webpackPrefetch: true, webpackChunkName: "a" */ "./a"); +import(/* webpackPrefetch: true, webpackChunkName: "a" */ "./a.css"); import(/* webpackPrefetch: true, webpackChunkName: "b" */ "./b"); import(/* webpackPrefetch: true, webpackChunkName: "c" */ "./c"); diff --git a/test/cases/prefetch-preload-mixed/webpack.config.js b/test/cases/prefetch-preload/webpack.config.js similarity index 100% rename from test/cases/prefetch-preload-mixed/webpack.config.js rename to test/cases/prefetch-preload/webpack.config.js diff --git a/test/cases/prefetch/expected/inner.js b/test/cases/prefetch/expected/inner.js deleted file mode 100644 index 49ef065a..00000000 --- a/test/cases/prefetch/expected/inner.js +++ /dev/null @@ -1,10 +0,0 @@ -(self["webpackChunk"] = self["webpackChunk"] || []).push([[0],{ - -/***/ 6: -/***/ (() => { - - - -/***/ }) - -}]); \ No newline at end of file diff --git a/test/cases/prefetch/expected/inner2.js b/test/cases/prefetch/expected/inner2.js deleted file mode 100644 index 9eff91f7..00000000 --- a/test/cases/prefetch/expected/inner2.js +++ /dev/null @@ -1,17 +0,0 @@ -(self["webpackChunk"] = self["webpackChunk"] || []).push([[1],{ - -/***/ 7: -/***/ (() => { - - - -/***/ }), - -/***/ 8: -/***/ (() => { - - - -/***/ }) - -}]); \ No newline at end of file diff --git a/test/cases/prefetch/expected/main.js b/test/cases/prefetch/expected/main.js deleted file mode 100644 index 6541c8c3..00000000 --- a/test/cases/prefetch/expected/main.js +++ /dev/null @@ -1,411 +0,0 @@ -/******/ (() => { // webpackBootstrap -/******/ var __webpack_modules__ = ([ -/* 0 */, -/* 1 */ -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - -__webpack_require__.e(/* import() | prefetched2 */ 5).then(__webpack_require__.t.bind(__webpack_require__, 4, 23)); -__webpack_require__.e(/* import() | prefetched2 */ 5).then(__webpack_require__.t.bind(__webpack_require__, 4, 23)); -__webpack_require__.e(/* import() | prefetched3 */ 6).then(__webpack_require__.t.bind(__webpack_require__, 5, 23)); - - -/***/ }) -/******/ ]); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = __webpack_modules__; -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/chunk loaded */ -/******/ (() => { -/******/ var deferred = []; -/******/ __webpack_require__.O = (result, chunkIds, fn, priority) => { -/******/ if(chunkIds) { -/******/ priority = priority || 0; -/******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1]; -/******/ deferred[i] = [chunkIds, fn, priority]; -/******/ return; -/******/ } -/******/ var notFulfilled = Infinity; -/******/ for (var i = 0; i < deferred.length; i++) { -/******/ var [chunkIds, fn, priority] = deferred[i]; -/******/ var fulfilled = true; -/******/ for (var j = 0; j < chunkIds.length; j++) { -/******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) { -/******/ chunkIds.splice(j--, 1); -/******/ } else { -/******/ fulfilled = false; -/******/ if(priority < notFulfilled) notFulfilled = priority; -/******/ } -/******/ } -/******/ if(fulfilled) { -/******/ deferred.splice(i--, 1) -/******/ var r = fn(); -/******/ if (r !== undefined) result = r; -/******/ } -/******/ } -/******/ return result; -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/chunk prefetch function */ -/******/ (() => { -/******/ __webpack_require__.F = {}; -/******/ __webpack_require__.E = (chunkId) => { -/******/ Object.keys(__webpack_require__.F).map((key) => { -/******/ __webpack_require__.F[key](chunkId); -/******/ }); -/******/ } -/******/ })(); -/******/ -/******/ /* webpack/runtime/compat get default export */ -/******/ (() => { -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = (module) => { -/******/ var getter = module && module.__esModule ? -/******/ () => (module['default']) : -/******/ () => (module); -/******/ __webpack_require__.d(getter, { a: getter }); -/******/ return getter; -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/create fake namespace object */ -/******/ (() => { -/******/ var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__); -/******/ var leafPrototypes; -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 16: return value when it's Promise-like -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = this(value); -/******/ if(mode & 8) return value; -/******/ if(typeof value === 'object' && value) { -/******/ if((mode & 4) && value.__esModule) return value; -/******/ if((mode & 16) && typeof value.then === 'function') return value; -/******/ } -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ var def = {}; -/******/ leafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)]; -/******/ for(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) { -/******/ Object.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key]))); -/******/ } -/******/ def['default'] = () => (value); -/******/ __webpack_require__.d(ns, def); -/******/ return ns; -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/ensure chunk */ -/******/ (() => { -/******/ __webpack_require__.f = {}; -/******/ // This file contains only the entry chunk. -/******/ // The chunk loading function for additional chunks -/******/ __webpack_require__.e = (chunkId) => { -/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { -/******/ __webpack_require__.f[key](chunkId, promises); -/******/ return promises; -/******/ }, [])); -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/get javascript chunk filename */ -/******/ (() => { -/******/ // This function allow to reference async chunks -/******/ __webpack_require__.u = (chunkId) => { -/******/ // return url for filenames based on template -/******/ return "" + {"0":"inner","1":"inner2","3":"normal","4":"prefetched","5":"prefetched2","6":"prefetched3"}[chunkId] + ".js"; -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/get mini-css chunk filename */ -/******/ (() => { -/******/ // This function allow to reference async chunks -/******/ __webpack_require__.miniCssF = (chunkId) => { -/******/ // return url for filenames based on template -/******/ return undefined; -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/global */ -/******/ (() => { -/******/ __webpack_require__.g = (function() { -/******/ if (typeof globalThis === 'object') return globalThis; -/******/ try { -/******/ return this || new Function('return this')(); -/******/ } catch (e) { -/******/ if (typeof window === 'object') return window; -/******/ } -/******/ })(); -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/load script */ -/******/ (() => { -/******/ var inProgress = {}; -/******/ // data-webpack is not used as build has no uniqueName -/******/ // loadScript function to load a script via script tag -/******/ __webpack_require__.l = (url, done, key, chunkId) => { -/******/ if(inProgress[url]) { inProgress[url].push(done); return; } -/******/ var script, needAttach; -/******/ if(key !== undefined) { -/******/ var scripts = document.getElementsByTagName("script"); -/******/ for(var i = 0; i < scripts.length; i++) { -/******/ var s = scripts[i]; -/******/ if(s.getAttribute("src") == url) { script = s; break; } -/******/ } -/******/ } -/******/ if(!script) { -/******/ needAttach = true; -/******/ script = document.createElement('script'); -/******/ -/******/ script.charset = 'utf-8'; -/******/ script.timeout = 120; -/******/ if (__webpack_require__.nc) { -/******/ script.setAttribute("nonce", __webpack_require__.nc); -/******/ } -/******/ -/******/ -/******/ script.src = url; -/******/ } -/******/ inProgress[url] = [done]; -/******/ var onScriptComplete = (prev, event) => { -/******/ // avoid mem leaks in IE. -/******/ script.onerror = script.onload = null; -/******/ clearTimeout(timeout); -/******/ var doneFns = inProgress[url]; -/******/ delete inProgress[url]; -/******/ script.parentNode && script.parentNode.removeChild(script); -/******/ doneFns && doneFns.forEach((fn) => (fn(event))); -/******/ if(prev) return prev(event); -/******/ } -/******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000); -/******/ script.onerror = onScriptComplete.bind(null, script.onerror); -/******/ script.onload = onScriptComplete.bind(null, script.onload); -/******/ needAttach && document.head.appendChild(script); -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/publicPath */ -/******/ (() => { -/******/ var scriptUrl; -/******/ if (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + ""; -/******/ var document = __webpack_require__.g.document; -/******/ if (!scriptUrl && document) { -/******/ if (document.currentScript) -/******/ scriptUrl = document.currentScript.src; -/******/ if (!scriptUrl) { -/******/ var scripts = document.getElementsByTagName("script"); -/******/ if(scripts.length) { -/******/ var i = scripts.length - 1; -/******/ while (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src; -/******/ } -/******/ } -/******/ } -/******/ // When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration -/******/ // or pass an empty string ("") and set the __webpack_public_path__ variable from your code to use your own logic. -/******/ if (!scriptUrl) throw new Error("Automatic publicPath is not supported in this browser"); -/******/ scriptUrl = scriptUrl.replace(/#.*$/, "").replace(/\?.*$/, "").replace(/\/[^\/]+$/, "/"); -/******/ __webpack_require__.p = scriptUrl; -/******/ })(); -/******/ -/******/ /* webpack/runtime/jsonp chunk loading */ -/******/ (() => { -/******/ // no baseURI -/******/ -/******/ // object to store loaded and loading chunks -/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched -/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded -/******/ var installedChunks = { -/******/ 2: 0 -/******/ }; -/******/ -/******/ __webpack_require__.f.j = (chunkId, promises) => { -/******/ // JSONP chunk loading for javascript -/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; -/******/ if(installedChunkData !== 0) { // 0 means "already installed". -/******/ -/******/ // a Promise means "currently loading". -/******/ if(installedChunkData) { -/******/ promises.push(installedChunkData[2]); -/******/ } else { -/******/ if(true) { // all chunks have JS -/******/ // setup Promise in chunk cache -/******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject])); -/******/ promises.push(installedChunkData[2] = promise); -/******/ -/******/ // start chunk loading -/******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId); -/******/ // create error before stack unwound to get useful stacktrace later -/******/ var error = new Error(); -/******/ var loadingEnded = (event) => { -/******/ if(__webpack_require__.o(installedChunks, chunkId)) { -/******/ installedChunkData = installedChunks[chunkId]; -/******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined; -/******/ if(installedChunkData) { -/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); -/******/ var realSrc = event && event.target && event.target.src; -/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; -/******/ error.name = 'ChunkLoadError'; -/******/ error.type = errorType; -/******/ error.request = realSrc; -/******/ installedChunkData[1](error); -/******/ } -/******/ } -/******/ }; -/******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId); -/******/ } -/******/ } -/******/ } -/******/ }; -/******/ -/******/ __webpack_require__.F.j = (chunkId) => { -/******/ if((!__webpack_require__.o(installedChunks, chunkId) || installedChunks[chunkId] === undefined) && true) { -/******/ installedChunks[chunkId] = null; -/******/ var link = document.createElement('link'); -/******/ -/******/ if (__webpack_require__.nc) { -/******/ link.setAttribute("nonce", __webpack_require__.nc); -/******/ } -/******/ link.rel = "prefetch"; -/******/ link.as = "script"; -/******/ link.href = __webpack_require__.p + __webpack_require__.u(chunkId); -/******/ document.head.appendChild(link); -/******/ } -/******/ }; -/******/ -/******/ // no preloaded -/******/ -/******/ // no HMR -/******/ -/******/ // no HMR manifest -/******/ -/******/ __webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0); -/******/ -/******/ // install a JSONP callback for chunk loading -/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { -/******/ var [chunkIds, moreModules, runtime] = data; -/******/ // add "moreModules" to the modules object, -/******/ // then flag all "chunkIds" as loaded and fire callback -/******/ var moduleId, chunkId, i = 0; -/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { -/******/ for(moduleId in moreModules) { -/******/ if(__webpack_require__.o(moreModules, moduleId)) { -/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; -/******/ } -/******/ } -/******/ if(runtime) var result = runtime(__webpack_require__); -/******/ } -/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); -/******/ for(;i < chunkIds.length; i++) { -/******/ chunkId = chunkIds[i]; -/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { -/******/ installedChunks[chunkId][0](); -/******/ } -/******/ installedChunks[chunkId] = 0; -/******/ } -/******/ return __webpack_require__.O(result); -/******/ } -/******/ -/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; -/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); -/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); -/******/ })(); -/******/ -/******/ /* webpack/runtime/chunk prefetch trigger */ -/******/ (() => { -/******/ var chunkToChildrenMap = { -/******/ "4": [ -/******/ 1, -/******/ 0 -/******/ ] -/******/ }; -/******/ __webpack_require__.f.prefetch = (chunkId, promises) => (Promise.all(promises).then(() => { -/******/ var chunks = chunkToChildrenMap[chunkId]; -/******/ Array.isArray(chunks) && chunks.map(__webpack_require__.E); -/******/ })); -/******/ })(); -/******/ -/******/ /* webpack/runtime/startup prefetch */ -/******/ (() => { -/******/ __webpack_require__.O(0, [2], () => { -/******/ [5,4,6].map(__webpack_require__.E); -/******/ }, 5); -/******/ })(); -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be in strict mode. -(() => { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _with_nested__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1); -/* harmony import */ var _with_nested__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_with_nested__WEBPACK_IMPORTED_MODULE_0__); -// eslint-disable-next-line import/no-unresolved - - -__webpack_require__.e(/* import() | prefetched */ 4).then(__webpack_require__.t.bind(__webpack_require__, 2, 23)); -setTimeout(() => { - __webpack_require__.e(/* import() | normal */ 3).then(__webpack_require__.t.bind(__webpack_require__, 3, 23)); -}, 500); - -})(); - -__webpack_exports__ = __webpack_require__.O(__webpack_exports__); -/******/ })() -; \ No newline at end of file diff --git a/test/cases/prefetch/expected/normal.js b/test/cases/prefetch/expected/normal.js deleted file mode 100644 index 25608459..00000000 --- a/test/cases/prefetch/expected/normal.js +++ /dev/null @@ -1,10 +0,0 @@ -(self["webpackChunk"] = self["webpackChunk"] || []).push([[3],{ - -/***/ 3: -/***/ (() => { - - - -/***/ }) - -}]); \ No newline at end of file diff --git a/test/cases/prefetch/expected/prefetched.js b/test/cases/prefetch/expected/prefetched.js deleted file mode 100644 index 17c45d61..00000000 --- a/test/cases/prefetch/expected/prefetched.js +++ /dev/null @@ -1,15 +0,0 @@ -(self["webpackChunk"] = self["webpackChunk"] || []).push([[4],{ - -/***/ 2: -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - -setTimeout(() => { - __webpack_require__.e(/* import() | inner */ 0).then(__webpack_require__.t.bind(__webpack_require__, 6, 23)); - __webpack_require__.e(/* import() | inner2 */ 1).then(__webpack_require__.t.bind(__webpack_require__, 7, 23)); - __webpack_require__.e(/* import() | inner2 */ 1).then(__webpack_require__.t.bind(__webpack_require__, 8, 23)); -}, 5000); - - -/***/ }) - -}]); \ No newline at end of file diff --git a/test/cases/prefetch/expected/prefetched2.js b/test/cases/prefetch/expected/prefetched2.js deleted file mode 100644 index 12cf8614..00000000 --- a/test/cases/prefetch/expected/prefetched2.js +++ /dev/null @@ -1,10 +0,0 @@ -(self["webpackChunk"] = self["webpackChunk"] || []).push([[5],{ - -/***/ 4: -/***/ (() => { - - - -/***/ }) - -}]); \ No newline at end of file diff --git a/test/cases/prefetch/expected/prefetched3.js b/test/cases/prefetch/expected/prefetched3.js deleted file mode 100644 index 93a9146a..00000000 --- a/test/cases/prefetch/expected/prefetched3.js +++ /dev/null @@ -1,10 +0,0 @@ -(self["webpackChunk"] = self["webpackChunk"] || []).push([[6],{ - -/***/ 5: -/***/ (() => { - - - -/***/ }) - -}]); \ No newline at end of file diff --git a/test/cases/prefetch/index.js b/test/cases/prefetch/index.js deleted file mode 100644 index 34275c6b..00000000 --- a/test/cases/prefetch/index.js +++ /dev/null @@ -1,7 +0,0 @@ -// eslint-disable-next-line import/no-unresolved -import "./with-nested"; - -import(/* webpackPrefetch: 1, webpackChunkName: "prefetched" */ "./prefetched"); -setTimeout(() => { - import(/* webpackChunkName: "normal" */ "./normal"); -}, 500); diff --git a/test/cases/prefetch/inner.js b/test/cases/prefetch/inner.js deleted file mode 100644 index e69de29b..00000000 diff --git a/test/cases/prefetch/inner2.js b/test/cases/prefetch/inner2.js deleted file mode 100644 index e69de29b..00000000 diff --git a/test/cases/prefetch/inner3.js b/test/cases/prefetch/inner3.js deleted file mode 100644 index e69de29b..00000000 diff --git a/test/cases/prefetch/normal.js b/test/cases/prefetch/normal.js deleted file mode 100644 index e69de29b..00000000 diff --git a/test/cases/prefetch/prefetched.js b/test/cases/prefetch/prefetched.js deleted file mode 100644 index b895d1e3..00000000 --- a/test/cases/prefetch/prefetched.js +++ /dev/null @@ -1,5 +0,0 @@ -setTimeout(() => { - import(/* webpackPrefetch: 10, webpackChunkName: "inner" */ "./inner"); - import(/* webpackPrefetch: 20, webpackChunkName: "inner2" */ "./inner2"); - import(/* webpackChunkName: "inner2" */ "./inner3"); -}, 5000); diff --git a/test/cases/prefetch/prefetched2.js b/test/cases/prefetch/prefetched2.js deleted file mode 100644 index e69de29b..00000000 diff --git a/test/cases/prefetch/prefetched3.js b/test/cases/prefetch/prefetched3.js deleted file mode 100644 index e69de29b..00000000 diff --git a/test/cases/prefetch/webpack.config.js b/test/cases/prefetch/webpack.config.js deleted file mode 100644 index cf55c08c..00000000 --- a/test/cases/prefetch/webpack.config.js +++ /dev/null @@ -1,18 +0,0 @@ -import Self from "../../../src"; - -module.exports = { - entry: "./index.js", - module: { - rules: [ - { - test: /\.css$/, - use: [Self.loader, "css-loader"], - }, - ], - }, - plugins: [ - new Self({ - filename: "[name].css", - }), - ], -}; diff --git a/test/cases/prefetch/with-nested.js b/test/cases/prefetch/with-nested.js deleted file mode 100644 index a8d638ad..00000000 --- a/test/cases/prefetch/with-nested.js +++ /dev/null @@ -1,9 +0,0 @@ -import( - /* webpackPrefetch: -20, webpackChunkName: "prefetched2" */ "./prefetched2" -); -import( - /* webpackPrefetch: 3, webpackChunkName: "prefetched2" */ "./prefetched2" -); -import( - /* webpackPrefetch: -10, webpackChunkName: "prefetched3" */ "./prefetched3" -); diff --git a/test/cases/preload/expected/inner.js b/test/cases/preload/expected/inner.js deleted file mode 100644 index 49ef065a..00000000 --- a/test/cases/preload/expected/inner.js +++ /dev/null @@ -1,10 +0,0 @@ -(self["webpackChunk"] = self["webpackChunk"] || []).push([[0],{ - -/***/ 6: -/***/ (() => { - - - -/***/ }) - -}]); \ No newline at end of file diff --git a/test/cases/preload/expected/inner2.js b/test/cases/preload/expected/inner2.js deleted file mode 100644 index 9eff91f7..00000000 --- a/test/cases/preload/expected/inner2.js +++ /dev/null @@ -1,17 +0,0 @@ -(self["webpackChunk"] = self["webpackChunk"] || []).push([[1],{ - -/***/ 7: -/***/ (() => { - - - -/***/ }), - -/***/ 8: -/***/ (() => { - - - -/***/ }) - -}]); \ No newline at end of file diff --git a/test/cases/preload/expected/main.js b/test/cases/preload/expected/main.js deleted file mode 100644 index 597eae1b..00000000 --- a/test/cases/preload/expected/main.js +++ /dev/null @@ -1,372 +0,0 @@ -/******/ (() => { // webpackBootstrap -/******/ var __webpack_modules__ = ([ -/* 0 */, -/* 1 */ -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - -__webpack_require__.e(/* import() | preloaded2 */ 5).then(__webpack_require__.t.bind(__webpack_require__, 4, 23)); -__webpack_require__.e(/* import() | preloaded2 */ 5).then(__webpack_require__.t.bind(__webpack_require__, 4, 23)); -__webpack_require__.e(/* import() | preloaded3 */ 6).then(__webpack_require__.t.bind(__webpack_require__, 5, 23)); - - -/***/ }) -/******/ ]); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = __webpack_modules__; -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/chunk preload function */ -/******/ (() => { -/******/ __webpack_require__.H = {}; -/******/ __webpack_require__.G = (chunkId) => { -/******/ Object.keys(__webpack_require__.H).map((key) => { -/******/ __webpack_require__.H[key](chunkId); -/******/ }); -/******/ } -/******/ })(); -/******/ -/******/ /* webpack/runtime/compat get default export */ -/******/ (() => { -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = (module) => { -/******/ var getter = module && module.__esModule ? -/******/ () => (module['default']) : -/******/ () => (module); -/******/ __webpack_require__.d(getter, { a: getter }); -/******/ return getter; -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/create fake namespace object */ -/******/ (() => { -/******/ var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__); -/******/ var leafPrototypes; -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 16: return value when it's Promise-like -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = this(value); -/******/ if(mode & 8) return value; -/******/ if(typeof value === 'object' && value) { -/******/ if((mode & 4) && value.__esModule) return value; -/******/ if((mode & 16) && typeof value.then === 'function') return value; -/******/ } -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ var def = {}; -/******/ leafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)]; -/******/ for(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) { -/******/ Object.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key]))); -/******/ } -/******/ def['default'] = () => (value); -/******/ __webpack_require__.d(ns, def); -/******/ return ns; -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/ensure chunk */ -/******/ (() => { -/******/ __webpack_require__.f = {}; -/******/ // This file contains only the entry chunk. -/******/ // The chunk loading function for additional chunks -/******/ __webpack_require__.e = (chunkId) => { -/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { -/******/ __webpack_require__.f[key](chunkId, promises); -/******/ return promises; -/******/ }, [])); -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/get javascript chunk filename */ -/******/ (() => { -/******/ // This function allow to reference async chunks -/******/ __webpack_require__.u = (chunkId) => { -/******/ // return url for filenames based on template -/******/ return "" + {"0":"inner","1":"inner2","3":"normal","4":"preloaded","5":"preloaded2","6":"preloaded3"}[chunkId] + ".js"; -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/get mini-css chunk filename */ -/******/ (() => { -/******/ // This function allow to reference async chunks -/******/ __webpack_require__.miniCssF = (chunkId) => { -/******/ // return url for filenames based on template -/******/ return undefined; -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/global */ -/******/ (() => { -/******/ __webpack_require__.g = (function() { -/******/ if (typeof globalThis === 'object') return globalThis; -/******/ try { -/******/ return this || new Function('return this')(); -/******/ } catch (e) { -/******/ if (typeof window === 'object') return window; -/******/ } -/******/ })(); -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/load script */ -/******/ (() => { -/******/ var inProgress = {}; -/******/ // data-webpack is not used as build has no uniqueName -/******/ // loadScript function to load a script via script tag -/******/ __webpack_require__.l = (url, done, key, chunkId) => { -/******/ if(inProgress[url]) { inProgress[url].push(done); return; } -/******/ var script, needAttach; -/******/ if(key !== undefined) { -/******/ var scripts = document.getElementsByTagName("script"); -/******/ for(var i = 0; i < scripts.length; i++) { -/******/ var s = scripts[i]; -/******/ if(s.getAttribute("src") == url) { script = s; break; } -/******/ } -/******/ } -/******/ if(!script) { -/******/ needAttach = true; -/******/ script = document.createElement('script'); -/******/ -/******/ script.charset = 'utf-8'; -/******/ script.timeout = 120; -/******/ if (__webpack_require__.nc) { -/******/ script.setAttribute("nonce", __webpack_require__.nc); -/******/ } -/******/ -/******/ -/******/ script.src = url; -/******/ } -/******/ inProgress[url] = [done]; -/******/ var onScriptComplete = (prev, event) => { -/******/ // avoid mem leaks in IE. -/******/ script.onerror = script.onload = null; -/******/ clearTimeout(timeout); -/******/ var doneFns = inProgress[url]; -/******/ delete inProgress[url]; -/******/ script.parentNode && script.parentNode.removeChild(script); -/******/ doneFns && doneFns.forEach((fn) => (fn(event))); -/******/ if(prev) return prev(event); -/******/ } -/******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000); -/******/ script.onerror = onScriptComplete.bind(null, script.onerror); -/******/ script.onload = onScriptComplete.bind(null, script.onload); -/******/ needAttach && document.head.appendChild(script); -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/publicPath */ -/******/ (() => { -/******/ var scriptUrl; -/******/ if (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + ""; -/******/ var document = __webpack_require__.g.document; -/******/ if (!scriptUrl && document) { -/******/ if (document.currentScript) -/******/ scriptUrl = document.currentScript.src; -/******/ if (!scriptUrl) { -/******/ var scripts = document.getElementsByTagName("script"); -/******/ if(scripts.length) { -/******/ var i = scripts.length - 1; -/******/ while (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src; -/******/ } -/******/ } -/******/ } -/******/ // When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration -/******/ // or pass an empty string ("") and set the __webpack_public_path__ variable from your code to use your own logic. -/******/ if (!scriptUrl) throw new Error("Automatic publicPath is not supported in this browser"); -/******/ scriptUrl = scriptUrl.replace(/#.*$/, "").replace(/\?.*$/, "").replace(/\/[^\/]+$/, "/"); -/******/ __webpack_require__.p = scriptUrl; -/******/ })(); -/******/ -/******/ /* webpack/runtime/jsonp chunk loading */ -/******/ (() => { -/******/ // no baseURI -/******/ -/******/ // object to store loaded and loading chunks -/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched -/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded -/******/ var installedChunks = { -/******/ 2: 0 -/******/ }; -/******/ -/******/ __webpack_require__.f.j = (chunkId, promises) => { -/******/ // JSONP chunk loading for javascript -/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; -/******/ if(installedChunkData !== 0) { // 0 means "already installed". -/******/ -/******/ // a Promise means "currently loading". -/******/ if(installedChunkData) { -/******/ promises.push(installedChunkData[2]); -/******/ } else { -/******/ if(true) { // all chunks have JS -/******/ // setup Promise in chunk cache -/******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject])); -/******/ promises.push(installedChunkData[2] = promise); -/******/ -/******/ // start chunk loading -/******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId); -/******/ // create error before stack unwound to get useful stacktrace later -/******/ var error = new Error(); -/******/ var loadingEnded = (event) => { -/******/ if(__webpack_require__.o(installedChunks, chunkId)) { -/******/ installedChunkData = installedChunks[chunkId]; -/******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined; -/******/ if(installedChunkData) { -/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); -/******/ var realSrc = event && event.target && event.target.src; -/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; -/******/ error.name = 'ChunkLoadError'; -/******/ error.type = errorType; -/******/ error.request = realSrc; -/******/ installedChunkData[1](error); -/******/ } -/******/ } -/******/ }; -/******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId); -/******/ } -/******/ } -/******/ } -/******/ }; -/******/ -/******/ // no prefetching -/******/ -/******/ __webpack_require__.H.j = (chunkId) => { -/******/ if((!__webpack_require__.o(installedChunks, chunkId) || installedChunks[chunkId] === undefined) && true) { -/******/ installedChunks[chunkId] = null; -/******/ var link = document.createElement('link'); -/******/ -/******/ link.charset = 'utf-8'; -/******/ if (__webpack_require__.nc) { -/******/ link.setAttribute("nonce", __webpack_require__.nc); -/******/ } -/******/ link.rel = "preload"; -/******/ link.as = "script"; -/******/ link.href = __webpack_require__.p + __webpack_require__.u(chunkId); -/******/ document.head.appendChild(link); -/******/ } -/******/ }; -/******/ -/******/ // no HMR -/******/ -/******/ // no HMR manifest -/******/ -/******/ // no on chunks loaded -/******/ -/******/ // install a JSONP callback for chunk loading -/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { -/******/ var [chunkIds, moreModules, runtime] = data; -/******/ // add "moreModules" to the modules object, -/******/ // then flag all "chunkIds" as loaded and fire callback -/******/ var moduleId, chunkId, i = 0; -/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { -/******/ for(moduleId in moreModules) { -/******/ if(__webpack_require__.o(moreModules, moduleId)) { -/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; -/******/ } -/******/ } -/******/ if(runtime) var result = runtime(__webpack_require__); -/******/ } -/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); -/******/ for(;i < chunkIds.length; i++) { -/******/ chunkId = chunkIds[i]; -/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { -/******/ installedChunks[chunkId][0](); -/******/ } -/******/ installedChunks[chunkId] = 0; -/******/ } -/******/ -/******/ } -/******/ -/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; -/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); -/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); -/******/ })(); -/******/ -/******/ /* webpack/runtime/chunk preload trigger */ -/******/ (() => { -/******/ var chunkToChildrenMap = { -/******/ "4": [ -/******/ 1, -/******/ 0 -/******/ ] -/******/ }; -/******/ __webpack_require__.f.preload = (chunkId) => { -/******/ var chunks = chunkToChildrenMap[chunkId]; -/******/ Array.isArray(chunks) && chunks.map(__webpack_require__.G); -/******/ }; -/******/ })(); -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be in strict mode. -(() => { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _with_nested__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1); -/* harmony import */ var _with_nested__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_with_nested__WEBPACK_IMPORTED_MODULE_0__); -// eslint-disable-next-line import/no-unresolved - - -__webpack_require__.e(/* import() | preloaded */ 4).then(__webpack_require__.t.bind(__webpack_require__, 2, 23)); -setTimeout(() => { - __webpack_require__.e(/* import() | normal */ 3).then(__webpack_require__.t.bind(__webpack_require__, 3, 23)); -}, 500); - -})(); - -/******/ })() -; \ No newline at end of file diff --git a/test/cases/preload/expected/normal.js b/test/cases/preload/expected/normal.js deleted file mode 100644 index 25608459..00000000 --- a/test/cases/preload/expected/normal.js +++ /dev/null @@ -1,10 +0,0 @@ -(self["webpackChunk"] = self["webpackChunk"] || []).push([[3],{ - -/***/ 3: -/***/ (() => { - - - -/***/ }) - -}]); \ No newline at end of file diff --git a/test/cases/preload/expected/preloaded.js b/test/cases/preload/expected/preloaded.js deleted file mode 100644 index 17c45d61..00000000 --- a/test/cases/preload/expected/preloaded.js +++ /dev/null @@ -1,15 +0,0 @@ -(self["webpackChunk"] = self["webpackChunk"] || []).push([[4],{ - -/***/ 2: -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - -setTimeout(() => { - __webpack_require__.e(/* import() | inner */ 0).then(__webpack_require__.t.bind(__webpack_require__, 6, 23)); - __webpack_require__.e(/* import() | inner2 */ 1).then(__webpack_require__.t.bind(__webpack_require__, 7, 23)); - __webpack_require__.e(/* import() | inner2 */ 1).then(__webpack_require__.t.bind(__webpack_require__, 8, 23)); -}, 5000); - - -/***/ }) - -}]); \ No newline at end of file diff --git a/test/cases/preload/expected/preloaded2.js b/test/cases/preload/expected/preloaded2.js deleted file mode 100644 index 12cf8614..00000000 --- a/test/cases/preload/expected/preloaded2.js +++ /dev/null @@ -1,10 +0,0 @@ -(self["webpackChunk"] = self["webpackChunk"] || []).push([[5],{ - -/***/ 4: -/***/ (() => { - - - -/***/ }) - -}]); \ No newline at end of file diff --git a/test/cases/preload/expected/preloaded3.js b/test/cases/preload/expected/preloaded3.js deleted file mode 100644 index 93a9146a..00000000 --- a/test/cases/preload/expected/preloaded3.js +++ /dev/null @@ -1,10 +0,0 @@ -(self["webpackChunk"] = self["webpackChunk"] || []).push([[6],{ - -/***/ 5: -/***/ (() => { - - - -/***/ }) - -}]); \ No newline at end of file diff --git a/test/cases/preload/index.js b/test/cases/preload/index.js deleted file mode 100644 index bba8e969..00000000 --- a/test/cases/preload/index.js +++ /dev/null @@ -1,7 +0,0 @@ -// eslint-disable-next-line import/no-unresolved -import "./with-nested"; - -import(/* webpackPreload: 1, webpackChunkName: "preloaded" */ "./preloaded"); -setTimeout(() => { - import(/* webpackChunkName: "normal" */ "./normal"); -}, 500); diff --git a/test/cases/preload/inner.js b/test/cases/preload/inner.js deleted file mode 100644 index e69de29b..00000000 diff --git a/test/cases/preload/inner2.js b/test/cases/preload/inner2.js deleted file mode 100644 index e69de29b..00000000 diff --git a/test/cases/preload/inner3.js b/test/cases/preload/inner3.js deleted file mode 100644 index e69de29b..00000000 diff --git a/test/cases/preload/normal.js b/test/cases/preload/normal.js deleted file mode 100644 index e69de29b..00000000 diff --git a/test/cases/preload/preloaded.js b/test/cases/preload/preloaded.js deleted file mode 100644 index c676cd7a..00000000 --- a/test/cases/preload/preloaded.js +++ /dev/null @@ -1,5 +0,0 @@ -setTimeout(() => { - import(/* webpackPreload: 10, webpackChunkName: "inner" */ "./inner"); - import(/* webpackPreload: 20, webpackChunkName: "inner2" */ "./inner2"); - import(/* webpackChunkName: "inner2" */ "./inner3"); -}, 5000); diff --git a/test/cases/preload/preloaded2.js b/test/cases/preload/preloaded2.js deleted file mode 100644 index e69de29b..00000000 diff --git a/test/cases/preload/preloaded3.js b/test/cases/preload/preloaded3.js deleted file mode 100644 index e69de29b..00000000 diff --git a/test/cases/preload/webpack.config.js b/test/cases/preload/webpack.config.js deleted file mode 100644 index cf55c08c..00000000 --- a/test/cases/preload/webpack.config.js +++ /dev/null @@ -1,18 +0,0 @@ -import Self from "../../../src"; - -module.exports = { - entry: "./index.js", - module: { - rules: [ - { - test: /\.css$/, - use: [Self.loader, "css-loader"], - }, - ], - }, - plugins: [ - new Self({ - filename: "[name].css", - }), - ], -}; diff --git a/test/cases/preload/with-nested.js b/test/cases/preload/with-nested.js deleted file mode 100644 index 8f23fcf1..00000000 --- a/test/cases/preload/with-nested.js +++ /dev/null @@ -1,7 +0,0 @@ -import( - /* webpackPreload: -20, webpackChunkName: "preloaded2" */ "./preloaded2" -); -import(/* webpackPreload: 3, webpackChunkName: "preloaded2" */ "./preloaded2"); -import( - /* webpackPreload: -10, webpackChunkName: "preloaded3" */ "./preloaded3" -); diff --git a/test/manual/index.html b/test/manual/index.html index 3b7d2ca4..8c93cb71 100644 --- a/test/manual/index.html +++ b/test/manual/index.html @@ -23,6 +23,16 @@ background: lightgreen; } + + @@ -97,6 +107,20 @@

+
+

Prefetch CSS: Must be blue and green after click.

+

+ to load + prefetched chunk +

+
+
+

Preload CSS: Must be white, then blue, then green after click.

+

+ to load + preloaded chunk +

+
diff --git a/test/manual/src/index.js b/test/manual/src/index.js index 8f0d1450..76f0dc49 100644 --- a/test/manual/src/index.js +++ b/test/manual/src/index.js @@ -102,3 +102,16 @@ worker.postMessage("test"); worker.addEventListener("message", (event) => { console.log(`Received message from worker: ${event.data}`); }); + +makeButton( + ".prefetch-button", + () => import(/* webpackPrefetch: true */ "./prefetch.css"), + false +); + +makeButton( + ".preload-button", + // eslint-disable-next-line import/extensions + () => import("./preload.js"), + false +); diff --git a/test/manual/src/prefetch.css b/test/manual/src/prefetch.css new file mode 100644 index 00000000..b0439ee6 --- /dev/null +++ b/test/manual/src/prefetch.css @@ -0,0 +1,3 @@ +.prefetch { + background: lightgreen !important; +} diff --git a/test/manual/src/preload.css b/test/manual/src/preload.css new file mode 100644 index 00000000..2742013d --- /dev/null +++ b/test/manual/src/preload.css @@ -0,0 +1,3 @@ +.preload { + background: lightgreen !important; +} diff --git a/test/manual/src/preload.js b/test/manual/src/preload.js new file mode 100644 index 00000000..015a99a7 --- /dev/null +++ b/test/manual/src/preload.js @@ -0,0 +1,7 @@ +async function load() { + setTimeout(() => { + import(/* webpackPreload: true */ "./preload.css"); + }, 1000); +} + +load(); diff --git a/types/index.d.ts b/types/index.d.ts index 0765eb15..0bd721c3 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -14,7 +14,8 @@ declare class MiniCssExtractPlugin { ): CssDependencyConstructor; /** * Returns all hooks for the given compilation - * @param {Compilation} compilation + * @param {Compilation} compilation the compilation + * @returns {MiniCssExtractPluginCompilationHooks} hooks */ static getCompilationHooks( compilation: Compilation @@ -118,6 +119,8 @@ type MiniCssExtractPluginCompilationHooks = { [string, VarNames], string >; + linkPreload: SyncWaterfallHook<[string, Chunk]>; + linkPrefetch: SyncWaterfallHook<[string, Chunk]>; }; type PluginOptions = { filename?: Required["output"]["filename"]; @@ -255,3 +258,4 @@ type VarNames = { resolve: string; reject: string; }; +import { SyncWaterfallHook } from "tapable";