You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法部署网站至Vercel等平台:EventEmitter导出错误求助

解决Vercel部署时"EventEmitter is not exported by __vite-browser-external"错误

问题原因

你代码中import {EventEmitter} from "events"引入的是Node.js内置的events模块,这个模块仅在Node.js服务端环境可用,浏览器环境并没有内置该模块。Vite在打包浏览器端代码时,会将events标记为浏览器外部依赖(即__vite-browser-external),导致无法找到EventEmitter的导出,从而触发部署错误。

解决方案

方案1:自定义简易EventEmitter

不需要额外安装依赖,直接在Sizes.js中实现一个轻量的EventEmitter替代Node.js版本:

// 自定义简易事件发射器
class EventEmitter {
  constructor() {
    this.events = {};
  }

  // 监听事件
  on(event, callback) {
    if (!this.events[event]) {
      this.events[event] = [];
    }
    this.events[event].push(callback);
  }

  // 触发事件
  emit(event, ...args) {
    if (this.events[event]) {
      this.events[event].forEach(callback => callback(...args));
    }
  }
}

export default class Sizes extends EventEmitter {
  constructor() {
    super();
    this.width = window.innerWidth;
    this.height = window.innerHeight;
    this.aspect = this.width / this.height;
    this.pixelRatio = Math.min(window.devicePixelRatio, 2);
    this.frustrum = 5;

    window.addEventListener("resize", () => {
      this.width = window.innerWidth;
      this.height = window.innerHeight;
      this.aspect = this.width / this.height;
      this.pixelRatio = Math.min(window.devicePixelRatio, 2);
      this.emit('resize')
    })
  }
}

方案2:使用第三方轻量事件库(如mitt)

如果不想自己实现,可以使用专门为浏览器环境设计的轻量事件库mitt:

  1. 安装依赖:
npm install mitt
# 或
yarn add mitt
  1. 修改Sizes.js代码:
import mitt from 'mitt';

export default class Sizes {
  constructor() {
    this.emitter = mitt();
    this.width = window.innerWidth;
    this.height = window.innerHeight;
    this.aspect = this.width / this.height;
    this.pixelRatio = Math.min(window.devicePixelRatio, 2);
    this.frustrum = 5;

    window.addEventListener("resize", () => {
      this.width = window.innerWidth;
      this.height = window.innerHeight;
      this.aspect = this.width / this.height;
      this.pixelRatio = Math.min(window.devicePixelRatio, 2);
      this.emitter.emit('resize')
    })
  }

  // 对外暴露监听方法,保持原有调用逻辑一致
  on(event, callback) {
    this.emitter.on(event, callback);
  }
}

两种方案都能解决浏览器环境下的EventEmitter缺失问题,确保代码能在Vercel等平台正常部署运行。

内容的提问来源于stack exchange,提问作者Kuba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:03:22