整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          經典面試題從瀏覽器輸入URL到頁面加載的過程?

          經典面試題從瀏覽器輸入URL到頁面加載的過程?

          輸入URL到頁面加載的過程涉及多個步驟,包括**DNS解析、TCP連接、發送HTTP請求、服務器處理請求、瀏覽器解析渲染頁面以及斷開連接**。具體如下:

          1. **DNS解析**:當你在瀏覽器中輸入一個URL時,瀏覽器首先需要將域名轉換為IP地址。這個過程稱為DNS解析。DNS服務器負責將人類可讀的域名(如www.example.com)轉換為機器可讀的IP地址。

          2. **TCP連接**:一旦瀏覽器獲得了目標服務器的IP地址,它就會嘗試與服務器建立TCP連接。這個過程通常被稱為TCP三次握手,它確保了數據的可靠傳輸。

          3. **發送HTTP請求**:TCP連接建立后,瀏覽器會向服務器發送一個HTTP請求,請求中包含了它想要獲取的資源(如HTML文件、圖片、CSS或JavaScript文件等)。

          4. **服務器處理請求**:服務器接收到請求后,會根據請求的內容進行處理。這可能涉及到查詢數據庫、執行服務器端腳本等操作。處理完成后,服務器會將請求的資源作為一個HTTP響應返回給瀏覽器。

          5. **瀏覽器解析渲染頁面**:瀏覽器接收到服務器返回的數據后,會開始解析HTML文檔,并根據HTML、CSS和JavaScript指令渲染頁面。這個過程涉及到構建DOM樹、計算樣式、布局以及繪制頁面內容等子步驟。

          6. **斷開連接**:一旦頁面加載完成,瀏覽器和服務器之間的TCP連接通常會被關閉。這個過程稱為TCP四次揮手,它標志著數據傳輸的結束。

          覽器加載一個js腳本,會在devtools中留下各種痕跡,elements中的script元素,console中的日志,source中的代碼,network中的網絡請求等

          elements

          這個比較簡單,插入js的時候設置好id,在js中刪掉自身就好了

          <script id="xxx">
              // todo
              document.getElementById("xxx").remove();
          </script>
          

          對于引用js

          <script id="xxx" src="a.js"></script>
          
          // a.js
          document.getElementById("xxx").remove()
          

          對于動態加載的js也是一樣的

          <script>
              let e=document.createElement("script");
              e.id="xxx";
              e.src="a.js";
              document.head.appendChild(e);
          </script>
          
          // a.js
          document.getElementById("xxx").remove()
          

          或者也可以這樣

          <script>
              let e=document.createElement("script");
              e.src="a.js";
              document.head.appendChild(e);
              e.remove();
          </script>
          

          雖然看起來很奇怪,但a.js確實能執行,似乎是加載a.js時阻塞了腳本執行,執行完a.js之后再remove

          console

          clear就好了

          console.clear()
          

          source

          直接引用和動態加載都會在source中出現

          <script src="a.js"></script>
          
          <script>
              let e=document.createElement("script");
              e.src="a.js";
              document.head.appendChild(e);
          </script>
          

          這樣都是不行的,經過測試發現動態插入js代碼時不會被記錄在source中

          <script>
              fetch("a.js").then(resp=> {
                  return resp.text()
              }).then(text=> {
                  let e=document.createElement("script");
                  e.innerHTML=text;
                  document.head.appendChild(e);
              })
          </script>
          

          這樣a.js就不會出現在source里了

          network

          常規HTTP/WebSocket都會被記錄,無法繞過,但是WebRTC不會,WebRTC可以基于UDP/TCP傳輸,WebRTC提供createDataChannel API,可以用于傳輸文本,那么就可以實現network隱藏加載

          考慮WebRTC需要傳遞offer和icecandidate,還是得通過HTTP/WebSocket傳輸,而且復雜網絡環境下還需要使用或部署STUN/TURN服務器,穩定性有待考慮

          WebRTC技術可以參考學習我最近看的幾篇文章透明日報20200801期

          其他的方法我還沒有找到,技術不行就社會工程

          一個思路是可以偽裝成其他流量混過去,比如png

          <script>
              fetch("a.png").then(resp=> {
                  return resp.text()
              }).then(text=> {
                  let e=document.createElement("script");
                  e.innerHTML=text;
                  document.head.appendChild(e);
              })
          </script>
          

          然后在delvtools里也看不出來

          另外一個思路是devtools目前只在打開的時候記錄network數據,那么只要在devtools關閉的時候加載資源,打開就不加載,這樣就不會出現在network里了

          新的問題又出現了,如何檢測devtools的狀態,網上已經有不少公開技巧了

          https://github.com/sindresorhus/devtools-detect

          https://github.com/AEPKILL/devtools-detector

          最后

          還可以在哪里找到加載和執行痕跡呢

          還有什么方法可以隱藏這些痕跡呢

          如果你現在也想學習前端開發技術,在學習前端的過程當中有遇見任何關于學習方法,學習路線,學習效率等方面的問題,你都可以申請加入我的Q群:前114中6649后671還有大牛整理的一套高效率學習路線和教程與您免費分享,還有許多大廠面試真題。希望能夠對你們有所幫助。

          站前端的用戶體驗,決定了用戶是否想要繼續使用網站以及網站的其他功能,網站的用戶體驗佳,可留住更多的用戶。除此之外,前端優化得好,還可以為企業節約成本。那么我們應該如何對我們前端的頁面進行性能優化呢?

          前端性能優化可以分為三個方面:接口訪問優化、靜態資源優化和頁面渲染速度優化。

          一、接口訪問優化

          1.1、減少http請求,合理設置 HTTP緩存

          http協議是無狀態的應用層協議,每次發送http請求時,都需要建立連接、通信、斷開連接,在服務器端每個http都需要開啟獨立的線程去處理。所以盡量減少http請求,盡可能地提高訪問性能。

          減少http請求的方法:

          1. 合并 js、css、圖片等文件,合并成一個文件,瀏覽器就只需請求一次就可以了。圖片合并要適當,不能想著優化呢,盲目地都合并成一張圖片。
          2. 借用瀏覽器緩存。恰當的緩存設置可以大大減少http請求。不懂瀏覽器緩存的可參考《瀏覽器九大緩存方法》。
          3. 接口合并。前端交互,經常需要請求多個并行或串行接口,此時可以通過接口合并方式,提高接口訪問速度。
          4. 能使用css的盡量不使用js,能使用js的盡量不用三方插件,避免三方插件大量的庫。

          1.2、減少cookie傳輸

          cookie 存在于 http 頭,在客戶端與服務器之間交換,盡可能地控制 cookie 的大小,cookie越小,響應速度越快,減少 cookie 傳輸,響應速度更快。

          1.3、使用CDN提供靜態文件

          使用 CDN 可以更快地在全球范圍內獲取到你的靜態文件,加快網頁加載。

          1.4、啟用 GZIP 壓縮

          http 協議上 GZIP 編碼,是一種用來改進 web 應用程序的。開啟 GZIP 后,服務器會把網頁內容壓縮后傳輸,一般能壓縮到原大小40%,這樣網頁傳輸速度就更快了。GZIP 有兩大好處:一是減少存儲空間,二是通過網絡傳輸文件時,可以減少傳輸時間。

          1.5、分域存放資源

          HTTP 客戶端一般對同一個服務器的并發連接個數都是有限制的,通常最大并行連接為四了,剩下的會進入等待隊列,等前邊的執行完畢,等待的才會執行。所以利用多域名主機存放資源,增加并行連接量,縮短資源加載時間。

          1.6、減少頁面重定向

          開啟 https 可以有效防范攻擊,保證用戶始終訪問到網站的加密連接,保護數據安全,同時省去 301/302 跳轉的時間,大大提升網站的安全系數和用戶體驗。

          如果在網站設置當用戶訪問域名的時候強制 https 進行 301 或者 302 跳轉,但是這個過程中,用到 HTTP 因此容易發生劫持,受到第三方的攻擊。所以盡可能使用https安全。

          1.7、避免使用iframe

          iframe 相當于本頁面又嵌套了一個頁面,消耗性能,還要加載嵌套頁面的資源,所以更消耗時間。

          1.8、借用瀏覽器緩存

          ajax 請求到的數據,可以緩存到瀏覽器,下次使用的時候無需再次獲取,直接取緩存數據就可以。這個會根據具體的項目來做,比如常用的角色類型就會緩存,獲取到的普通數據為了保證實時性,不能使用緩存。

          二、靜態資源優化

          2.1、壓縮 html、css、js 等文件

          刪除不必要的空格、注釋和中行,減少文件大小,顯著減少用戶下載時間,加快網頁加載速度。可以直接使用壓縮工具,可以自動刪除所有不必要內容。

          2.2、在 js 之前引用 css

          這是一個小細節,js 執行的時候會進入阻塞,如果放入 js 之后加載,會等待 js 執行完成之后才能加載 css,渲染頁面,此時就會出現布局錯亂。所以 css 文件需要非阻塞引入,以防DOM 花費更多時間才能渲染。

          2.3、非阻塞 js

          js 會阻止 html 文檔的正常解析,當解析器到達 script 標記時,它會停止解析并執行腳本。所以我們經常把 script 引入的 js,放到 html 中最底下。如果需要讓腳本位于頁面頂部,建議添加非阻塞屬性。經常使用 defer 和 async 來異步加載js文件。

          <!--  使用defer  -->
          <script defer src="foo.js" ></script>
          <!--   使用async  -->
          <script async src="foo.js"></script>

          2.4、圖片壓縮

          最常見的就是 css 雪碧,就是將很多很多的小圖標放在一張圖片上,就稱為雪碧圖。雪碧圖最大優點就是可以減少http請求,除此也能壓縮圖片文件大小。使用的時候,通過設置 background-position ,移動圖片的位置。除此之外,網站用到的大圖,也需要在保證圖片質量前提下優化到最小。

          2.5、矢量圖替代位圖

          矢量圖(SVG)往往比圖像小很多,縮放的時候不失真,這些圖像還可以通過 css 進行動畫和修改,比位圖方便控制。可以的話,盡量用矢量圖多點。

          2.6、js代碼相關優化

          1. 盡量減少使用閉包,因為閉包所在的上下文不會被釋放。
          2. js避免嵌套循環和死循環,一旦遇到死循環,瀏覽器會卡死。
          3. 在js封裝過程中,盡量做到低耦合高內聚。減少頁面的冗余代碼。
          4. 盡量減少遞歸,避免死遞歸。
          5. 盡量使用window.requestAnimationFrame替代傳統的定時器。

          三、頁面渲染速度

          3.1、懶加載

          素材類的網站,頁面一屏展示很多圖片,而且圖片還不能失真,圖片加載太多,網頁加載慢得很,所以就引用懶加載,只加載可視區的圖片,避免加載可以能不需要或不必要的圖像。改善頁面的響應時間。

          3.2、避免響應式布局

          響應式網站雖然能夠兼容所有終端設備,但是會出現隱藏部分無用內容,浪費帶寬,加載時間還長,頁面的渲染時間也長。想更多了解響應式布局,請點擊《前端響應式布局為什么是個坑?》。

          3.3、設置大小,避免重繪

          遇到 img 標簽,會立馬發送一個 http 請求,下載圖片,頁面繼續向下渲染,等圖片加載成功了,發現圖片的寬高大小發生變化,影響后邊排版,所以頁面會重新再繪制一次這部分。所以盡可能設置圖片的大小。

          3.4、減少DOM元素

          解析 html 內容,將標簽轉化為DOM節點,之后再解析其他文件,DOM元素越少,也就是標簽越少,文件轉化得越快,加載速度也就快了。

          3.5、減少 Flash 的使用

          flash 文件比較大,加載起來耗時。除此,flash 插件還需要運行才能運行,最主要有些瀏覽器flash插件馬上要下線了,建議盡量不用 flash。

          3.6、文件順序

          css文件放在最頂部,優先渲染。js放在最底部,避免阻塞。

          讓網頁如何加載更快,有好多的細節,還是要好好提升自己的技能~~~~~~~~~


          點個關注!更多分享內容。


          主站蜘蛛池模板: 亚洲日本乱码一区二区在线二产线 | 天美传媒一区二区三区| 亚洲国产专区一区| 99国产精品一区二区| 日韩精品无码一区二区视频| 少妇激情av一区二区| 国产成人无码精品一区在线观看| 亚洲视频免费一区| 亚洲熟女少妇一区二区| 一区二区三区在线播放视频| 一区二区三区精密机械| 国产日韩精品视频一区二区三区| 国产丝袜美女一区二区三区| 女人和拘做受全程看视频日本综合a一区二区视频 | 日韩在线视频一区二区三区 | 美日韩一区二区三区| 一区二区三区无码视频免费福利| 一区二区三区精密机械| 亚洲男女一区二区三区| 国产成人精品无码一区二区| 亚洲一区二区三区国产精品| 国内精品视频一区二区三区| 亚洲一区二区三区久久| 无码少妇一区二区| 亚洲日韩精品一区二区三区无码| 黑人一区二区三区中文字幕| 国产视频福利一区| 国产在线精品一区二区在线看 | 色久综合网精品一区二区| 国产精品一区二区av| 国产在线不卡一区二区三区 | 亚洲视频一区在线| 日韩精品中文字幕无码一区| 最新中文字幕一区| 国内精品一区二区三区最新| 国产SUV精品一区二区88| 高清一区二区在线观看| 日韩免费无码一区二区三区| 精品一区二区三区中文字幕| 国产精品特级毛片一区二区三区| 一区二区三区美女视频|