demo10源码地址
    CSS Tree Shaking并不像Js Tree Shaking那样方便理解,首先要模拟一个真实的项目环境,来体现CSS的Tree Shaking 的配置和效果。

    此章节源码给予第八节处理CSS项目上做修改
    我们首先编写/src/css/base.css样式文件,在文件中,我们编写了3个样式类。但在代码中,我们只会使用.box和.box—big这两个类。代码如下所示:

    1. /* base.css */
    2. html {
    3. background: red;
    4. }
    5. .box {
    6. height: 200px;
    7. width: 200px;
    8. border-radius: 3px;
    9. background: green;
    10. }
    11. .box--big {
    12. height: 300px;
    13. width: 300px;
    14. border-radius: 5px;
    15. background: red;
    16. }
    17. .box-small {
    18. height: 100px;
    19. width: 100px;
    20. border-radius: 2px;
    21. background: yellow;
    22. }

    按照正常使用习惯,DOM操作来实现样式的添加和卸载,是一贯技术手段。所以,入口文件/src/app.js中创建一个

    标签,并且将它的类设为.box

    // index.js
    import base from './css/base.css'
    
    // 给 app 标签再加一个 div 并且类名为 box
    var app = document.getElementById('app')
    var div = document.createElement('div')
    div.className = 'box'
    app.appendChild(div)
    

    最后,为了让环境更接近实际环境,我们在index.html的一个标签,也引用了定义好的box-big样式类。

    <!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>
      </head>
    
      <body>
        <div id="app">
          <div class="box-big"></div>
        </div>
      </body>
    </html>
    

    PurifyCSS将帮助我们进行 CSS Tree Shaking 操作。为了能准确指明要进行 Tree Shaking 的 CSS 文件,还有 glob-all (另一个第三方库)。
    安装依赖:

    npm i glob-all purify-css perifycss-webpack —save-dev

    更改配置文件:

    const path = require('path')
    
    const CleanWebpackPlugin = require('clean-webpack-plugin')
    const HtmlWebpackPlugin = require('html-webpack-plugin')
    
    const MiniCssExtractPlugin = require('mini-css-extract-plugin') // 将 css 单独打包成文件
    
    const PurifyCSS = require('purifycss-webpack')
    const glob = require('glob-all')
    
    module.exports = {
      entry: {
        app: './src/app.js'
      },
      output: {
        publicPath: './', // js 引用的路径或者 CDN 地址
        path: path.resolve(__dirname, 'dist'), // 打包文件的输出目录
        filename: '[name].bundle.js', // 代码打包后的文件名
        chunkFilename: '[name].js' // 代码拆分后的文件名
      },
      module: {
        rules: [
          {
            test: /\.css$/, // 针对 .scss 或者 .css 后缀的文件设置 loader
            use: [
              {
                loader: MiniCssExtractPlugin.loader
              },
              'css-loader'
            ]
          }
        ]
      },
      plugins: [
        new CleanWebpackPlugin(),
        new HtmlWebpackPlugin({
          // 打包输出HTML
          title: '自动生成 HTML',
          minify: {
            // 压缩 HTML 文件
            removeComments: true, // 移除 HTML 中的注释
            collapseWhitespace: true, // 删除空白符与换行符
            minifyCSS: true // 压缩内联 css
          },
          filename: 'index.html', // 生成后的文件名
          template: 'index.html', // 根据此模版生成 HTML 文件
          chunks: ['app'] // entry中的 app 入口才会被打包
        }),
        new MiniCssExtractPlugin({
          filename: '[name].css',
          chunkFilename: '[id].css'
        }),
        // 清除无用 css
        new PurifyCSS({
          paths: glob.sync([
            // 要做 CSS Tree Shaking 的路径文件
            path.resolve(__dirname, './*.html'), // 请注意,我们同样需要对 html 文件进行 tree shaking
            path.resolve(__dirname, './src/*.js')
          ])
        })
      ]
    }
    

    打包完查看dist/app.css文件
    image.png
    在index.html和src/app.js中引用的样式都被打包了,而没有被使用的样式类box-small,没有被打包进去。