面試前端性能優化八股文十問十答第二期

面試前端性能優化八股文十問十答第二期

作者:程序員小白條,個人博客

相信看了本文后,對你的面試是有一定幫助的!關注專欄后就能收到持續更新!

?點贊?收藏?不迷路!?

1)如何優化動畫?

優化動畫可以通過以下幾個方面進行:

  • 使用 CSS 動畫:利用 CSS3 提供的 transitionanimation 屬性來實現動畫效果,因為 CSS 動畫是由瀏覽器來執行的,通常比 JavaScript 動畫性能更高。
  • 使用硬件加速:通過 CSS 屬性 transformopacity 來觸發 GPU 加速,可以使動畫更加流暢。例如,可以使用 translate3d() 來進行 3D 變換,或者使用 opacity 來實現淡入淡出效果。
  • 避免強制同步布局(Layout):在動畫過程中避免頻繁地讀取和修改布局信息,因為這會觸發瀏覽器的重排和重繪,導致動畫卡頓。可以通過將動畫元素設置為 position: absolutefixed,或者使用 transform 屬性來避免布局抖動。
  • 使用 requestAnimationFrame:使用 requestAnimationFrame 方法來執行動畫,它可以讓瀏覽器在下一次重繪之前執行動畫邏輯,保證動畫的流暢性,并且在頁面被隱藏或最小化時自動暫停動畫,節省 CPU 資源。
  • 節流和防抖:對于一些頻繁觸發的事件(如滾動、鼠標移動等),可以使用節流(Throttling)和防抖(Debouncing)等技術來控制事件的觸發頻率,減少不必要的動畫計算和渲染次數,提高性能。

2)documentFragment 是什么?

DocumentFragment 是一個輕量級的文檔片段,它是 DOM 結構的一部分,但是不屬于文檔樹的一部分。它可以作為一個臨時的容器,用來存儲和操作 DOM 元素,然后一次性地將這些元素添加到文檔中,從而減少 DOM 操作所帶來的性能開銷。

DocumentFragment 可以通過 document.createDocumentFragment() 方法來創建,然后可以像操作普通的 DOM 元素一樣來操作它,比如添加子節點、移除子節點等。一般情況下,當需要頻繁地操作 DOM 元素時,可以將這些操作放在 DocumentFragment 中進行,然后將整個 DocumentFragment 添加到文檔中,以提高性能。

3)用 documentFragment 跟直接操作 DOM 的區別是什么?

使用 DocumentFragment 和直接操作 DOM 的主要區別在于性能和渲染效率:

  • 性能:直接操作 DOM 可能會導致瀏覽器頻繁地觸發重排和重繪,因為每次操作都會導致瀏覽器重新計算布局和樣式。而使用 DocumentFragment 可以將多次操作合并成一次,然后一次性地將所有操作結果添加到文檔中,減少了瀏覽器的重排和重繪次數,提高了性能。
  • 渲染效率:直接操作 DOM 可能會導致頁面閃爍或者布局抖動的問題,因為每次操作都會影響到頁面的渲染。而使用 DocumentFragment 可以避免這些問題,因為所有的操作都是在一個虛擬的文檔片段中進行的,直到操作完成后才將結果添加到文檔中,用戶在這個過程中不會看到任何中間狀態的頁面渲染。

因此,總的來說,使用 DocumentFragment 可以提高 DOM 操作的性能和渲染效率,特別是在需要頻繁操作大量 DOM 元素時,使用 DocumentFragment 是一個很好的優化手段。

4)對節流與防抖的理解

  • 節流(Throttling):節流是一種限制一個函數在一定時間內執行的頻率的技術。當一個函數被節流控制時,它不會在短時間內被連續調用,而是以一定的時間間隔執行。這可以防止過多的函數調用,特別是在一些頻繁觸發的事件中,如滾動、鼠標移動等。
  • 防抖(Debouncing):防抖是一種在一定時間內,延遲執行函數的技術。當一個函數被防抖控制時,如果在規定的時間內再次觸發該函數,則會重新計時,直到沒有新的觸發事件。這通常用于處理輸入框的輸入事件,確保在用戶輸入結束后再觸發相應的處理邏輯,避免頻繁的處理。

5)實現節流函數和防抖函數

下面是簡單的 JavaScript 實現:

節流函數:

function throttle(func, delay) {let lastCallTime = 0;return function (...args) {const now = Date.now();if (now - lastCallTime >= delay) {func.apply(this, args);lastCallTime = now;}};
}

防抖函數:

function debounce(func, delay) {let timer;return function (...args) {clearTimeout(timer);timer = setTimeout(() => {func.apply(this, args);}, delay);};
}

使用方式如下:

const throttledFn = throttle(() => {console.log('Throttled function called');
}, 1000);const debouncedFn = debounce(() => {console.log('Debounced function called');
}, 1000);// 使用節流函數
window.addEventListener('scroll', throttledFn);// 使用防抖函數
document.getElementById('inputField').addEventListener('input', debouncedFn);

6)如何對項目中的圖片進行優化?

對項目中的圖片進行優化是提高頁面加載性能的重要步驟。一些優化技術包括:

  • 選擇合適的圖片格式:選擇適合場景的圖片格式,如JPEG、PNG、WebP等。JPEG適合照片,PNG適合圖標和透明圖像,而WebP通常可以在保持高質量的同時減小文件大小。
  • 壓縮圖片:使用工具對圖片進行壓縮,以減小文件大小。常見的工具有TinyPNG、ImageOptim等。在構建過程中,可以使用構建工具集成壓縮操作。
  • 懶加載(Lazy Loading):僅在用戶滾動到視口附近時加載圖片,而不是一開始就加載所有圖片。這可以通過設置loading="lazy"屬性或使用JavaScript庫來實現。
  • 使用CSS Sprites:將多個小圖標或圖片合并成一個圖集,減少HTTP請求次數,提高加載速度。
  • 適當的圖片尺寸:確保圖片的實際尺寸和在頁面上顯示的尺寸一致,避免加載過大的圖片。
  • CDN加速:使用內容分發網絡(CDN)來加速圖片加載,將圖片資源分布到全球多個服務器,提高訪問速度。
  • 響應式圖片:為不同設備提供不同尺寸的圖片,以確保在不同屏幕大小和分辨率下都能夠獲得最佳的用戶體驗。

綜合使用這些優化技術,可以顯著提升項目中圖片的加載性能,加快頁面加載速度。

7)常見的圖片格式及使用場景

常見的圖片格式有:

  • JPEG(.jpg、.jpeg):適用于照片和復雜圖像,具有較高的壓縮比,但會損失一定的圖像質量。
  • PNG(.png):適用于圖標、透明圖片等,支持無損壓縮,保留圖像質量的同時可以實現透明效果。
  • GIF(.gif):適用于動畫,支持多幀動畫,但顏色數較少,適用于簡單的動畫場景。
  • WebP:一種現代的圖片格式,結合了JPEG和PNG的優點,支持有損和無損壓縮,可以實現更小的文件大小和更高的圖像質量。
  • SVG(.svg):矢量圖形格式,適用于圖標、簡單圖形等,可無限放大而不失真。

使用場景一般根據圖片的特性來選擇:

  • 如果需要高質量的照片或者復雜圖像,可以選擇JPEG格式。
  • 如果需要保留透明度或者是簡單的圖標,可以選擇PNG格式。
  • 如果是動畫,可以選擇GIF格式。
  • 如果希望在保證高質量的同時減小文件大小,可以考慮使用WebP格式。
  • 如果是簡單的圖形或需要無限放大而不失真的圖形,可以選擇SVG格式。

8)如何提?webpack的打包速度?

提高Webpack的打包速度可以采取以下措施:

  • 升級Webpack版本:Webpack的新版本通常會優化性能,使用最新版本可以獲得更好的打包速度。
  • 合理配置Loader:盡量減少Loader的使用數量,避免不必要的轉換和處理。可以使用loader的include和exclude配置選項,只對必要的文件進行處理。
  • 使用HappyPack或ThreadLoader:這些工具可以將Loader的工作分配給多個子進程或者線程,提高并行處理能力,加快打包速度。
  • 使用DllPlugin:將不經常變動的第三方庫打包成單獨的文件,并使用DllPlugin插件進行緩存,避免每次重新打包。
  • 優化resolve.modules配置:通過配置resolve.modules選項,告訴Webpack在哪些目錄下搜索模塊,避免搜索過多的目錄,提高搜索速度。
  • 使用Tree Shaking:通過配置Webpack進行無用代碼的剔除,減少打包體積,提高打包速度。

9)如何減少 Webpack 打包體積

減少Webpack打包體積可以采取以下策略:

  • 優化代碼:刪除無用的代碼、注釋和日志輸出,減少不必要的代碼量。
  • 按需加載:使用按需加載的方式引入模塊,而不是一次性加載所有模塊。
  • 使用代碼分割:將代碼分割成多個小塊,并在需要的時候動態加載,以減小單個包的體積。
  • 壓縮代碼:使用Webpack的壓縮插件(如UglifyJsPlugin、TerserPlugin)對代碼進行壓縮,減小文件體積。
  • 使用CDN引入公共庫:將公共庫(如React、Vue等)通過CDN引入,減少打包體積。
  • 優化圖片:對圖片進行壓縮和懶加載,減少圖片文件的體積。
  • 使用Tree Shaking:通過配置Webpack進行無用代碼的剔除,減少打包體積。

10)如何?webpack來優化前端性能?

Webpack可以通過一系列的優化手段來提高前端性能:

  • 代碼壓縮:使用UglifyJsPlugin等插件對代碼進行壓縮,減小文件體積。
  • 代碼分割:使用SplitChunksPlugin等插件將代碼分割成多個小塊,按需加載,提高頁面加載速度。
  • 按需加載:使用import()語法或者動態import()函數進行按需加載,減少首次加載時間。
  • 資源優化:對圖片、字體等靜態資源進行壓縮和懶加載,減小文件體積,提高頁面加載速度。
  • 緩存優化:通過Webpack的hash或chunkhash等機制生成文件名,實現文件內容變化時文件名變化,利用瀏覽器緩存機制,減少不必要的請求。
  • 環境分離:使用Webpack的DefinePlugin等插件將開發環境和生產環境分離,提高開發效率,減小生產環境下的文件體積。
  • 服務端渲染:使用Webpack配合服務器端渲染(SSR)框架,將部分頁面邏輯在服務端完成,減少客戶端渲染時間,提高頁面加載速度和SEO。

綜合使用這些優化手段,可以有效提高前端項目的性能,提升用戶體驗。

開源項目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system

前后端總計已經 700+ Star,1W+ 訪問!

?點贊?收藏?不迷路!?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/697489.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/697489.shtml
英文地址,請注明出處:http://en.pswp.cn/news/697489.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c語言中的大小寫字母轉換怎么轉?

在C語言中,大小寫字母轉換是基于ASCII碼表的特性實現的。ASCII碼中,小寫字母從’a’到’z’的ASCII碼值是連續的(97到122),而大寫字母從’A’到’Z’的ASCII碼值也是連續的(65到90)。它們之間有…

Redis高性能原理

redis大家都知道擁有很高的性能,每秒可以支持上萬個請求,這里探討下它高性能的原理。單線程架構和io多路復用技術。 一,單線程架構 單線程架構指的是命令執行核心線程是單線程的,數據持久化、同步、異步刪除是其他線程在跑的。re…

獲取視頻第一幀,以及后續上傳

// 獲取視頻基本信息 const getVideoBasicInfo (videoSrc) > {return new Promise((resolve, reject) > {const video document.createElement("video");video.src videoSrc;// 視頻一定要添加預加載video.preload "auto";// 視頻一定要同源或者…

什么是系統工程(字幕)35

0 00:00:01,190 --> 00:00:02,840 下面的內容 1 00:00:04,850 --> 00:00:06,520 接下來呢就是 2 00:00:08,180 --> 00:00:09,830 16.6.1 3 00:00:11,070 --> 00:00:13,440 項流熱平衡分析 4 00:00:15,350 --> 00:00:16,730 這一節 5 00:00:18,860 --> 0…

億道丨三防平板丨加固平板丨三防加固平板丨改善資產管理

庫存資產管理中最重要的部分之一是準確性;過時的庫存管理技術會增加運輸過程中人為錯誤、物品丟失或紙張損壞的風險。如今隨著三防平板電腦的廣泛使用,庫存管理也迎來了好幫手,通過使用三防平板電腦能夠確保庫存管理、數據存儲和記錄保存的準…

React18源碼: React調度中的3種優先級類型和Lane的位運算

優先級類型 React內部對于優先級的管理,貫穿運作流程的4個階段(從輸入到輸出),根據其功能的不同,可以分為3種類型: 1 )fiber優先級(LanePriority) 位于 react-reconciler包,也就是L…

掌握 Android 中的 RecyclerView 優化

掌握 Android 中的 RecyclerView 優化 一、RecyclerView Pool以及何時使用它二、onCreateViewHolder 和 onBindViewHolder三、優化 RecyclerView 的不同方法四、視圖無效與請求布局五、ViewHolder模式六、默認的廢料和臟視圖類型七、結論 RecyclerView 是 Android 中一個功能強…

【操作系統】磁盤存儲空間的管理

實驗5 磁盤存儲空間的管理 一、實驗目的 磁盤是用戶存放程序和數據的存儲設備,磁盤管理的主要目的是充分有效地利用磁盤空間。本實驗模擬實現磁盤空間的分配與回收,使學生對磁盤空間的管理有一個較深入的理解。 二、實驗內容 實驗任務:用位…

FreeSWITCH debian11/12 apt安裝

官方給的easy way安裝方式如下: # 換成自己的token TOKENpat_ZrPXJQ8JNWsVQW2ubhnUwi7gapt-get update && apt-get install -y gnupg2 wget lsb-releasewget --http-usersignalwire --http-password$TOKEN -O /usr/share/keyrings/signalwire-freeswitch-…

#LLM入門|Prompt#1.2_提示原則_Guidelines

提示原則 一、編寫清晰、具體的指令 使用分隔符清晰地表示輸入的不同部分&#xff1a; 在Prompt中使用分隔符&#xff0c;如、“”"、< >、 、:等&#xff0c;將不同的文本部分區分開來&#xff0c;避免混淆和意外的結果。分隔符能夠防止提示詞注入&#xff0c;提…

petalinux_zynq7 驅動DAC以及ADC模塊之四:python實現http_api

前文&#xff1a; petalinux_zynq7 C語言驅動DAC以及ADC模塊之一&#xff1a;建立IPhttps://blog.csdn.net/qq_27158179/article/details/136234296petalinux_zynq7 C語言驅動DAC以及ADC模塊之二&#xff1a;petalinuxhttps://blog.csdn.net/qq_27158179/article/details/1362…

Java觀察者模式:實現高效的事件驅動編程

Java中的裝飾者模式&#xff1a;靈活地為對象添加功能 一、引言 在軟件設計中&#xff0c;我們經常需要為對象動態地添加功能或行為。裝飾者模式&#xff08;Decorator Pattern&#xff09;是一種結構型設計模式&#xff0c;它允許我們在運行時將功能動態地添加到對象上&…

串的相關題目

于是他錯誤的點名開始了 我發現有關hash得題目有些是可以通過map數組來完成的&#xff1a;何為map數組&#xff0c;我們先思考一下最簡單的桶的排序&#xff0c;桶排序是將我們需要數字最為下標輸進數組中&#xff0c;而數組是存放的數字是這個數字出現的次數&#xff0c;但是由…

Matlab論文插圖繪制模板第137期—極坐標分組氣泡圖

在之前的文章中&#xff0c;分享了Matlab極坐標氣泡圖的繪制模板&#xff1a; 進一步&#xff0c;再來分享一下極坐標分組氣泡圖。 先來看一下成品效果&#xff1a; ? 特別提示&#xff1a;本期內容『數據代碼』已上傳資源群中&#xff0c;加群的朋友請自行下載。有需要的朋…

解決SSH遠程登錄開飯板出現密碼錯誤問題

輸入“adduser Zhanggong回車”&#xff0c;使用adduser命令創建開發板用戶名為Zhanggong 輸入密碼“123456” 輸入密碼“123456”

openGauss學習筆記-226 openGauss性能調優-系統調優-配置LLVM-LLVM適用場景與限制

文章目錄 openGauss學習筆記-226 openGauss性能調優-系統調優-配置LLVM-LLVM適用場景與限制226.1 適用場景226.2 非適用場景 openGauss學習筆記-226 openGauss性能調優-系統調優-配置LLVM-LLVM適用場景與限制 226.1 適用場景 支持LLVM的表達式 查詢語句中存在以下的表達式支持…

PostgreSQL數據庫備份和恢復

一、數據庫備份 /usr/lib/postgresql/16/bin/pg_dump -h localhost -p 5432 -U odoo -F c -b -v -f backup.sql laonian 二、數據庫恢復 1 現在目標pgsql數據庫中創建空數據庫老年 create database laonian owner odoo; 2 執行恢復命令&#xff08;windows系統下&#xff…

網絡安全-nc(Netcat)工具詳解

經常在反彈shell的時候使用nc命令&#xff0c;但是從來沒有了解過&#xff0c;今天翻書看到了&#xff0c;準備記錄一下。 nc全稱Netcat&#xff0c;是TCP/IP連接的瑞士軍刀。哈哈我最喜歡瑞士軍刀了。 有一個比較偏的知識點&#xff0c;nc還可以探測目標的端口是否開放&…

Modern C++ std::variant的5個特性+原理

1 前言 上一節《Modern C std::variant的實現原理》我們簡單分析了std::variant的實現原理&#xff0c;其實要學好C編程&#xff0c;除了看優秀的代碼包括標準庫實現&#xff0c;讀文檔也是很便捷且必須的一種辦法。 本節我將逐條解析文檔中的五個特性&#xff0c;解析的辦法有…

LINUX操作系統:重定向

輸出重定向&#xff1a;將命令行程序的輸出重定向到其他位置&#xff0c;如文件、程序、打印機等。 輸入重定向&#xff1a;從其他位置獲取輸入&#xff0c;而不是從標準輸入&#xff08;鍵盤、鼠標等&#xff09; 錯誤重定向&#xff1a;同輸出。 輸出重定向&#xff08;Outp…