成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

高性能網(wǎng)站搭建-前端性能優(yōu)化 (附Vue首屏加載時(shí)間優(yōu)化詳細(xì)方案)

xingqiba / 2159人閱讀

摘要:附首屏加載時(shí)間過長(zhǎng)詳細(xì)優(yōu)化方案首先附一張優(yōu)化過后的圖首屏加載時(shí)間從原來的到,測(cè)試的個(gè)人站點(diǎn)注我在優(yōu)化項(xiàng)目的時(shí)候使用的是。如果是的項(xiàng)目影響也不大,優(yōu)化的方案是結(jié)合服務(wù)端和的。

前言
事實(shí)上, 只有10%-20%的最終用戶響應(yīng)時(shí)間是發(fā)在從Web服務(wù)器獲取HTML文檔并傳送到瀏覽器中的。如果希望能夠有效地減少頁面的響應(yīng)時(shí)間,就必須關(guān)注剩余80%-90%的最終用戶體驗(yàn)。
--Steve Souders

在這篇博客中,我根據(jù)工作中的實(shí)際項(xiàng)目經(jīng)驗(yàn)和一些測(cè)試的經(jīng)驗(yàn)中總結(jié)出了前端頁面在性能上優(yōu)化方案。其中一些經(jīng)驗(yàn)吸收自《高性能網(wǎng)站建設(shè)指南》Steve Souders 著 電子工業(yè)出版社。

一、 代碼相關(guān)優(yōu)化 1. 將樣式表放在首部-使用link標(biāo)簽將樣式表放在文檔的HEAD中

遵循HTML規(guī)范,將樣式表放在頭部,可以有效避免白屏無樣式內(nèi)容的閃爍。





  
  
  
  
  
  





2. 將腳本放在底部

將腳本放在頂部會(huì)造成的影響: 腳本阻塞對(duì)其后面內(nèi)容的顯示; 腳本會(huì)阻塞對(duì)其后面組件的下載;

將腳本放在底部標(biāo)簽之前, 類似于document.body.appendChild(yourScript), 不會(huì)阻塞頁面內(nèi)容的呈現(xiàn),而且頁面中的可視組件可以盡早下載。





  
  
  
  
  



  
  


3. 減少HTTP請(qǐng)求 1) CSS Sprites (雪碧圖)
多個(gè)圖片合成一張圖片,通過background-position來定位所需要的圖片。每次請(qǐng)求的話只需要請(qǐng)求一張圖片減少http請(qǐng)求。(如果使用圖標(biāo)的話建議使用svg,也可以使用iconfont)

合成雪碧圖的工具有很多

本地工具:https://github.com/iwangx/sprite(國(guó)人寫的)

在線工具h(yuǎn)ttps://www.toptal.com/develo...

本地工具:

在線工具:

2) 內(nèi)聯(lián)圖片和腳本

通過內(nèi)聯(lián)圖片和腳本無需額外的HTTP請(qǐng)求,圖片小于10K的可以設(shè)置內(nèi)聯(lián)為base64位。



bad



使用外部Javascript和Css的主要作用有: 可以配置緩存 有利于組件重用

5. 使用CDN (內(nèi)容分發(fā)網(wǎng)絡(luò) Content Delivery Network)
CDN是構(gòu)建在網(wǎng)絡(luò)之上的內(nèi)容分發(fā)網(wǎng)絡(luò),依靠部署在各地的邊緣服務(wù)器,通過中心平臺(tái)的負(fù)載均衡、內(nèi)容分發(fā)調(diào)度等功能模塊,使用戶就近獲取所需內(nèi)容,降低網(wǎng)絡(luò)擁塞,提高用戶訪問響應(yīng)速度和命中率。CDN的關(guān)鍵技術(shù)主要有內(nèi)容存儲(chǔ)分發(fā)技術(shù)。--摘自百度百科

通過CDN引入的資源目前基本都是使用目前最新的HTTP2協(xié)議,所以在性能上可以做到極致優(yōu)化,感謝CDN。

BootCDN - Bootstrap 中文網(wǎng)開源項(xiàng)目免費(fèi) CDN 加速服務(wù)

UNPKG

6. 代碼壓縮 1) Gzip 壓縮
gzip壓縮可以節(jié)省50%-70%的網(wǎng)絡(luò)開銷
瀏覽器支持的壓縮類型可以通過network的Accept-Encoding: gzip, deflate來查看。支持deflate的瀏覽器也支持gzip,但很多瀏覽器支持gzip卻不支持deflate,因此gzip是最理想的壓縮方法

node端 使用compression如果是webpack項(xiàng)目可以看下面的Vue首屏加載時(shí)間優(yōu)化方案里的gzip壓縮

// npm install compression --save-dev
const compression = require("compression")
2) 代碼壓縮

前端打包壓縮的有g(shù)runt,gulp,webpack,可以對(duì)HTML,CSS,Javascript代碼壓縮

二、 服務(wù)器相關(guān)優(yōu)化
本文中使用nginx服務(wù)器進(jìn)行相關(guān)配置,使用apache同樣可以做到相關(guān)優(yōu)化,具體操作請(qǐng)另Google
1. 開啟gzip壓縮

服務(wù)端配置gzip壓縮

gzip on; # 開啟Gzip
gzip_static on; # 開啟靜態(tài)文件壓縮
gzip_min_length  1k; # 不壓縮臨界值,大于1K的才壓縮
gzip_buffers     4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss; # 進(jìn)行壓縮的文件類型
gzip_vary on;
gzip_proxied   expired no-cache no-store private auth;
gzip_disable   "MSIE [1-6].";

我的服務(wù)器nginx相關(guān)的配置:

2. 開啟HTTP2

HTTP2在前端性能上主要表現(xiàn)在:請(qǐng)求和響應(yīng)的多路復(fù)用、頭部壓縮

感受下多路復(fù)用

nginx服務(wù)器配置HTTP2

使用http2需要配合https使用

使用https需要ca證書 阿里云https證書購買 (有免費(fèi)的ca證書)

3. 開啟緩存 添加Expires頭(強(qiáng)緩存)

個(gè)人站點(diǎn)相關(guān)配置

nginx配置

location ~.*.(svg|woff|js|css){
    root /yourFilePath;
    expires 1d;
}

Web服務(wù)器使用Expires頭來告訴Web客戶端它可以使用一個(gè)組件的當(dāng)前副本,直到指定的時(shí)間為止 HTTP規(guī)范中簡(jiǎn)要地稱該頭為“在這一日期時(shí)間之后,響應(yīng)將被認(rèn)為是無效的”。它在HTTP響應(yīng)中發(fā)送

expires: Thu, 30 May 2019 20:51:42 GMT

上面的Expires頭告訴瀏覽器該響應(yīng)的有效性持續(xù)到2019年5月30日為止。如果為頁面中的一個(gè)圖片返回了這個(gè)頭,瀏覽器在后續(xù)的頁面瀏覽中會(huì)使用緩存的圖片,將HTTP請(qǐng)求的數(shù)量減少一個(gè)

Max-Age和mod_expires

個(gè)人站點(diǎn)的css文件使用強(qiáng)緩存cache-control: max-age

nginx配置

server {
    add_header Cache-Control max-age=72000;
}

在解釋緩存如何很好地改善傳輸性能之前,需要提及除了Expires 頭之外的另一種選擇。HTTP 1.1引入了Cache-Control頭來克服Expires頭的限制

因?yàn)镋xpires頭使用一個(gè)特定的時(shí)間,它要求服務(wù)器和客戶端的時(shí)鐘嚴(yán)格同步。另外,過期日期需要經(jīng)常檢查,并且一旦未來這天到來了,還需要在服務(wù)器配置中提供個(gè)新的日期。

Cache-Control使用max-age指令指定組件被緩存多久, 如果從組件被請(qǐng)求開始過去的秒數(shù)少于max-age,瀏覽器就使用緩存的版本,這就避免了額外的HTTP請(qǐng)求。一個(gè)長(zhǎng)久的max-age頭可以將刷新窗設(shè)置為未來10年。

Cache-Control: max-age=315360000

Expires 和Cache-Control max-age.如果兩者同時(shí)出現(xiàn),HTTP規(guī)范規(guī)定max-age指令將重寫Expires頭。

建議使用Cache-Control max-age,如果使用expires你需要擔(dān)心它帶來的時(shí)鐘同步配置維護(hù)問題。

配置ETag(協(xié)商緩存)

Vue官方文檔的Expires相關(guān)配置

瀏覽器必須產(chǎn)生這個(gè)HTTP請(qǐng)求,執(zhí)行有效性檢查, 但這仍比簡(jiǎn)單地下載所有已過期的組件效率要高(對(duì)比強(qiáng)緩存)。如果瀏覽器緩存中的組件是有效的(即它能夠和原始服務(wù)器上的組件相匹配),原始服務(wù)器不會(huì)返回整個(gè)內(nèi)容,而是返回一個(gè)304 Not Modifed狀態(tài)碼。
附:Vue首屏加載時(shí)間過長(zhǎng)詳細(xì)優(yōu)化方案

首先附一張優(yōu)化過后的圖

首屏加載時(shí)間從原來的10s2s,測(cè)試的個(gè)人站點(diǎn)

注:我在優(yōu)化vue項(xiàng)目的時(shí)候使用的是[email protected], [email protected]。 如果是cli2的項(xiàng)目影響也不大,優(yōu)化的方案是結(jié)合服務(wù)端和webpack的。
vue-cli腳手架默認(rèn)配置已經(jīng)大幅度優(yōu)化了前端整體的性能,在此基礎(chǔ)上,我又使用了三個(gè)優(yōu)化項(xiàng)增加了大幅度提升
1. gzip壓縮

結(jié)合服務(wù)器相關(guān)優(yōu)化第一條:開啟gzip壓縮

下面是前端項(xiàng)目中vue.config.js中的配置

// 需要 npm install compression-webpack-plugin --save-dev
const CompressionWebpackPlugin = require("compression-webpack-plugin")

// 定義當(dāng)前環(huán)境
const ENV = process.env.NODE_ENV || "development"

module.exports = {
    configureWebpack: config => {
        // 如果是開發(fā)環(huán)境的話,開啟壓縮
        if (ENV === "production") {
            //  參數(shù)配置文檔: https://www.webpackjs.com/plugins/compression-webpack-plugin/
            config.plugins.push(new CompressionWebpackPlugin({
                algorithm: "gzip",
                test: /.(js|css|html)$/,
                threshold: 10240,
                minRatio: 0.8
            }))
        }
    }
}
2. 使用CDN內(nèi)容分發(fā)網(wǎng)絡(luò)
index.html文件中通過環(huán)境來判斷是否引入cdn文件,在vue.config.js文件中webpack通過環(huán)境判斷是否使用cdn引入文件的全局變量

使用CDN需要在webpackindex.html進(jìn)行相關(guān)配置

第一步 配置vue.config.js,只需要在剛才配置Gzip壓縮的基礎(chǔ)上再加一段代碼

const CompressionWebpackPlugin = require("compression-webpack-plugin")

const ENV = process.env.NODE_ENV || "development"

module.exports = {
    configureWebpack: config => {
        if (ENV === "production") {
            config.plugins.push(new CompressionWebpackPlugin({
                algorithm: "gzip",
                test: /.(js|css|html)$/,
                threshold: 10240,
                minRatio: 0.8
            }))
            // 配置externals就是當(dāng)使用CDN進(jìn)入的js文件在當(dāng)前項(xiàng)目中可以引用
            // 比如在開發(fā)環(huán)境引入的vue是import Vue from "vue", 這個(gè)大寫的Vue就是對(duì)應(yīng)的下面的大寫的Vue
            config.externals = {
              "vue": "Vue",
              "vue-router": "VueRouter",
              "axios": "axios"
            }
        }
    }
}

第二步 配置index.html,在body里使用EJS語法判斷是否為生產(chǎn)環(huán)境


  
<% if (NODE_ENV === "production") { %> <% } %>
3. 配置sourceMap

devtool | webpack中文網(wǎng) 你可以根據(jù)官網(wǎng)來對(duì)開發(fā)環(huán)境和生產(chǎn)環(huán)境進(jìn)行詳細(xì)配置

當(dāng)然也可以像我一樣直接productionSourceMap: false干掉生產(chǎn)環(huán)境的sourceMap

const CompressionWebpackPlugin = require("compression-webpack-plugin")

const ENV = process.env.NODE_ENV || "development"

module.exports = {
    configureWebpack: config => {
        if (ENV === "production") {
            config.plugins.push(new CompressionWebpackPlugin({
                algorithm: "gzip",
                test: /.(js|css|html)$/,
                threshold: 10240,
                minRatio: 0.8
            }))
            config.externals = {
              "vue": "Vue",
              "vue-router": "VueRouter",
              "axios": "axios"
            }
        }
    },
    // 禁用生產(chǎn)環(huán)境的sourceMap
    productionSourceMap: false
}
4. 使用HTTP2

請(qǐng)參考服務(wù)端優(yōu)化第二條

結(jié)語

前端性能優(yōu)化至關(guān)重要,文中提及的是我認(rèn)為比較重要的幾點(diǎn),以后遇到更好的方案會(huì)補(bǔ)充進(jìn)來。當(dāng)然你也可以在評(píng)論區(qū)留言我們一起探討,有錯(cuò)誤的地方歡迎指出。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/40453.html

相關(guān)文章

  • 前端每周清單:Node.js 微服務(wù)實(shí)踐,Vue.js 與 GraphQL,Angular 組件技巧

    摘要:前端每周清單第期微服務(wù)實(shí)踐,與,組件技巧,攻防作者王下邀月熊編輯徐川前端每周清單專注前端領(lǐng)域內(nèi)容,以對(duì)外文資料的搜集為主,幫助開發(fā)者了解一周前端熱點(diǎn)分為新聞熱點(diǎn)開發(fā)教程工程實(shí)踐深度閱讀開源項(xiàng)目巔峰人生等欄目。 前端每周清單第 26 期:Node.js 微服務(wù)實(shí)踐,Vue.js 與 GraphQL,Angular 組件技巧,HeadlessChrome 攻防 作者:王下邀月熊 編輯:徐川...

    wall2flower 評(píng)論0 收藏0
  • 前端黑科技:美團(tuán)網(wǎng)頁首幀優(yōu)化實(shí)踐

    摘要:在美團(tuán)支付的前端技術(shù)體系里,通過預(yù)渲染提升網(wǎng)頁首幀優(yōu)化,從而優(yōu)化了白屏問題,提升用戶體驗(yàn),并形成了最佳實(shí)踐。我們團(tuán)隊(duì)主要負(fù)責(zé)美團(tuán)支付相關(guān)的業(yè)務(wù),如果網(wǎng)站太慢會(huì)影響用戶的支付體驗(yàn),會(huì)造成客訴或資損。 前言 自JavaScript誕生以來,前端技術(shù)發(fā)展非常迅速。移動(dòng)端白屏優(yōu)化是前端界面體驗(yàn)的一個(gè)重要優(yōu)化方向,Web 前端誕生了 SSR 、CSR、預(yù)渲染等技術(shù)。在美團(tuán)支付的前端技術(shù)體系里,通...

    mrli2016 評(píng)論0 收藏0
  • 前端經(jīng)驗(yàn) - 收藏集 - 掘金

    摘要:我拖拖拖拖放基礎(chǔ)篇前端掘金不要搞錯(cuò),本文不是講如何拖地的。結(jié)構(gòu)說明前端應(yīng)該從哪些方面來優(yōu)化網(wǎng)站前端掘金不知道是哪位大牛的文章,轉(zhuǎn)過來回答。 我拖拖拖 --H5 拖放 API 基礎(chǔ)篇 - 前端 - 掘金不要搞錯(cuò),本文不是講如何拖地的??催^《javascript精粹》朋友應(yīng)該知道,他實(shí)現(xiàn)拖放的過程比較復(fù)雜,現(xiàn)在時(shí)代不同了,我們用H5的新的拖放API就能非常方便的實(shí)現(xiàn)拖放效果了。最近在園子見...

    MudOnTire 評(píng)論0 收藏0
  • 移動(dòng)web開發(fā)問題和優(yōu)化小結(jié)

    摘要:如何讓我們所開發(fā)的手機(jī)頁面能有更好的交互體驗(yàn),就是這篇文章的主旨移動(dòng)開發(fā)問題和優(yōu)化小結(jié)。關(guān)于和鼠標(biāo)事件的延遲說明,我引用葉小釵大神博客里面的一張圖片,如下在手機(jī)上,的延遲將近。 1.前言 到目前為止,互聯(lián)網(wǎng)行業(yè)里,手機(jī)越來越智能化,移動(dòng)端占有的比例越來越高,尤其實(shí)在電商,新聞,廣告,游戲領(lǐng)域。用戶要求越來越高,網(wǎng)站功能越來越好,效果越來越炫酷,這就要求我們產(chǎn)品質(zhì)量越來越高,web前端開...

    galaxy_robot 評(píng)論0 收藏0
  • 移動(dòng)web開發(fā)問題和優(yōu)化小結(jié)

    摘要:如何讓我們所開發(fā)的手機(jī)頁面能有更好的交互體驗(yàn),就是這篇文章的主旨移動(dòng)開發(fā)問題和優(yōu)化小結(jié)。關(guān)于和鼠標(biāo)事件的延遲說明,我引用葉小釵大神博客里面的一張圖片,如下在手機(jī)上,的延遲將近。 1.前言 到目前為止,互聯(lián)網(wǎng)行業(yè)里,手機(jī)越來越智能化,移動(dòng)端占有的比例越來越高,尤其實(shí)在電商,新聞,廣告,游戲領(lǐng)域。用戶要求越來越高,網(wǎng)站功能越來越好,效果越來越炫酷,這就要求我們產(chǎn)品質(zhì)量越來越高,web前端開...

    ysl_unh 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<