From e738135df929735f4108adba27b6436dc97d1ac0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A5=9D=E5=BD=AD=E8=BE=89?= Date: Tue, 9 Sep 2025 21:18:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=94=AF=E6=8C=81=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E7=AB=AF=E7=9A=84eventCenter=E4=BB=A3=E7=90=86?= =?UTF-8?q?=E7=B1=BB=EF=BC=8C=E8=A7=A3=E5=86=B3=E4=BB=8E@tarojs/taro?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E7=9A=84eventCenter=E4=B8=BA=E7=A9=BA?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nextjs/taro/src/basics/eventCenter.ts | 84 +++++++++++++++++++ packages/nextjs/taro/src/basics/index.ts | 1 + packages/nextjs/taro/src/index.ts | 8 +- 3 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 packages/nextjs/taro/src/basics/eventCenter.ts diff --git a/packages/nextjs/taro/src/basics/eventCenter.ts b/packages/nextjs/taro/src/basics/eventCenter.ts new file mode 100644 index 0000000..0f27d65 --- /dev/null +++ b/packages/nextjs/taro/src/basics/eventCenter.ts @@ -0,0 +1,84 @@ +/** + * Taro事件中心代理类 + * 实现客户端懒加载@tarojs/runtime中的eventCenter + * 解决从@tarojs/taro导入的eventCenter为空的问题 + */ +import promisify from 'mpromisify' +import { limited } from '../_util' + +// 单例实例 +let instance: EventCenterProxy + +interface EventCenterProxy { + ready: boolean + eventCenter: any + pendingCalls: any[] +} + +class EventCenterProxy { + constructor() { + if (instance) { + return instance + } + + this.ready = false + this.eventCenter = null + this.pendingCalls = [] + // eslint-disable-next-line @typescript-eslint/no-this-alias + instance = this + } + + // 获取单例实例 + static getInstance() { + if (!instance) { + instance = new EventCenterProxy() + } + return instance + } + + // 加载真实eventCenter + async loadEventCenter() { + try { + const { eventCenter } = await import('@tarojs/runtime') + this.eventCenter = eventCenter + this.ready = true + + // 执行所有待处理的调用 + this.pendingCalls.forEach(({ method, args, resolve }) => { + resolve(this.eventCenter[method](...args)) + }) + this.pendingCalls = [] + } catch (error) { + console.error('加载eventCenter失败:', error) + // 失败时也执行待处理调用,避免阻塞 + this.pendingCalls.forEach(({ reject }) => reject(error)) + this.pendingCalls = [] + } + } + + // 创建代理方法 + createProxyMethod(method) { + return (...args) => { + if (this.ready) { + return this.eventCenter[method](...args) + } + + return new Promise((resolve, reject) => { + this.pendingCalls.push({ method, args, resolve, reject }) + const loadEventCenter = promisify( + limited.async('loadEventCenter', this.loadEventCenter) + ) + loadEventCenter() // 触发加载 + }) + } + } + + // 代理方法 + on = this.createProxyMethod('on') + off = this.createProxyMethod('off') + trigger = this.createProxyMethod('trigger') + once = this.createProxyMethod('once') +} + +// 导出代理类和单例实例 +export const eventCenter = EventCenterProxy.getInstance() diff --git a/packages/nextjs/taro/src/basics/index.ts b/packages/nextjs/taro/src/basics/index.ts index ea03a18..6193bf7 100644 --- a/packages/nextjs/taro/src/basics/index.ts +++ b/packages/nextjs/taro/src/basics/index.ts @@ -20,3 +20,4 @@ export * from './system' export * from './update' export * from './debug' export * from './performance' +export * from './eventCenter' diff --git a/packages/nextjs/taro/src/index.ts b/packages/nextjs/taro/src/index.ts index 4565200..a35f4dd 100644 --- a/packages/nextjs/taro/src/index.ts +++ b/packages/nextjs/taro/src/index.ts @@ -1,3 +1,6 @@ +// Taro API 的 Next.js 兼容实现 +// 提供与 Taro 官方 API 完全一致的接口,但适配 Next.js 环境 + import { // debug setEnableDebug, @@ -11,7 +14,8 @@ import { getAppAuthorizeSetting, getSystemInfoSync, getSystemInfoAsync, - getSystemInfo + getSystemInfo, + eventCenter } from './basics' import { @@ -184,6 +188,7 @@ export { getSystemInfoSync, getSystemInfoAsync, getSystemInfo, + eventCenter, createOffscreenCanvas, createCanvasContext, @@ -323,6 +328,7 @@ export default { getSystemInfoSync, getSystemInfoAsync, getSystemInfo, + eventCenter, createOffscreenCanvas, createCanvasContext,