当前位置: 首页 > article >正文

深入理解Vue3中style的scoped

概述

scoped的作用就是样式模块化(CSS Module),即给组件每一个元素(以及非动态添加的子组件的根元素)加上一个data-v-xxxx的属性,样式选择器也会格式化成选择器[data-v-xxxx],这样就做到了样式隔离,每个组件内定义的样式只对该组件生效,避免了不同组件或页面的样式(选择器)冲突。本文将以vue3为例,深入了解scoped原理。

scoped实践

  • vue3组件是如下定义样式:
<template>
  <div class="header">
    <span>标绘管理</span>
  </div>
</template>
<style scoped>
.header span {
  position: relative;
  margin-left: 54px;
  font-size: 16px;
  display: inline-flex;
  height: 24px;
  line-height: 24px;
  font-family: "Microsoft YaHei";
  font-weight: bold;
  color: #303133;
}
</style>
  • 效果如下:

在这里插入图片描述

scoped源码分析

compiler-sfc模块

vue3中有个模块@vue/compiler-sfc,这个模块是单独拎出来,不会被打包到vue.global.jscompiler-sfc主要作用就是用来编译单文件组件,就是.vue。因为scoped的实现是在compiler-sfc模块中,所以本文的所有的讨论也是基于SFC

viteplugin-vue

vue3如果是通过vite搭建的,那么compiler-sfc会通过viteplugin-vue调用,这在script 标签的 setup 实现原理中有讲解,可以简短回顾。

Style 样式选择器中的处理

plugin-vue中会读取.vue组件,并识别<style></style>部分,如下

if (query.type === "style") {
   
  return transformStyle(
    code,
    descriptor,
    Number(query.index || 0),
    options.value,
    this,
    filename
  );
}

transformStyle函数会将<style></style>的 code 传给compiler.compileStyleAsync,并返回编译的结果,其中参数包含idscoped

  • id的生成

    id包含于descriptor中,其生成过程如下所示:

descriptor.id = getHash(normalizedPath + (isProduction ? source : "")); // normalizedPath:序列化文件路径后的字符串,如果是生产环境,还会加上源码

function getHash(text) {
   
  return node_crypto
    .createHash("sha256")
    .update(text)
    .digest("hex")
    .substring(0

http://www.kler.cn/news/317331.html

相关文章:

  • 简单计算器(python基础代码撰写)
  • Vue3:具名插槽
  • 微信小程序07-开发进阶
  • c++难点核心笔记(一)
  • 基于SpringBoot+Vue的在线问诊管理系统
  • 【觅图网-注册安全分析报告-无验证方式导致安全隐患】
  • 爬虫逆向学习(七):补环境动态生成某数四代后缀MmEwMD
  • AIGC时代!AI的“iPhone时刻”与投资机遇
  • Electron 隐藏顶部菜单
  • 面试速通宝典——2
  • 在特征工程中,如何评估特征的重要性
  • linux使用docker安装运行kibana报错“Kibana server is not ready yet“的解决办法
  • Linux 网络安全守护:构建安全防线的最佳实践
  • 【开源免费】基于SpringBoot+Vue.JS学科竞赛管理系统(JAVA毕业设计)
  • 对onlyoffice进行定制化开发
  • 1614. 括号的最大嵌套深度
  • 单片机原理与应用
  • 深入理解音视频pts,dts,time_base以及时间数学公式
  • GNU链接器(LD):什么是符号?符号定义及实例解析
  • 网络分段:您需要了解的一切
  • ssh 免密登陆服务器故障
  • 免费在线压缩pdf 压缩pdf在线免费 推荐简单好用
  • 学习Vue3骨架+异步组件(defineAsyncComponent)+Suspense
  • Rust的初级学者课程和学习资源推荐
  • MyBatis-Mapper 接口与 XML 映射
  • NLP 主要语言模型分类
  • 项目实战:Qt+OSG爆破动力学仿真三维引擎测试工具v1.1.0(加载.K模型,子弹轨迹模拟动画,支持windows、linux、国产麒麟系统)
  • 鹏哥C语言43---函数的嵌套调用和链式访问
  • gin参数绑定panic错误分析
  • OpenCV特征检测(5)检测图像中的角点函数cornerMinEigenVal()的使用