无法部署网站至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:
- 安装依赖:
npm install mitt # 或 yarn add mitt
- 修改
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
相关产品推荐
相关产品推荐

