Webpack loader that dynamically injects CSS into the DOM at runtime with multiple injection strategies and CSS modules support
—
Seven different strategies for injecting CSS into the DOM, from individual style tags to lazy-loaded styles with manual control.
Automatically injects styles using multiple individual <style> elements. Each CSS file gets its own style element.
injectType: "styleTag"Characteristics:
<style> elements in the DOMUsage Example:
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.css$/i,
use: [
{ loader: "style-loader", options: { injectType: "styleTag" } },
"css-loader"
],
},
],
},
};
// component.js
import "./styles.css"; // Automatically creates <style> element
import "./other.css"; // Creates another <style> elementInjects all styles into a single shared <style> element for better performance with many CSS modules.
injectType: "singletonStyleTag"Characteristics:
<style> element contains all CSSUsage Example:
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.css$/i,
use: [
{ loader: "style-loader", options: { injectType: "singletonStyleTag" } },
"css-loader"
],
},
],
},
};Automatically chooses between styleTag (modern browsers) and singletonStyleTag (IE6-9) for optimal compatibility.
injectType: "autoStyleTag"Characteristics:
<style> elements in modern browsers<style> element in IE6-9Usage Example:
module.exports = {
module: {
rules: [
{
test: /\.css$/i,
use: [
{ loader: "style-loader", options: { injectType: "autoStyleTag" } },
"css-loader"
],
},
],
},
};Creates multiple <style> elements with manual control via use() and unuse() methods.
injectType: "lazyStyleTag"
// Generated API for lazy styles
interface LazyStyleAPI {
use(insertOptions?: object): LazyStyleAPI;
unuse(): void;
locals?: Record<string, string>; // CSS Modules locals
}Characteristics:
<style> elements (when activated)Usage Example:
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.lazy\.css$/i,
use: [
{ loader: "style-loader", options: { injectType: "lazyStyleTag" } },
"css-loader"
],
},
],
},
};
// component.js
import styles from "./component.lazy.css";
// Activate styles (creates <style> elements)
styles.use();
// Optional: pass insertion options
styles.use({
insertInto: document.head,
insertAt: "top"
});
// Deactivate styles (removes <style> elements when ref count reaches 0)
styles.unuse();
// CSS Modules integration
import styles, { className } from "./component.lazy.css";
styles.use();
console.log(styles.locals.className); // CSS module class nameCreates a single shared <style> element with manual control via use() and unuse() methods.
injectType: "lazySingletonStyleTag"
// Same API as lazyStyleTag
interface LazyStyleAPI {
use(insertOptions?: object): LazyStyleAPI;
unuse(): void;
locals?: Record<string, string>;
}Characteristics:
<style> element (when activated)Usage Example:
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.lazy\.css$/i,
use: [
{ loader: "style-loader", options: { injectType: "lazySingletonStyleTag" } },
"css-loader"
],
},
],
},
};
// component.js
import styles from "./heavy-styles.lazy.css";
// Conditionally load styles
if (shouldLoadStyles) {
styles.use();
}
// Cleanup when component unmounts
styles.unuse();Automatically chooses between lazyStyleTag and lazySingletonStyleTag based on browser capabilities, with manual control.
injectType: "lazyAutoStyleTag"
// Same API as other lazy types
interface LazyStyleAPI {
use(insertOptions?: object): LazyStyleAPI;
unuse(): void;
locals?: Record<string, string>;
}Characteristics:
<style> elements in modern browsers (when activated)<style> element in IE6-9 (when activated)Usage Example:
module.exports = {
module: {
rules: [
{
test: /\.lazy\.css$/i,
use: [
{ loader: "style-loader", options: { injectType: "lazyAutoStyleTag" } },
"css-loader"
],
},
],
},
};Injects styles using <link rel="stylesheet"> elements that reference CSS files directly.
injectType: "linkTag"Characteristics:
<link> elements instead of <style> elementsUsage Example:
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.css$/i,
use: [
{ loader: "style-loader", options: { injectType: "linkTag" } },
"css-loader"
],
},
],
},
};
// component.js
import "./styles.css"; // Creates <link> element| Type | Elements | Source Maps | Manual Control | IE6-9 Support | Best For |
|---|---|---|---|---|---|
styleTag | Multiple <style> | ✅ | ❌ | ✅ | Development, debugging |
singletonStyleTag | Single <style> | ❌ | ❌ | ✅ | Performance with many modules |
autoStyleTag | Auto-detect | Conditional | ❌ | ✅ | Cross-browser compatibility |
lazyStyleTag | Multiple <style> | ✅ | ✅ | ✅ | Conditional styling |
lazySingletonStyleTag | Single <style> | ❌ | ✅ | ✅ | Performance + conditional |
lazyAutoStyleTag | Auto-detect | Conditional | ✅ | ✅ | Conditional + compatibility |
linkTag | <link> elements | N/A | ❌ | ✅ | External CSS files |
styleTag for full debugging capabilitiessingletonStyleTag for better performancelinkTag when working with pre-built CSS filesInstall with Tessl CLI
npx tessl i tessl/npm-style-loader