Safari在Chromium之后也加入声明式影子DOM支持

2021年发布的Chromium 90系列浏览器,就已支持的声明式影子DOM(Declarative Shadow DOM),Safari终于也开始支持,Safari技术预览版162的浏览器引擎Webkit,添加声明式影子DOM API并且默认激活。

影子DOM属于Web Components中三个主要技术之一,其他两个技术还有自定义元素和HTML模板。Web Components的出现,是为了让开发者创建可在网页上,重复使用的自定义小工具和组件,目前Web Components的所有技术都已经被集成到DOM和HTML标准中,受主要浏览器支持。

而在声明式影子DOM的支持上,Chromium系列浏览器的进度最快,早在Chromium 90就开始支持,Safari的浏览器引擎Webkit则是一直到现在才开始技术预览,Webkit官方也解释了必须支持声明式影子DOM的原因。

所谓的影子DOM,是为DOM树提供一个轻量级封装,因此开发者便可以在元素上创建一个平行的树,该树被称为影子树,由于影子树与主要文件的DOM树分开渲染,能够在不修改主要DOM树下,取代该元素的渲染,因此元素功能可以被脚本化和风格化,而不需要担心和文件的其他部分冲突。

但是影子DOM有一个缺点,在元素上创建影子树之前,需要以JavaScript在该元素上调用attachShadow。由于需要JavaScript缘故,当JavaScript被停用的时候,像是在电子邮件客户端,该功能便无法使用。

Webkit官方还提到,目前不少网页应用程序,会使用服务器端渲染技术,而使用该技术的网站,通常会在渲染初期避免JavaScript使用,以减少搭建延迟,随着脚本和相关元素加载,才会慢慢强化内容互动性。但因为如此,这些网站便无法使用影子DOM,因为影子DOM使用前提是必须调用attachShadow,而声明式影子DOM则是通过在HTML中,包含影子DOM内容的机制,以解决这个问题。

Webkit的声明式影子DOM API,具向下兼容性,因此即便于存在声明式影子DOM的元素上调用attachShadow,Webkit也不会丢出异常,因此支持声明式影子DOM,也能够向下兼容现有依赖attachShadow创建影子根的JavaScript方法。

官方也提醒,目前DOMParser和innerHTML等JavaScript解析器API,都不会默认支持声明式影子DOM,因为要避免在现有接受任意模板内容的网站上,产生跨站脚本漏洞。

由于声明式影子DOM能够在停用JavaScript,及应用服务器端渲染的情况下,提供在HTML中定义影子树的新方法,因此是一个重要且受开发者高度期待的功能,备受浏览器供应商讨论,主要浏览器Chrome、Edge和Opera都在2021年便开始支持,Safari在目前发布的技术预览版中默认激活,Firefox则倾向支持但尚未实例。