scoped原理、穿透原理、哈希计算

2024-01-30 05:36

本文主要是介绍scoped原理、穿透原理、哈希计算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 什么是socped
  • 原理
  • data-v-xxxx

什么是socped

当一个style标签拥有scoped属性时,它的CSS样式就只能作用于当前组件,通过该属性,可以使组件之间的样式不相互污染。也就是实现组件私有化,起到样式隔离的作用

原理

  1. 组件实例生成一个唯一的标识,给组件中的每个标签对应的dom元素添加一个标签属性,data-v-xxxx,也叫做组件ID
  2. 给 < style scoped>中的每个选择器的最后一个选择器添加一个属性选择器,原选择器[data-v-xxxx],如:原选择器为.container #id div,则更改后的选择器为.container #id div[data-v-xxxx]

引出另外一个问题:
如果使用第三方组件,加了scoped之后就可能控制不到第三方组件中的样式了。(例如element-ui)

所以这时候需要样式穿透
样式穿透的写法有两种:/deep/::v-deep、>>>(这种写法比较老)

样式穿透原理:
scoped后选择器最后默认会加上当前组件的一个标识,比如[data-v-xxxx]用了样式穿透后,同样可以通过这个标签属性来对其进行样式权重的控制。不会在选择器后面追加[data-v-xxxx]

样式穿透原理指的是当元素存在嵌套时,某个元素可以直接使用父元素的样式,也就是说当我们给父元素定义一个样式时,子元素可以直接使用,不需要重新定义。这种机制叫做样式穿透原理。 原理解释:样式穿透原理是计算机中选择器的优先级选择原理,即当选择器存在嵌套时,父元素中定义的样式可以被子元素继承,同时子元素也可以重新定义样式,且优先级将高于父元素的样式

data-v-xxxx

xxxx值是怎么得到的?
webpack+vue-loader对vue2的处理

// vue-loader/src/index.tsconst shortFilePath = path.relative(rootContext || process.cwd(), filename).replace(/^(..[/\])+/, '').replace(/\/g, '/')const id = hash(isProduction? shortFilePath + '\n' + source.replace(/\r\n/g, '\n'): shortFilePath)

vite+@vitejs/plugin-vue对vue3的处理

// vite-plugin-vue/src/util/descriptorCache.tsimport path from "node:path";
import { createHash } from "node:crypto";
import slash from "slash";function getHash(text) {return createHash("sha256").update(text).digest("hex").substring(0, 8);
}// 获取文件相对路径
const normalizedPath = slash(path.normalize(path.relative(root, filename)));
// 计算 ID
descriptor.id = getHash(normalizedPath + (isProduction ? source : ""));

可以发现,不管是 vue-loader 还是 @vitejs/plugin-vue ,data 属性 ID 的生成机制都是一样的,即:

  • 开发环境下会根据文件相对路径生成唯一 ID,比如 vite 中 src/App.vue 固定生成 7a7a37b1
  • 生产环境下会根据文件相对路径+文件内容共同生成唯一 ID
    注意:相同路径结构的 Vue 子应用的组件,在开发环境下会产生样式冲突,但在生产环境下大概率不会,除非文件内容完全一样。
    那如果遇到了冲突问题,除了手动修改文件路径或文件名,还有什么办法可以完全避免?

给 Vue 提 PR ! 一个更好的 ID 计算方式是加上项目名(或者 package.json 的 name),并支持手动指定,这样就可以彻底避免冲突问题了。

import path from "node:path";
import { createHash } from "node:crypto";
import slash from "slash";function getHash(text) {return createHash("sha256").update(text).digest("hex").substring(0, 8);
}// 获取项目名
const projectName = config.projectName || path.basename(root)
// 获取文件相对路径(含项目名)
const normalizedPath = slash(path.normalize(path.join(projectName, path.relative(root, filename))));
// 计算 ID
descriptor.id = getHash(normalizedPath + (isProduction ? source : ""));

为什么开发环境和生产环境的 ID 计算方式不一样?

首先,开发环境下最好不要加入文件内容进行 hash 计算。
这很好理解:

一来 hash 计算是耗时的,内容越多耗时越长;
二来还会频繁变动节点样式,徒增成本。

那生产环境为什么还要加入文件内容计算 hash ?
如果 ID 与文件内容无关,就可以实现稳定的 data 属性。对于 E2E (端对端)测试用例,就可以直接使用 data 属性进行元素寻址。

为什么在生产环境中要将文件内容纳入哈希计算?

在生产环境中,将文件内容纳入哈希计算主要是为了解决缓存问题和版本控制
在Web开发中,为了提高网站的加载速度和性能,通常会将静态资源(如CSS、JavaScript文件)进行缓存。当浏览器首次加载网页时,会将这些资源下载到本地,并根据资源的URL进行缓存。当用户再次访问同一网页时,浏览器会先检查缓存,如果资源没有发生变化,则直接使用缓存的资源,从而提高加载速度。

然而,如果在生产环境中对静态资源进行修改,而URL没有发生变化,浏览器可能仍然使用缓存的旧资源,导致网页显示不正确或出现错误。为了解决这个问题,可以使用哈希计算

哈希计算会将文件的内容计算出唯一的哈希值,并将其添加到文件名或URL中。当文件内容发生变化时,哈希值也会随之改变。这样,浏览器在加载网页时就会发现URL发生了变化,从而强制重新下载最新的静态资源。这保证了用户总是能够看到最新的文件版本,同时也解决了缓存问题。

这篇关于scoped原理、穿透原理、哈希计算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/659237

相关文章

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

XTU 1237 计算几何

题面: Magic Triangle Problem Description: Huangriq is a respectful acmer in ACM team of XTU because he brought the best place in regional contest in history of XTU. Huangriq works in a big compa