Vue項目上線要做哪些優化?面試必學

来源:https://www.cnblogs.com/chengxuyuanaa/archive/2020/07/20/13347572.html
-Advertisement-
Play Games

前言 大家好啊,我是wangly19,一名前端摸魚小能手。最近忙著開源項目的東西,還有公司項目的迭代問題,導致更新文章的頻率有點低了。也來聊聊我在幹嘛吧。 第一個事情就是比較我的閹割版UI Design,要開始Vue3.0的開發工作,所以近期都在看Vue3.0的東西。 其次就是和UI配套的方法庫,也 ...


 

前言

大家好啊,我是wangly19,一名前端摸魚小能手。最近忙著開源項目的東西,還有公司項目的迭代問題,導致更新文章的頻率有點低了。也來聊聊我在幹嘛吧。

第一個事情就是比較我的閹割版UI Design,要開始Vue3.0的開發工作,所以近期都在看Vue3.0的東西。 其次就是和UI配套的方法庫,也是我近期的一個項目,是一個Typescript生產的小東西。希望能夠對於大家有一些幫助。

eleganceUI框架:Github倉庫

這篇文章呢,主要是做一個Vue性能優化的帖子,做一個參考文檔,對以後項目上線做一些集合文檔。如果對各位在項目優化時,做一個文檔參照。

開發過程

在開發項目的時候,就要註意項目的一些小技巧,下麵我就羅列一些經常用到的優化的方法吧。同時老規矩,查缺補漏。

優先使用vIf

vIf 和 vShow 理論上都是作用於元素的顯示隱藏,只是一個是直接對DOM,一個是通過CSS的 display 來操作的,在項目中大部分的時候我都是直接使用 vIf 直接代替使用 vShow ,只有當DOM頻繁進行顯示和隱藏的時候,但是這種場景非常少見,我只在信息推送優先順序中使用過,項目中一直通過 WebSocket 推的消息進行消息的場景遇到過,頻繁推送不同類型的通知。

vFor和vIf不要一起使用

1、vFor 的優先順序其實是比 vIF 高的,所以當兩個指令出現來一個DOM中,那麼 vFor 渲染的當前列表,每一次都需要進行一次 vIf 的判斷。而相應的列表也會重新變化,這個看起來是非常不合理的。因此當你需要進行同步指令的時候。儘量使用計算屬性,先將 vIf 不需要的值先過濾掉。他看起像是下麵這樣的。
2、前端技術是不斷更新的。順便給大家點福利吧,送你們2020最新企業級別Vue3.0/Js/ES6/TS/React/node等實戰視頻教程,想學的可進裙 519293536 免費獲取,小白勿進哦!

// 計算屬性
computed: {
  filterList: function () {
  return this.showData.filter(function (data) {
    return data.isShow
  })
}
  
// DOM
  
<ul>
  <li v-for="item in filterList" :key="item.id">
  {{ item.name }}
  </li>
</ul>
複製代碼

 

 

vFor key避免使用index作為標識

其實大家都知道 vFor 是不推薦使用 index 下標來作為 key 的值,這是一個非常好理解的知識點,可以從圖中看到,當index作為標識的時候,插入一條數據的時候,列表中它後面的key都發生了變化,那麼當前的 vFor 都會對key變化的 Element 重新渲染,但是其實它們除了插入的 Element 數據都沒有發生改變,這就導致了沒有必要的開銷。所以,儘量不要用index作為標識,而去採用數據中的唯一值,如 id 等欄位。

 

 

釋放組件資源

什麼是資源? 每創建出一個事物都需要消耗資源,資源不是憑空產生的,是分配出來的。所以說,當組件銷毀後,儘量把我們開闢出來的資源塊給銷毀掉,比如 setInterval , addEventListener等,如果你不去手動給釋放掉,那麼它們依舊會占用一部分資源。這就導致了沒有必要的資源浪費。多來幾次後,可以想象下資源占用率肯定是上升的。

添加的事件

created() {
  addEventListener('click', Function, false)
},
beforeDestroy() {
  removeEventListener('click', Function false)
}
複製代碼

定時器

created() {
  this.currentInterVal = setInterval(code,millisec,lang)
},
beforeDestroy() {
  clearInterval(this.currentInterVal)
}
複製代碼

長列表

項目當中,會涉及到非常多的長列表場景,區別於普通的分頁來說,大部分的前端在做這種 無限列表 的時候,大部分新手前端都是通過一個 vFor 將數據遍歷出來,想的多一點的就是做一個分頁。滾動到底部的時候就繼續請求 API 。其實這也是未思考妥當的。隨著數據的載入,DOM會越來越多,這樣就導致了性能開銷的問題產生了,當頁面上的DOM太多的時候,難免給我的客戶端造成一定的壓力,所以對於長列表渲染的時候,建議將DOM移除掉,類似於圖片懶載入的模式,只有出現在視圖上的DOM才是重要的DOM。網路上有一些很好的解決方案,如 vue-virtual-scroller 庫等等,大家可以理性的選擇。

圖片合理的優化方式

圖片應該都不陌生吧,在網頁中,往往存在大量的圖片資源,這些資源或大或小。當我們頁面中DOM中存在大量的圖片時,難免不會碰到一些載入緩慢的問題,導致圖片出現載入失敗的問題。網路上大部分都在使用 懶載入 的使用方式,只有當 存在圖片的DOM 出現在頁面上才會進行圖片的載入,無形中起到了分流的作用,下麵就說一套實踐的方案吧

  • 小圖標使用 SVG 或者字體圖標
  • 通過 base64 和 webp  的方式載入小型圖片
  • 能通過cdn加速的大圖儘量用cdn
  • 大部分框架都帶有懶載入的圖片,不要嫌麻煩,多花點時間使用它

路由器按需載入

對於路由的懶載入,如果還不會的話,那麼就真該好好的重新去學習一下了。路由懶載入的方式有兩種,一種是require 另一種是 import 。當路由按需載入後,那麼Vue服務在第一次載入時的壓力就能夠相應的小一些,不會出現 超長白屏P0問題 。下麵是兩種路由懶載入的寫法:

// require法
component: resolve=>(require(['@/components/HelloWorld'],resolve))

// import
component: () => import('@/components/HelloWorld')
複製代碼

UI框架使用方式

確保在使用UI框架如, Element , And Design 等UI框架的時候,都使用官方給暴露出來的按需載入組件。只有真正用到它的時候時候才會載入當前UI框架的組件,而不是一開始就將整個組件庫給載入出來,我們都知道,一個UI框架其實很大,相對比其他的東西來說。因此,它在方便我們開發者的同時,也無形中產生了多餘的開銷。但是項目周期開發的時候,不得不依賴它。所以建議儘量的使用按需載入。合理的對項目進行止損,如果你不在意,非常嫌麻煩,那麼可以進行全局引入。

import { Button } from 'xxxx
複製代碼

首屏優化

眾所周知,第一次打開Vue的時候,如果你的項目夠大,那麼首次載入資源時,會非常的久。由於資源沒有載入完畢,界面的DOM也不會渲染,會造成白屏的問題。用戶此時並不知道是載入的問題,所以會帶來一個不好的體驗。因此通常會在public下寫一個載入動畫,告訴用戶,網頁在載入中這個提示。當頁面載入成功後,頁面渲染出來的這一個體驗比白屏等開機要好太多了。因此,推薦大家都設計一個自家公司的loading載入方式放入index.html中吧。

項目過程

最小化JS文件

可以通過webpack處理打包的JavaScript文件,讓其更加的精簡。在配置中,你可以這麼做

config.optimization.minimize(true);
複製代碼

圖片資源壓縮

可以通過 image-webpack-loader 插件對打包的圖片進行壓縮,看起來會對圖片的載入有一些提升。如果擔心破壞圖片,可以放棄使用它。

“ 

$ yarn add  image-webpack-loader

- - QAQ
config.module
  .rule('images')
  .use('image-webpack-loader')
  .loader('image-webpack-loader')
  .options({
    bypassOnDebug: true
  })
  .end()
複製代碼

打包公共代碼

在 webpack4 中,可以通過 optimization.minimize 將公共代碼進行打包,雖然我個人認為這個東西對SPA應用來說,效果其實有限,但有勝於無,文字再小也是肉不是,所以說,在細節的把控上,永遠是無止境的。但是在webpack4中也是將CommonsChunkPlugin 改用 SplitChunksPlugin 了。感覺評論掘友的提醒。

new webpack.optimize.CommonsChunkPlugin({
  name: ['vendor','runtime'],
  filename: '[xxxxx].js'
})
複製代碼

刪除沉澱代碼

使用 Tree-Shaking 插件可以將一些無用的沉澱泥沙代碼給清理掉。

依賴庫CDN加速

看到有小伙伴使用CDN的方式引入一些依賴包,覺得非常的 Nice ,然後我也開始使用了。我將 Vue Axios Echarts 等等都分離了出來,在正式環境下,通過CDN,確實有了一些明顯的提升,所以說大家可以進行嘗試。

CDN LinkDI地址:BootCDN

// 在html引入script標簽後。在vue的配置中,進行聲明

configureWebpack: {
  externals: {
    'echarts': 'echarts' // 配置使用CDN
  }
}
複製代碼

GZIP

這個東西需要後端進行配置,當然,如果你有操作 Nginx 的許可權的話,那麼可以自己開啟,反正我認為,這個東西提升還是很大的。具體的可以看這篇文章。這裡不過多贅述這個東西。 Vue CLI 2&3 下的項目優化實踐 —— CDN + Gzip + Prerender

後話

項目優化是非常重要的,一絲一毫的提升都是對用戶的負責。另外前端技術是不斷更新的。順便給大家點福利吧,送你們2020最新企業級別Vue3.0/Js/ES6/TS/React/node等實戰視頻教程,想學的可進裙 519293536 免費獲取,小白勿進哦!

本文的文字及圖片來源於網路加上自己的想法,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 接上一篇《PG-跨庫操作-dblink》;講下postgres_fdw的使用;postgres_fdw工作原理詳細介紹可以去看下《PostgreSQL指南》第4章; 對FDW特性;還支持在PostgreSQL異構資料庫的同步、遷移的場景。FDW隨著Postgres版本而升級、優化,對分散式架構也是支 ...
  • 墨天輪資料庫周刊第33期發佈啦,每周1次推送本周資料庫相關熱門資訊、精選文章、乾貨文檔。 ...
  • 問題故障:Mysql資料庫意外崩潰,一直無法啟動資料庫。報錯日誌: 啟動報錯:service mysqld restartERROR! MySQL server PID file could not be found!Starting MySQL. ERROR! The server quit wi ...
  • 在使用eventTime的時候如何處理亂序數據?我們知道,流處理從事件產生,到流經source,再到operator,中間是有一個過程和時間的。雖然大部分情況下,流到operator的數據都是按照事件產生的時間順序來的,但是也不排除由於網路延遲等原因,導致亂序的產生,特別是使用kafka的話,多個分 ...
  • 新聞 谷歌將在今年秋季推出的Android 11中增加117個新emoji表情 谷歌計劃在Android 11中預設禁用過度扭曲的美顏濾鏡 谷歌可能在8月推出Android 6.0以上設備的Nearby Share特性 谷歌推出免費的 Kotlin 和 Android 開發課程 Android 11 ...
  • 百度了好久都是說: 修改 config/index.js 裡面的此屬性:autoOpenBrowser: false, (毫無作用,依然還是運行就自動打開!) 解決: npm run dev 時候執行的是build/dev-server.js,npm-opn包去打開瀏覽器,把如下代碼註釋掉即可。 / ...
  • 1. number, string, boolean(聲明方式加不加new的區別) var a = number( 1 ) 返回數字 1 var b = string( false ) 返回字元串 'false' var c = boolean( 1) 返回布爾值 true (5個false值: 0 ...
  • 1.div+css佈局 <div>特征 ① 可以定義文檔中的分區或節(division/section) ② 可以把文檔分割為獨立的、不同的部分,可以用作嚴格的組織工具 ③ 是一個塊級元素,它的內容會自動開始一個新行 ④ 一般通過 id 或 class 標記與CSS配合使用 常用到的CSS屬性: w ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...