十年前端工程師教你Vue CLI 首屏優化技巧

来源:https://www.cnblogs.com/coderhf/archive/2020/05/14/12890982.html
-Advertisement-
Play Games

前言 之前用 vuecli做了個博客,是一個單頁面項目,大概有十個路由。 直接 npm run build打包出來,有一個 1M的巨大 js文件。 先掛載到伺服器上試試 好家伙 這載入時間 仿佛過了半個世紀 首屏頁面整整載入了 9s 光載入那個大文件就花了 8s 這必須得做個優化了,沒有用戶能忍受 ...


前言

之前用 vuecli做了個博客,是一個單頁面項目,大概有十個路由。

直接 npm run build打包出來,有一個 1M的巨大 js文件。

img

先掛載到伺服器上試試 好家伙 這載入時間 仿佛過了半個世紀

img

首屏頁面整整載入了 9s 光載入那個大文件就花了 8s 這必須得做個優化了,沒有用戶能忍受 9s的白屏而不關閉頁面的

過程中,我還順便把項目從 vuecli 2.x遷移到了 vuecli 3,所以接下來還會介紹一些它們在優化上的異同

## 分析

vuecli 2.x自帶了分析工具 只要運行 npm run build --report

如果是 vuecli 3的話,先安裝插件

 cnpm intall webpack-bundle-analyzer –save-dev 

 

然後在 vue.config.js中對 webpack進行配置

 chainWebpack: (config) => {
  /* 添加分析工具*/
  if (process.env.NODE_ENV === 'production') {
  if (process.env.npm_config_report) {
             config
  .plugin('webpack-bundle-analyzer')
  .use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin)
  .end();
             config.plugins.delete('prefetch')
  }
  } }

 

再運行 npm run build --report

會在瀏覽器打開一個項目打包的情況圖,便於直觀地比較各個 bundle文件的大小

img

可以看到 項目中所有的依賴,所有的路由,都被打包進了同一個文件中

另外,在瀏覽器中,也可以通過 converge來查看代碼的使用狀況

img

紅色的是下載了但未使用的部分

“大清亡於閉關鎖國,學習技術需要交流和資料”。這是我的知乎專欄的一篇導航性文章,裡面彙集了web前端技術乾貨、前端面試題系列、技術動向、職業生涯、行業熱點、職場趣事等一切有關於程式員的高質量文章和學習資料分享。阿裡名廠標準web前端高級工程師教程目錄大全,從基礎到進階,看完保證您的薪資上升一個臺階

路由懶載入

當打包構建應用時,JavaScript包會變得非常大,影響頁面載入。 如果我們能把不同路由對應的組件分割成不同的代碼塊,然後當路由被訪問的時候才載入對應組件,這樣就更加高效了。

在一開始就下載完所有路由對應的組件文件,這明顯是不合適的,這就像下載一個 app了,所以我們就需要使用路由懶載入

img

在 router.js文件中,原來的靜態引用方式

 import ShowBlogs from '@/components/ShowBlogs'
 ​
 routes:[ path: 'Blogs', name: 'ShowBlogs', component: ShowBlogs ]

 

改為

 
routes:[ path: 'Blogs',name: 'ShowBlogs',component: () => import('./components/ShowBlogs.vue')

 

以函數的形式動態引入,這樣就可以把各自的路由文件分別打包,只有在解析給定的路由時,才會下載路由組件

img

首屏需要載入的文件變成了橙色的部分,被小弟們分流出去了 300k

如果是在 vuecli 3中,我們還需要多做一步工作

因為 vuecli 3預設開啟 prefetch(預先載入模塊),提前獲取用戶未來可能會訪問的內容

在首屏會把這十幾個路由文件,都一口氣下載了

所以我們要關閉這個功能,在 vue.config.js中設置

參考官網的做法:

img

設置完畢後,首屏就只會載入當前頁面路由的組件了

element-ui按需載入

img

首屏需要載入的依賴包,其中 element-ui整整占了 568k 原本的引進方式引進了整個包:

 import ElementUI from 'element-ui'
 Vue.use(ElementUI)

 

但實際上我用到的組件只有按鈕,分頁,表格,輸入與警告 所以我們要按需引用

 
import { Button, Input, Pagination, Table, TableColumn, MessageBox } from 'element-ui';
 Vue.use(Button)
 Vue.use(Input)
 Vue.use(Pagination)
 Vue.prototype.$alert = MessageBox.alert

 

註意 MessageBox註冊方法的區別,並且我們雖然用到了 alert,但並不需要引入 Alert組件

在 .babelrc文件中添加( vue-cli 3要先安裝 babel-plugin-component):

 plugins: [
  [
  "component",
  {
  "libraryName": "element-ui",
  "styleLibraryName": "theme-chalk"
  }
  ]
  ]

 

img

element-ui小了很多,不過看到那個顯眼的 table.js後想到, table組件只有後臺管理頁面用到了,不需要全局註冊,所以我們刪除 main.js中 Table和 TablColumn的引用,併在後臺組件中局部註冊

 import { Table, TableColumn } from "element-ui";
 ​
 components: {
  "el-table": Table,
  "el-table-column": TableColumn },

 

img

table就被拆分到了路由文件中

組件重覆打包

可以看到上圖,有兩個路由文件都引用了 codemirror.js造成重覆下載 我們可以在 webpack的 config文件中,修改 CommonsChunkPlugin的配置

minChunks: 3

把3改為2,就會把使用2次及以上的包抽離出來,放進公共依賴文件,不過由於首頁也有復用的組件,所以首頁也會下載這個公共依賴文件

img

首頁下載了黃色和灰色部分 拆了半天,又回到原點

當然,我們可以繼續折騰 CommonsChunkPlugin的配置來解決這個問題 但在新版 webpack中, CommonsChunkPlugin被自由度更高,更高級的 SplitChunksPlugin代替

這也是為什麼我要把項目遷移到 vuecli 3(使用 webpack4) 預設就做了優化,首頁只會下載灰色的部分( 235K)

“大清亡於閉關鎖國,學習技術需要交流和資料”。 在這裡我給大家準備了很多的學習資料免費獲取,每天都有包括但不限於技術乾貨、大廠面試題系列、技術動向等一切有關程式員的分享.web前端小白進階方法筆記,學習資料,面試題和視頻,項目源碼免費領取

gzip

拆完包之後,我們再用 gzip做一下壓縮 安裝 compression-webpack-plugin

cnmp i compression-webpack-plugin -D

 

在 vue.congig.js中引入並修改 webpack配置

const CompressionPlugin = require('compression-webpack-plugin')

configureWebpack: (config) => {
 if (process.env.NODE_ENV === 'production') {
 // 為生產環境修改配置...
            config.mode = 'production'
 return {
                plugins: [new CompressionPlugin({
                    test: /\.js$|\.html$|\.css/, //匹配文件名
                    threshold: 10240, //對超過10k的數據進行壓縮
                    deleteOriginalAssets: false //是否刪除原文件
 })]
 }
 }

 

img

可以看到 200k以上的文件被壓縮到了 100k以內

在伺服器我們也要做相應的配置 如果發送請求的瀏覽器支持 gzip,就發送給它 gzip格式的文件 我的伺服器是用 express框架搭建的 只要安裝一下 compression就能使用

const compression = require('compression')
app.use(compression())

 

註意,後面這一句,要放在所有其他中間件註冊之前

最終效果

img

首屏載入資源198k,載入時間1s,相比原來速度提升了90%

後記:css是否要拆分

vuecli 3和 vuecli2.x還有一個區別是 vuecli 3會預設開啟一個 css分離插件 ExtractTextPlugin

每一個模塊的 css文件都會分離出來,整整13個 css文件,而我們的首頁就請求了4個,花費了不少的資源請求時間。

我們可以在 vue.config.js中關閉它:

    css: {
 // 是否使用css分離插件 ExtractTextPlugin
    extract: false,
 // 開啟 CSS source maps?
    sourceMap: false,
 // css預設器配置項
    loaderOptions: {},
 // 啟用 CSS modules for all css / pre-processor files.
    modules: false
},

 

img

img

打包出來的文件中,直接就沒有了 css文件夾。

取而代之的是整合起來的一個 js文件,負責在一開始就註入所有的樣式。

首屏載入文件數減少,但體積變大,最終測下來速度沒有太大差異。

所以,是否要css拆分就見仁見智,具體項目具體分析吧。

“大清亡於閉關鎖國,學習技術需要交流和資料”。這是我的知乎專欄的一篇導航性文章,裡面彙集了web前端技術乾貨、前端面試題系列、技術動向、職業生涯、行業熱點、職場趣事等一切有關於程式員的高質量文章和學習資料分享。阿裡名廠標準web前端高級工程師教程目錄大全,從基礎到進階,看完保證您的薪資上升一個臺階

總結

性能優化是一個非常令人愉悅的過程,同時也是個深坑,有著太多東西,本篇文章開了個頭,希望能對大家有所幫助


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

-Advertisement-
Play Games
更多相關文章
  • 註冊成為開發者 登錄 "蘋果開發者中心" ,點擊 "Accounts" ,在這裡需要你填寫你的Appple ID進行登錄,如果沒有,點擊 "這裡" 申請一個,填寫信息就成,這裡就不再贅述。申請完成之後,使用申請的AppID進行登錄。 進入主頁之後,然後點擊 "Join the Apple Devel ...
  • 前言 數組去重是一個老生常談的話題,也是前端童鞋在面試時的一道高頻題。本文將深入的探索數組去重的原理及實現,為各位小伙伴提供 可以 面試官的解決方案。 話不多說,上去就來一梭子... 數組去重核心原理 價值100W的核心原理上來就給你了...,記得留言點贊鴨! 1. 一般我們都會創建臨時變數tmp, ...
  • 1 安裝 ①Windows安裝 A. 下載編譯好的可執行程式 github發佈頁下載官方編譯好的程式,是一個zip壓縮包,裡面就一個簡簡單單的deno.exe程式,把它放到你喜歡的位置,我放在了 ,那麼添加個環境變數就可以使用了。 不會添加環境變數的同學,建議百度學習。 B. 使用curl命令 cu ...
  • 寫在前面 書籍介紹:本書在尊重《設計模式》原意的同時,針對JavaScript語言特性全面介紹了更適合JavaScript程式員的了16個常用的設計模式,講解了JavaScript面向對象和函數式編程方面的基礎知識,介紹了面向對象的設計原則及其在設計模式中的體現,還分享了面向對象編程技巧和日常開發中 ...
  • 小練習 順序跳躍顯示數組中的值 <input type="text" id="t" size="60"> <button id="s">stop</button> <script> var tt=document.getElementById('t'); var s=document.getElem ...
  • @ 2020.5.14 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <tit ...
  • 1.vue優點? 2.vue父組件向子組件傳遞數據? 3.子組件像父組件傳遞事件? 4.v-show 和 v-if指令的共同點和不同點? 5. 如何讓CSS只在當前組件中起作用? 6. 的作用是什麼? 7.如何獲取dom? 8.說出幾種vue當中的指令和它的用法?。 9. vue-loader是什麼 ...
  • HTML學習 一個例子 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>第一個頁面</title> 6 </head> 7 <body> 8 <h1>我的第一個標題</h1> 9 <p>我的第一個段落。</p ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...