From 116392a2f8658c8f3e037a2c759ef866c464e268 Mon Sep 17 00:00:00 2001 From: "Andrii.Sas" Date: Mon, 30 Dec 2019 08:06:12 +0200 Subject: [PATCH] feat: link preload support (#142) --- src/index.js | 40 ++++++++++++++++++++++++++- src/plugin-options.json | 3 ++ test/manual/index.html | 5 ++++ test/manual/src/index.js | 17 ++++++++++++ test/manual/src/lazy-link-preload.css | 3 ++ 5 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 test/manual/src/lazy-link-preload.css diff --git a/src/index.js b/src/index.js index d9f6bf2d..3a831fad 100644 --- a/src/index.js +++ b/src/index.js @@ -107,6 +107,7 @@ class MiniCssExtractPlugin { filename: DEFAULT_FILENAME, moduleFilename: () => this.options.filename || DEFAULT_FILENAME, ignoreOrder: false, + cssPreload: true, }, options ); @@ -338,7 +339,7 @@ class MiniCssExtractPlugin { Template.indent([ 'var tag = existingLinkTags[i];', 'var dataHref = tag.getAttribute("data-href") || tag.getAttribute("href");', - 'if(tag.rel === "stylesheet" && (dataHref === href || dataHref === fullhref)) return resolve();', + 'if((tag.rel === "stylesheet" || tag.rel === "preload") && (dataHref === href || dataHref === fullhref)) return resolve();', ]), '}', 'var existingStyleTags = document.getElementsByTagName("style");', @@ -350,9 +351,46 @@ class MiniCssExtractPlugin { ]), '}', 'var linkTag = document.createElement("link");', + this.options.cssPreload + ? Template.asString([ + 'var isPreloadSupported = (function() {', + Template.indent([ + 'try { return linkTag.relList.supports("preload"); }', + 'catch(e) { return false; }', + ]), + '}());', + 'if (isPreloadSupported) {', + Template.indent([ + 'linkTag.rel = "preload";', + 'linkTag.as = "style";', + 'linkTag.onload = function() {', + Template.indent([ + 'linkTag.rel = "stylesheet";', + 'linkTag.onload = null;', + 'resolve();', + ]), + '};', + ]), + '} else {', + Template.indent([ + 'linkTag.rel = "stylesheet";', + 'linkTag.type = "text/css";', + 'linkTag.media = "print";', + 'linkTag.onload = function() {', + Template.indent([ + 'linkTag.media = "all";', + 'linkTag.onload = null;', + 'resolve();', + ]), + '};', + ]), + '}', + ]) + : Template.asString([ 'linkTag.rel = "stylesheet";', 'linkTag.type = "text/css";', 'linkTag.onload = resolve;', + ]), 'linkTag.onerror = function(event) {', Template.indent([ 'var request = event && event.target && event.target.src || fullhref;', diff --git a/src/plugin-options.json b/src/plugin-options.json index 391cbf9a..e2484466 100644 --- a/src/plugin-options.json +++ b/src/plugin-options.json @@ -13,6 +13,9 @@ }, "ignoreOrder": { "type": "boolean" + }, + "cssPreload": { + "type": "boolean" } } } diff --git a/test/manual/index.html b/test/manual/index.html index c95108db..0f6ed7fb 100644 --- a/test/manual/index.html +++ b/test/manual/index.html @@ -51,6 +51,11 @@

An error should have appeared.

Now if you turn the network back on and click it again, it should turn aqua.

+

Preloaded CSS: Must be green.

displays an alert and should turn red.

diff --git a/test/manual/src/index.js b/test/manual/src/index.js index 92761702..1ed06b8e 100644 --- a/test/manual/src/index.js +++ b/test/manual/src/index.js @@ -45,6 +45,23 @@ const makeButton = (className, fn, shouldDisable = true) => { makeButton('.lazy-button', () => import('./lazy.js')); makeButton('.lazy-button2', () => import('./lazy2.css')); +makeButton('.lazy-link-preload-button', () => { + const promise = import('./lazy-link-preload.css'); + const linkElement = Array.from(document.head.children) + .slice(-2) + .find((el) => { + return el.tagName === 'LINK'; + }); + + alert( + `Is css preloaded by ? - ${ + linkElement.getAttribute('rel') === 'preload' ? 'yes' : 'no' + }` + ); + + return promise; +}); + makeButton('.preloaded-button1', () => import(/* webpackChunkName: "preloaded1" */ './preloaded1') ); diff --git a/test/manual/src/lazy-link-preload.css b/test/manual/src/lazy-link-preload.css new file mode 100644 index 00000000..c110018f --- /dev/null +++ b/test/manual/src/lazy-link-preload.css @@ -0,0 +1,3 @@ +.lazy-link-preload { + background: lightgreen; +}