Webpack5 系列(二):静态资源的处理4

简介: Webpack5 系列(二):静态资源的处理4

四、补充:css-loader 的 options

不同的 loader 都会有各自的 options,css-loaders 有两个实用的 options。

  • importLoaders:The option importLoaders allows you to configure how many loaders before css-loader should be applied to @imported resources and CSS modules/ICSS imports. 简单来说,就是允许你在执行 css-loader 前,让某些资源要经过前面的 loaders 去处理的个数。
  • modules:Allows to enable/disable CSS Modules or ICSS and setup configuration. 允许你开启 CSS Module

webpack.config.js

module.exports = {
  module: {
    rules: [
      {
        test: /\.sc?ss$/i,
        use: [
          "style-loader",
          {
            loader: "css-loader",
            options: {
              importLoaders: 2,
              // 0 => no loaders (default);
              // 1 => postcss-loader;
              // 2 => postcss-loader, sass-loader
              modules: true, // 默认是 false ***
            },
          },
          "sass-loader",
          "postcss-loader",
        ],
      },
    ],
  },
};

注意,上面 importLoaders 设置为 2,表示匹配到样式文件时,都会去执行一开始的两个 loader,也就是 'sass-loader' 以及 'postcss-loader'.

至于 modules 设置为 true,则保证了样式模块的独立性,不会被互相覆盖。具体看下面的例子:

a) 不设置 modules 选项

src/assets/styles/global.scss

// 自定义变量
$color: #ff4200;
$fs: 14px;
$ls: 1.2;
// 自定义mixin
@mixin size($w, $h: $w) {
  width: $w;
  height: $h;
}
body {
  font-size: $fs;
  background-color: #eaeaea;
  .avatar {
    @include size(150px);
    transform: translateX(50px);
  }
}

src/assets/js/createImg.js

import avatar from "../images/avatar-2.jpg";
import dog1 from "../images/animal-dog-1.png";
function createImg(root) {
  const img = new Image();
  img.src = dog1;
  img.classList.add("avatar"); // 添加 avatar 类名
  root.append(img);
}
export default createImg;

src/index.js

import "./assets/styles/reset.css";
import "./assets/styles/global.scss";
import dog1 from "./assets/images/animal-dog-1.png";
import createImg from "./assets/js/createImg.js";
const dom = document.getElementById("root");
// 第一张图的创建
createImg(dom);
// 第二张图的创建
// insert an image
const img = new Image();
img.src = dog1;
img.classList.add("avatar"); // // 添加 avatar 类名
root.append(img);

在这种情况下,import './assets/styles/global.scss'这一句对全局的文件都有效果,因此它的后一句 import createImg from './assets/js/createImg.js'; 就会受到影响。影响的结果就是,createImg.js 文件中的第 7 行代码的样式添加,添加的就是 global.scss 中的第 15 行的选择器 'avatar' 的样式。

打包后,结果如图所示:

1688268026960.png


b) 将 modules 设置为 true

设置完后,代码不变的情况下,打包完成后,查看结果如图所示:

1688268043039.png

前后两张秋田犬均变成了超大的图,原因是样式没有作用到图片上。

当应用 CSS Module 时,要通过以下的方式添加样式:

(注意:这里仅对 index.js 中的代码作修改,使之恢复,而 createImg.js 模块中的代码不变,从而形成对比。)

src/index.js

import "./assets/styles/global.scss";
import style from "./assets/styles/global.scss"; // 自定义变量名称,作为 css module 导入
import dog1 from "./assets/images/animal-dog-1.png";
import createImg from "./assets/js/createImg.js";
const dom = document.getElementById("root");
// 第一张图的创建
createImg(dom);
// 第二张图的创建
// insert an image
const img = new Image();
img.src = dog1;
// css module 的使用:通过自定义变量名称 style 加 . 的形式访问到 avatar 类名
img.classList.add(style.avatar); 
root.append(img);

打包后,结果如图所示:

1688268067404.png


通过对比,就可以发现,通过模块方式设置的秋田犬的样式是有的,而第一张则没有。

这种利用 CSS Module 的方式来添加样式的方法,解决了全局覆盖同名样式(一般是类名和 id)的尴尬情况。

阅读参考:

小结

以上,是本篇的所有内容。在 Webpack5 中,对于静态资源的处理,我们只要简单地设置 type 就能处理文件,非常方便。但是有些特殊情况还是需要去单独处理的,例如资源输出的路径及文件名的设置、URI 编码格式的设置、转 base64 的文件大小限制的设置。样式文件中,为了防止全局的样式污染,可以开启 CSS Module 来避免。

添加我的微信:enjoy_Mr_cat,共同成长,卷卷群里等你 🤪。

以上,感谢您的阅读~


目录
相关文章
|
前端开发 JavaScript Shell
Webpack5 系列(二):静态资源的处理3
Webpack5 系列(二):静态资源的处理3
86 0
|
XML 前端开发 JavaScript
Webpack5 系列(二):静态资源的处理2
Webpack5 系列(二):静态资源的处理2
323 0
|
XML 前端开发 JavaScript
Webpack5 系列(二):静态资源的处理1
Webpack5 系列(二):静态资源的处理
187 0
|
5月前
|
JavaScript 前端开发
webpack成长指北第9章---webpack如何对icon字体进行打包
webpack成长指北第9章---webpack如何对icon字体进行打包
107 1
|
5月前
|
前端开发 JavaScript
webpack成长指北第8章---webpack的CSS Modules打包
webpack成长指北第8章---webpack的CSS Modules打包
55 0
|
25天前
|
JavaScript
webpack打包TS
webpack打包TS
|
9天前
|
JavaScript 测试技术 Windows
vue配置webpack生产环境.env.production、测试环境.env.development(配置不同环境的打包访问地址)
本文介绍了如何使用vue-cli和webpack为Vue项目配置不同的生产和测试环境,包括修改`package.json`脚本、使用`cross-env`处理环境变量、创建不同环境的`.env`文件,并在`webpack.prod.conf.js`中使用`DefinePlugin`来应用这些环境变量。
25 2
vue配置webpack生产环境.env.production、测试环境.env.development(配置不同环境的打包访问地址)
|
10天前
|
缓存
webpack 打包多页面应用
webpack 打包多页面应用
|
21天前
webpack 打包多页面应用
webpack 打包多页面应用
|
1月前
|
前端开发 开发者
在前端开发中,webpack 作为一个强大的模块打包工具,为我们提供了丰富的功能和扩展性
【9月更文挑战第1天】在前端开发中,Webpack 作为强大的模块打包工具,提供了丰富的功能和扩展性。本文重点介绍 DefinePlugin 插件,详细探讨其原理、功能及实际应用。DefinePlugin 可在编译过程中动态定义全局变量,适用于环境变量配置、动态加载资源、接口地址配置等场景,有助于提升代码质量和开发效率。通过具体配置示例和注意事项,帮助开发者更好地利用此插件优化项目。
68 13
下一篇
无影云桌面