javascript - React 服务器端 + Nodejs setInterval 内存泄漏

标签 javascript node.js reactjs express memory-leaks

在我的通用 React 应用程序中,我在 componentWillMountclearInterval< 中有一个包含 setInterval 的 React 组件componentWillUnmount 中。

幸运的是,componentWillUnmount 没有在服务器上调用。

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

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

我的 express 服务器出现崩溃和内存泄漏问题。我创建了堆转储并在 chrome 内存工具上分析了这些。

不幸的是,没有成功找到内存泄漏。因此,当我通过检查窗口对象的 typeof 从服务器端逻辑中删除 setInterval 时。从那以后我没有制造任何崩溃。所以,我想知道上面的代码是内存泄漏的原因,为什么?

最佳答案

您可以安全地将您的方法迁移到未在服务器上调用的 componenDidMount

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);
}

如果你使用的是 webpack,你可以在配置中定义一个环境变量

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

并使用条件 process.env.BROWSER && "your code"

关于javascript - React 服务器端 + Nodejs setInterval 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47969931/

相关文章:

javascript - 我的 html 表单验证不起作用

node.js - 如何在nodejs中访问 Controller 中的常量变量

node.js - ZeroMQ 推/拉和 Nodejs 读取流

javascript - react组件如何传值给上一个页面组件

javascript - 如何更改 KeyboardTimePicker (material-ui-pickers) 中的图标?

Javascript "onmousemove()"在 Chrome 中有效,但在 Firefox 中无效

javascript - ES6 箭头函数正在改变 Meteor.publish 中 this 的范围

javascript - CKEDITOR.document 和 CKEDITOR.dom.document 有什么区别?

node.js - Node js buffer.toString() 编码问题

testing - 什么时候应该在 Enzyme/React 测试中使用 render 和 shallow?