CSS模块化需用PostCSS+postcss-import拆分、CSS Modules隔离样式、clsx处理状态组合,禁用@import;伪类/动画须与宿主同文件。
CSS 项目结构混乱,本质不是写法问题,而是缺乏模块边界和职责划分。靠“多写注释”或“改命名规范”治标不治本,真正要做的,是用工具把样式按功能/组件切开,并让这些模块可独立加载、测试和复用。
@import 拆分文件?别再用了@import 在 CSS 中会阻塞渲染、无法并行加载,且不支持条件导入或变量透传。现代项目中它已基本被构建工具替代。
@import 当作普通 CSS 导入处理,但不会做依赖分析或作用域隔离.css 文件里写 @import "button.css",最终仍会合并成一个大文件,模块性为零@import 实现“模块化”,说明构建流程没接入 PostCSS 或 CSS-in-JS 工具链postcss-import 是轻量级拆分首选它把 @import 提前编译成内联内容,支持路径别名、嵌套导入、甚至配合 postcss-preset-env 解析未来语法。
/* src/css/base.css */
:root {
--color-primary: #007bff;
}
/ src/css/components/button.css /
.button {
background: var(--color-primary);
border: none;
}
/* src/css/index.css */ @import "base.css"; @import "components/button.css";
postcss-import 在 PostCSS 插件列表中排第一from 参数(即当前文件路径),不是 HTML 引入位置
污染,但要注意作用域泄漏它自动哈希类名,让 .title 变成 Header_title__abc123,天然隔离组件样式。
立即学习“前端免费学习笔记(深入)”;
modules: true;Vite 默认识别 .module.css 后缀:global(.highlight) { color: red; }
className={styles['item-' + status]} 会失效,得用 styles.itemDefault 这种静态键名按钮有 disabled、loading、size=large、theme=dark 四个维度,共 16 种组合。全写成独立类名(btn--disabled--loading--large--dark)不可维护;全用 JS 切换又退化回内联样式。
clsx(JS)或 tailwind-merge(Tailwind 场景)做条件组合,把逻辑收口到组件层tokens/breakpoints.css,用 @media (width >= 768px) 替代 @media screen and (min-width: 768px)(需要 postcss-custom-media):hover)、伪元素(::before)和动画关键帧(@keyframes)必须和宿主选择器写在同一模块文件里,否则构建后作用域错乱