Vue 項(xiàng)目性能優(yōu)化 — 實(shí)踐指南(網(wǎng)上最全 / 詳細(xì))

前言

Vue 框架通過數(shù)據(jù)雙向綁定和虛擬 DOM 技術(shù)岁忘,幫我們處理了前端開發(fā)中最臟最累的 DOM 操作部分斯议, 我們不再需要去考慮如何操作 DOM 以及如何最高效地操作 DOM;但 Vue 項(xiàng)目中仍然存在項(xiàng)目首屏優(yōu)化闰靴、Webpack 編譯配置優(yōu)化等問題,所以我們?nèi)匀恍枰リP(guān)注 Vue 項(xiàng)目性能方面的優(yōu)化,使項(xiàng)目具有更高效的性能利朵、更好的用戶體驗(yàn)。本文是作者通過實(shí)際項(xiàng)目的優(yōu)化實(shí)踐進(jìn)行總結(jié)而來猎莲,希望讀者讀完本文绍弟,有一定的啟發(fā)思考,從而對自己的項(xiàng)目進(jìn)行優(yōu)化起到幫助著洼。本文內(nèi)容分為以下三部分組成:

Vue 代碼層面的優(yōu)化樟遣;

webpack 配置層面的優(yōu)化;

基礎(chǔ)的 Web 技術(shù)層面的優(yōu)化身笤。

辛苦整理良久豹悬,還望手動點(diǎn)贊鼓勵~

github地址為:github.com/fengshi123/…液荸,匯總了作者的所有博客瞻佛,也歡迎關(guān)注及 star ~

一、代碼層面的優(yōu)化

1.1、v-if 和 v-show 區(qū)分使用場景

v-if真正的條件渲染,因?yàn)樗鼤_保在切換過程中條件塊內(nèi)的事件監(jiān)聽器和子組件適當(dāng)?shù)乇讳N毀和重建斤葱;也是惰性的:如果在初始渲染時條件為假,則什么也不做——直到條件第一次變?yōu)檎鏁r揖闸,才會開始渲染條件塊去扣。

v-show就簡單得多悄但, 不管初始條件是什么数初,元素總是會被渲染肌稻,并且只是簡單地基于 CSS 的 display 屬性進(jìn)行切換。

所以蹲嚣,v-if 適用于在運(yùn)行時很少改變條件递瑰,不需要頻繁切換條件的場景;v-show 則適用于需要非常頻繁切換條件的場景隙畜。

1.2抖部、computed 和 watch? 區(qū)分使用場景

computed:是計(jì)算屬性,依賴其它屬性值议惰,并且 computed 的值有緩存慎颗,只有它依賴的屬性值發(fā)生改變,下一次獲取 computed 的值時才會重新計(jì)算 computed? 的值言询;

watch:更多的是「觀察」的作用俯萎,類似于某些數(shù)據(jù)的監(jiān)聽回調(diào) ,每當(dāng)監(jiān)聽的數(shù)據(jù)變化時都會執(zhí)行回調(diào)進(jìn)行后續(xù)操作运杭;

運(yùn)用場景:

當(dāng)我們需要進(jìn)行數(shù)值計(jì)算夫啊,并且依賴于其它數(shù)據(jù)時,應(yīng)該使用 computed辆憔,因?yàn)榭梢岳?computed 的緩存特性撇眯,避免每次獲取值時报嵌,都要重新計(jì)算;

當(dāng)我們需要在數(shù)據(jù)變化時執(zhí)行異步或開銷較大的操作時熊榛,應(yīng)該使用 watch锚国,使用?watch?選項(xiàng)允許我們執(zhí)行異步操作 ( 訪問一個 API ),限制我們執(zhí)行該操作的頻率玄坦,并在我們得到最終結(jié)果前血筑,設(shè)置中間狀態(tài)。這些都是計(jì)算屬性無法做到的煎楣。

1.3云挟、v-for 遍歷必須為 item 添加 key,且避免同時使用 v-if

(1)v-for 遍歷必須為 item 添加 key

在列表數(shù)據(jù)進(jìn)行遍歷渲染時转质,需要為每一項(xiàng) item 設(shè)置唯一 key 值,方便 Vue.js 內(nèi)部機(jī)制精準(zhǔn)找到該條列表數(shù)據(jù)帖世。當(dāng) state 更新時休蟹,新的狀態(tài)值和舊的狀態(tài)值對比,較快地定位到 diff 日矫。

(2)v-for 遍歷避免同時使用 v-if

v-for 比 v-if 優(yōu)先級高赂弓,如果每一次都需要遍歷整個數(shù)組,將會影響速度哪轿,尤其是當(dāng)之需要渲染很小一部分的時候盈魁,必要情況下應(yīng)該替換成 computed 屬性。

推薦:

    ? ? ? {{ user.name }}?
computed: {? activeUsers: function () {? ? return this.users.filter(function (user) { return user.isActive? ? })? }}復(fù)制代碼

不推薦:

    ? ? ? {{ user.name }}?
復(fù)制代碼

1.4窃诉、長列表性能優(yōu)化

Vue 會通過 Object.defineProperty 對數(shù)據(jù)進(jìn)行劫持杨耙,來實(shí)現(xiàn)視圖響應(yīng)數(shù)據(jù)的變化,然而有些時候我們的組件就是純粹的數(shù)據(jù)展示飘痛,不會有任何改變珊膜,我們就不需要 Vue 來劫持我們的數(shù)據(jù),在大量數(shù)據(jù)展示的情況下宣脉,這能夠很明顯的減少組件初始化的時間车柠,那如何禁止 Vue 劫持我們的數(shù)據(jù)呢?可以通過 Object.freeze 方法來凍結(jié)一個對象塑猖,一旦被凍結(jié)的對象就再也不能被修改了竹祷。

exportdefault{data:()=>({users: {}? }),asynccreated() {constusers =awaitaxios.get("/api/users");this.users =Object.freeze(users);? }};復(fù)制代碼

1.5、事件的銷毀

Vue 組件銷毀時羊苟,會自動清理它與其它實(shí)例的連接塑陵,解綁它的全部指令及事件監(jiān)聽器,但是僅限于組件本身的事件蜡励。 如果在 js 內(nèi)使用 addEventListene 等方式是不會自動銷毀的猿妈,我們需要在組件銷毀時手動移除這些事件的監(jiān)聽吹菱,以免造成內(nèi)存泄露,如:

created() {? addEventListener('click',this.click,false)},beforeDestroy() {? removeEventListener('click',this.click,false)}復(fù)制代碼

1.6彭则、圖片資源懶加載

對于圖片過多的頁面鳍刷,為了加速頁面加載速度,所以很多時候我們需要將頁面內(nèi)未出現(xiàn)在可視區(qū)域內(nèi)的圖片先不做加載俯抖, 等到滾動到可視區(qū)域后再去加載输瓜。這樣對于頁面加載性能上會有很大的提升,也提高了用戶體驗(yàn)芬萍。我們在項(xiàng)目中使用 Vue 的 vue-lazyload 插件:

(1)安裝插件

npm install vue-lazyload --save-dev復(fù)制代碼

(2)在入口文件 man.js 中引入并使用

importVueLazyloadfrom'vue-lazyload'復(fù)制代碼

然后再 vue 中直接使用

Vue.use(VueLazyload)復(fù)制代碼

或者添加自定義選項(xiàng)

Vue.use(VueLazyload, {preLoad:1.3,error:'dist/error.png',loading:'dist/loading.gif',attempt:1})復(fù)制代碼

(3)在 vue 文件中將 img 標(biāo)簽的 src 屬性直接改為 v-lazy 尤揣,從而將圖片顯示方式更改為懶加載顯示:

以上為 vue-lazyload 插件的簡單使用,如果要看插件的更多參數(shù)選項(xiàng)柬祠,可以查看 vue-lazyload 的github 地址北戏。

1.7、路由懶加載

Vue? 是單頁面應(yīng)用漫蛔,可能會有很多的路由引入 嗜愈,這樣使用 webpcak 打包后的文件很大,當(dāng)進(jìn)入首頁時莽龟,加載的資源過多蠕嫁,頁面會出現(xiàn)白屏的情況,不利于用戶體驗(yàn)毯盈。如果我們能把不同路由對應(yīng)的組件分割成不同的代碼塊剃毒,然后當(dāng)路由被訪問的時候才加載對應(yīng)的組件,這樣就更加高效了搂赋。這樣會大大提高首屏顯示的速度赘阀,但是可能其他的頁面的速度就會降下來。

路由懶加載:

constFoo =()=>import('./Foo.vue')constrouter =newVueRouter({routes: [? ? {path:'/foo',component: Foo }? ]})復(fù)制代碼

1.8脑奠、第三方插件的按需引入

我們在項(xiàng)目中經(jīng)常會需要引入第三方插件纤壁,如果我們直接引入整個插件,會導(dǎo)致項(xiàng)目的體積太大捺信,我們可以借助babel-plugin-component酌媒,然后可以只引入需要的組件,以達(dá)到減小項(xiàng)目體積的目的迄靠。以下為項(xiàng)目中引入 element-ui 組件庫為例:

(1)首先秒咨,安裝babel-plugin-component:

npm install babel-plugin-component -D復(fù)制代碼

(2)然后,將 .babelrc 修改為:

{"presets": [["es2015", {"modules":false}]],"plugins": [? ? ["component",? ? ? {"libraryName":"element-ui","styleLibraryName":"theme-chalk"}? ? ]? ]}復(fù)制代碼

(3)在 main.js 中引入部分組件:

importVuefrom'vue';import{ Button, Select }from'element-ui'; Vue.use(Button) Vue.use(Select)復(fù)制代碼

1.9掌挚、優(yōu)化無限列表性能

如果你的應(yīng)用存在非常長或者無限滾動的列表雨席,那么需要采用?窗口化?的技術(shù)來優(yōu)化性能,只需要渲染少部分區(qū)域的內(nèi)容吠式,減少重新渲染組件和創(chuàng)建 dom 節(jié)點(diǎn)的時間陡厘。 你可以參考以下開源項(xiàng)目vue-virtual-scroll-listvue-virtual-scroller來優(yōu)化這種無限列表的場景的抽米。

1.10、服務(wù)端渲染 SSR or 預(yù)渲染

服務(wù)端渲染是指 Vue 在客戶端將標(biāo)簽渲染成的整個 html 片段的工作在服務(wù)端完成糙置,服務(wù)端形成的 html 片段直接返回給客戶端這個過程就叫做服務(wù)端渲染云茸。

(1)服務(wù)端渲染的優(yōu)點(diǎn):

更好的 SEO: 因?yàn)?SPA 頁面的內(nèi)容是通過 Ajax 獲取,而搜索引擎爬取工具并不會等待 Ajax 異步完成后再抓取頁面內(nèi)容谤饭,所以在 SPA 中是抓取不到頁面通過 Ajax 獲取到的內(nèi)容标捺;而 SSR 是直接由服務(wù)端返回已經(jīng)渲染好的頁面(數(shù)據(jù)已經(jīng)包含在頁面中),所以搜索引擎爬取工具可以抓取渲染好的頁面揉抵;

更快的內(nèi)容到達(dá)時間(首屏加載更快): SPA 會等待所有 Vue 編譯后的 js 文件都下載完成后亡容,才開始進(jìn)行頁面的渲染,文件下載等需要一定的時間等冤今,所以首屏渲染需要一定的時間闺兢;SSR 直接由服務(wù)端渲染好頁面直接返回顯示,無需等待下載 js 文件及再去渲染等戏罢,所以 SSR 有更快的內(nèi)容到達(dá)時間屋谭;

(2)服務(wù)端渲染的缺點(diǎn):

更多的開發(fā)條件限制: 例如服務(wù)端渲染只支持 beforCreate 和 created 兩個鉤子函數(shù),這會導(dǎo)致一些外部擴(kuò)展庫需要特殊處理帖汞,才能在服務(wù)端渲染應(yīng)用程序中運(yùn)行;并且與可以部署在任何靜態(tài)文件服務(wù)器上的完全靜態(tài)單頁面應(yīng)用程序 SPA 不同凑术,服務(wù)端渲染應(yīng)用程序翩蘸,需要處于 Node.js server 運(yùn)行環(huán)境;

更多的服務(wù)器負(fù)載:在 Node.js 中渲染完整的應(yīng)用程序淮逊,顯然會比僅僅提供靜態(tài)文件的 server 更加大量占用CPU 資源催首,因此如果你預(yù)料在高流量環(huán)境下使用,請準(zhǔn)備相應(yīng)的服務(wù)器負(fù)載泄鹏,并明智地采用緩存策略郎任。

如果你的項(xiàng)目的 SEO 和 首屏渲染是評價項(xiàng)目的關(guān)鍵指標(biāo),那么你的項(xiàng)目就需要服務(wù)端渲染來幫助你實(shí)現(xiàn)最佳的初始加載性能和 SEO备籽,具體的 Vue SSR 如何實(shí)現(xiàn)舶治,可以參考作者的另一篇文章《Vue SSR 踩坑之旅》。如果你的 Vue 項(xiàng)目只需改善少數(shù)營銷頁面(例如/车猬, /about霉猛,?/contact?等)的 SEO,那么你可能需要預(yù)渲染珠闰,在構(gòu)建時 (build time) 簡單地生成針對特定路由的靜態(tài) HTML 文件惜浅。優(yōu)點(diǎn)是設(shè)置預(yù)渲染更簡單,并可以將你的前端作為一個完全靜態(tài)的站點(diǎn)伏嗜,具體你可以使用prerender-spa-plugin就可以輕松地添加預(yù)渲染 坛悉。

二伐厌、Webpack 層面的優(yōu)化

2.1、Webpack 對圖片進(jìn)行壓縮

在 vue 項(xiàng)目中除了可以在webpack.base.conf.js中 url-loader 中設(shè)置 limit 大小來對圖片處理裸影,對小于 limit 的圖片轉(zhuǎn)化為 base64 格式挣轨,其余的不做操作。所以對有些較大的圖片資源空民,在請求資源的時候刃唐,加載會很慢,我們可以用image-webpack-loader來壓縮圖片:

(1)首先界轩,安裝 image-webpack-loader? :

npm install image-webpack-loader --save-dev復(fù)制代碼

(2)然后画饥,在 webpack.base.conf.js? 中進(jìn)行配置:

{test:/\.(png|jpe?g|gif|svg)(\?.*)?$/,use:[? ? {loader:'url-loader',options: {limit:10000,name: utils.assetsPath('img/[name].[hash:7].[ext]')? ? ? }? ? },? ? {loader:'image-webpack-loader',options: {bypassOnDebug:true,? ? ? }? ? }? ]}復(fù)制代碼

2.2、減少 ES6 轉(zhuǎn)為 ES5 的冗余代碼

Babel 插件會在將 ES6 代碼轉(zhuǎn)換成 ES5 代碼時會注入一些輔助函數(shù)浊猾,例如下面的 ES6 代碼:

classHelloWebpackextendsComponent{...}復(fù)制代碼

這段代碼再被轉(zhuǎn)換成能正常運(yùn)行的 ES5 代碼時需要以下兩個輔助函數(shù):

babel-runtime/helpers/createClass// 用于實(shí)現(xiàn) class 語法babel-runtime/helpers/inherits// 用于實(shí)現(xiàn) extends 語法? ? 復(fù)制代碼

在默認(rèn)情況下抖甘, Babel 會在每個輸出文件中內(nèi)嵌這些依賴的輔助函數(shù)代碼,如果多個源代碼文件都依賴這些輔助函數(shù)葫慎,那么這些輔助函數(shù)的代碼將會出現(xiàn)很多次衔彻,造成代碼冗余。為了不讓這些輔助函數(shù)的代碼重復(fù)出現(xiàn)偷办,可以在依賴它們時通過require('babel-runtime/helpers/createClass')的方式導(dǎo)入艰额,這樣就能做到只讓它們出現(xiàn)一次。babel-plugin-transform-runtime插件就是用來實(shí)現(xiàn)這個作用的椒涯,將相關(guān)輔助函數(shù)進(jìn)行替換成導(dǎo)入語句柄沮,從而減小 babel 編譯出來的代碼的文件大小。

(1)首先废岂,安裝babel-plugin-transform-runtime:

npm install babel-plugin-transform-runtime --save-dev復(fù)制代碼

(2)然后祖搓,修改 .babelrc? 配置文件為:

"plugins": ["transform-runtime"]復(fù)制代碼

如果要看插件的更多詳細(xì)內(nèi)容,可以查看babel-plugin-transform-runtime 的詳細(xì)介紹湖苞。

2.3拯欧、提取公共代碼

如果項(xiàng)目中沒有去將每個頁面的第三方庫和公共模塊提取出來,則項(xiàng)目會存在以下問題:

相同的資源被重復(fù)加載财骨,浪費(fèi)用戶的流量和服務(wù)器的成本镐作。

每個頁面需要加載的資源太大,導(dǎo)致網(wǎng)頁首屏加載緩慢隆箩,影響用戶體驗(yàn)滑肉。

所以我們需要將多個頁面的公共代碼抽離成單獨(dú)的文件,來優(yōu)化以上問題 摘仅。Webpack 內(nèi)置了專門用于提取多個Chunk 中的公共部分的插件 CommonsChunkPlugin靶庙,我們在項(xiàng)目中 CommonsChunkPlugin 的配置如下:

// 所有在 package.json 里面依賴的包,都會被打包進(jìn) vendor.js 這個文件中。newwebpack.optimize.CommonsChunkPlugin({name:'vendor',minChunks:function(module, count){return(module.resource &&/\.js$/.test(module.resource) &&module.resource.indexOf(? ? ? ? path.join(__dirname,'../node_modules')? ? ? ) ===0);? }}),// 抽取出代碼模塊的映射關(guān)系newwebpack.optimize.CommonsChunkPlugin({name:'manifest',chunks: ['vendor']})復(fù)制代碼

如果要看插件的更多詳細(xì)內(nèi)容六荒,可以查看 CommonsChunkPlugin 的詳細(xì)介紹护姆。

2.4、模板預(yù)編譯

當(dāng)使用 DOM 內(nèi)模板或 JavaScript 內(nèi)的字符串模板時掏击,模板會在運(yùn)行時被編譯為渲染函數(shù)卵皂。通常情況下這個過程已經(jīng)足夠快了,但對性能敏感的應(yīng)用還是最好避免這種用法砚亭。

預(yù)編譯模板最簡單的方式就是使用單文件組件——相關(guān)的構(gòu)建設(shè)置會自動把預(yù)編譯處理好灯变,所以構(gòu)建好的代碼已經(jīng)包含了編譯出來的渲染函數(shù)而不是原始的模板字符串。

如果你使用 webpack捅膘,并且喜歡分離 JavaScript 和模板文件添祸,你可以使用vue-template-loader,它也可以在構(gòu)建過程中把模板文件轉(zhuǎn)換成為 JavaScript 渲染函數(shù)寻仗。

2.5刃泌、提取組件的 CSS

當(dāng)使用單文件組件時,組件內(nèi)的 CSS 會以 style 標(biāo)簽的方式通過 JavaScript 動態(tài)注入署尤。這有一些小小的運(yùn)行時開銷耙替,如果你使用服務(wù)端渲染,這會導(dǎo)致一段 “無樣式內(nèi)容閃爍 (fouc) ” 曹体。將所有組件的 CSS 提取到同一個文件可以避免這個問題俗扇,也會讓 CSS 更好地進(jìn)行壓縮和緩存。

查閱這個構(gòu)建工具各自的文檔來了解更多:

webpack + vue-loader( vue-cli 的 webpack 模板已經(jīng)預(yù)先配置好)

Browserify + vueify

Rollup + rollup-plugin-vue

2.6箕别、優(yōu)化 SourceMap

我們在項(xiàng)目進(jìn)行打包后铜幽,會將開發(fā)中的多個文件代碼打包到一個文件中,并且經(jīng)過壓縮究孕、去掉多余的空格啥酱、babel編譯化后爹凹,最終將編譯得到的代碼會用于線上環(huán)境厨诸,那么這樣處理后的代碼和源代碼會有很大的差別,當(dāng)有 bug的時候禾酱,我們只能定位到壓縮處理后的代碼位置微酬,無法定位到開發(fā)環(huán)境中的代碼,對于開發(fā)來說不好調(diào)式定位問題颤陶,因此 sourceMap 出現(xiàn)了颗管,它就是為了解決不好調(diào)式代碼問題的。

SourceMap 的可選值如下(+ 號越多滓走,代表速度越快垦江,- 號越多,代表速度越慢, o 代表中等速度 )



開發(fā)環(huán)境推薦: cheap-module-eval-source-map

生產(chǎn)環(huán)境推薦: cheap-module-source-map

原因如下:

cheap: 源代碼中的列信息是沒有任何作用搅方,因此我們打包后的文件不希望包含列相關(guān)信息比吭,只有行信息能建立打包前后的依賴關(guān)系绽族。因此不管是開發(fā)環(huán)境或生產(chǎn)環(huán)境,我們都希望添加 cheap 的基本類型來忽略打包前后的列信息衩藤;

module:不管是開發(fā)環(huán)境還是正式環(huán)境吧慢,我們都希望能定位到bug的源代碼具體的位置,比如說某個 Vue 文件報錯了赏表,我們希望能定位到具體的 Vue 文件检诗,因此我們也需要 module 配置;

soure-map:source-map 會為每一個打包后的模塊生成獨(dú)立的 soucemap 文件 瓢剿,因此我們需要增加source-map 屬性逢慌;

eval-source-map:eval 打包代碼的速度非常快跋选,因?yàn)樗簧?map 文件涕癣,但是可以對 eval 組合使用 eval-source-map 使用會將 map 文件以 DataURL 的形式存在打包后的 js 文件中。在正式環(huán)境中不要使用 eval-source-map, 因?yàn)樗鼤黾游募拇笮∏氨辏窃陂_發(fā)環(huán)境中坠韩,可以試用下,因?yàn)樗麄兇虬乃俣群芸臁?/p>

2.7炼列、構(gòu)建結(jié)果輸出分析

Webpack 輸出的代碼可讀性非常差而且文件非常大只搁,讓我們非常頭疼。為了更簡單俭尖、直觀地分析輸出結(jié)果氢惋,社區(qū)中出現(xiàn)了許多可視化分析工具。這些工具以圖形的方式將結(jié)果更直觀地展示出來稽犁,讓我們快速了解問題所在焰望。接下來講解我們在 Vue 項(xiàng)目中用到的分析工具:webpack-bundle-analyzer。

我們在項(xiàng)目中webpack.prod.conf.js進(jìn)行配置:

if(config.build.bundleAnalyzerReport) {varBundleAnalyzerPlugin =require('webpack-bundle-analyzer').BundleAnalyzerPlugin;? webpackConfig.plugins.push(newBundleAnalyzerPlugin());}復(fù)制代碼

執(zhí)行$ npm run build --report后生成分析報告如下:

2.8已亥、Vue 項(xiàng)目的編譯優(yōu)化

如果你的 Vue 項(xiàng)目使用 Webpack 編譯熊赖,需要你喝一杯咖啡的時間,那么也許你需要對項(xiàng)目的 Webpack 配置進(jìn)行優(yōu)化虑椎,提高 Webpack 的構(gòu)建效率震鹉。具體如何進(jìn)行 Vue 項(xiàng)目的 Webpack 構(gòu)建優(yōu)化,可以參考作者的另一篇文章《 Vue 項(xiàng)目 Webpack 優(yōu)化實(shí)踐》

三捆姜、基礎(chǔ)的 Web 技術(shù)優(yōu)化

3.1传趾、開啟 gzip 壓縮

gzip 是 GNUzip 的縮寫,最早用于 UNIX 系統(tǒng)的文件壓縮泥技。HTTP 協(xié)議上的 gzip 編碼是一種用來改進(jìn) web 應(yīng)用程序性能的技術(shù)浆兰,web 服務(wù)器和客戶端(瀏覽器)必須共同支持 gzip。目前主流的瀏覽器,Chrome簸呈,firefox宽涌,IE等都支持該協(xié)議。常見的服務(wù)器如 Apache蝶棋,Nginx卸亮,IIS 同樣支持,gzip 壓縮效率非常高玩裙,通臣婷常可以達(dá)到 70% 的壓縮率,也就是說吃溅,如果你的網(wǎng)頁有 30K溶诞,壓縮之后就變成了 9K 左右

以下我們以服務(wù)端使用我們熟悉的 express 為例,開啟 gzip 非常簡單决侈,相關(guān)步驟如下:

安裝:

npm install compression --save復(fù)制代碼

添加代碼邏輯:

varcompression =require('compression');varapp = express();app.use(compression())復(fù)制代碼

重啟服務(wù)螺垢,觀察網(wǎng)絡(luò)面板里面的 response header,如果看到如下紅圈里的字段則表明 gzip 開啟成功 :

3.2赖歌、瀏覽器緩存

為了提高用戶加載頁面的速度枉圃,對靜態(tài)資源進(jìn)行緩存是非常必要的,根據(jù)是否需要重新向服務(wù)器發(fā)起請求來分類庐冯,將 HTTP 緩存規(guī)則分為兩大類(強(qiáng)制緩存孽亲,對比緩存),如果對緩存機(jī)制還不是了解很清楚的展父,可以參考作者寫的關(guān)于 HTTP 緩存的文章《深入理解HTTP緩存機(jī)制及原理》返劲,這里不再贅述。

3.3栖茉、CDN 的使用

瀏覽器從服務(wù)器上下載 CSS篮绿、js 和圖片等文件時都要和服務(wù)器連接,而大部分服務(wù)器的帶寬有限吕漂,如果超過限制亲配,網(wǎng)頁就半天反應(yīng)不過來。而 CDN 可以通過不同的域名來加載文件痰娱,從而使下載文件的并發(fā)連接數(shù)大大增加弃榨,且CDN 具有更好的可用性菩收,更低的網(wǎng)絡(luò)延遲和丟包率 梨睁。

3.4、使用 Chrome Performance 查找性能瓶頸

Chrome 的 Performance 面板可以錄制一段時間內(nèi)的 js 執(zhí)行細(xì)節(jié)及時間娜饵。使用 Chrome 開發(fā)者工具分析頁面性能的步驟如下坡贺。

打開 Chrome 開發(fā)者工具,切換到 Performance 面板

點(diǎn)擊 Record 開始錄制

刷新頁面或展開某個節(jié)點(diǎn)

點(diǎn)擊 Stop 停止錄制

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末遍坟,一起剝皮案震驚了整個濱河市拳亿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌愿伴,老刑警劉巖肺魁,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異隔节,居然都是意外死亡鹅经,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門怎诫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瘾晃,“玉大人,你說我怎么就攤上這事幻妓”奈螅” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵肉津,是天一觀的道長强胰。 經(jīng)常有香客問我,道長妹沙,這世上最難降的妖魔是什么哪廓? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮初烘,結(jié)果婚禮上涡真,老公的妹妹穿的比我還像新娘。我一直安慰自己肾筐,他們只是感情好哆料,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吗铐,像睡著了一般东亦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上唬渗,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天典阵,我揣著相機(jī)與錄音,去河邊找鬼镊逝。 笑死壮啊,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的撑蒜。 我是一名探鬼主播歹啼,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼玄渗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狸眼?” 一聲冷哼從身側(cè)響起藤树,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拓萌,沒想到半個月后岁钓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡微王,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年甜紫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骂远。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡囚霸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出激才,到底是詐尸還是另有隱情拓型,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布瘸恼,位于F島的核電站劣挫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏东帅。R本人自食惡果不足惜压固,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望靠闭。 院中可真熱鬧帐我,春花似錦、人聲如沸愧膀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽檩淋。三九已至芬为,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蟀悦,已是汗流浹背媚朦。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留日戈,地道東北人询张。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像涎拉,于是被迫代替她去往敵國和親瑞侮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 京東PLUS會員項(xiàng)目是國內(nèi)第一個電商付費(fèi)會員項(xiàng)目鼓拧,正式開通的會員數(shù)量已破千萬半火。我團(tuán)隊(duì)從2016年接手這個項(xiàng)目的前端...
    沫之閱讀 1,072評論 0 6
  • 得益于 Vue 的 響應(yīng)式系統(tǒng) 和 虛擬 DOM 系統(tǒng) ,Vue 在渲染組件的過程中能自動追蹤數(shù)據(jù)的依賴季俩,并精確知...
    binggg_booker閱讀 13,262評論 1 47
  • 基于Vue的一些資料 內(nèi)容 UI組件 開發(fā)框架 實(shí)用庫 服務(wù)端 輔助工具 應(yīng)用實(shí)例 Demo示例 element★...
    嘗了又嘗閱讀 1,140評論 0 1
  • 慢慢的干貨~ 有點(diǎn)長~ 關(guān)于 React 應(yīng)用加載的優(yōu)化钮糖,其實(shí)網(wǎng)上類似的文章已經(jīng)有太多太多了,隨便一搜就是一堆酌住,已...
    BluesCurry閱讀 3,856評論 1 19
  • 下雨天店归,吃火鍋,不錯酪我,沒有什么是吃解決不了的消痛,如果有,那就在吃一頓都哭,哈哈 今日學(xué)習(xí):有個詞“冒犯” 這個詞生活中真...
    Yoga999閱讀 95評論 0 1