style-loader

Adds CSS to the DOM by injecting a <style> tag

安装

  1. npm install style-loader --save-dev

用法

建议将 style-loadercss-loader 结合使用

component.js

  1. import style from './file.css';

webpack.config.js

  1. {
  2. module: {
  3. rules: [
  4. {
  5. test: /\.css$/,
  6. use: [{ loader: 'style-loader' }, { loader: 'css-loader' }],
  7. },
  8. ];
  9. }
  10. }

#

在使用局部作用域 CSS 时,模块导出生成的(局部)标识符(identifier)。

component.js

  1. import style from './file.css';
  2. style.className === 'z849f98ca812';

Url

也可以添加一个URL <link href="path/to/file.css" rel="stylesheet">,而不是用带有 <style></style> 标签的内联 CSS {String}

  1. import url from 'file.css';

webpack.config.js

  1. {
  2. module: {
  3. rules: [
  4. {
  5. test: /\.css$/,
  6. use: [{ loader: 'style-loader/url' }, { loader: 'file-loader' }],
  7. },
  8. ];
  9. }
  10. }
  1. <link rel="stylesheet" href="path/to/file.css" />

ℹ️ 使用 url 引用的 Source map 和资源:当 style-loader 与 { options: { sourceMap: true } } 选项一起使用时,CSS 模块将生成为 Blob,因此相对路径无法正常工作(他们将相对于 chrome:blobchrome:devtools)。为了使资源保持正确的路径,必须设置 webpack 配置中的 output.publicPath 属性,以便生成绝对路径。或者,你可以启用上面提到的 convertToAbsoluteUrls 选项。

可选的(Useable)

The style-loader injects the styles lazily making them useable on-demand via style.use() / style.unuse()

按照惯例,引用计数器 API(Reference Counter API) 应关联到 .useable.css,而 .css 的载入,应该使用基本的 style-loader 用法(类似于其他文件类型,例如 .useable.less.less)。

webpack.config.js

  1. {
  2. module: {
  3. rules: [
  4. {
  5. test: /\.css$/,
  6. exclude: /\.useable\.css$/,
  7. use: [
  8. { loader: "style-loader" },
  9. { loader: "css-loader" },
  10. ],
  11. },
  12. {
  13. test: /\.useable\.css$/,
  14. use: [
  15. {
  16. loader: "style-loader/useable"
  17. },
  18. { loader: "css-loader" },
  19. ],
  20. },
  21. ],
  22. },
  23. }

引用计数器 API(reference counter API)

component.js

  1. import style from './file.css';
  2. style.use(); // = style.ref();
  3. style.unuse(); // = style.unref();

样式不会添加在 import/require() 上,而是在调用 use/ref 时添加。如果 unuse/unrefuse/ref 一样频繁地被调用,那么样式将从页面中删除。

⚠️ 当 unuse/unrefuse/ref 调用频繁的时候,产生的行为是不确定的。所以不要这样做。

选项

名称

类型

默认值

描述

名称

hmr

类型

{Boolean}

默认值

true

描述

Enable/disable Hot Module Replacement (HMR), if disabled no HMR Code will be added (good for non local development/production)

名称

base

类型

{Number}

默认值

true

描述

设置模块 ID 基础 (DLLPlugin)

名称

attrs

类型

{Object}

默认值

{}

描述

添加自定义 attrs 到 <style></style>

名称

transform

类型

{Function}

默认值

false

描述

转换/条件加载 CSS,通过传递转换/条件函数

名称

insertAt

类型

{String|Object}

默认值

bottom

描述

在给定位置处插入 <style></style>

名称

insertInto

类型

{String}

默认值

<head>

描述

给定位置中插入 <style></style>

名称

singleton

类型

{Boolean}

默认值

undefined

描述

Reuses a single <style></style> element, instead of adding/removing individual elements for each required module.

名称

sourceMap

类型

{Boolean}

默认值

false

描述

启用/禁用 Sourcemap

名称

convertToAbsoluteUrls

类型

{Boolean}

默认值

false

描述

启用 source map 后,将相对 URL 转换为绝对 URL

hmr

Enable/disable Hot Module Replacement (HMR), if disabled no HMR Code will be added. This could be used for non local development and production.

webpack.config.js

  1. {
  2. loader: 'style-loader',
  3. options: {
  4. hmr: false
  5. }
  6. }

base

当使用一个或多个 DllPlugin 时,此设置主要用作 css 冲突 的修补方案。base 可以防止 app 的 css(或 DllPlugin2 的 css)覆盖 DllPlugin1 的 css,方法是指定一个 css 模块的 id 大于 DllPlugin1 的范围,例如:

webpack.dll1.config.js

  1. {
  2. test: /\.css$/,
  3. use: [
  4. 'style-loader',
  5. 'css-loader'
  6. ]
  7. }

webpack.dll2.config.js

  1. {
  2. test: /\.css$/,
  3. use: [
  4. { loader: 'style-loader', options: { base: 1000 } },
  5. 'css-loader'
  6. ]
  7. }

webpack.app.config.js

  1. {
  2. test: /\.css$/,
  3. use: [
  4. { loader: 'style-loader', options: { base: 2000 } },
  5. 'css-loader'
  6. ]
  7. }

attrs

如果已定义,style-loader 将把属性值附加在 <style> / <link> 元素上。

component.js

  1. import style from './file.css';

webpack.config.js

  1. {
  2. test: /\.css$/,
  3. use: [
  4. { loader: 'style-loader', options: { attrs: { id: 'id' } } }
  5. { loader: 'css-loader' }
  6. ]
  7. }
  1. <style id="id"></style>

Url

component.js

  1. import link from './file.css';

webpack.config.js

  1. {
  2. test: /\.css$/,
  3. use: [
  4. { loader: 'style-loader/url', options: { attrs: { id: 'id' } } }
  5. { loader: 'file-loader' }
  6. ]
  7. }

transform

transform 是一个函数,可以在通过 style-loader 加载到页面之前修改 css。 该函数将在即将加载的 css 上调用,函数的返回值将被加载到页面,而不是原始的 css 中。 如果 transform 函数的返回值是 falsy 值,那么 css 根本就不会加载到页面中。

⚠️ In case you are using ES Module syntax in tranform.js then, you need to transpile it or otherwise it will throw an {Error}.

webpack.config.js

  1. {
  2. loader: 'style-loader',
  3. options: {
  4. transform: 'path/to/transform.js'
  5. }
  6. }

transform.js

  1. module.exports = function(css) {
  2. // Here we can change the original css
  3. const transformed = css.replace('.classNameA', '.classNameB');
  4. return transformed;
  5. };

Conditional

webpack.config.js

  1. {
  2. loader: 'style-loader',
  3. options: {
  4. transform: 'path/to/conditional.js'
  5. }
  6. }

conditional.js

  1. module.exports = function(css) {
  2. // 如果条件匹配则加载[和转换] CSS
  3. if (css.includes('something I want to check')) {
  4. return css;
  5. }
  6. // 如果返回 falsy 值,则不会加载 CSS
  7. return false;
  8. };

insertAt

默认情况下,style-loader 将 <style> 元素附加到样式目标(style target)的末尾,即页面的 <head> 标签,也可以是由 insertInto 指定其他标签。这将导致 loader 创建的 CSS 优先于目标中已经存在的 CSS。要在目标的起始处插入 style 元素,请将此查询参数(query parameter)设置为 ‘top’,例如

webpack.config.js

  1. {
  2. loader: 'style-loader',
  3. options: {
  4. insertAt: 'top'
  5. }
  6. }

A new <style> element can be inserted before a specific element by passing an object, e.g.

webpack.config.js

  1. {
  2. loader: 'style-loader',
  3. options: {
  4. insertAt: {
  5. before: '#id'
  6. }
  7. }
  8. }

insertInto

默认情况下,样式加载器将 <style> 元素插入到页面的 <head> 标签中。如果要将标签插入到其他位置,可以在这里为该元素指定 CSS 选择器。如果你想要插入到 IFrame 中,请确保你具有足够的访问权限,样式将被注入到内容文档的 head 中。

You can also pass function to override default behavior and insert styles in your container, e.g

webpack.config.js

  1. {
  2. loader: 'style-loader',
  3. options: {
  4. insertInto: () => document.querySelector("#root"),
  5. }
  6. }

通过使用函数,可以将样式插入到 ShadowRoot 中,例如

webpack.config.js

  1. {
  2. loader: 'style-loader',
  3. options: {
  4. insertInto: () => document.querySelector("#root").shadowRoot,
  5. }
  6. }

singleton

如果已定义,则 style-loader 将重用单个 <style></style> 元素,而不是为每个所需的模块添加/删除单个元素。

ℹ️ 默认情况下启用此选项,IE9 对页面上允许的 style 标签数量有严格的限制。你可以使用 singleton 选项来启用或禁用它。

webpack.config.js

  1. {
  2. loader: 'style-loader',
  3. options: {
  4. singleton: true
  5. }
  6. }

sourceMap

启用/禁用 source map 加载

webpack.config.js

  1. {
  2. loader: 'style-loader',
  3. options: {
  4. sourceMap: true
  5. }
  6. }

convertToAbsoluteUrls

如果 convertToAbsoluteUrls 和 sourceMaps 都启用,那么相对 url 将在 css 注入页面之前,被转换为绝对 url。这解决了在启用 source map 时,相对资源无法加载的问题。你可以使用 convertToAbsoluteUrls 选项启用它。

webpack.config.js

  1. {
  2. loader: 'style-loader',
  3. options: {
  4. sourceMap: true,
  5. convertToAbsoluteUrls: true
  6. }
  7. }

维护人员

style-loader - 图1


  1. Juho Vepsäläinen

style-loader - 图2


  1. Joshua Wiens

style-loader - 图3


  1. Artem Sapegin

style-loader - 图4


  1. Michael Ciniawsky

style-loader - 图5


  1. Alexander Krasnoyarov

style-loader - 图6


  1. Tobias Koppers

style-loader - 图7


  1. Kees Kluskens