《CSS修仙传:第五篇·架构法则篇》
楔子:样式污染之劫
"轰隆!"整个青云门的前端项目突然崩塌,各种.btn、.title、.content的样式像失控的剑气般四处飞射。我惊恐地看着控制台报错:
复制
Error: Button styles conflict in
src/components/Button.css
and
src/pages/home/Header.css
林惊羽师姐面色铁青:"这就是你写的CSS架构?连最基本的样式隔离都做不到!"
第一章:CSS模块化之道
1.1 CSS Modules原理
师姐掐诀念咒,webpack配置金光闪现:
javascript
复制
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /.css$/,
use: [
'style-loader',
{
loader: 'css-loader',
options: {
modules: {
localIdentName: '[name]__[local]--[hash:base64:5]'
}
}
}
]
}
]
}
}
"看好了!"她展示编译前后的变化:
css
复制
/* 原代码 */
.button { color: red; }
/* 编译后 */
.Button__button--a3fj5 { color: red; }
1.2 BEM命名规范
掌门演示传统命名心法:
css
复制
.block {}
.block__element {}
.block--modifier {}
"对比CSS Modules:"他挥袖展示差异:
复制
传统BEM:依赖人工约定
CSS Modules:编译时自动转换
1.3 CSS-in-JS的剑走偏锋
魔教长老突然现身,展示styled-components邪术:
javascript
复制
const Button = styled.button`
color: ${props => props.primary ? 'white' : 'black'};
background: ${props => props.primary ? '#1890ff' : '#f5f5f5'};
`;
"注意runtime性能损耗!"师姐警告道。
第二章:预处理器的炼丹术
2.1 Sass高级特性
我尝试用Sass组织代码:
scss
复制
// _variables.scss
$colors: (
primary: #1890ff,
danger: #ff4d4f
);
// _mixins.scss
@mixin ellipsis($line: 1) {
@if $line == 1 {
white-space: nowrap;
} @else {
display: -webkit-box;
-webkit-line-clamp: $line;
}
overflow: hidden;
text-overflow: ellipsis;
}
2.2 PostCSS插件开发
掌门演示自定义插件:
javascript
复制
// postcss-color-guard.js
module.exports = postcss.plugin('color-guard', (opts = {}) => {
return root => {
root.walkDecls(decl => {
if (decl.prop.includes('color')) {
if (decl.value === 'red') {
throw decl.error('禁止使用红色!');
}
}
});
};
});
第三章:设计系统构建
3.1 Token工程化
师姐搭建设计Token系统:
javascript
复制
// tokens.js
module.exports = {
colors: {
primary: {
base: '#1890ff',
light: '#69c0ff',
dark: '#0050b3'
}
},
spacing: {
unit: 4,
sizes: [0, 1, 2, 4, 8, 16]
}
}
3.2 样式覆盖率统计
掌门施展覆盖率检测大法:
bash
复制
npx coverage-css -i "**/*.css" -o coverage.html
报告显示:
复制
未使用样式:23%
重复定义:8%
架构心诀
掌门口述九句真言:
复制
组件样式要隔离
命名冲突需防范
设计Token统一样式
预处理善用变量
PostCSS插件补兼容
公用样式分层级
CSS Modules保平安
Utility类勿滥用
定期清理废代码
实战:重构门派样式体系
最终架构方案:
复制
styles/
├── tokens/ # 设计Token
│ ├── colors.scss
│ └── spacing.scss
├── utils/ # 工具类
│ ├── _layout.scss
│ └── _text.scss
├── components/ # 组件样式
│ ├── Button.module.scss
│ └── Modal.module.scss
└── global.scss # 全局样式
渡劫测验
- 实现一个自动生成Utility类的PostCSS插件
- 对比CSS Modules和CSS-in-JS的性能差异
- 设计支持主题切换的Token系统
- 解释为什么BEM逐渐被CSS Modules取代
终章预告:《飞升大典》- 综合运用五篇绝学,迎战前端界终极天劫:Vue3+TypeScript+CSS架构的大型项目实战!