Vue 项目之 Webpack 对 CSS 的打包(2)

1,089 阅读2分钟

「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

1. style-loader 的使用

1.1 认识 style-loader

上一篇文章我们已经讲了如何通过 css-loader 来加载 css 文件,但是我们发现这个 css 文件中的样式代码最后并没有生效(页面没有效果)

这是为什么呢?

  • 因为 css-loader负责将 .css 文件进行解析加载,并不会将解析后的 css 代码插入到页面中(把 css 插入到页面有两种方式:要么把所有的 css 代码提取到独立的 .css 文件中,然后通过 <link> 元素在 html 文件中将其引入;要么直接在 html 文件的 <head> 中创建 <style> 元素,然后把 css 代码写到这个 <style> 元素中);
  • 如果我们希望再完成插入 style 的操作来使 css 样式生效,那么我们还需要另外一个 loader,就是 style-loaderstyle-loader 可以帮助我们在 html 中创建一个 <style> 元素,并把 css 代码放入这个 <style> 元素,然后插入到 html 中(不过 style-loader 并没有对 css 代码做提取,后面我们讲插件时再来讲对 css 的提取及压缩操作);

1.2 配置 style-loader

那我们怎么使用 style-loader 呢?既然是一个 loader,那 loader 必然也是一个库,所以我们需要先用 npm 进行安装:

npm install -D style-loader

安装完后,我们赶紧去使用它,我们一般通过配置文件的方式使用它,你可能会这样做:

module.exports = {
  ...
  module: {
    rules: [
      {
        test: /\.css$/, // 正则表达式
        use: [
          'css-loader',
          'style-loader'
        ]
      }
    ]
  }
}

先用 css-loader,再用 style-loader,这样的话不就完美了吗?那我们来执行一下 npm run buildimage-20211104070315089

你会发现,打包过程报错了。为什么报错呢?我们再来看下 Rule 对象中 use 的配置,use 对应着一个数组,里面有多个 loader,那这些 loader 应该是有执行顺序的,比如我们这里的 css-loaderstyle-loader,应该是先使用 css-loadercss 文件进行读取,然后才能用 style-loader 把对应的 css 插入到相应的 html 文档中。但是,use 对应的数组在使用里面的 loader 时,它的执行顺序和常规的顺序不一样,其执行顺序是从后往前(从下往上或者从右往左)的,也就是说,写在后面的 loader 是先执行(加载)的。而我们这里应该是先执行 css-loader,因此,需要把 style-loader 写在 css-loader 前面:

module.exports = {
  ...
  module: {
    rules: [
      {
        test: /\.css$/, // 正则表达式
        use: [
          'style-loader',
          'css-loader'
        ]
      }
    ]
  }
}

再来执行 npm run build 命令编译打包,就不会报错了:

image-20211104071747044

来到浏览器中查看对应的页面效果:

image-20211104072020660

可以看到,样式也都生效了。style-loader 的做法是将 css 通过文档样式表(将样式写在 <head> 元素的 <style> 元素中)的方式添加进来的:style-loader<head> 元素中创建了一个 <style> 元素,把 css 样式塞入了这个 <style> 元素中。当然,开发中一般情况下我们会把样式提取到单独的 css 文件中,然后把它 <link> 进来,这个我们后面讲插件时再来实现。