最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

聊聊Flare應(yīng)用前后端性能優(yōu)化問題

 更新時間:2022年02月09日 14:43:38   作者:蘇洋  
這篇文章主要介紹了Flare應(yīng)用前后端性能優(yōu)化,制作?flare?的過程,其實也是?flame?性能調(diào)優(yōu)的過程。不過在解決問題之前,我們首先得能定位問題有哪些,帶著這些問題一起通過本文學(xué)習(xí)吧

兩周前,在給顏值在線的 flame 提交了幾個 PR 之后,我將它封裝成了容器,用于書簽和在線應(yīng)用的管理。

但是在遷移個人書簽的過程中,我發(fā)覺 flame 在性能上的表現(xiàn)并不是特別好,于是我做了一個改良版:flare。

寫在前面

在聊 flare 之前,我想先聊聊 flame。

flame 是一個顏值在線的導(dǎo)航頁項目,你可以將你常用的書簽和在線應(yīng)用存儲在它上面。它由一個波蘭小哥創(chuàng)建,項目地址是 https://github.com/pawelmalak/flame

Flame 默認(rèn)界面

Flame 默認(rèn)界面

在試用之后,我覺得項目還不錯,于是稍作調(diào)整,封裝了一個新的鏡像:https://github.com/soulteary/docker-flame

新封裝的應(yīng)用

新封裝的應(yīng)用

在項目文檔中,記錄了我的修改:

  • 簡化程序功能和依賴(如K8S),減少軟件包體積,重構(gòu)了一些細(xì)節(jié)邏輯,簡化應(yīng)用啟動流程。
  • 重寫了天氣獲取邏輯,使用城市名稱替換經(jīng)緯度來獲取天氣數(shù)據(jù)。
  • 對程序已有的一些小 BUG 進(jìn)行了修復(fù),支持中文搜索。
  • 對程序進(jìn)行了簡單的漢化。

但是隨著深入使用,我發(fā)現(xiàn)頁面有著比較大的性能問題。

因為波蘭小哥采用了 SPA 方案,項目內(nèi)又包含了 6700 多個 SVG 圖標(biāo)、以及若干網(wǎng)頁字體,并且在接口上有一些小問題,導(dǎo)致了頁面體積非常大,接口請求數(shù)量也非常多。

甚至當(dāng)你上傳一些包含元素比較多的 SVG 作為你書簽圖標(biāo)的時候,由 React 觸發(fā)的頁面渲染會造成瀏覽器卡死。

我大概有幾百個書簽需要處理,預(yù)估未來書簽數(shù)量還會增長,所以我使用程序批量創(chuàng)建了接近一千個書簽。然后我發(fā)現(xiàn)渲染如此多的書簽,頁面會出現(xiàn)卡頓,甚至在頁面內(nèi)搜索包含關(guān)鍵詞的書簽也會感受到明顯的掉幀。

所以,我決定重新寫一個輕量一些的程序,來解決我的需求。新的項目地址在這里,如果你好奇的話,可以試試看:https://github.com/soulteary/docker-flare

制作 flare 的過程,其實也是 flame 性能調(diào)優(yōu)的過程。不過在解決問題之前,我們首先得能定位問題有哪些。

應(yīng)用性能問題分析

關(guān)于這個應(yīng)用的性能優(yōu)化,其實并不復(fù)雜,和傳統(tǒng)應(yīng)用優(yōu)化差別不大:優(yōu)先減少計算量,在實在減少不了的情況下使用計算效率更高的方式來解決問題。

不過結(jié)合使用場景來說,在分析技術(shù)問題之前,可以先從功能入手。

對于我不適用的功能

首先從功能上看,我不需要這個應(yīng)用與 Docker 集成,提供“服務(wù)發(fā)現(xiàn)”功能。比如在我啟動容器后,這個應(yīng)用會自動將新啟動的容器作為書簽或者應(yīng)用進(jìn)行添加。

其次,在擁有自己的 SSO 服務(wù)之后,我也不再需要使用簡單的賬號密碼登錄之類的功能,所以這個功能也可以去掉。

最后,關(guān)于書簽數(shù)據(jù)的存儲,我覺得在缺少用戶體驗非常棒的 Web 編輯器的前提下,可能不如配置聲明的方式更易于管理和維護(hù)。(你可以使用任何你喜歡的編輯器來更新和維護(hù)內(nèi)容,你可以使用 Git 或者任何你喜歡的方式,以白盒形式保存你自己的數(shù)據(jù))。

基于上面的變化,我大概可以少寫幾個部分的代碼:容器(Docker & K8S)集成、登錄鑒權(quán)、應(yīng)用和書簽,以及書簽分類的 “CRUD”。

前端架構(gòu)中的問題

Flame 項目中,作者使用都是 create-react-app 腳手架創(chuàng)建的項目,項目依賴為: React v17 + TypeScript + Redux,為了提供簡潔一致的圖標(biāo),作者在前端引入了 Templarian/MaterialDesign-JS,一個被精心處理過的 DOM 結(jié)構(gòu)非常簡單的 SVG 圖標(biāo)庫。

在使用構(gòu)建工具打包、服務(wù)端 GZip 壓縮之后,需要傳輸接近 1MB 的資源,原始腳本程序體積接近 3MB。相對膨大的程序體積導(dǎo)致了頁面加載和執(zhí)行時間都會比較長。比如頁面頁面首次渲染時間在 1s 上下浮動,多數(shù)情況下會超過 1s,完成時間一般都在 1.5s 以上??赡苁亲髡邔τ诜?wù)端程序開發(fā)不夠熟悉,雖然在前端進(jìn)行應(yīng)用配置更新時會復(fù)用接口,但是在內(nèi)容頁面展示時,會調(diào)用多達(dá)8個接口。此外,為了在頁面中展示和更新天氣信息,波蘭小哥還使用了 WebSocket 來進(jìn)行數(shù)據(jù)交互。

Flame 應(yīng)用性能概覽

Flame 應(yīng)用性能概覽

其他的問題,在文章前面已經(jīng)提到過了,就不贅述了。

后端架構(gòu)中的問題

項目使用的技術(shù)棧為 Node.js,Web 框架為市占率非常高的 Express 的最新版本,ORM 框架選擇的則是 Sequelize,數(shù)據(jù)存儲落地為 SQLite3 。上面的選擇粗看問題不大,如果應(yīng)用不需要公開提供瀏覽訪問,應(yīng)該不會出現(xiàn)任何性能問題。

但是,如果我們仔細(xì)觀察服務(wù)響應(yīng),會發(fā)現(xiàn)有一些請求的響應(yīng)的時間非常長,比如頁面資源、比如對于頁面至關(guān)重要的 JS 程序資源,它們的獲取都消耗了接近 400ms。

Flame 網(wǎng)絡(luò)請求記錄

Flame 網(wǎng)絡(luò)請求記錄

此外,前端發(fā)起了多次請求來獲取數(shù)據(jù),結(jié)合數(shù)據(jù)存儲使用 SQLite,如果提供公開內(nèi)容訪問,很容易遇到性能瓶頸。

針對應(yīng)用進(jìn)行改進(jìn)

當(dāng)我們清楚了解到上面的問題之后,比如容易采取的方案是:基于原程序進(jìn)行重構(gòu)調(diào)整,簡化前端請求、合理拆分模塊、處理資源加載和執(zhí)行時機(jī),調(diào)整數(shù)據(jù)存儲和處理方式,提高服務(wù)端響應(yīng)能力等組合拳。然而,這會是最簡單和收益最高的方案嘛?

調(diào)整前端實現(xiàn)

如果說在需要交互的頁面程序中使用 MVVM 框架會有較高的收益和性價比,那么在缺少多端組件代碼復(fù)用、沒有服務(wù)端渲染需求的場景下,使用這類框架則是一個性價比不高的選擇。

或許有同學(xué)會問,如果不使用 React、Vue、Angular 這類框架,難道在 2022 年還要再拾起 jQuery 等老的工具嗎?雖然可以,但其實在近乎于純展示的場景下,我們可以脫離 JS 來實現(xiàn)業(yè)務(wù)功能和簡單的交互,比如自動獲取焦點、菜單按鈕的激活狀態(tài)變化、甚至是帶有動畫效果的天氣圖標(biāo)。

所以,在調(diào)整實現(xiàn)的時候,其實還有一個選擇:不使用任何腳本。

Flare 無腳本實現(xiàn)的渲染效率

Flare 無腳本實現(xiàn)的渲染效率

在完成程序之后,我們可以看到從服務(wù)器獲取整個頁面數(shù)據(jù)、結(jié)構(gòu)解析、樣式計算、元素布局、頁面繪制的完整時間在 33ms(包含了 idle 等待時間),其中關(guān)鍵流程的時間消耗加起來不到 10ms,而完成頁面渲染的時間更是縮短到了 1.65ms。

在得到了頁面快速渲染能力之后,即使不使用瀏覽器針對資源進(jìn)行緩存,加速渲染,我們也能夠做到頁面切換的“無刷新”瀏覽(因為渲染速度足夠快)。

調(diào)整后端實現(xiàn)

雖然我非常喜歡使用 Node.js,以往也分享過你所未知的3種Node.js代碼優(yōu)化方式,但是,為了能夠低成本提高高性能的資源響應(yīng),這里進(jìn)行技術(shù)棧切換是必要的:比如 Golang。

在使用 Golang 簡化程序功能后,程序?qū)τ诿總€請求的響應(yīng)基本能夠保持在幾毫秒的水平(受限于網(wǎng)絡(luò)傳輸),相比較之前大概下降了2~3個量級。頁面關(guān)鍵的 DOM ContentLoad 時間更是縮短到原來的八分之一。

Flare 優(yōu)化過后批量請求狀況

Flare 優(yōu)化過后批量請求狀況

結(jié)合上面的前端優(yōu)化提到的渲染時間來粗略估計,從資源下載到渲染加起來都不到 10ms,如果不是瀏覽器的一些限制,繪制幀率應(yīng)該能夠遠(yuǎn)超 60 幀,進(jìn)一步滿足我們實現(xiàn)“即使刷新了也比沒一些沒刷新的實現(xiàn)還順滑”。

上面的實現(xiàn)中,我將頁面圖標(biāo)請求和頁面文檔進(jìn)行了拆分,在書簽數(shù)量和圖標(biāo)種類不多的場景下,或許并不是最優(yōu)的方案,但是一旦書簽數(shù)量級到幾百、上千之后,你會發(fā)現(xiàn)圖標(biāo)拆分可以極大地提升性能。

當(dāng)然,為了滿足數(shù)量比較少的場景,我也對合并輸出進(jìn)行了實現(xiàn),算上網(wǎng)站 favicon 獲取,一共只有兩個請求。在書簽不是很多的時候,渲染性能甚至比文檔和資源拆分輸出效率更好。

Flare 請求合并模式下的網(wǎng)絡(luò)請求

Flare 請求合并模式下的網(wǎng)絡(luò)請求

圖標(biāo)資源優(yōu)化

Flame 使用的方案是讀取后端接口配置,從前端腳本中動態(tài)創(chuàng)建 SVG 圖標(biāo)并插入文檔中,F(xiàn)lare 程序默認(rèn)的方式則是將 SVG 和文檔拆分,以應(yīng)對大量書簽狀況下的頁面性能問題。

雖然解決了頁面性能問題,但是服務(wù)端 IO 問題卻會伴隨而來,所以這里還需要處理資源在服務(wù)端的釋放和讀取問題,盡量將資源的磁盤 IO 變?yōu)榱恪?/p>

聽起來比較玄乎,但其實結(jié)合代碼生成的方式,還是蠻好實現(xiàn)的。當(dāng)然,因為 Go 存在自動 GC,所以在不同的資源被使用的時候,會出現(xiàn)大量內(nèi)存的分配,影響效率,這里可以考慮使用持久化方案來解決問題,處理起來挺有意思的,受限于篇幅和主題就不展開啦。有一部分我在前兩篇文章中提到了,關(guān)于 Golang 嵌入資源的使用和優(yōu)化。

前段時間折騰 Go Emed 的記錄

前段時間折騰 Go Emed 的記錄

比如,在不針對 HTTP 服務(wù)實現(xiàn)做任何優(yōu)化、限制運行資源為兩核心的前提下,僅優(yōu)化資源 IO 后,能達(dá)到穩(wěn)定 3ms 輸出資源,每秒提供2萬7千次以上的響應(yīng)服務(wù)。

容器鏡像的優(yōu)化

除了常規(guī)優(yōu)化之外,容器時代的應(yīng)用,鏡像優(yōu)化也是非常關(guān)鍵的。容器優(yōu)化方式,我在前面的文章反復(fù)提過多次,所以也不再展開了,感興趣可以自行翻閱之前的內(nèi)容。

# docker images | grep fla                 
soulteary/flare       0.1.1      22b18ad73c66        12MB
soulteary/flaume      2.2.0      b39fffc0ca81        152MB
pawelmalak/flame      2.2.0      fa47c93c0af6        179MB
pawelmalak/flame      2.0.0      729b0fcea7f0        190MB

可以看到,相比較原版程序,優(yōu)化后的程序在本地解壓后的尺寸大概是之前十五到十六分之一。

額外的優(yōu)化

如果我們使用 lighthouse 針對 Flame 前端實現(xiàn)進(jìn)行測試,能夠看到前端程序在實現(xiàn)上的一些小問題,得分雖然四個環(huán)綠三個,但是只有一個環(huán)是綠色的。

Flame 應(yīng)用 Lighthouse 得分

Flame 應(yīng)用 Lighthouse 得分

在重新實現(xiàn)的過程中,除了簡化結(jié)構(gòu),調(diào)試實現(xiàn)之外,還順手將這四個圈都打到了滿分(Chrome 版本 v97+)。

Flare 應(yīng)用 Lighthouse 得分

Flare 應(yīng)用 Lighthouse 得分

最后

聊到這里,相信你已經(jīng)了解了我是怎么做的啦,如果你對 Flare 感興趣,并且也需要一個簡單的導(dǎo)航程序,可以訪問項目 https://github.com/soulteary/docker-flare,來親自上手試試。

到此這篇關(guān)于Flare應(yīng)用前后端性能優(yōu)化的文章就介紹到這了,更多相關(guān)Flare性能優(yōu)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Jebrains付費插件Activation code[持續(xù)更新]

    Jebrains付費插件Activation code[持續(xù)更新]

    這篇文章主要介紹了Jebrains付費插件Activation code[持續(xù)更新],使用本Activation code需要jetbrains-agent支持!感興趣的朋友跟隨小編一起看看吧
    2020-09-09
  • VS CODE 使用SVN插件的方法步驟

    VS CODE 使用SVN插件的方法步驟

    這篇文章主要介紹了VS CODE 使用SVN插件的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Dreamweaver中如何設(shè)定文字大小、字體、顏色

    Dreamweaver中如何設(shè)定文字大小、字體、顏色

    這篇文章主要給大家介紹了關(guān)于Dreamweaver中如何設(shè)定文字大小、字體、顏色的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2007-06-06
  • idea激活碼最新獲取方法(idea2020激活碼匯總)

    idea激活碼最新獲取方法(idea2020激活碼匯總)

    針對idea激活碼失效的情況,我們給大家?guī)碜钚碌膇dea激活碼以及相關(guān)激活教程,分享最新idea激活參數(shù)等信息。
    2020-02-02
  • FFmpeg視頻處理入門教程(新手必看)

    FFmpeg視頻處理入門教程(新手必看)

    本文主要介紹了FFmpeg視頻處理入門教程,它功能強(qiáng)大,用途廣泛,是許多音頻和視頻格式的標(biāo)準(zhǔn)編碼/解碼實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • WebStorm打開多個項目的三種方法總結(jié)

    WebStorm打開多個項目的三種方法總結(jié)

    WebStorm支持多項目管理,本文介紹了三種方法:使用項目導(dǎo)航面板、窗口分割和多個WebStorm實例,項目導(dǎo)航面板可以在同一窗口內(nèi)管理多個項目,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-09-09
  • Runnable.com 在線測試代碼片分享網(wǎng)站

    Runnable.com 在線測試代碼片分享網(wǎng)站

    Runnable是一個一站式的代碼片段集合網(wǎng)站,你不僅可以搜索代碼,還可以編輯、運行這些代碼片段,以確保它們的正確性與可用性
    2013-12-12
  • 利用ChatGPT與MindShow制作一個PPT的方法詳解

    利用ChatGPT與MindShow制作一個PPT的方法詳解

    PPT制作是商務(wù)、教育和各種場合演講的重要組成部分,然而,很多人會花費大量時間和精力在內(nèi)容生成和視覺設(shè)計方面,為了解決這個問題,我們可以利用兩個強(qiáng)大的工具——ChatGPT和MindShow,來提高制作PPT的效率,感興趣的同學(xué)可以參考閱讀
    2023-06-06
  • Windows下安裝Git

    Windows下安裝Git

    這篇文章介紹了Window下安裝Git的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • 將ChatGPT接入微信實現(xiàn)智能回復(fù)功能

    將ChatGPT接入微信實現(xiàn)智能回復(fù)功能

    這篇文章主要介紹了將ChatGPT接入微信實現(xiàn)智能回復(fù)功能,本項目是基于ChatGPT的微信聊天機(jī)器人,通過?OpenAI?接口生成對話內(nèi)容,使用?itchat?實現(xiàn)微信消息的接收和自動回復(fù),需要的朋友可以參考下
    2023-02-02

最新評論

盐城市| 丰城市| 巧家县| 蕉岭县| 开远市| 前郭尔| 葵青区| 甘孜| 论坛| 东乌珠穆沁旗| 新乡县| 潜江市| 孟津县| 象山县| 白朗县| 溆浦县| 盐津县| 东方市| 札达县| 彰化县| 长垣县| 樟树市| 磴口县| 林西县| 肥东县| 赞皇县| 长宁区| 古丈县| 宜城市| 陇川县| 邯郸市| 永德县| 宿州市| 咸丰县| 滦平县| 满洲里市| 宣威市| 丁青县| 达尔| 卢龙县| 开江县|