Skip to content

Repository files navigation

licenseBuild Statusnpm versiondependencies StatusdevDependencies StatuspeerDependencies Statusnpm

Asynchronous stylesheets loading with HTML Webpack Plugin

Why load stylesheets asynchronously?

Referencing CSS stylesheets with link[rel=stylesheet] or @import causes browsers to delay page rendering while a stylesheet loads. When loading stylesheets that are not critical to the initial rendering of a page, this blocking behavior is undesirable. The new <link rel="preload"> standard enables us to load stylesheets asynchronously, without blocking rendering.

Install via npm

npm install --save-dev async-stylesheet-webpack-plugin

Usage

The plugin will update all your webpack bundles stylesheets in the head using link tags with rel="preload" attribute. Just add the plugin to your webpack config as follows:

webpack.config.js

constHtmlWebpackPlugin=require('html-webpack-plugin')constAsyncStylesheetWebpackPlugin=require('async-stylesheet-webpack-plugin');module.exports={
...
plugins: [newHtmlWebpackPlugin(),newAsyncStylesheetWebpackPlugin(),
...
]}

This will generate a file dist/index.html containing the following:

<!DOCTYPE html><html><head><metacharset="UTF-8"><title>Webpack App</title><linkhref="app.css" rel="preload" as="style" onload="this.onload=null;this.rel='stylesheet';"><noscript><linkhref="app.css" rel="stylesheet"></noscript></head><body><scriptsrc="app.js"></script></body></html>

Options

You can pass a hash of configuration options to async-stylesheet-webpack-plugin. Allowed values are as follows:

NameTypeDefaultDescription
preloadPolyfill{Boolean}falseIf true then enabled legacy browser support
noscriptFallback{Boolean}trueIf true then enabled fallback stylesheets loading without JavaScript
chunks{String[]}nullAllows you to async load only some chunks
excludeChunks{String[]}nullAllows you to skip async load some chunks

Here's an example webpack config illustrating how to use these options:

webpack.config.js

module.exports={
...
plugins: [newHtmlWebpackPlugin(),newAsyncStylesheetWebpackPlugin({preloadPolyfill: true,noscriptFallback: true}),
...
]}

Legacy browser support

Preload polyfill

If preloadPolyfill option is enabled (this option disabled by default) async-stylesheet-webpack-plugin adding in HTML headcssrelpreload.js provided by loadCSS.

This will generate a file dist/index.html containing the following:

<!DOCTYPE html><html><head><metacharset="UTF-8"><title>Webpack App</title><scripttype="text/javascript">/* here is the content of the cssrelpreload.js */</script><linkhref="app.css" rel="preload" as="style" onload="this.onload=null;this.rel='stylesheet';"><noscript><linkhref="app.css" rel="stylesheet"></noscript></head><body><scriptsrc="app.js"></script></body></html>

Without JavaScript

If noscriptFallback option is enabled (this option enabled by default) async-stylesheet-webpack-plugin adding in HTML headnoscript tag with traditional stylesheet loading.

This will generate a file dist/index.html containing the following:

<!DOCTYPE html><html><head><metacharset="UTF-8"><title>Webpack App</title><linkhref="app.css" rel="preload" as="style" onload="this.onload=null;this.rel='stylesheet';"><noscript><linkhref="app.css" rel="stylesheet"></noscript></head><body><scriptsrc="app.js"></script></body></html>

If noscriptFallback option is disabled async-stylesheet-webpack-plugin only updated link tags:

<!DOCTYPE html><html><head><metacharset="UTF-8"><title>Webpack App</title><linkhref="app.css" rel="preload" as="style" onload="this.onload=null;this.rel='stylesheet';"></head><body><scriptsrc="app.js"></script></body></html>

Credit

  • loadCSS - A function for loading CSS asynchronously;
  • HTML Webpack Plugin - Simplifies creation of HTML files to serve your webpack bundles.

See also

Need a feature?

Welcome to issues!

About

Loading stylesheets asynchronously

Topics

Resources

Stars

9 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages