模块化目前在前端的日常开发中已经不是什么新鲜词,早期AMD规范的requirejs,CMD规范的seajs,以及nodejs的模块化规范commonjs,但是css的模块化一直进展不大,虽然有想less,sass,postcss…的出先,但是这些只是改善了css弱编程方面的问题,在模块化方面还是进展比较缓慢。
一.为什么要说CSS模块化?
首先,前端模块化是大势所趋,而CSS又是前端开发中重要的一部分,在大型web项目中,没有规范的模块化方案的问题对日常的开发和维护影响越来越大。
其次,模块化的好处在项目的维护,提高代码的复用率,便于组内协同开发,提高开发效率方面的效果是肉眼可见的
所以CSS样式的模块化一直在不断的尝试和探索
如何实现CSS的模块化
在讲如何实现CSS模块化之前先讲讲要利用模块化来解决什么问题:
- 样式私有化
- 避免被其他样式文件污染
- 可复用
我们在写样式的时候最常见的方式就是为各个模块的根节点设置一个唯一的类名,然后采用样式的后代选择器的方式来实现的,比如下面这样:
<div class="container">
<div class="area1"></div>
<div class="area2">
<div class="area3"></div>
</div>
</div>
样式文件:
.container > .area1{
}
.container > .area2 {
}
.container > .area2 .area3 {
}
当然,我们可以借助less,sass这类预处理器来写上面的样式,这样样式的可编程能力会更好,同时样式文件的层次也会更加清晰,比如我们用less写上的样式文件
index.less
.container{
.area1{
}
.area2{
.area3{
}
}
}
这样看起来一方面解决了不影响其他模块的问题,同时css的编程能力弱的问题也得到了解决。but ! but ! but ! 这只是针对前端项目比较小的时候,开发人员少比如就一个人就搞定了,像这类前端工程,这种方式确实就能解决问题了。如果这个前端工程师有多个前端开发人员协同开发,甚至可能还设计到跨小组开发的情况,那么这种方式就明显不适用了,因为别人在写类名的时候,他是不知道什么类名已经使用了,所以这也可能导致类名重名,并不能真正解决样式不污染其他的样式和被其他样式污染的问题。
既然有可能重名,那么能不能使用hash值来生成dom元素的唯一标识呢?这样就可以避免重名了。别说,还是真可以。下面我们就来说说在目前前端流行框架Vue和React在CSS模块化方面的尝试。