电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

js與css的阻塞問題詳析

瀏覽:95日期:2024-03-22 09:58:08
目錄DOMContentLoaded和loadjs 阻塞了什么css 阻塞了什么優化總結DOMContentLoaded和load

我們先了解兩個事件,有助于后面的分析。

load事件:load 應該僅用于檢測一個完全加載的頁面 當一個資源及其依賴資源已完成加載時,將觸發load事件。也就是說,頁面的html、css、js、圖片等資源都已經加載完之后才會觸發 load 事件。

DOMContentLoaded事件:當初始的 HTML 文檔被完全加載和解析完成之后,DOMContentLoaded 事件被觸發,而無需等待樣式表、圖像和子框架的完成加載。也就是說,DOM 樹已經構建完畢就會觸發 DOMContentLoaded 事件。

js 阻塞了什么

因為js在執行的過程中可能會操作DOM,發生回流和重繪,所以GUI渲染線程與JS引擎線程是互斥的。

在解析HTML過程中,如果遇到 script 標簽,渲染線程會暫停渲染過程,將控制權交給 JS 引擎。內聯的js代碼會直接執行,如果是js外部文件,則要下載該js文件,下載完成之后再執行。等 JS 引擎運行完畢,瀏覽器又會把控制權還給渲染線程,繼續 DOM 的解析。

因此,js會阻塞DOM樹的構建。

那么,是否會阻塞頁面的顯示呢?我們用下面的代碼來測試一下。

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <meta http-equiv='X-UA-Compatible' content='IE=edge'> <meta name='viewport' content='width=device-width, initial-scale=1.0'> <title>Document</title></head><body> <div>hello world</div> <script> debugger </script> <div>hello world2</div></body></html>

js與css的阻塞問題詳析

可以看到,這個頁面的DOMContentLoaded發生在2.23s,可見js阻塞了DOM樹的構建。但是,頁面上卻幾乎在一瞬間顯示了hello world,說明js不會阻塞位于它之前的dom元素的渲染。

現代瀏覽器為了更好的用戶體驗,渲染引擎將嘗試盡快在屏幕上顯示的內容。它不會等到所有DOM解析完成后才布局渲染樹。而是當js阻塞發生時,會將已經構建好的DOM元素渲染到屏幕上,減少白屏的時間。

這也是為什么我們會將script標簽放到body標簽的底部,因為這樣就不會影響前面的頁面的渲染。

css 阻塞了什么

當我們解析 HTML 時遇到 link 標簽或者 style 標簽時,就會計算樣式,構建CSSOM。

css不會阻塞dom樹的構建,但是會阻塞頁面的顯示。我們依然用一個例子來測試:

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <meta http-equiv='X-UA-Compatible' content='IE=edge'> <meta name='viewport' content='width=device-width, initial-scale=1.0'> <title>Document</title> <link rel='stylesheet' type='text/css' ></head><body> <div class='woo-spinner-filled'>hello world</div> <div>hello world2</div></body></html>

js與css的阻塞問題詳析

使用一個外部css文件,打開Slow 3G模擬比較慢的網速,可以看到,DOMContentLoaded事件觸發只用了30ms,頁面此時依然是空白,而幾乎是loaded事件2.92s發生時,頁面才出現內容。

原因是,瀏覽器在構建 CSSOM 的過程中,不會渲染任何已處理的內容。即便 DOM 已經解析完畢了,只要 CSSOM 不沒構建好,頁面也不會顯示內容。

只有當我們遇到 link 標簽或者 style 標簽時,才會構建CSSOM,所以如果 link 標簽之前有dom元素,當加載css發生阻

<body> <div class='woo-spinner-filled'>hello world</div> <link rel='stylesheet' type='text/css' > <div>hello world2</div></body>

這樣做會導致一個問題,就是頁面閃爍,在css被加載之前,瀏覽器按照默認樣式渲染 <div class='woo-spinner-filled'>hello world</div>,當css加載完成,會為該div計算新的樣式,重新渲染,出現閃爍的效果。

為了避免頁面閃爍,通常 link 標簽都放在head中。

css會不會阻塞后面js執行?答案是會!

JS 的作用在于修改,它幫助我們修改網頁的方方面面:內容、樣式以及它如何響應用戶交互。這“方方面面”的修改,本質上都是對 DOM 和 CSSDOM 進行修改。當在JS中訪問了CSSDOM中某個元素的樣式,那么這時候就需要等待這個樣式被下載完成才能繼續往下執行JS腳本。

運行下面這個例子,就會發現等css加載完成后,才會在控制臺打印“this is a test”。

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <meta http-equiv='X-UA-Compatible' content='IE=edge'> <meta name='viewport' content='width=device-width, initial-scale=1.0'> <title>Document</title> <link rel='stylesheet' type='text/css' ></head><body> <div class='woo-spinner-filled'>hello world</div> <div>hello world2</div> <script> console.log(’this is a test’) </script></body></html>優化

使用內聯 JavaScript 和 CSS,這樣獲取到 HTML 文件之后就可以直接開始渲染流程了。

并不是所有的場合都適合內聯,那么還可以盡量減少文件大小,比如通過 webpack 等構建工具刪除無用代碼、壓縮 css、JavaScript 文件的體積;并且啟用 CDN 加快文件的下載速度。

對于大的 CSS 文件,可以通過媒體查詢屬性,將其拆分為多個不同用途的 CSS 文件,這樣只有在特定的場景下才會加載特定的 CSS 文件。

如果 JavaScript 文件中沒有操作 DOM 相關代碼,就可以將該 JavaScript 腳本設置為異步加載,通過 async 或 defer 來標記代碼。

<script src='http://www.hdgsjgj.cn/bcjs/index.js'></script>//瀏覽器必須等待 index.js 加載和執行完畢才能去做其它事情。<script async src='http://www.hdgsjgj.cn/bcjs/index.js'></script>//index.js 的加載是異步的,加載時不會阻塞瀏覽器做任何其它的事情。//當它加載結束,JS 腳本會立即執行。<script defer src='http://www.hdgsjgj.cn/bcjs/index.js'></script>//JS 的加載是異步的,執行是被推遲的。//使用了 defer 標記的腳本文件,會等整個文檔解析完成,在 DOMContentLoaded 事件觸發之前執行總結

到此這篇關于js與css的阻塞問題的文章就介紹到這了,更多相關js與css阻塞內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 净水器代理,净水器招商,净水器加盟-FineSky德国法兹全屋净水 | 钢结构-钢结构厂房-钢结构工程[江苏海逵钢构厂] | 合金ICP光谱仪(磁性材料,工业废水)-百科 | 天津蒸汽/热水锅炉-电锅炉安装维修直销厂家-天津鑫淼暖通设备有限公司 | MVR蒸发器厂家-多效蒸发器-工业废水蒸发器厂家-康景辉集团官网 | 危废处理系统,水泥厂DCS集散控制系统,石灰窑设备自动化控制系统-淄博正展工控设备 | 滑板场地施工_极限运动场地设计_滑板公园建造_盐城天人极限运动场地建设有限公司 | 假肢-假肢价格-假肢厂家-河南假肢-郑州市力康假肢矫形器有限公司 | 洛阳防爆合格证办理-洛阳防爆认证机构-洛阳申请国家防爆合格证-洛阳本安防爆认证代办-洛阳沪南抚防爆电气技术服务有限公司 | 阿米巴企业经营-阿米巴咨询管理-阿米巴企业培训-广东键锋企业管理咨询有限公司 | 上海公众号开发-公众号代运营公司-做公众号的公司企业服务商-咏熠软件 | 锡膏喷印机-全自动涂覆机厂家-全自动点胶机-视觉点胶机-深圳市博明智控科技有限公司 | 水质传感器_水质监测站_雨量监测站_水文监测站-山东水境传感科技有限公司 | 华溶溶出仪-Memmert稳定箱-上海协烁仪器科技有限公司 | 蒸汽吸附分析仪-进口水分活度仪|康宝百科 | 证券新闻,热播美式保罗1984第二部_腾讯1080p-仁爱影院 | 电缆接头_防水接头_电缆防水接头 - 乐清市新豪电气有限公司 | 工业rfid读写器_RFID工业读写器_工业rfid设备厂商-ANDEAWELL | 圆盘鞋底注塑机_连帮鞋底成型注塑机-温州天钢机械有限公司 | 钢绞线万能材料试验机-全自动恒应力两用机-混凝土恒应力压力试验机-北京科达京威科技发展有限公司 | 泵阀展|阀门展|水泵展|流体机械展 -2025上海国际泵管阀展览会flowtech china | 游泳池设计|设备|配件|药品|吸污机-东莞市太平洋康体设施有限公司 | 万烁建筑设计院-建筑设计公司加盟,设计院加盟分公司,市政设计加盟 | 深圳市万色印象美业有限公司| 超细粉碎机|超微气流磨|气流分级机|粉体改性设备|超微粉碎设备-山东埃尔派粉碎机厂家 | 美能达分光测色仪_爱色丽分光测色仪-苏州方特电子科技有限公司 | 甲级防雷检测仪-乙级防雷检测仪厂家-上海胜绪电气有限公司 | 模型公司_模型制作_沙盘模型报价-中国模型网 | 河南中整光饰机械有限公司-抛光机,去毛刺抛光机,精密镜面抛光机,全自动抛光机械设备 | 加中寰球移民官网-美国移民公司,移民机构,移民中介,移民咨询,投资移民 | 耐磨陶瓷,耐磨陶瓷管道_厂家-淄博拓创陶瓷科技 | 安徽成考网-安徽成人高考网 | 大米加工设备|大米加工机械|碾米成套设备|大米加工成套设备-河南成立粮油机械有限公司 | Boden齿轮油泵-ketai齿轮泵-yuken油研-无锡新立液压有限公司 | 扬尘在线监测系统_工地噪声扬尘检测仪_扬尘监测系统_贝塔射线扬尘监测设备「风途物联网科技」 | 企业微信scrm管理系统_客户关系管理平台_私域流量运营工具_CRM、ERP、OA软件-腾辉网络 | 翅片管换热器「型号全」_厂家-淄博鑫科环保| 青岛侦探_青岛侦探事务所_青岛劝退小三_青岛调查出轨取证公司_青岛婚外情取证-青岛探真调查事务所 | 河南包装袋厂家_河南真空袋批发价格_河南服装袋定制-恒源达包装制品 | 网带通过式抛丸机,,网带式打砂机,吊钩式,抛丸机,中山抛丸机生产厂家,江门抛丸机,佛山吊钩式,东莞抛丸机,中山市泰达自动化设备有限公司 | 祝融环境-地源热泵多恒系统高新技术企业,舒适生活环境缔造者! |