真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

VueJSSSR后端繪制內(nèi)存泄漏的示例分析-創(chuàng)新互聯(lián)

小編給大家分享一下VueJS SSR后端繪制內(nèi)存泄漏的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),定西企業(yè)網(wǎng)站建設(shè),定西品牌網(wǎng)站建設(shè),網(wǎng)站定制,定西網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,定西網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

引言

Memory Leak 是最難排查調(diào)試的 Bug 種類之一,因?yàn)閮?nèi)存泄漏是個(gè) undecidable problem,只有開發(fā)者才能明確一塊內(nèi)存是不是需要被回收。再加上內(nèi)存泄漏也沒有特定的報(bào)錯(cuò)信息,只能通過一定時(shí)間段的日志來判斷是否存在內(nèi)存泄漏。大家熟悉的常用調(diào)試工具對排查內(nèi)存泄漏也沒有用武之地。當(dāng)然了,除了專門用于排查內(nèi)存泄漏的工具(抓取Heap之類的工具)之外。

對于不同的語言,各種排查內(nèi)存泄漏的方式方法也不盡相同。對于 JavaScript 來說,針對不同的平臺(tái),調(diào)試工具也是不一樣的,最常用的恐怕還是 Chrome 自帶的各種利器(針對 browser 也好,nodeJS 也好)都有不錯(cuò)的使用體驗(yàn),網(wǎng)上也有很多使用教程。

這次我想給大家介紹的內(nèi)存泄漏的定位方法,并非工具的使用。而是一些經(jīng)驗(yàn)的總結(jié),也就是我所知道的 VueJS SSR 中最容易出現(xiàn)內(nèi)存泄漏的地方,如果大家知道更多 VueJS SSR 內(nèi)存泄漏點(diǎn),可以在評論處留言告訴更多的人。

難點(diǎn)

遇到過 VueJS SSR 內(nèi)存泄漏的朋友可能知道,針對 VueJS SSR 內(nèi)存泄漏的排查,與普通 NodeJS 和 Browser 平臺(tái)相比是要麻煩很多的。如果你使用了 webpack-dev-server 在本地調(diào)試,你會(huì)發(fā)現(xiàn)常用的內(nèi)存泄漏工具毫無用武之地,因?yàn)樽ト〉降男畔⒉粌H包括 VueJS SSR 進(jìn)程信息,還包含了 Webpack 的進(jìn)程信息,甚至還有 webpack-dev-server 的各種堆信息。當(dāng)然了,你也可以通過各種手段來過濾掉無關(guān)的信息,從而只剩下 VueJS SSR 的堆信息。

我在排查我們組項(xiàng)目內(nèi)存泄漏的時(shí)候,動(dòng)用了各種常規(guī)工具,但最終發(fā)現(xiàn) VueJS SSR 的內(nèi)存泄漏有很大可能性出現(xiàn)在以下地方,也就說如果,你碰巧也有 VueJS SSR 內(nèi)存泄漏的問題,先不要使用內(nèi)存泄漏排查工具,首先從下面幾個(gè)地方著手,看看是否有內(nèi)存泄漏的邏輯??赡苤睋粢?,節(jié)約時(shí)間。

可能造成泄漏的位置

生命周期處的 beforeCreate/created

以下是 VueJS 開發(fā)者看過無數(shù)次的說明圖,我還請大家再多看一遍

VueJS SSR后端繪制內(nèi)存泄漏的示例分析

在官方文檔里,有這么一句話:

Since there are no dynamic updates, of all the lifecycle hooks, only beforeCreate and created will be called during SSR. This means any code inside other lifecycle hooks such as beforeMount or mounted will only be executed on the client.

也就是說 SSR 跟前端繪制一樣,也有生命周期,只不過 SSR 的生命周期里只有 beforeCreate 和 created 。

所以你需要首先排查你的組件的 beforeCreate 和 created 里面是否有內(nèi)存泄漏的代碼,或者他們是否調(diào)用了會(huì)內(nèi)存泄漏的代碼。

路由守衛(wèi)(Route Guards)處

路由也是會(huì)引起 SSR 內(nèi)存泄漏的地方之一

跟生命周期不同,所有的 route guard 都會(huì)在 SSR 運(yùn)行。他們分別都是

  • beforeEach

  • beforeRouteUpdate

  • beforeEnter

  • beforeRouteEnter

  • beforeResolve

  • afterEach

  • beforeRouteEnter

Data-Prefetch 處

還需要特別注意的地方就是 Date-prefetch 的地方,里面很容易出現(xiàn)內(nèi)存泄漏的代碼。 所謂 Date-prefetch 就是自定義實(shí)現(xiàn)的,在SSR處提前獲取第三方數(shù)據(jù),用于繪制的過程。

Global Mixin 處

這個(gè)內(nèi)存泄漏的點(diǎn)想必大家都已經(jīng)熟知,作者也在github上詳細(xì)闡述過:GitHub issue

簡單來說,就是 global mixin 會(huì)給每個(gè) Vue 實(shí)例一個(gè)拷貝,而不是引用。

內(nèi)存泄漏的例子

以上列舉了一些可能出現(xiàn)內(nèi)存泄漏的地方,那么具體怎么樣的代碼才會(huì)引起內(nèi)存泄漏呢?引起代碼泄漏的例子網(wǎng)上有很多,我在這里想給大家介紹幾種常見的泄漏例子。

不小心造成的全局變量

function foo(arg) {
 bar = "this is a hidden global variable";
}

以上的代碼會(huì)順利運(yùn)行,但是因?yàn)椴恍⌒穆暶髁艘粋€(gè) bar 的變量。相當(dāng)于:

function foo(arg) {
 window.bar = "this is an explicit global variable";
}

生成了一個(gè)全局變量 window.bar

如果不手動(dòng)回收,這個(gè)全局變量會(huì)一直存在于內(nèi)存中,不會(huì)被CG回收。積少成多,最后造成內(nèi)存泄漏。

現(xiàn)在大家都是在各種模塊化(CommonJS/AMD/CMD/etc..)之后的環(huán)境下進(jìn)行開發(fā),這種全局變量的內(nèi)存泄漏的問題基本上是被消除了。但是要提醒大家,由于JavaScript的各種特性,會(huì)有很多意想不到的狀況發(fā)生。當(dāng)摸不清頭腦的時(shí)候,可以嘗試從這些特性出發(fā)找到問題。

被遺忘了的 Timer 或者 callback

請大家先看以下的例子

var someResource = getData();
setInterval(function() {
 var node = document.getElementById('Node');
 if(node) {
 // Do stuff with node and someResource.
 node.innerHTML = JSON.stringify(someResource));
 }
}, 1000);

乍一看沒啥問題,之后如果 Node 節(jié)點(diǎn)從DOM上被移除,因?yàn)樯厦娴?callback 對 Node 節(jié)點(diǎn)有引用,所以 Node 節(jié)點(diǎn)會(huì)一直常駐內(nèi)存,不會(huì)被CG回收。

要避免以上問題,就要養(yǎng)成 removeEventListenerclearInterval 的習(xí)慣。

var someResource = getData();
var interval = setInterval(function() {
 var node = document.getElementById('Node');
 if(node) {
 // Do stuff with node and someResource.
 node.innerHTML = JSON.stringify(someResource));
 } else {
 // Remove Timer
 clearInterval(interval);
 }
}, 1000);

還比如:

var element = document.getElementById('button');

function onClick(event) {
 element.innerHtml = 'text';
}

element.addEventListener('click', onClick);
// Do stuff
element.removeEventListener('click', onClick);
element.parentNode.removeChild(element);
// Now when element goes out of scope,
// both element and onClick will be collected even in old browsers that don't
// handle cycles well.

addEventListener 之后已經(jīng)要記得 removeEventListener

閉包

閉包造成內(nèi)存泄漏的情況比較復(fù)雜,而且較難查找。限于本文主旨,不做原理說明。

為什么要使用Vue

Vue是一款友好的、多用途且高性能的JavaScript框架,使用vue可以創(chuàng)建可維護(hù)性和可測試性更強(qiáng)的代碼庫,Vue允許可以將一個(gè)網(wǎng)頁分割成可復(fù)用的組件,每個(gè)組件都包含屬于自己的HTML、CSS、JavaScript,以用來渲染網(wǎng)頁中相應(yīng)的地方,所以越來越多的前端開發(fā)者使用vue。

以上是“VueJS SSR后端繪制內(nèi)存泄漏的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


當(dāng)前文章:VueJSSSR后端繪制內(nèi)存泄漏的示例分析-創(chuàng)新互聯(lián)
地址分享:http://weahome.cn/article/dcpphd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部