不同组件的 className 可能会一样,导致样式冲突。
为此,我们希望 css 能实现像 js 的 es module 一样的模块化功能。
可以用 BEM 的命名规范来避免冲突,但是这需要人为保证,不够可靠。
一般都是用编译的方式,比如 CSS Modules 或者 vue 的 Scoped CSS。
它是通过 postcss-modules 实现的,可以把 css 的 className 编译成带 hash 的形式。
然后在组件里用 styles.xxx 的方式引入。
在 vite、cra(已停止维护,新项目建议用 Vite)里都对 css modules 做了支持,只要用 xx.module.css、xxx.module.scss 等结尾,就默认开启了 css modules。
还可以通过各种配置来做更多定制:
在 webpack 的 css-loader 里也有类似的配置。
现在的组件开发基本都有模块化的要求,所以 CSS Modules 在日常开发中用的特别多。