文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Vue项目中CSS Modules和Scoped CSS的介绍与区别

2024-04-02 19:55

关注

背景

在前端工程化飞速发展的时候,作为非编程语言的CSS在融入模块化的浪潮时产生了很多问题:

组件化开发是前端模块化的核心,但是原生CSS的思想是样式的层叠,对于组件来说并不友好,会造成组件样式被覆盖等问题。

于是我们希望样式是存在作用域的,即在组件的作用域内,组件样式只对该组件生效。

在大型项目中,多人合作经常容易产生命名混乱的问题,直接后果就是代码风格不统一、样式冲突等。

组件开发也意味着有很多样式代码是重复的,在项目中显得十分冗余。

于是我们希望存在一种机制可以导入和导出CSS,做到样式的复用。

解决CSS模块化的方案有很多种,在Vue项目中,Vue Loader支持的两种分别是Scoped CSS和CSS Modules。

Scoped CSS是Vue Loader默认支持的,因此在Vue项目中可以直接使用;

CSS Modules被Vue Loader视为模拟Scoped CSS的替代方案,也提供了集成来支持,但是需要写入一些配置。

// vue.config.js
// 使用vue-cli的话,可以直接在该文件中配置,不用暴露webpack的配置
​
module.exports = {
    css: {
        // 开启CSS Modules
        requireModuleExtension: true;
        loaderOptions: {
            // 向loader传递配置选项
            css: {
                modules: {
                    // 自定义类命名规则
                    // 在我们的项目中,对类的命名是根据环境不同而改变的,开发环境中会展示该类的文件路径方便调试,其他环境中会                      使用hash值封装
                    localIdentName: process.env.NODE_ENV === 'development' ? '[path][name]__[local]' :                          '[hash:base62:8]',
                }
            }
        }
    }
}

需要知道的是,这两个解决方案都不是CSS的官方规范,只是我们通过一些构建工具,比如Webpack或者脚手架来加载对应的Loader,从而对CSS代码进行一些转换,来做到实现模块化的效果。

CSS Modules

原理

CSS Modules实现CSS模块化的原理就是根据我们在config文件中定义的类名命名规则给类生成一个独一无二的命名,从而实现作用域的隔离。

<style module>
.example {
  color: red;
}
</style>
​
<template>
  <div class="example">hi</div>
</template>
<!-- 转化规则是自己定义的 -->
<!-- 生产环境中,直接用hash值封装 -->
<style module>
._1TdbN_VT {
  color: red;
}
</style>
​
<template>
  <div class="._1TdbN_VT">hi</div>
</template>
​
<!-- 开发环境中,会显示来源 -->
<style module>
.src-views-login-Index__example {
  color: red;
}
</style>
​
<template>
  <div class=".src-views-login-Index__example">hi</div>
</template>

规则

在style标签中需要声明module特性:

<style module>
...
</style>

声明module特性后,Vue Loader会生成一个$style计算属性,向组件注入CSS Modules对象,我们可以通过使用该计算属性在template和JS中访问到CSS Modules对象。

<template>
    <!-- 直接通过$style来访问red类,同理$style作为计算属性也支持对象和数组语法 -->
  <p :class="$style.red">
    This should be red
  </p>
</template>
.classA {
    color: green;
    background: red;
}
​
.classB {
    composes: classA;
    color: red;
}

如果需要组合其他module里的样式,可以通过导入的方式:

.classC {
    composes: classA from './style.css'
}

:global选择器

:global()允许括号中声明的选择器命中全局,即其类名不会经过规则封装,因此不受作用域的限制。

实际项目中,当我们希望修改所使用组件库的默认样式时,在使用CSS Modules方案的情况下,就可以通过:global()来修改其默认样式,但是要注意最好外面有一层类封装,否则可能影响全局样式。

Vue3新特性

<style module="login">
...
</style>

支持给module命名,可以用module名替代$style,比如<div :class="login.red"></div>。

在setup()中可以使用useCssModuleAPI来获取module对象。

支持在style中把某条rule的值和data中的一个数据绑定,比如:

.red {
    color: v-bind(color);
}

Scoped CSS

原理

Vue Loader默认使用CSS后处理器PostCSS来实现Scoped CSS,原理就是给声明了scoped的样式中选择器命中的元素添加一个自定义属性,再通过属性选择器实现作用域隔离样式的效果。

<style module>
.example {
  color: red;
}
</style>
​
<template>
  <div class="example">hi</div>
</template>
<!-- 用自定义属性把类名封装起来了 -->
<style>
.example[data-v-f3f3eg9] {
  color: red;
}
</style>
​
<template>
  <div class="example" data-v-f3f3eg9>hi</div>
</template>

规则

<style>

</style>
​
<style scoped>

</style>

深度作用选择器


<style scoped>
.a :deep(.b) {
  
}
</style>
​

.a[data-v-f3f3eg9] .b {
  
}

Vue3新特性

二者的比较

CSS ModulesScoped CSS
需要在vue.config.js中额外配置Vue Loader默认支持,无需额外配置
通过根据配置的类命名规则,为元素生成独一无二的类名来实现作用域隔离通过给元素自定义hash属性,再使用属性选择器选中元素来实现作用域隔离
在style标签中声明module在style标签中声明scoped
支持导入其他module的样式,支持样式组合/
通过:global()来解除作用域的隔离,使样式在全局生效1. 可以定义全局样式,使样式不受作用域约束;2. 可以通过深度作用选择器命中子组件,从而控制子组件的样式

总结

到此这篇关于Vue项目中CSS Modules和Scoped CSS的介绍与区别的文章就介绍到这了,更多相关Vue中CSS Modules和Scoped CSS内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯