目錄
聲明性的影子圓頂解決了什麼
它的工作方式:語法
用例和福利
1。更快的初始渲染速度
2。更好的SSR支持
3。改進的SEO
4。漸進式增強
重要的局限性
後備策略
首頁 web前端 H5教程 聲明的影子Dom解釋了

聲明的影子Dom解釋了

Jul 31, 2025 am 09:30 AM
java 程式設計

聲明性的影子DOM允許開發人員直接在HTML中定義Shadow dom,從而通過在HTML解析過程中立即渲染封裝的內容來解決渲染的JavaScript問題,從而改善了性能,支持Next.js(例如Next.js),通過使SEO諸如SEO之類的SEO來增強SEO,從而增強陰影內容可消除和進步的增強功能;但是,它缺乏動態邏輯,具有範圍的樣式限制,目前僅限於基於鉻的瀏覽器,並通過使用JavaScript進行舊瀏覽器的後備策略。

聲明性的影子DOM是一個Web平台功能,它允許開發人員直接在HTML中定義陰影DOM結構,而不是通過JavaScript毫不猶豫地創建它們。這對於服務器端渲染(SSR)和改善Web組件的性能特別有用。

在潛水之前,讓我們簡要介紹什麼是Shadow dom是:這是一種封裝標記,樣式和行為的方法,以便它們不會洩漏到或受到頁面其餘部分的影響。傳統上,您使用這樣的JavaScript創建Shadow dom:

 const shadow = element.attachshadow({mode:'open'});
shadow.innerhtml =&#39;<p> Shadow </p>&#39;中的內容;

但這只能在客戶端加載後運行。這意味著,如果您要在服務器上渲染組件,則直到JavaScript執行,延遲視覺渲染並損害性能,就無法使用Shadow DOM結構。

聲明性的影子圓頂解決了什麼

核心問題聲明的陰影dom地址是在Web組件中構造javaScript 。使用傳統的影子DOM,在JavaScript運行之前,您將看不到封裝的內容。這導致:

  • 未風格的內容(FOUC)的閃光
  • 延遲互動
  • 可憐的SEO(搜索引擎可能不會等待JS執行)

聲明的影子DOM可讓您使用特殊的語法直接在HTML中編寫陰影根,因此瀏覽器可以立即解析並渲染包含的內容,甚至在JavaScript負載之前。

它的工作方式:語法

聲明的影子DOM引入了一個新的自定義元素: <template>帶有shadowroot屬性。這是一個例子:

 <my-component>
  <template shadowroot =“ open”>
    <樣式>
      p {顏色:藍色; }
    </style>
    <p>這立即在陰影dom中渲染。 </p>
  </template>
</my-component>

當瀏覽器解析此時,它會自動:

  1. shadowroot一起找到<template>模板>
  2. 將陰影根附加到父母( <my-component>
  3. 根據shadowroot值( openclosed )設置模式
  4. 將模板的孩子移至陰影根

這一切都發生在HTML解析期間 - 不需要JavaScript。

注意:您通常仍然需要JavaScript來定義自定義元素( customElements.define(&#39;my-component&#39;, ...) ),但是視覺結構已經到位。

用例和福利

1。更快的初始渲染速度

由於影子內容位於HTML中,因此用戶立即看到樣式的內容。不等待JS附著陰影根。

2。更好的SSR支持

諸如Next.js,Astro或Sveltekit之類的框架可以輸出完全渲染的Web組件,而Shadow dom baked在HTML中。即使還沒有進行水合,該組件看起來很完整。

3。改進的SEO

搜索引擎爬網可以在陰影DOM內部索引內容,因為它存在於初始HTML中。

4。漸進式增強

您可以構建無JavaScript的組件,然後在JS加載後增強它們。

重要的局限性

  • 沒有動態邏輯:由於它是聲明性的,因此您不能使用模板中的條件或循環(與JS不同)。
  • 造型範圍:模板內的樣式範圍範圍為陰影根 - 這很好,但是要小心全局重置。
  • 瀏覽器支持:截至2024年,基於鉻的瀏覽器(Chrome,Edge等)支持。 Firefox和Safari仍在努力實施。

您可以在Caniuse.com上檢查當前狀態。

後備策略

如果您需要支持較舊的瀏覽器,請將聲明性和當務之急的方法結合在一起:

 <my-component>
  <template shadowroot =“ open”>
    <p>我在支持瀏覽器</p>時立即顯示
  </template>
</my-component>

<script>
//重用現有模板(如果尚未處理)
如果(!mycomponent.shadowroot){
  const template = mycomponent.queryselector(&#39;[Shadowroot]&#39;);
  如果(template){
    const shadow = mycomponent.attachshadow({mode:&#39;open&#39;});
    Shadow.appendChild(template.content.clonenode(true));
  }
}
</script>

這樣可以確保優雅的降級。


聲明的影子DOM不會替換基於JavaScript的陰影DOM,它可以對其進行補充。這是邁出更具彈性,性能的網絡組件的一步,尤其是在現代SSR驅動的框架中。

基本上:寫一次,快速渲染,以後增強。

以上是聲明的影子Dom解釋了的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1604
29
PHP教程
1509
276
如何在Java中實現簡單的TCP客戶端? 如何在Java中實現簡單的TCP客戶端? Aug 08, 2025 pm 03:56 PM

Importjava.ioandjava.net.SocketforI/Oandsocketcommunication.2.CreateaSocketobjecttoconnecttotheserverusinghostnameandport.3.UsePrintWritertosenddataviaoutputstreamandBufferedReadertoreadserverresponsesfrominputstream.4.Usetry-with-resourcestoautomati

用Docker將Java應用程序部署到Kubernetes 用Docker將Java應用程序部署到Kubernetes Aug 08, 2025 pm 02:45 PM

容器化Java應用:創建Dockerfile,使用基礎鏡像如eclipse-temurin:17-jre-alpine,複製JAR文件並定義啟動命令,通過dockerbuild構建鏡像並用dockerrun測試本地運行。 2.推送鏡像到容器註冊表:使用dockertag標記鏡像並推送到DockerHub等註冊表,需先登錄dockerlogin。 3.部署到Kubernetes:編寫deployment.yaml定義Deployment,設置副本數、容器鏡像和資源限制,編寫service.yaml創建

VS代碼快捷方式專注於Explorer面板 VS代碼快捷方式專注於Explorer面板 Aug 08, 2025 am 04:00 AM

VSCode中可通過快捷鍵快速切換面板與編輯區。要跳轉至左側資源管理器面板,使用Ctrl Shift E(Windows/Linux)或Cmd Shift E(Mac);返回編輯區可用Ctrl `或Esc或Ctrl 1~9。相比鼠標操作,鍵盤快捷鍵更高效且不打斷編碼節奏。其他技巧包括:Ctrl KCtrl E聚焦搜索框,F2重命名文件,Delete刪除文件,Enter打開文件,方向鍵展開/收起文件夾。

修復:Windows Update無法安裝 修復:Windows Update無法安裝 Aug 08, 2025 pm 04:16 PM

runthewindowsupdatetrubloubleshooterviaSettings>更新&安全> is esseShootsoAtomationfixCommonissues.2.ResetWindowSupDateComponentsByStoppingRealatedServices,RenamingTheSoftWaredWaredWaredSoftwaredSistribution andCatroot2Folders,intrestrestartingthertingthertingtherserviceSteStoceTocle

如何在Java中使用一個時循環 如何在Java中使用一個時循環 Aug 08, 2025 pm 04:04 PM

AwhileloopinJavarepeatedlyexecutescodeaslongastheconditionistrue;2.Initializeacontrolvariablebeforetheloop;3.Definetheloopconditionusingabooleanexpression;4.Updatethecontrolvariableinsidethelooptopreventinfinitelooping;5.Useexampleslikeprintingnumber

Java對象的序列化過程是什麼? Java對象的序列化過程是什麼? Aug 08, 2025 pm 04:03 PM

JavaserializationConvertSanObject'SstateIntoAbyTeSteAmForStorageorTransermission,andDeserializationReconstructstheObjectStheObjectFromThstream.1.toenableserialization,aclassMustimustimplementTheSerializableizableface.2.UseObjectObjectObjectObjectOutputputputputputtreamToserialializeanobectizeanobectementeabectenobexpent,savin

python numpy陣列示例 python numpy陣列示例 Aug 08, 2025 am 06:13 AM

NumPy數組的使用包括:1.創建數組(如從列表、全零、全一、範圍創建);2.形狀操作(reshape、轉置);3.向量化運算(加減乘除、廣播、數學函數);4.索引與切片(一維和二維操作);5.統計計算(最大值、最小值、均值、標準差、求和及軸向操作);這些操作高效且無需循環,適合大規模數值計算,最終掌握需多加練習。

什麼是Java的哈希圖? 什麼是Java的哈希圖? Aug 11, 2025 pm 07:24 PM

ahashmapinjavaiSadattrastureturethatStoreskey-valuepairsforefficeFitedReval,插入和deletion.itusesthekey’shashcode()methodtodeTermInestorageLageLageAgeLageAgeAgeAgeAgeAneStorageAgeAndAllowSavereo(1)timecomplexityforget()

See all articles