MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 upgrade listeners added to [Server]

vue yekong

vue2 webpack js项目运行时,会出现下面的警告信息

MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 upgrade listeners added to [Server]. Use emitter.setMaxListeners() to increase limit
(Use `node --trace-warnings ...` to show where the warning was created)

查询后得知

在 Vue.js 项目中遇到 MaxListenersExceededWarning: Possible EventEmitter memory leak detected 警告,通常是因为某个事件监听器被多次添加,超过了默认的最大监听器数量(默认是 10 个)。这个问题可能会导致内存泄漏。

排查原因

通过代码排查发现是反向代理目录添加太多造成的,因为反向代理接口目录比较多造成的

  devServer: {
    port: 9545,
    open: true,
    overlay: {
      warnings: false,
      errors: true
    },
    proxy: {
      '/user': {
        target: 'https://www.wanjunshijie.com',
        changeOrigin: true
      },
      '/moneyLog': {
        target: 'https://www.wanjunshijie.com',
        changeOrigin: true
      },
      '/order': {
        target: 'https://www.wanjunshijie.com',
        changeOrigin: true
      },
      '/banner': {
        target: 'https://www.wanjunshijie.com',
        changeOrigin: true
      },
      '/basic': {
        target: 'https://www.wanjunshijie.com',
        changeOrigin: true
      },
      '/config': {
        target: 'https://www.wanjunshijie.com',
        changeOrigin: true
      },
      '/sysDictType': {
        target: 'https://www.wanjunshijie.com',
        changeOrigin: true
      },
      '/cash': {
        target: 'https://www.wanjunshijie.com',
        changeOrigin: true
      },
      '/bank': {
        target: 'https://www.wanjunshijie.com',
        changeOrigin: true
      },
      '/sysRole': {
        target: 'https://www.wanjunshijie.com',
        changeOrigin: true
      }
      // 可以继续添加更多的代理规则
    }
  },

解决方案

不做限制

vue.config.js中增加:require('events').EventEmitter.defaultMaxListeners = 0;

require('events').EventEmitter.defaultMaxListeners = 0; 这一段代码的意思是将 Node.js 中 EventEmitter 对象的默认最大监听器数量设置为无限制。具体来说:

  • require('events'):引入 Node.js 的 events 模块。
  • EventEmitter:从 events 模块中获取 EventEmitter 类。
  • defaultMaxListenersEventEmitter 类的一个静态属性,用于设置所有 EventEmitter 实例的默认最大监听器数量。
  • = 0:将 defaultMaxListeners 设置为 0,表示不限制监听器的数量。

虽然这种方法可以避免警告,但并不推荐作为长期解决方案,因为它可能掩盖了代码中的潜在问题,如重复添加监听器或内存泄漏。更好的方法是查找并优化代码,确保不会重复添加不必要的监听器。

喜欢