demo10源码地址
CSS Tree Shaking并不像Js Tree Shaking那样方便理解,首先要模拟一个真实的项目环境,来体现CSS的Tree Shaking 的配置和效果。
此章节源码给予第八节处理CSS项目上做修改
我们首先编写/src/css/base.css样式文件,在文件中,我们编写了3个样式类。但在代码中,我们只会使用.box和.box—big这两个类。代码如下所示:
/* base.css */html {background: red;}.box {height: 200px;width: 200px;border-radius: 3px;background: green;}.box--big {height: 300px;width: 300px;border-radius: 5px;background: red;}.box-small {height: 100px;width: 100px;border-radius: 2px;background: yellow;}
按照正常使用习惯,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文件
在index.html和src/app.js中引用的样式都被打包了,而没有被使用的样式类box-small,没有被打包进去。
