@@ -323,10 +323,13 @@ class ExtractCssChunksPlugin {
323
323
}
324
324
) ;
325
325
const { insert } = this . options ;
326
+ const supportsPreload =
327
+ '(function() { try { return document.createElement("link").relList.supports("preload"); } catch(e) { return false; }}());' ;
326
328
return Template . asString ( [
327
329
source ,
328
330
'' ,
329
331
`// ${ pluginName } CSS loading` ,
332
+ `var supportsPreload = ${ supportsPreload } ` ,
330
333
`var cssChunks = ${ JSON . stringify ( chunkMap ) } ;` ,
331
334
'if(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);' ,
332
335
'else if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {' ,
@@ -340,8 +343,7 @@ class ExtractCssChunksPlugin {
340
343
Template . indent ( [
341
344
'var tag = existingLinkTags[i];' ,
342
345
'var dataHref = tag.getAttribute("data-href") || tag.getAttribute("href");' ,
343
- 'if(tag.rel === "stylesheet" && (dataHref === href || dataHref === fullhref)) return resolve();' ,
344
- ] ) ,
346
+ 'if((tag.rel === "stylesheet" || tag.rel === "preload") && (dataHref === href || dataHref === fullhref)) return resolve();' , ] ) ,
345
347
'}' ,
346
348
'var existingStyleTags = document.getElementsByTagName("style");' ,
347
349
'for(var i = 0; i < existingStyleTags.length; i++) {' ,
@@ -352,8 +354,8 @@ class ExtractCssChunksPlugin {
352
354
] ) ,
353
355
'}' ,
354
356
'var linkTag = document.createElement("link");' ,
355
- 'linkTag.rel = "stylesheet";' ,
356
- 'linkTag.type = "text/css";' ,
357
+ 'linkTag.rel = supportsPreload ? "preload": "stylesheet";' ,
358
+ 'supportsPreload ? linkTag.as = "style" : linkTag.type = "text/css";' ,
357
359
'linkTag.onload = resolve;' ,
358
360
'linkTag.onerror = function(event) {' ,
359
361
Template . indent ( [
@@ -383,7 +385,18 @@ class ExtractCssChunksPlugin {
383
385
: 'var head = document.getElementsByTagName("head")[0]; head.appendChild(linkTag)' ,
384
386
] ) ,
385
387
'}).then(function() {' ,
386
- Template . indent ( [ 'installedCssChunks[chunkId] = 0;' ] ) ,
388
+ Template . indent ( [
389
+ 'installedCssChunks[chunkId] = 0;' ,
390
+ 'if(supportsPreload) {' ,
391
+ Template . indent ( [
392
+ 'var execLinkTag = document.createElement("link");' ,
393
+ `execLinkTag.href = ${ mainTemplate . requireFn } .p + ${ linkHrefPath } ;` ,
394
+ 'execLinkTag.rel = "stylesheet";' ,
395
+ 'execLinkTag.type = "text/css";' ,
396
+ 'document.body.appendChild(execLinkTag);' ,
397
+ ] ) ,
398
+ '}' ,
399
+ ] ) ,
387
400
'}));' ,
388
401
] ) ,
389
402
'}' ,
0 commit comments