CSS Tree Shaking:去除项目代码中用不到的CSS样式,仅保留被使用的样式代码。

PurifyCSS

PurifyCSS可以用来进行CSS Tree Shaking。为了能准确指明要进行Tree Shaking的CSS文件,还需要用到glob-all(另一个第三方库)。

glob-all的作用就是:帮助PurifyCSS进行路径处理,定位要做Tree Shaking的路径文件。

具体配置如下:

const PurifyCSS = require("purifycss-webpack");
const glob = require("glob-all");

const purifyCSS = new PurifyCSS({
  paths: glob.sync([
    // 要做CSS Tree Shaking的路径文件
    path.resolve(__dirname, "./*.html"),
    path.resolve(__dirname, "./src/*.js")
  ])
});
1
2
3
4
5
6
7
8
9
10

demo实战

装包

yarn add webpack webpack-cli glob-all purifycss-webpack purify-css css-loader style-loader mini-css-extract-plugin --dev
1

项目目录

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>CSS Tree Shaking</title>
    <link rel="stylesheet" href="./dist/main.css">
</head>
<body>
    <div id="root">
        <div class="big"></div>
    </div>
    <script src="./dist/bundle.js"></script>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

index.js

import './style/index.css';

const root = document.querySelector('#root');
const div = document.createElement('div');
div.className = 'box';
root.appendChild(div);
1
2
3
4
5
6
html {
    background: red;
}

.box {
    height: 200px;
    width: 200px;
    border-radius: 3px;
    background: green;
}

.big {
    height: 300px;
    width: 300px;
    border-radius: 5px;
    background: red;
}

.small {
    height: 100px;
    width: 100px;
    border-radius: 2px;
    background: yellow;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

需要注意:.small样式并没有使用到。 webpack.config.js:

const path = require("path");
const PurifyCSS = require("purifycss-webpack");
const glob = require("glob-all");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");

module.exports = {
    mode: 'none',
    entry: './src/index.js',
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'bundle.js'
    },
    module: {
        rules: [
          {
            test: /\.css$/,
            use: [MiniCssExtractPlugin.loader, 'css-loader'],
          },
        ],
    },
    plugins: [
        new MiniCssExtractPlugin({filename: "[name].css", chunkFilename: "[id].css"}),
        new PurifyCSS({
            paths: glob.sync([
                // 要做CSS Tree Shaking的路径文件
                path.resolve(__dirname, "./*.html"), // 请注意,我们同样需要对 html 文件进行 tree shaking
                path.resolve(__dirname, "./src/*.js")
            ])
        })
    ]
};
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

运行webpack打包:

9007ad39a47476ddd1f86600397f5095.png

我们在index.html和./src/index.js中引用的样式都被打包了,而没有被使用的样式类small没有出现在打包后的css文件中,CSS Tree Shaking成功。