1. 程式人生 > >vue大型專案高效能優化----想說愛你真的不容易

vue大型專案高效能優化----想說愛你真的不容易

## 一、背景   目前公司的```電子合同```採用```表單設計器```+```合同業務```配合實現,做了半年多後終於上線,但是下邊員工普遍反映卡頓,甚至卡死,爆棧。尤其是新增和修改合同頁面,因為這部分資料量大,邏輯複雜,很容易崩潰,所以決定進行效能優化。 ## 二、業務場景介紹   先來了解一下我們是怎麼實現:   1. 因為我們公司合同變換頻繁,條款之間還有邏輯,所以做了個```基礎服務```(說白了就是元件庫),為合同提供模板   2. 表單設計器作為基礎服務,打包成了元件庫,嵌入到合同專案,包括合同生成元件(拖拽生成合同模板)和合同預覽元件(載入資料庫中的合同模板資料)   3. 合同專案有一個模組管理頁面,可以對多個模板進行維護,比如可以選擇啟用哪個模板。   4. 合同的管理員負責維護模板,可以用表單設計器拖拽生成合同模板,提交後落入資料庫,每個合同型別可以同時啟用一個模板。   5. 最終下邊員工用的就是啟用的模板(尤其是這部門卡頓) **下面是電子合同的巨集觀泳道圖:** ![image](https://img-blog.csdnimg.cn/20200216200900531.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NvZGVMaXVndWlzaGVuZw==,size_16,color_FFFFFF,t_70) ## 三、頁面介紹 1. 合同模板管理頁 ![image](https://img-blog.csdnimg.cn/20200910105834157.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NvZGVMaXVndWlzaGVuZw==,size_16,color_FFFFFF,t_70) 2. 新增模板頁面 ![image](https://img-blog.csdnimg.cn/20200910105956622.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NvZGVMaXVndWlzaGVuZw==,size_16,color_FFFFFF,t_70) 3. 新建合同頁面 ![image](https://img-blog.csdnimg.cn/202009101101566.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NvZGVMaXVndWlzaGVuZw==,size_16,color_FFFFFF,t_70) 4. 合同填寫頁面 ![image](https://img-blog.csdnimg.cn/20200911134425140.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NvZGVMaXVndWlzaGVuZw==,size_16,color_FFFFFF,t_70)   好了,基本的業務邏輯和頁面就介紹這麼多,特別卡頓的頁面就是第四個頁面,下面我們分析一下卡頓的原因。 ## 四、卡頓分析   1. 首先就是表單設計器的問題最嚴重,因為每一個元件需要很多配置項才能夠支撐元件的渲染,而一個合同是由上千個元件組成,經過測試,一個合同模板需要5MB的儲存空間(資料庫用的是MongoDB,儲存格式為字串,幾乎不影響),下面是一個輸入框的配置 ![image](https://img-blog.csdnimg.cn/20200910103459458.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NvZGVMaXVndWlzaGVuZw==,size_16,color_FFFFFF,t_70)   2. 表單設計器的實現用了大量的閉包管理業務,我們都知道,閉包是特別耗記憶體的。   3. 合同模板巨複雜,由上萬個元件拼接而成,我把模板資料down下來看了一下,大約是16000多個元件,大小為3.4MB。   4. 因為表單設計器中包括```id,model,事件id```都是前端隨機生成的,採用```隨機字串+時間戳```的形式,一共46位。   5. 合同專案屬於大型專案,業務場景及其複雜,包括合同管理,附件管理,合同列表,新增頁面,審批頁面等等,我計算了一下,光路由頁面就有三十多個,```頁面,元件,樣式,業務```巨多,如果不做處理,不卡才怪 ## 五、效能優化 #### 1. 第一次嘗試   說一下我的優化思路:首先,電子合同由表單設計器和合同業務兩個專案共同完成,合同模板載入慢的原因是瀏覽器渲染了大量的模板資料,這些模板資料是由多個組組成的(大約12個),我第一想到的就是```分組渲染```,先載入一個組,先讓使用者看到頁面,然後在繼續載入,一個一個,最終載入完成。這也是被大家認可的方案。   然後我就開始實現這個分組渲染,做了大概有二十多天吧,一點效果沒出來。   先看一下渲染的程式碼: ``` ```   上面就是所有組載入的程式碼,這是一個```v-for```,做分組渲染,我想到使用```vue的非同步元件```實現,但是這是一個迴圈,所有的元件註冊的都是同一個名字,這顯然是不能用非同步元件的,除非註冊的是不同名字的元件,但是我想了很長時間都做出來效果,所以這二十多天,失敗了。 #### 2.第二次嘗試   上邊說了,模板載入慢是因為瀏覽器渲染了大量的資料,我們知道,js是單執行緒的,也就是說,所有任務只能在一個執行緒上完成,一次只能做一件事。前面的任務沒做完,後面的任務只能等著。因此js處理資料的能力有限,所以在朋友的建議下調研了一把```webworker```。   webworker的作用,就是為js創造多執行緒環境,允許主執行緒建立Worker執行緒,將一些任務分配給後者執行。在主執行緒執行的同時,Worker執行緒在後臺執行,兩者互不干擾。   看了一把文件我第一時間覺得這個方案不可行。說到底我們就是想要webworker為我們開闢縣城用來處理大量資料,但是webworker處理的大資料,不是指資料量非常大,而是要從計算量來看,通常用時不能控制在毫秒級內的運算都可以考慮放在web worker中執行。而我們的合同模板資料恰恰是資料量大,並不需要做特別大的運算。   第二次嘗試失敗。 #### 3.第三次嘗試   後來在同事的建議下決定採用```ssr```,也就是```服務端預渲染```。我們平常寫的vue專案打包後生成```dist```,運維會把這個資料夾放在伺服器中,我們看到的頁面其實就是生成執行的```render函式```,這是比較耗時的。   所謂的服務端渲染,就是在```服務端```生成靜態頁面,然後交給```客戶端```渲染。   自己從零搭建一套服務端渲染的應用是相當複雜的,所以我最終選用了```nuxt```框架。關於nuxt框架我不多做介紹,可以自己去看文件[(傳送門)](https://nuxtjs.org/)。這個框架有自己的腳手架,也是vue官方推薦的。   經過了一週的時間,完成了從vue向nuxt的遷移,大部門頁面速度有了明顯的提升。   **除了我們想優化的新增合同頁面。**   經過分析,合同專案用到的元件庫有```element-UI```和我問自己的表單設計器,element只有部門元件支援ssr,像是```表格和樹```是不支援ssr的,所以就不存在服務端渲染了。   我也曾嘗試過弄一把表單設計器,讓它支援ssr,但是並沒有效果,如果有誰知道,可以聯絡我。   很顯然,第三次也失敗了。 #### 4.第四次嘗試   命運總是很捉弄人,優化了一個多月的合同,速度並沒有顯著的提升,領導很著急,我也很著急。   突然有一天,我在回家的途中,記得那天風雨交加,雷霆大作,一聲巨雷轟天響,把我好的idea都劈出來了。我一下子想到了分組載入的實現。 先來看一把程式碼的實現(只展示了部分程式碼): ```

相關推薦

vue大型專案高效能優化----真的容易

## 一、背景   目前公司的```電子合同```採用```表單設計器```+```合同業務```配合實現,做了半年多後終於上線,但是下邊員工普遍反映卡頓,甚至卡死,爆棧。尤其是新增和修改合同頁面,因為這部分資料量大,邏輯複雜,很容易崩潰,所以決定進行效能優化。 ## 二、業務場景介紹

Delphi 真的容易

使用Delphi 2010建立TRibbon介面,走了萬里長征一樣。也許現在用delphi的人太少了,沒有人遇到過! 問題1:TRibbon不能修改為宋體或者說字型裡面不是黑體的字型都不行,否則Tab和Group標題變小不協調。 問題2:使用大按鈕,在TImageList新

Vue+Webpack 專案打包優化,從 60s 到 17s 的優化

有的 Vue 專案比較大或者說專案中引入了許多第三方庫,那麼在執行 NPM、Run、Build 構建專案的時候會極其的慢。比如我現在的專案就每次打包就要大概 60s 的樣子。可能大家也會遇到如下同樣的問題: NPM、Run、Build 構建專案耗時較長; 打包出來的檔案太大; 打包前

vue+webpack專案打包優化,從60s到17s的優化之法

有的 Vue 專案比較大.或者說專案中引入了許多第三方庫,那麼在執行 npm run build 構建專案的時候會極其的慢.比如我現在的專案就每次打包就要大概60s的樣子。可能大家也會遇到如下同樣的問題

線程池來了解一下嗎?

java並發編程 新建 out 沒有 在線 dex keepal AD 定性 前言 只有光頭才能變強 回顧前面: ThreadLocal就是這麽簡單 多線程三分鐘就可以入個門了! 多線程基礎必要知識點!看了學習多線程事半功倍 Java鎖機制了解一下 AQS簡簡單單過一

WebView 容易

cati tint line tex ext web show 開發 原生 為什麽要使用WebView 隨著app業務的不斷深入發展,只靠著原生代碼來堆砌功能是不現實,畢竟開發的時長會增加,而且同時需要開發iOS和Android兩套,並且,如果在UI上改變了一丁點,都需要提

程序猿悲喜錄:魔都,容易

求職 輔助 開發項目 想法 小天 計算機專業 簡單 用不了 上下 程序猿悲喜錄:魔都,想說愛你不容易 初入魔都男怕入錯行,女怕嫁錯郎,真是一語中的,想當初為了贏取白富美,走上人生巔峰,腦袋一抽便進入了開發行業,坎坎坷坷,如今頭發都禿了。 從學校出來,便留在了上海,想要創出一

vue專案shou優化記錄

1.起因   專案打包的時候發現部分檔案過大:vender.js有400K,app.css高達1.6M。看著這個數值,瞬間凌亂。 2.優化   2.1 優化vender.js     是因專案的依賴 vue、vue-router、vuex、axios 造成的,可使用cdn,注意更換對應版本號 <

手把手教將一箇舊的大型專案遷移到 Python 3

一年半前,我們就決定使用 Python 3 了。我們已經討論了很長時間,現在是時候使用了!現在這個過程已經結束了,我們已經把生產環境的最後部署都遷移到了 Python 3 整個程式碼庫大約有 240 k 行,不包括空行和註解。 這是一個基於 Web 的批處理任務系統。並且只有一個生產,部署環境

前端架構師必備之Vue專案打包優化

前幾天聽老師講過前端架構師必備之Vue專案打包優化的課之後,有感而發利用空閒時間寫了一下。 大佬路過請留步知道一下, 使用vue-cli部署生產包時,發現資源包很大,打包後的vendor.js達到了1.4M,這已經很大了,而且會影響到首屏載入。那麼,怎麼優化呢? 1.元件按需載入

居然有人說Python能用於大型專案這不是在逗我嗎!十大誤區

  語言多元化是PayPal程式設計文化中一個重要的組成部分。在C++和Java長期流行的同時,更多的團隊選擇了Jva和Scala。同時,Braintree的收購也引入了一個久經世故的Ruby社群。 Python作為一門特別的語言,在eBay和PayPal有很長的歷史。而且其

程式猿悲喜錄:魔都,容易

  初入魔都 男怕入錯行,女怕嫁錯郎,真是一語中的,想當初為了贏取白富美,走上人生巔峰,腦袋一抽便進入了開發行業,坎坎坷坷,如今頭髮都禿了。   從學校出來,便留在了上海,想要創出一番事業,像模像樣的規劃著自己的未來,一時間機會多、工資高等種種美好的憧憬閃耀在眼前

Vue全家桶+Egg從0開發大型專案(一)搭建專案

前言 因為要開發本科畢設,做一個校友交流平臺,正好想記錄下整個開發過程,同時也分享給各位。當然那些需求調研的,前期設計的就省略啦。 專案大概是一個全棧的專案,使用的IDE是vscode(期間涉及一些外掛、配置推薦),大概的專案技術棧: vue + vue-router + vuex + vue-i

Vue專案實戰優化:已有元件優化系列(一)

一_原有元件效果 其中,核取方塊為一個元件,根據資料庫中的值,進行是否勾選,並且核取方塊只能是禁用的 二_原有元件程式碼 <template> <input v-if="gearboxtype === 'A'" checked type="

根據我開發過的六七個vue專案以及獨立開發的3個vue專案總結,手把手教搭建一個結構清晰易開發易維護的公司的Vue專案,包含axios服務,vuex,公共元件/指令/過濾器/服務等

看了網上有很多搭建vue專案的demo,但是不是已經年久失修的專案就是很簡單的demo,那些只能做新手參考並不能直接拿來用。我近兩年中已經參與了六七個vue專案的開發,包含PC端、客戶端、手機端,其中獨立負責的vue專案主要為微信公眾號的開發。而在每個專案中,我都會取長補短的去搭建自己的專案,經

Vue專案打包優化(MD.10)

好久不見,最近很忙,大家依然可以關注漫島的最新動態。 今天要說的是Vue專案的一些打包技巧,都是我在漫島使用過的,因為我們沒錢買高配置伺服器(目前還是個測試伺服器),所以就只能把優化做到更優了。 隨著專案開發,上線包體積的增大,尤其是我們的vendor.js,這會讓專案首屏載入緩慢,白屏

vue專案細節優化筆記

1、vue-awesome-swiper輪播圖片在3G網路載入時,下面內容出現頁面抖動 解決辦法: 外層div新增class為wrapper .wrapper{ width: 100%; height: 0; overflow: hidd

Vue專案Webpack優化實踐,構建效率提高50%

       公司的前端專案使用Vue框架,Vue框架使用Webpack進行構建,隨著專案不斷迭代,專案逐漸變得龐大,然而專案的構建速度隨之變得緩慢,於是對Webpack構建進行優化變得刻不容緩。經過不斷的摸索和實踐,通過以下方法優化後,專案的構建速度提高了50%。現將

Django ORM模型:容易

作者:Vamei 出處:http://www.cnblogs.com/vamei 嚴禁轉載。 使用Python的Django模型的話,一般都會用它自帶的ORM(Object-relational mapping)模型。這個ORM模型的設計比較簡單,學起來不會特別花時間。不過,Django的ORM模型有自

vue專案效能優化(路由懶載入、gzip加速、cdn加速)

前端工程效能優化一說意義深遠悠長,本章主要介紹除了一些基礎優化外如何實行路由懶載入、Gzip加速、CDN加速,讓網頁飛的快一些。 基礎優化 老生常談的一些: 不要在模板中寫複雜的表示式 慎用watch尤其是deep 合理的使用v-if/v-show/v-for 善用keep-alive