From 6383ef39a4a72472e5e26caecd22659f7d21be94 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Wed, 7 Mar 2018 10:33:14 +0100 Subject: [PATCH] only load CSS once --- src/index.js | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/index.js b/src/index.js index 0bcfb3ba..e9763ac8 100644 --- a/src/index.js +++ b/src/index.js @@ -131,6 +131,25 @@ class MiniCssExtractPlugin { } }); const { mainTemplate } = compilation; + mainTemplate.hooks.localVars.tap( + 'mini-css-extract-plugin', + (source, chunk) => { + const chunkMap = this.getCssChunkObject(chunk); + if (Object.keys(chunkMap).length > 0) { + return Template.asString([ + source, + '', + '// object to store loaded CSS chunks', + 'var installedCssChunks = {', + Template.indent( + chunk.ids.map(id => `${JSON.stringify(id)}: 0`).join(',\n'), + ), + '}', + ]); + } + return source; + }, + ); mainTemplate.hooks.requireEnsure.tap( 'mini-css-extract-plugin', (source, chunk, hash) => { @@ -164,9 +183,10 @@ class MiniCssExtractPlugin { '', '// mini-css-extract-plugin CSS loading', `var cssChunks = ${JSON.stringify(chunkMap)};`, - 'if(cssChunks[chunkId]) {', + 'if(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);', + 'else if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {', Template.indent([ - 'promises.push(new Promise(function(resolve, reject) {', + 'promises.push(installedCssChunks[chunkId] = new Promise(function(resolve, reject) {', Template.indent([ 'var linkTag = document.createElement("link");', 'linkTag.rel = "stylesheet";', @@ -175,6 +195,7 @@ class MiniCssExtractPlugin { `linkTag.href = ${mainTemplate.requireFn}.p + ${linkHrefPath};`, 'var head = document.getElementsByTagName("head")[0];', 'head.appendChild(linkTag);', + 'installedCssChunks[chunkId] = 0;', ]), '}));', ]),