使用 Webpack 如何处理 Css、Less、Sass、Scss、Stylus 样式资源

# 介绍

Webpack 本身是不能识别样式资源的,所以我们需要借助 Loader 来帮助 Webpack 解析样式资源

我们找 Loader 都应该去官方文档中找到对应的 Loader,然后使用

官方文档找不到的话,可以从社区 Github 中搜索查询

Webpack 官方 Loader 文档 (opens new window)

# 处理CSS资源

官方文档 https://www.webpackjs.com/loaders/css-loader/

# 下载依赖

npm i css-loader style-loader -D
1
  • css-loader:负责将 Css 文件编译成 Webpack 能识别的模块
  • style-loader:会动态创建一个 Style 标签,里面放置 Webpack 中 Css 模块内容

此时样式就会以 Style 标签的形式在页面上生效

# 配置webpack.config.js 的 module

// 加载器
module: {
    rules: [
        {
            // 设置匹配 的文件后缀
            test: /\.css$/, // 匹配 .css且以其为结尾的文件
            // use 数组里面 Loader 执行顺序从左到右
            // 先执行 style-loader 动态词创建 style 标签,
            // 再执行 css-loader 将 css 文件编译成 webpack 能识别的模块
            use: ["style-loader", "css-loader"],
        },
    ],
},
1
2
3
4
5
6
7
8
9
10
11
12
13
  • ⭐完整 webpack.config.js (后面也会参考)
const path = require("path");

module.exports = {
  // 入口
  entry: "./src/main.js",
  // 输出
  output: {
    // path: 文件输出目录,必须是绝对路径
    // path.resolve()方法返回一个绝对路径
    // __dirname 当前文件的文件夹绝对路径
    path: path.resolve(__dirname, "dist"),
    // 输出的文件名
    filename: "main.js",
  },
  // 加载器
  module: {
    rules: [
      {
        // 设置匹配 的文件后缀
        test: /\.css$/, // 匹配 .css且以其为结尾的文件
        // use 数组里面 Loader 执行顺序从左到右
        // 先执行 style-loader 动态词创建 style 标签,
        // 再执行 css-loader 将 css 文件编译成 webpack 能识别的模块
        use: ["style-loader", "css-loader"],
      },
    ],
  },
  // 插件
  plugins: [],
  // 模式
  mode: "development", // development or production
};

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

# 添加 Css 资源

  • src/css/index.css
.box1 {
  width: 100px;
  height: 100px;
  background-color: pink;
}
1
2
3
4
5
  • src/main.js
import { intt, intt2 } from "./js/index";
// 引入 Css 资源,Webpack才会对其打包
import "./style/index.css";

// // dev-log >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
console.log(`[Dev_Log][${"entry: main_js"}_]_>>>`);
intt(1, 2);
intt2([1, 2]);
1
2
3
4
5
6
7
8
  • public/index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>webpack5</title>
  </head>
  <body>
    <h1>Hello Webpack5</h1>
    <!-- 准备一个使用样式的 DOM 容器 -->
    <div class="box1"></div>
    <!-- 引入打包后的js文件,才能看到效果 -->
    <script src="../dist/main.js"></script>
  </body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 运行指令

npx webpack
1

打开 index.html 页面查看效果

# 处理Scss资源

所有主要步骤参考上方 处理CSS资源-建议先读一遍,不同在于,依赖loader不同,webpack.config.js 配置,使用样式资源文件名.less

处理Scss样式的依赖名称是 Sass,项目中使用 .sass.scss 作为后缀名

  • 下载依赖
npm i css-loader style-loader sass sass-loader -D
1
  • 配置依赖
// webpack.config.js 参考 (ctrl+f) 上方完整 `webpack.config.js` 

// 仅 modules 改变
module: {
    rules: [
        {
            // 用来匹配 .css 结尾的文件
            test: /\.css$/,
            // use 数组里面 Loader 执行顺序是从右到左
            use: ["style-loader", "css-loader"],
        },
        {
            // 用来匹配 .scss 结尾的文件
            test: /\.scss$/,
            use: ["style-loader", "css-loader", "sass-loader"],
        },
    ],
},
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  • 准备scss,sass文件
  • 在mainjs中引入

# 处理Less资源

所有主要步骤参考上方 处理CSS资源-建议先读一遍,不同在于,依赖loader不同,webpack.config.js 配置,使用样式资源文件名.less

  • 下载依赖
npm i css-loader style-loader less-loader -D
1
  • 配置依赖
// webpack.config.js 参考 (ctrl+f) 上方完整 `webpack.config.js` 

// 仅 modules 改变
module: {
    rules: [
        {
            // 用来匹配 .css 结尾的文件
            test: /\.css$/,
            // use 数组里面 Loader 执行顺序是从右到左
            use: ["style-loader", "css-loader"],
        },
        {
            // 用来匹配 .less 结尾的文件
            test: /\.less$/,
            use: ["style-loader", "css-loader", "less-loader"],
        },
    ],
},
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  • 准备less文件
  • 在mainjs中引入

# 处理 Styl 资源

  • 所有步骤 都参考 处理css资源
  • 只有依赖不同,为 npm i stylus-loader -D