主頁 > 企業開發 > 十年前端工程師教你Vue CLI 首屏優化技巧

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

2020-09-20 16:27:54 企業開發

前言

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

小編提醒您,后面有驚喜哦!

直接 npm run build打包出來,有一個 1M的巨大 js檔案,

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檔案的大小

可以看到 專案中所有的依賴,所有的路由,都被打包進了同一個檔案中

另外,在瀏覽器中,也可以通過 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拆分就見仁見智,具體專案具體分析吧,

 

總結

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

hello!各位想成為高級前端工程師的大神,你們好啊.來了即是緣分,是能夠成為高級前端工程師的緣分.

在這里我給大家推薦一個web前端交流群,覆寫了1-8年的web前端開發者.在這里每天都會有技術干貨、技術動向、職業生涯、行業熱點、職場趣事等一切有關于程式員的內容分享,每天晚上8點都會有大神講解前端專案和重要知識點.下面這些資料加1055351817群可以免費獲取哦.

 

 

前端電子書籍資料

 

前端基礎進階視頻

游戲和特效和專案原始碼

2020最新大廠面試題資料等

 

 

除了這些,這是我的知乎專欄的一篇導航式文章,里面匯集了web前端技術干貨、各大名廠前端面試題系列、技術動向、職業生涯、行業熱點、職場趣事等一切有關于程式員的高質量文章和學習資料分享

適合小白和有基礎的程式員進階,點擊此處可觀看

 

 

希望大家都能找到高薪的前端作業.

 

 

---------------------后面是web的前景和學習路線-----------------

最全面,更新最快的前端學習路線圖

 

 

下面這些資料加1055351817群可以免費領取學習資料和專案原始碼哦.點擊群號加群

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/90147.html

標籤:JavaScript

上一篇:學習前端的未來在哪里?今天詳細的談一下

下一篇:吊打面試官系列-58道vue面試題

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more