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"; pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy