2017-12-25 7 views
3

をリークし、私はcomponentWillUnmountcomponentWillMountsetIntervalclearIntervalを含む反応成分を有するよ反応します。は、サーバー側+ NodejsたsetIntervalメモリが私のユニバーサル反応するアプリケーションで

幸いにも、componentWillUnmountはサーバー上で呼び出されません。

componentWillMount(){ 
    this.checker = setInterval(this.checkForSubscription, 2000); 
} 

componentWillUnmount(){ 
    clearInterval(this.checker); 
} 

エクスプレスサーバでクラッシュやメモリリークが発生しています。私はヒープダンプを作り、クロムメモリツールでヒープダンプを分析しました。

残念ながら、メモリリークを見つけるのに成功しませんでした。したがって、ウィンドウオブジェクトのtypeofをチェックして、サーバー側のロジックからsetIntervalを削除すると、それ以来、私はクラッシュを起こさない。だから、私は上記のコードがメモリリークの原因であることを知りたいのですが、なぜですか?

答えて

0

私はそれを自分で見つけました。上記のコードの問題点は、componentWillUnmountがサーバー上で呼び出されていないため、サーバー側でclearIntervalを呼び出すことができないことです。したがって、サーバー上でメモリリークが発生します。

ウィンドウオブジェクトの存在のチェックを設定すると、クライアント側でのみ呼び出されます。したがって、以後サーバクラッシュはありません

0

あなたは安全にあなたがすることができますWebPACKのを使用している場合

componentDidlMount(){ 
    this.checker = setInterval(this.checkForSubscription, 2000); 
} 

componentWillUnmount(){ 
    clearInterval(this.checker); 
} 

あなたはまた、より多くのパッケージを使用していないことができcan-use-dom

import canUseDOM from 'can-use-dom'; 
componentWillMount(){ 
    canUseDOM && this.checker = setInterval(this.checkForSubscription, 2000); 
} 

componentWillUnmount(){ 
    clearInterval(this.checker); 
} 

のようにサーバー上で呼び出されないcomponenDidMountにメソッドを移行することができます設定でenv変数を定義するだけです

new webpack.DefinePlugin({ 
     'process.env': { 
     BROWSER: JSON.stringify(true), 
     }, 
    }), 

および使用条件process.env.BROWSER && "your code"

+0

これは、ウィンドウオブジェクトの存在を確認することで簡単に処理できます。私の質問は、サーバー上でcomponentWillUnmountが呼び出されていないので、ノードサーバーでメモリリークが発生するかどうかです。 –

+0

いいえ、3つの例すべてでメモリリークが発生しません –

関連する問題