必须用 import styles from './Component.module.css' 实现样式隔离,因 .module.css 文件名触发 CSS Modules 机制,生成哈希类名(如 Button_btn__kx9f2),避免全局污染;import './Component.css' 则全局注入同名类导致覆盖。

用 import styles from './Component.module.css' 替代 import './Component.css'
直接 import './Button.css' 是全局注入,所有同名类(比如 .btn)都会互相覆盖,Modal 里的按钮、Ant Design 的按钮都可能被意外改掉。真正“按需”且“不污染”的唯一路径是启用 CSS Modules —— 它不是配置开关,而是靠文件名约定触发的机制。
必须同时满足三个条件:
- 文件后缀是
.module.css(不是.css,也不是.modules.css) - 导入写法是
import styles from './Button.module.css'(不是import './Button.module.css',也不是import * as styles from './Button.module.css') - 使用时通过对象属性访问:
className={styles.btn}(styles是 JS 对象,值是哈希后的字符串,如Button_btn__kx9f2)
动态类名别用字符串拼接,用 clsx 或三元判断兜底
className={`${styles.btn} ${styles.primary}`} 看似简洁,但一旦 styles.primary 不存在(比如拼写错误或条件未命中),结果就是 "Button_btn__kx9f2 undefined",React 不报错,但样式丢失且无提示。
安全做法只有两种:
className={clsx(styles.btn, condition && styles.primary)}className={clsx(styles.btn, condition ? styles.primary : null)}
注意:clsx 不是必需,但能自动过滤 falsy 值;不用它的话,至少得确保每个 styles.xxx 都存在,否则就得加 ?? '' 或提前 console.log(styles) 确认导出内容。
别在 .module.css 里滥用 :global()
:global() 是逃生舱,不是后门。你写 :global(.ant-btn) { margin: 0; } 是合理穿透;但写成 .btn { :global(.icon) { ... } } 就违反嵌套规则,Vite/Webpack 可能静默忽略,也可能报错,行为不可控。
来自 Vercel Engineering 的 React 和 Next.js 性能优化指南。用于编写、审查或重构 React/Next.js 代码以确保最佳性
真正需要 :global() 的场景极少,常见就两类:
- 重置第三方组件的默认 margin/padding(比如对接 legacy UI 库)
- 给子组件中无法控制 className 的 DOM 节点加样式(如某些富文本编辑器内部节点)
除此之外,所有样式都应该留在模块作用域内 —— 否则等于白开了 CSS Modules。
Vite 和 Webpack 对 .module.css 的支持差异
Vite 默认识别 .module.css,开箱即用;Webpack 则依赖 css-loader 配置,必须确保 modules: true 只对匹配 /\.module\.(css|sass|scss|less)$/ 的文件生效,不能设成全局 modules: true,否则普通 .css 也会被模块化,导致 Ant Design 等全局样式失效。
检查点:
- Webpack 项目跑
npx webpack --mode=development --stats=verbose | grep 'module',确认.module.css走的是CssModulesPlugin流程 - Vite 项目检查
vite.config.ts是否有误配css.modules选项(通常不需要手动开) - 如果用了
.module.scss,还得确认sass-loader或style-resources-loader没干扰模块化逻辑
最易忽略的一点:构建工具不会因为文件名错一位(比如 Button.moduel.css)就报错,它只会当普通 CSS 处理 —— 样式照常生效,但已全局污染,问题要等上线后才暴露。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










