欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談VueJS SSR 后端繪制內(nèi)存泄漏的相關(guān)解決經(jīng)驗

 更新時間:2018年12月20日 14:43:40   作者:再見尼克  
這次我想給大家介紹的內(nèi)存泄漏的定位方法,并非工具的使用。而是一些經(jīng)驗的總結(jié),也就是我所知道的 VueJS SSR 中最容易出現(xiàn)內(nèi)存泄漏的地方,非常具有實用價值,需要的朋友可以參考下

引言

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

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

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

難點

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

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

可能造成泄漏的位置

生命周期處的 beforeCreate/created

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

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

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)用了會內(nèi)存泄漏的代碼。

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

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

跟生命周期不同,所有的 route guard 都會在 SSR 運行。他們分別都是

  • beforeEach
  • beforeRouteUpdate
  • beforeEnter
  • beforeRouteEnter
  • beforeResolve
  • afterEach
  • beforeRouteEnter

Data-Prefetch 處

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

Global Mixin 處

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

簡單來說,就是 global mixin 會給每個 Vue 實例一個拷貝,而不是引用。

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

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

不小心造成的全局變量

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

以上的代碼會順利運行,但是因為不小心聲明了一個 bar 的變量。相當于:

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

生成了一個全局變量 window.bar

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

現(xiàn)在大家都是在各種模塊化(CommonJS/AMD/CMD/etc..)之后的環(huán)境下進行開發(fā),這種全局變量的內(nèi)存泄漏的問題基本上是被消除了。但是要提醒大家,由于JavaScript的各種特性,會有很多意想不到的狀況發(fā)生。當摸不清頭腦的時候,可以嘗試從這些特性出發(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é)點從DOM上被移除,因為上面的 callback 對 Node 節(jié)點有引用,所以 Node 節(jié)點會一直常駐內(nèi)存,不會被CG回收。

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

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)存泄漏的情況比較復雜,而且較難查找。限于本文主旨,不做原理說明。

總結(jié)

個人認為 VueJS SSR 后端繪制內(nèi)存泄漏造成影響要比普通的 VueJS 前端內(nèi)存泄漏造成的影響要更大。

前端內(nèi)存泄漏的影響,都是發(fā)生在客戶機器上,而且基本上現(xiàn)代瀏覽器也會做好保護機制,一般自行刷新之后都會解決。但是,一旦后端繪制內(nèi)存泄漏造成宕機之后,整個服務器都會受影響,危險性更大,搞不好年終獎就沒了。

前端工程師一般都是關(guān)注于瀏覽器端表現(xiàn),在開發(fā)過程中的內(nèi)存泄漏問題不太在意也不太容易被發(fā)現(xiàn)。一般都是在項目上線一段時間之后,才發(fā)現(xiàn)內(nèi)存泄漏的情況。那個時候再去著手,可能會有些無從下手或者手忙腳亂。

那么,就讓我們在開發(fā)的時候開始關(guān)注內(nèi)存泄漏問題,將 VueJS SSR 后端繪制內(nèi)存泄漏問題扼殺于襁褓之中。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vue動態(tài)加載ECharts圖表數(shù)據(jù)的方式

    Vue動態(tài)加載ECharts圖表數(shù)據(jù)的方式

    這篇文章主要介紹了Vue動態(tài)加載ECharts圖表數(shù)據(jù)的方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • vue.js實現(xiàn)表格合并示例代碼

    vue.js實現(xiàn)表格合并示例代碼

    最近工作中遇到一個需求,是要做一個頁面放張大表格用來顯示數(shù)據(jù)項,純粹為了view層操作方便,就用了vue做渲染。然而又被提出了一個需求,需要相鄰的相同值的行數(shù)據(jù)項進行單元格合并,這就醉了。沒辦法,只能想辦法解決,下面通過這篇文章來一起看看吧。
    2016-11-11
  • 2種在vue項目中使用百度地圖的簡單方法

    2種在vue項目中使用百度地圖的簡單方法

    在本篇文章中我們給大家整理了2種關(guān)于VUE項目中使用百度地圖的最簡單的方法,非常實用,一起來學習下。
    2018-09-09
  • 關(guān)于Element-UI Table 表格指定列添加點擊事件

    關(guān)于Element-UI Table 表格指定列添加點擊事件

    這篇文章主要介紹了關(guān)于Element-UI Table 表格指定列添加點擊事件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Vue2?Dialog彈窗函數(shù)式調(diào)用實踐示例

    Vue2?Dialog彈窗函數(shù)式調(diào)用實踐示例

    這篇文章主要為大家介紹了Vue2?Dialog彈窗函數(shù)式調(diào)用實踐示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Vue生命周期中的組件化你知道嗎

    Vue生命周期中的組件化你知道嗎

    這篇文章主要為大家詳細介紹了Vue生命周期中的組件化,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Vue 實現(xiàn)一個簡單的鼠標拖拽滾動效果插件

    Vue 實現(xiàn)一個簡單的鼠標拖拽滾動效果插件

    這篇文章主要介紹了Vue 實現(xiàn)一個簡單的鼠標拖拽滾動效果插件,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下
    2020-12-12
  • vue項目中輪詢狀態(tài)更改方式(鉤子函數(shù))

    vue項目中輪詢狀態(tài)更改方式(鉤子函數(shù))

    這篇文章主要介紹了vue項目中輪詢狀態(tài)更改方式(鉤子函數(shù)),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • vue實現(xiàn)員工信息錄入功能

    vue實現(xiàn)員工信息錄入功能

    這篇文章主要為大家詳細介紹了vue實現(xiàn)員工信息錄入功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • 淺談vue引用靜態(tài)資源需要注意的事項

    淺談vue引用靜態(tài)資源需要注意的事項

    今天小編就為大家分享一篇淺談vue引用靜態(tài)資源需要注意的事項,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09

最新評論