自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

前后端分離開發(fā),我用這幾個技巧讓頁面加載速度提高了90%

開發(fā) 前端
性能優(yōu)化是一個非常令人愉悅的過程,同時也是個深坑,有著太多東西,本篇文章開了個頭,希望能對大家有所幫助。

前言

之前用 vuecli 做了個博客,是一個單頁面項目,大概有十個路由,直接 npm run build 打包出來,有一個 1M 的巨大 js 文件

先掛載到服務(wù)器上試試

好家伙 這加載時間 仿佛過了半個世紀

首屏頁面整整加載了 9s 光加載那個大文件就花了 8s

這必須得做個優(yōu)化了,沒有用戶能忍受 9s 的白屏而不關(guān)閉頁面的

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

分析

vuecli 2.x 自帶了分析工具,因此只要運行 npm run build --report 即可。

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

  1. cnpm intall webpack bundle analyzer save dev 

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

  1. chainWebpack: (config) => {  
  2.     /* 添加分析工具*/  
  3.     if (process.env.NODE_ENV === 'production') { 
  4.         if (process.env.npm_config_report) {  
  5.             config  
  6.                 .plugin('webpack-bundle-analyzer')  
  7.                 .use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin)  
  8.                 .end();  
  9.             config.plugins.delete('prefetch')  
  10.         }  
  11.     } } 

再運行 npm run build --report

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

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

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

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

路由懶加載

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

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

在 router.js 文件中,原來的靜態(tài)引用方式 

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

改為 

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

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

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

如果是在 vuecli 3 中,我們還需要多做一步工作因為 vuecli 3 默認開啟 prefetch(預先加載模塊),提前獲取用戶未來可能會訪問的內(nèi)容。

在首屏會把這十幾個路由文件,都一口氣下載了所以我們要關(guān)閉這個功能,在 vue.config.js 中設(shè)置

參考官網(wǎng)的做法:

設(shè)置完畢后,首屏就只會加載當前頁面路由的組件了

element-ui按需加載

首屏需要加載的依賴包,其中 element-ui 整整占了 568k

原本的引進方式引進了整個包: 

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

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

所以我們要按需引用: 

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

注意 MessageBox 注冊方法的區(qū)別,并且我們雖然用到了 alert,但并不需要引入 Alert 組件

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

  1. plugins: [  
  2.     [  
  3.       "component",  
  4.       {  
  5.         "libraryName": "element-ui",  
  6.         "styleLibraryName": "theme-chalk"  
  7.       }  
  8.     ]  
  9.   ] 

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

  1. import { Table, TableColumn } from "element-ui";  
  2. components: {  
  3.     "el-table": Table,  
  4.     "el-table-column": TableColumn }, 

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

組件重復打包

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

  1. minChunks: 3 

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

首頁下載了黃色和灰色部分。

拆了半天,又回到原點

當然,我們可以繼續(xù)折騰 CommonsChunkPlugin 的配置來解決這個問題。

但在新版 webpack 中, CommonsChunkPlugin 被自由度更高,更高級的 SplitChunksPlugin 代替

這也是為什么我要把項目遷移到 vuecli 3(使用 webpack4)

因為默認就做了優(yōu)化,首頁只會下載灰色的部分( 235K)

gzip

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

  1. cnmp i compression-webpack-plugin -D 

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

  1. const CompressionPlugin = require('compression-webpack-plugin')  
  2. configureWebpack: (config) => {  
  3.         if (process.env.NODE_ENV === 'production') {  
  4.             // 為生產(chǎn)環(huán)境修改配置...  
  5.             config.mode = 'production'  
  6.             return {  
  7.                 plugins: [new CompressionPlugin({  
  8.                     test: /\.js$|\.html$|\.css/, //匹配文件名  
  9.                     threshold: 10240, //對超過10k的數(shù)據(jù)進行壓縮  
  10.                     deleteOriginalAssets: false //是否刪除原文件  
  11.                 })]  
  12.             }  
  13.         } 

可以看到 200k 以上的文件被壓縮到了 100k 以內(nèi)

在服務(wù)器我們也要做相應(yīng)的配置

如果發(fā)送請求的瀏覽器支持 gzip,就發(fā)送給它 gzip 格式的文件

我的服務(wù)器是用 express 框架搭建的,只要安裝一下 compression 就能使用 

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

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

最終效果

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

后記:css是否要拆分

vuecli 3 和 vuecli2.x 還有一個區(qū)別是

  •  vuecli 3會默認開啟一個 css 分離插件 ExtractTextPlugin

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

我們可以在 vue.config.js 中關(guān)閉它 

  1. css: {  
  2.     // 是否使用css分離插件 ExtractTextPlugin  
  3.     extract: false,  
  4.     // 開啟 CSS source maps?  
  5.     sourceMap: false,  
  6.     // css預設(shè)器配置項  
  7.     loaderOptions: {},  
  8.     // 啟用 CSS modules for all css / pre-processor files.  
  9.     modules: false  
  10. }, 

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

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

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

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

總結(jié)

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

 

責任編輯:龐桂玉 來源: Web開發(fā)
相關(guān)推薦

2021-07-28 14:35:09

代碼進度條前端

2019-12-16 09:21:14

HTTPAPI認證

2023-09-01 14:27:10

前段后端開發(fā)

2022-09-06 10:26:38

前后端分離Vue跨域

2024-02-07 13:37:39

AWS系統(tǒng)應(yīng)用程序

2023-11-30 12:13:29

開發(fā)分離工具

2019-06-12 19:00:14

前后端分離AppJava

2019-06-21 08:39:23

SQLmysql索引

2019-12-10 09:47:51

IaaS云計算物聯(lián)網(wǎng)

2024-02-26 12:51:20

2020-06-11 08:05:47

nginx線程池數(shù)據(jù)

2023-02-08 16:29:58

前后端開發(fā)

2020-08-21 10:59:10

微軟服務(wù)器運維

2020-06-12 14:44:06

線程池模式nginx

2020-09-02 08:27:58

CSS 屬性前端

2021-12-08 12:50:39

代碼MyBatisJava

2011-06-09 16:14:14

2022-09-01 07:18:21

分離項目Vue

2021-09-18 09:45:33

前端接口架構(gòu)

2021-02-23 18:38:11

iPhone地圖蘋果
點贊
收藏

51CTO技術(shù)棧公眾號