CSS修仙传:第五篇·架构法则篇

63 阅读2分钟

《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           # 全局样式

渡劫测验

  1. 实现一个自动生成Utility类的PostCSS插件
  2. 对比CSS Modules和CSS-in-JS的性能差异
  3. 设计支持主题切换的Token系统
  4. 解释为什么BEM逐渐被CSS Modules取代

终章预告:《飞升大典》- 综合运用五篇绝学,迎战前端界终极天劫:Vue3+TypeScript+CSS架构的大型项目实战!