当前位置: 首页 > 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/a/317331.html

相关文章:

  • 关于学习炸鸡佬智能手表 应用硬件IIC1来取代原来软件模拟的IIC
  • Android 项目依赖库无法找到的解决方案
  • LeetCode面试经典150题C++实现,更新中
  • 家政服务小程序,家政行业数字化发展下的优势
  • linux上海康SDK安装并设置环境变量
  • 开源模型应用落地-qwen模型小试-Qwen2.5-7B-Instruct-tool usage入门-集成心知天气(二)
  • 简单计算器(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):什么是符号?符号定义及实例解析
  • 网络分段:您需要了解的一切