2025-07-22
css文件瘦身
许多css样式实际没有使用,可以删除。
减少文件体积,可以加速下载,也能提升解析效率。
解决思路
需要CSS Tree Shaking,即“未使用的 CSS 选择器剔除”。
1、使用 PurgeCSS(推荐)
PurgeCSS 可以扫描HTML、JS、Vue 文件,自动移除未用到的 CSS 选择器。
基本用法
1、安装:
npm install purgecss -g
2、运行(举例):
purgecss --css public/static/css/content.min.css --content \"src/**/*.vue\" \"public/index.html\" --output public/static/css/cleaned/
–css 指定要清理的 CSS 文件
–content 指定所有可能用到 class 的源码文件(支持 glob)
–output 输出目录
可以对每个 CSS 文件都这样处理。
注意事项
如果有动态生成 class(如 :class=”isActive ? ‘foo’ : ‘bar’“),要用 PurgeCSS 的 safelist 配置保留。
处理后建议手动测试页面,防止误删。
2、 在构建工具中集成(如 Vite、Webpack)
Vite、Webpack 都有 PurgeCSS 或类似插件,可以自动在生产构建时清理无用 CSS。
例如 Vite + vite-plugin-purgecss。
3、 在线工具/手动分析
有些在线工具(如 uncss、purifycss)也能做类似事情,但不如 PurgeCSS 灵活。
方案1的实践
1、 准备脚本,自动批量清理所有 CSS 文件
import { execSync } from 'child_process';
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const cssDir = path.join(__dirname, 'public/static/css');
const outDir = path.join(cssDir, 'cleaned');
const contentGlobs = [
'src/**/*.vue',
'src/**/*.js',
'src/**/*.ts',
'public/index.html'
];
if (!fs.existsSync(outDir)) fs.mkdirSync(outDir);
let totalBefore = 0;
let totalAfter = 0;
fs.readdirSync(cssDir)
.filter(f => f.endsWith('.css'))
.forEach(cssFile => {
const cssPath = path.join(cssDir, cssFile);
const outPath = path.join(outDir, cssFile);
const beforeSize = fs.statSync(cssPath).size;
totalBefore += beforeSize;
const cmd = [
'purgecss',
`--css "${cssPath}"`,
contentGlobs.map(g => `--content "${g}"`).join(' '),
`--output "${outDir}"`
].join(' ');
console.log('Running:', cmd);
execSync(cmd, { stdio: 'inherit' });
const afterSize = fs.existsSync(outPath) ? fs.statSync(outPath).size : 0;
totalAfter += afterSize;
const percent = beforeSize === 0 ? 0 : (((beforeSize - afterSize) / beforeSize) * 100).toFixed(2);
console.log(`【${cssFile}】 缩减前: ${(beforeSize/1024).toFixed(2)} KB,缩减后: ${(afterSize/1024).toFixed(2)} KB,减少: ${percent}%`);
});
const totalPercent = totalBefore === 0 ? 0 : (((totalBefore - totalAfter) / totalBefore) * 100).toFixed(2);
console.log(`\n【总体积】缩减前: ${(totalBefore/1024).toFixed(2)} KB,缩减后: ${(totalAfter/1024).toFixed(2)} KB,总减少: ${totalPercent}%`);
console.log('PurgeCSS 批量清理完成,结果在 public/static/css/cleaned 目录下。');
2、用法
将上面脚本保存为 purgecss-batch.js。
在项目根目录运行:
node purgecss-batch.js
清理后的 CSS 文件会在 public/static/css/cleaned/ 目录下。
3、替换引用
检查 index.html 或入口文件,把原来的 CSS 路径改为 cleaned 目录下的新文件,测试页面功能和样式。
4、动态 class safelist(可选)
如果有动态生成的 class,可以在命令中加 –safelist 参数,或用 PurgeCSS 配置文件(如 purgecss.config.js)来指定 safelist。
5、还原/回滚
清理是“非破坏性”的,原文件不会被覆盖,随时可以回滚。
6、瘦身结果
体积
网络时长
未瘦身
瘦身
对比
小结
本次对项目中的 CSS 文件进行了瘦身优化。
从对比数据可以看出,所有主要样式文件的体积和加载时间均有明显下降。
总体积从 119 kB 降至 52 kB,减少了约 56.3%。
总加载时间从 3893 ms 降至 1349 ms,缩短了约 65.3%。
其中,content.min.css、news.min.css 等文件的优化效果尤为显著,体积和加载时间均大幅下降。
通过本次优化,有效减小了静态资源体积,提升了页面加载速度和用户体验,为后续性能优化打下了良好基础。