1. 资源内联。使用 html-inline-css-webpack-plugin
  2. 单独的文件。

css-loader

作用:用于加载 .css 文件,并且转换成 CommonJS 对象。也就是说样式代码会被放到 JS 里面去。

配置(只用了 css-loader):

  1. // webpack.config.js
  2. module.exports = {
  3. //...
  4. module: {
  5. rules: [
  6. {
  7. test: /.css$/,
  8. use: ['css-loader'],
  9. }
  10. ]
  11. }
  12. }

结果:

打包后的文件不包含任何 CSS 文件。

CSS 资源处理及其差异 - 图1

样式代码在 JS 文件里。

style-loader

作用:将样式通过 <style> 标签插入到 head 中。

插入是一个动态的过程,打包后生成的 HTML 文件没有 <style></style> 标签,而是在代码运行时动态的创建 style 标签,然后将 CSS Style 插入到 style 标签里面去。

配置:

  1. // webpack.config.js
  2. module.exports = {
  3. //...
  4. module: {
  5. rules: [
  6. {
  7. test: /.css$/,
  8. use: [
  9. 'style-loader',
  10. 'css-loader'
  11. ]
  12. }
  13. ]
  14. }
  15. }

结果:

CSS 资源处理及其差异 - 图2

CSS 资源处理及其差异 - 图3

打包后的文件不包含任何 CSS 文件。

CSS 资源处理及其差异 - 图4

样式代码在 JS 文件里。

运行时(运行时插入):

CSS 资源处理及其差异 - 图5

使用 style-loader 可以配置 options.injectType: 'singletonStyleTag'

mini-css-extract-plugin

作用:将 CSS 提取到单独的文件中。

配置:

  1. // webpack.config.js
  2. module.exports = {
  3. //...
  4. plugins: [new MiniCssExtractPlugin()],
  5. module: {
  6. rules: [
  7. {
  8. test: /.css$/,
  9. use: [
  10. MiniCssExtractPlugin.loader,
  11. 'css-loader'
  12. ]
  13. }
  14. ]
  15. }
  16. }

结果:

CSS 资源处理及其差异 - 图6

CSS 资源处理及其差异 - 图7

打包后的文件中 CSS 文件,并且 HTML 文件中使用 <link /> 链接了该 CSS 文件。

  1. <link href="search_7860b96e.css" rel="stylesheet" />

html-inline-css-webpack-plugin

使用 html-inline-css-webpack-plugin 需要 mini-css-extract-pluginhtml-webpack-plugin

作用:内联样式

  1. <link rel="stylesheet" /> ====> <style>...<style/>

配置:

  1. // webpack.config.js
  2. module.exports = {
  3. //...
  4. plugins: [
  5. new MiniCssExtractPlugin(),
  6. new HtmlWebpackPlugin(),
  7. new HTMLInlineCSSWebpackPlugin()
  8. ],
  9. module: {
  10. rules: [
  11. {
  12. test: /.css$/,
  13. use: [
  14. MiniCssExtractPlugin.loader,
  15. 'css-loader'
  16. ]
  17. }
  18. ]
  19. }
  20. }

结果:

CSS 资源处理及其差异 - 图8

CSS 资源处理及其差异 - 图9

总结:

CSS 内联的思路是:先将 CSS 提取打包成一个单独的 CSS 文件(使用 MiniCssExtractPlugin.loader),然后再将提取的 CSS 内容注入到页面的 style 里面去。这个过程在构建阶段完成。