Hello Blazor:(14)CSS隔离

前言

上次我们说到,FindRazorSourceFile使用有一定限制.

查看它的源码,发现它仅查找以b-开头属性名的HTML元素:

function getScope(element: Element): string | null {return element.getAttributeNames().filter(name => name.startsWith('b-'))[0] || null;
}async function getRazorSourceName(scope: string | null): Promise<RazorSourceName | null> {if (scope === null) return null;let razorSourceName = razorSourceMap[scope] || null;if (razorSourceName !== null) return razorSourceName;const res = await fetch(`_content/FindRazorSourceFile/RazorSourceMapFiles/${scope}.txt`);if (res.ok) {const text = await res.text();const p = text.replace(/[\r\n]*$/ig, '').split('|');const razorSourceName = { projectName: p[0], itemName: p[1] };razorSourceMap[scope] = razorSourceName;return razorSourceName;}else {razorSourceMap[scope] = NotFound;return NotFound;}
}

那这个b-是什么意思?

CSS 隔离

原来,FindRazorSourceFile实际上使用了Blazor中的“CSS隔离”功能[1]

CSS隔离帮助避免组件和库的样式冲突。

例如Index.razor,包含有如下HTML标记:

<h1>Hello, world!</h1>

实际在浏览器中显示时,HTML会被添加以b-开头的属性作为标识符,例如:

<h1 b-82p0zt5u2f>Hello, world!</h1>

CSS隔离标识符是唯一的,并且与每个组件相关联。也就是说,b-xxx可以用来作为HTML元素与.razor文件之间的对应key。

强制生成标识符

但是,你可能注意到,默认情况下,只有使用了*.razor.css的HTML元素才会有标识符:

af4a149ccaadb9861bdf46e4744aa86c.png

这也是正确的,因为CSS隔离是为了匹配的Razor文件中的HTML元素,在应用的其他位置定义的同名CSS声明都不会与这个组件的样式冲突。

如果没使用特定组件样式,则无需CSS隔离,当然也就不用生成标识符。

而FindRazorSourceFile使用了一个技巧,它增加了一个MsBuild编译目标,强制对所有Razor文件执行了`ComputeCssScope`任务[2]

<ComputeCssScope ScopedCssInput="@(_Fictional_RazorCss)" Targetname="$(TargetName)"><Output TaskParameter="ScopedCss" ItemName="_Fictional_RazorCss_with_Scope" />
</ComputeCssScope>

ComputeCssScope任务的源码中,我们可以找到标识符的生成算法:

private string GenerateScope(string targetName, string relativePath)
{using var hash = SHA256.Create();var bytes = Encoding.UTF8.GetBytes(relativePath + targetName);var hashBytes = hash.ComputeHash(bytes);var builder = new StringBuilder();builder.Append("b-");builder.Append(ToBase36(hashBytes));return builder.ToString();
}

结论

从本文中,我们知道了“CSS隔离”功能,并且了解到“CSS隔离”是由编译任务实现的,而不是运行时。

参考资料

[1]

“CSS隔离”功能: https://docs.microsoft.com/zh-cn/aspnet/core/blazor/components/css-isolation?view=aspnetcore-5.0

[2]

ComputeCssScope任务: https://github.com/dotnet/sdk/blob/main/src/RazorSdk/Tasks/ComputeCssScope.cs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于iPhone的UIView刷新(转)

大家应该都比较清楚如果想要刷新一个UIView的话&#xff0c;调用它的setNeedsDisplay即可。 问题是&#xff0c;当你调用了一个UIView的setNeedsDisplay之后&#xff0c;该UIView何时才得到刷新&#xff1f; 经过调研发现&#xff0c;应该是在一个runloop的最后阶段刷新。 什么…

Android之Broadcast, BroadcastReceiver(广播)

在 Android 中使用 Activity, Service, Broadcast, BroadcastReceiver 活动(Activity) - 用于表现功能 服务(Service) - 相当于后台运行的 Activity 广播(Broadcast) - 用于发送广播 广播接收器(BroadcastReceiver) - 用于接收广播 Intent - 用于连接以上各个组件,并在其间…

Exchange Connector 访问报错解决方法一

Exchange Connector 可是个好东东&#xff0c;下载地址如下&#xff1a; http://www.microsoft.com/downloads/details.aspx?familyid0140bc6d-1c51-41f6-a473-d0e04690ee5e A great little add on for Exchange 2007 and Visio 2007 which will help automatically graphical…

服务器系统吞吐量是否就是带宽,多少带宽才够用(一):简介与吞吐量问题

“带宽”对于网络管理人员、建筑师和技术人员来说是毫无意义的一个术语&#xff0c;相反&#xff0c;他们使用“数据传输率”、“连接性能”或者甚至“网速”来简单地代替这个术语&#xff0c;这就说明了一个问题&#xff0c;我们对网络有点无知&#xff0c;至少对在OSI模式的7…

CSS- 横向和纵向时间轴

时间轴在展示公司发展信息&#xff0c;服务流程中用的比较多&#xff0c;常见的注册登录有的是通过引导&#xff0c;一步一步的来完成&#xff0c;上面会通过时间轴告诉用户当前在哪一步&#xff0c;公司在关于我们或者发展流程的时候也特别喜欢用时间轴来展示&#xff0c;简单…

互联网巨头基于全球产业链打造ARM CPU

日前&#xff0c;“四十大盗”发布服务器CPU屠龙710。就“四十大盗”公司公布的数据来看&#xff0c;屠龙710是一款非常优秀的ARM芯片&#xff0c;在SPECInt2017基础测试中屠龙710跑分达到440分&#xff0c;超过行业标杆20%。不过&#xff0c;和以前FT、HW的ARM服务器CPU类似&a…

modbus 台达a2_驱控智造未来 台达重磅发布多款工业自动化新品

呼应智能制造发展需求&#xff0c;8月22日&#xff0c;“驱控智造未来-——2019台达工业自动化新品发布会”在北京举行&#xff0c;台达推出PC-Based运动控制器AX864E系列、伺服驱动系统ASDA-B3系列、精巧迷你型矢量控制变频器ME300系列、高功能通用型矢量控制变频器C2000 Plus…

SQL调优:带函数的谓词导致CBO Cardinality计算误差

今天处理了这样一问题&#xff0c;where条件中存在函数fun(date)<to_date(9999-01-01,YYYY-MM-DD)这样的无实际意义谓词&#xff0c;导致CBO计算基数时cardinality远小于实际情况&#xff0c;导致优化器认为2个源数据集的基数都不大&#xff0c;从而选择了HASH JOIN Right S…

当充气娃娃过于逼真......

1 朋友一生一起走....▼2 总裁爹是被吓到了吗&#xff1f;▼3 我宣布&#xff1a;本届舞林大会&#xff0c;冠军已出&#xff01;▼4 哥哥&#xff0c;我来了&#xff01;▼5 为了防疫&#xff0c;泰国的小朋友们很不容易▼6 这位爸爸真的是非常巧妙了&#xff01;▼7 生…

Android之gallery 常见2种使用方法和3D效果总结

我们有时候在iPhone手机上或者Windows上面看到动态的图片,可以通过鼠标或者手指触摸来移动它,产生动态的图片滚动效果,还可以根据你的点击或者触摸触发其他事件响应。同样的,在Android中也提供这这种实现,这就是通过Gallery在UI上实现缩略图浏览器。 一般情况下,我们在A…

(转)Android基础类之BaseAdapter

BaseAdapter就Android应用程序中经常用到的基础数据适配器&#xff0c;它的主要用途是将一组数据传到像ListView、Spinner、Gallery及GridView等UI显示组件&#xff0c;它是继承自接口类Adapter&#xff0c;1、Adapter类简介1)、Adapter相关类结构如下图所示&#xff1a;自定义…

[Windows]_[0基础]_[使用命令行工具dumpbin分析文件]

dumpbin(vs拥有) 1. 出口lib函数符号文件(symbols) dumpbin /exports zlib1.lib Microsoft (R) COFF/PE Dumper Version 10.00.40219.01 Copyright (C) Microsoft Corporation. All rights reserved.Dump of file zlib1.libFile Type: LIBRARYExportsordinal name1 _adl…

手把手教你学Dapr - 4. 服务调用

介绍通过使用服务调用&#xff0c;您的应用程序可以使用标准的gRPC或HTTP协议与其他应用程序可靠、安全地通信。为什么不直接用HttpClientFactory呢先问几个问题&#xff1a;如何发现和调用不同服务的方法如何安全地调用其他服务&#xff0c;并对方法应用访问控制如何处理重试和…

高速的二舍八入三七作五_有没有发现,高速收费都是5的倍数,这是为什么?怎么判断的?...

要想富&#xff0c;先修路。这是劳动人民致富的第一要素。从最早的泥巴路到现在的高速公路&#xff0c;人民生活有了翻天覆地的变化。随后路上汽车的数量也就越来越多了&#xff0c;堵车便成为很常见的现象&#xff0c;所以就有了高架桥、立交桥的诞生&#xff0c;它们的出现很…

android http请求

参考&#xff1a;http://stackoverflow.com/questions/2742236/android-httpclient 源码 首先要在 AndroidManifest.xml中添加权限: <uses-permission android:name"android.permission.INTERNET"></uses-permission> </manifest> 代码&#xff1a…

清华大学再出神人,汽车被盗,用“贪心算法”瞬间找到偷车贼

全世界只有3.14 % 的人关注了爆炸吧知识惹谁都不要惹会算法的人今天要讲的故事的主人公&#xff0c;是来自圣母大学计算机系的副教授史戈宇。就在之前&#xff0c;他还经历了一场惊心动魄的劫车事件。度假旅游遇劫匪在某一个周末&#xff0c;史教授计划着开车带一家人去百慕大度…

Android之RecyclerView 实现真正的Gallery效果

简介&#xff1a; RecyclerView是support-v7包中的新组件&#xff0c;是一个强大的滑动组件&#xff0c;与经典的ListView相比&#xff0c;同样拥有item回收复用的功能&#xff0c;但是直接把viewholder的实现封装起来&#xff0c;用户只要实现自己的viewholder就可以了&#x…

关于梦想--------听说标题够长才有人看

今天同桌拿手机看新闻。看到某市某中学生在国旗下讲话时私自篡改了老师原先为其准备的演讲稿&#xff0c;“讲了些有关抨击高考制度&#xff0c;学校不应沦为制度下的机器什么的。听说被勒令退学了。看到这个想起来我初三时候写的一片作文。名字叫做《梦想》。记得当时我先后采…

Android之ADB常用命令

adb devices //列出所有的连接设备 adb connect <host>[:<port>] //通过tcp/ip连接&#xff0c;5555是默认端口 设备命令&#xff1a; adb push <local> <remote> //拷贝文件/目录到设备 adb pull <remote> [<local>] //从设备拷贝文件/目…

手把手教你学Dapr - 2. 必须知道的概念

Sidecar 边车Dapr API提供Http和gRPC两种通讯方式。运行方式则可以是容器也可以是进程&#xff08;Windows开发推荐使用Self Hosted&#xff0c;后续会解释&#xff09;。这样的好处是与运行环境无关&#xff0c;且独立运行不需要应用包含Dapr运行时的代码。只需要通过SDK集成即…