UNPKG

@fe-fast/unused-css-pruner

Version:

A powerful CSS pruning tool that removes unused styles with support for dynamic class names, CSS-in-JS, and component-level analysis

550 lines (427 loc) 12.4 kB
# CSS Pruner 🌿 一个强大且智能的 CSS 清理工具,用于识别和删除项目中未使用的 CSS 选择器。使用 TypeScript 构建,旨在与现代开发工作流程无缝集成。 ## 功能特性 ✨ - 🔍 **智能分析**:检测整个代码库中未使用的 CSS 选择器 - 🚀 **框架支持**:支持 Vue、React、Angular 和原生 HTML/JS - 🎯 **动态类检测**:处理 Tailwind CSS、CSS-in-JS 和模板字面量 - 📊 **多种报告格式**:控制台、JSON 和精美的 HTML 报告 - ⚙️ **高度可配置**:丰富的配置选项和智能默认值 - 🛡️ **默认安全**:试运行模式和白名单支持 - 📦 **零依赖**:轻量级,外部依赖最少 - 🔧 **CLI 和编程 API**:可作为命令行工具使用或集成到构建过程中 ## 安装 📦 ```bash # 使用 npm npm install -g @fe-fast/unused-css-pruner # 使用 yarn yarn global add @fe-fast/unused-css-pruner # 使用 pnpm pnpm add -g @fe-fast/unused-css-pruner # 项目特定用法 npm install --save-dev @fe-fast/unused-css-pruner ``` ## 快速开始 🚀 ### 命令行使用 ```bash # 分析 CSS 使用情况 css-pruner analyze --css "src/**/*.css" --source "src" # 清理 CSS 文件(试运行) css-pruner clean --css "src/**/*.css" --source "src" --dry-run # 生成 HTML 报告 css-pruner analyze --css "src/**/*.css" --source "src" --format html --output report.html # 初始化配置文件 css-pruner init ``` ### 编程使用 ```typescript import { analyzeCSSUsage, cleanCSS } from '@fe-fast/unused-css-pruner'; // 分析 CSS 使用情况 const result = await analyzeCSSUsage({ cssFiles: ['src/**/*.css'], sourceDirectories: ['src'], config: { reportFormat: 'json', verbose: true } }); console.log(`发现 ${result.stats.unusedSelectors} 个未使用的选择器`); // 清理 CSS 文件 const { result: cleanResult, cleanedFiles } = await cleanCSS({ cssFiles: ['src/**/*.css'], sourceDirectories: ['src'], outputDir: 'dist', dryRun: false }); ``` ## 配置 🔧 在项目根目录创建 `css-pruner.config.js` 文件: ```javascript module.exports = { // 要分析的 CSS 文件(支持 glob 模式) cssFiles: ['src/**/*.css', '!src/**/*.min.css'], // 扫描类使用情况的源目录 sourceDirectories: ['src', 'components'], // 要忽略的模式 ignorePatterns: [ 'node_modules/**', 'dist/**', 'build/**' ], // 始终保留的选择器(白名单) whitelist: [ 'sr-only', 'visually-hidden', /^wp-/, // WordPress 类 /^js-/, // JavaScript 钩子 /^is-/, // 状态类 /^has-/ // 状态类 ], // 要扫描的文件扩展名 fileExtensions: ['.vue', '.jsx', '.tsx', '.js', '.ts', '.html'], // 报告格式:'console'、'json'、'html' reportFormat: 'console', // 详细日志 verbose: false, // 试运行模式 dryRun: false }; ``` ## CLI 命令 💻 ### `analyze` 分析 CSS 文件并生成使用报告。 ```bash css-pruner analyze [选项] 选项: --css <patterns> 要分析的 CSS 文件(glob 模式) --source <dirs> 要扫描的源目录 --config <file> 配置文件路径 --format <format> 报告格式(console|json|html) --output <file> 报告输出文件 --verbose 启用详细日志 ``` ### `clean` 从文件中删除未使用的 CSS 选择器。 ```bash css-pruner clean [选项] 选项: --css <patterns> 要清理的 CSS 文件 --source <dirs> 要扫描的源目录 --output <dir> 清理后文件的输出目录 --dry-run 预览更改而不修改文件 --config <file> 配置文件路径 --verbose 启用详细日志 ``` ### `init` 创建示例配置文件。 ```bash css-pruner init [filename] ``` ## 框架集成 🔗 ### Webpack 插件 ```javascript const { CSSPrunerPlugin } = require('@fe-fast/unused-css-pruner/webpack'); module.exports = { plugins: [ new CSSPrunerPlugin({ cssFiles: ['dist/**/*.css'], sourceDirectories: ['src'], mode: 'analyze', // 或 'clean' config: { reportFormat: 'console', verbose: true }, onAnalysisComplete: (result) => { console.log(`发现 ${result.unusedSelectors.length} 个未使用选择器`); } }) ] }; ``` ### Vite 插件 ```javascript import { cssPruner } from '@fe-fast/unused-css-pruner/vite'; export default { plugins: [ cssPruner({ cssFiles: ['dist/**/*.css'], sourceDirectories: ['src'], mode: 'analyze', // 或 'clean' config: { reportFormat: 'console', verbose: true, whitelist: [/^btn-/, /^text-/] // 保护动态类 }, onAnalysisComplete: (result) => { console.log(`发现 ${result.unusedSelectors.length} 个未使用选择器`); } }) ] }; ``` ### Rollup 插件 ```javascript import { cssPruner } from '@fe-fast/unused-css-pruner/rollup'; export default { plugins: [ cssPruner({ cssFiles: ['dist/**/*.css'], sourceDirectories: ['src'], mode: 'analyze', // 或 'clean' config: { reportFormat: 'console', verbose: true }, onAnalysisComplete: (result) => { console.log(`发现 ${result.unusedSelectors.length} 个未使用选择器`); } }) ] }; ``` > 💡 **插件使用提示**: > - `analyze` 模式:安全分析,不修改文件,适合开发环境 > - `clean` 模式:实际清理CSS,建议在生产构建中使用 > - 详细使用指南请参考 [PLUGIN_USAGE.md](./PLUGIN_USAGE.md) ``` ## 高级功能 🎯 ### 动态类检测 CSS Pruner 智能检测动态生成的类: ```javascript // Tailwind CSS JIT const className = `bg-${color}-500`; // CSS-in-JS const styles = css` .${dynamicClass} { color: red; } `; // 模板字面量 const buttonClass = `btn btn-${variant} ${size}`; ``` ### 白名单模式 保护重要选择器不被删除: ```javascript module.exports = { whitelist: [ // 精确匹配 'sr-only', 'visually-hidden', // 正则表达式 /^wp-/, // WordPress 类 /^woocommerce-/, // WooCommerce 类 /^elementor-/, // Elementor 类 /^js-/, // JavaScript 钩子 /^is-/, // 状态类 /^has-/, // 状态类 // 响应式前缀(Tailwind) /^sm:/, /^md:/, /^lg:/, /^xl:/, /^2xl:/ ] }; ``` ### 自定义动态模式 为动态类检测添加自己的模式: ```javascript module.exports = { dynamicClassPatterns: [ // 自定义框架模式 /\bmyframework-\w+/, /\bcomponent-[a-z0-9-]+/, // 模板引擎模式 /\{\{[^}]+\}\}/, /\{%[^%]+%\}/ ] }; ``` ## 示例项目 🚀 `examples/` 目录包含三个综合性的演示项目,展示了 CSS Pruner 在不同构建系统和框架中的功能。每个示例都包含故意冗余的 CSS 类,以演示工具的有效性。 ### 可用示例 #### 1. Webpack + React 示例 **位置**: `examples/webpack-react-example/` **特性**: - React 18 与函数组件和 hooks - Webpack 5 与 CSS 提取 - 带有可复用组件的交互式计数器应用 - 用于测试的大量未使用 CSS 类 **快速开始**: ```bash cd examples/webpack-react-example npm install npm run build npm run css-prune ``` #### 2. Vite + Vue 示例 **位置**: `examples/vite-vue-example/` **特性**: - Vue 3 与 Composition API - Vite 用于快速开发和构建 - 交互式待办事项列表和计数器功能 - Vue 特定的 CSS 类模式 **快速开始**: ```bash cd examples/vite-vue-example npm install npm run build npm run css-prune ``` #### 3. Rollup + Vue 示例 **位置**: `examples/rollup-vue-example/` **特性**: - Vue 3 与高级组件架构 - Rollup 用于优化打包 - 带有任务管理的交互式仪表板 - 全面的 CSS 工具类 **快速开始**: ```bash cd examples/rollup-vue-example npm install npm run build npm run analyze-css ``` ### 每个示例演示的内容 **测试的常见 CSS 模式**: - 布局和网格系统(Bootstrap 风格的类) - 组件变体(按钮、卡片、表单) - 工具类(间距、排版、颜色) - 动画和效果 - 框架特定模式 **预期结果**: 每个示例应该检测到 **60-80% 的未使用 CSS 类**,演示: - 高检测准确性 - 框架兼容性 - 构建工具集成 - 全面的报告生成 **典型输出**: ``` 📊 CSS 分析结果: 📁 分析的 CSS 文件: 1 📄 总 CSS 规则: ~200-300 ✅ 已使用的 CSS 类: ~60-80 ❌ 未使用的 CSS 类: ~120-200 📉 潜在大小减少: 60-75% ``` ### 运行示例 对于任何示例: 1. **导航到示例目录**: ```bash cd examples/[示例名称] ``` 2. **安装依赖**: ```bash npm install ``` 3. **构建项目**: ```bash npm run build ``` 4. **运行 CSS 分析**: ```bash npm run css-prune # 或 npm run analyze-css ``` 5. **查看结果**: - 检查控制台输出的摘要 - 打开 `css-analysis/report.html` 查看详细视图 - 查看 `css-analysis/report.json` 进行程序化访问 6. **预览应用程序**(可选): ```bash npm run preview # 或 npm run dev ``` ### 配置文件 每个示例包含: - **`css-pruner.config.js`**: CSS Pruner 配置 - **构建配置**: 框架特定的构建配置 - **`package.json`**: 依赖项和 npm 脚本 - **`README.md`**: 示例特定的文档 有关每个示例的详细信息,请参阅其各自目录中的 README 文件。 ## 报告格式 📊 ### 控制台报告 彩色、详细的控制台输出,包含统计信息和建议。 ### JSON 报告 机器可读格式,非常适合 CI/CD 集成: ```json { "summary": { "totalSelectors": 1250, "usedSelectors": 892, "unusedSelectors": 358, "potentialSavings": 45600, "usageRate": 71.4 }, "unusedSelectors": [...], "fileBreakdown": [...], "recommendations": [...] } ``` ### HTML 报告 精美的交互式 HTML 报告,包含图表和详细分析。 ## 最佳实践 💡 1. **从分析开始**:清理前始终先运行分析 2. **使用试运行**:首先使用 `--dry-run` 标志测试 3. **配置白名单**:将框架特定的类添加到白名单 4. **版本控制**:运行清理前先提交 5. **彻底测试**:清理后彻底测试应用程序 6. **增量清理**:对于大型项目,一次清理一个组件/页面 ## CI/CD 集成 🔄 ### GitHub Actions ```yaml name: CSS 分析 on: [push, pull_request] jobs: css-analysis: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: node-version: '18' - run: npm install - run: npx css-pruner analyze --css "src/**/*.css" --source "src" --format json --output css-report.json - uses: actions/upload-artifact@v2 with: name: css-analysis-report path: css-report.json ``` ### Pre-commit 钩子 ```json { "husky": { "hooks": { "pre-commit": "css-pruner analyze --css 'src/**/*.css' --source 'src' && lint-staged" } } } ``` ## 故障排除 🔧 ### 常见问题 **问:一些已使用的类被标记为未使用** 答:将它们添加到白名单或检查它们是否是动态生成的。 **问:大型项目分析缓慢** 答:使用更具体的 glob 模式并排除不必要的目录。 **问:框架类的误报** 答:配置框架特定的白名单模式。 **问:未检测到动态类** 答:将自定义模式添加到 `dynamicClassPatterns` 配置。 ### 调试模式 ```bash css-pruner analyze --verbose --css "src/**/*.css" --source "src" ``` ## 贡献 🤝 我们欢迎贡献!请查看我们的[贡献指南](CONTRIBUTING.md)了解详情。 1. Fork 仓库 2. 创建功能分支(`git checkout -b feature/amazing-feature`) 3. 提交更改(`git commit -m 'Add amazing feature'`) 4. 推送到分支(`git push origin feature/amazing-feature`) 5. 打开 Pull Request ## 许可证 📄 MIT 许可证 - 详情请参阅 [LICENSE](LICENSE) 文件。 ## 更新日志 📝 查看 [CHANGELOG.md](CHANGELOG.md) 了解更改列表。 ## 支持 💬 - 📖 [文档] - 🐛 [问题跟踪器](https://github.com/william-xue/css-pruner/issues) - 💬 [讨论](https://github.com/william-xue/css-pruner/discussions) - 📧 [邮件支持] ---