简介
控制器模块。从 electron/controller/ 加载控制器文件,将导出的类转换为可调用的方法映射对象。每个前端 IPC 请求通过 {controller}/{name}/{method} 通道格式路由到对应的控制器方法。
模块同时提供同步加载(loadController,适用于 CJS 项目)和异步加载(loadControllerAsync,适用于 ESM 项目)。线程安全标志防止并发同步/异步加载——在异步加载期间调用同步方法会抛出错误。
内部支持两种加载模式:
- Bundle 模式(注册表):从
globalThis.__EE_CONTROLLER_REGISTRY__读取预注册的控制器模块,由 esbuild 插件在构建时填充。 - Dev 模式(文件系统):使用
scanDirSync/scanDirAsync递归扫描文件系统。
类控制器通过 wrapClass() 处理,遍历原型链并通过 methodToMiddleware() 将每个方法转换为中间件函数。每次中间件调用创建新的控制器实例,确保多个请求并发时的安全性。
导出结构示例:
controller/
user.js -> { controller: { user: { add: fn, delete: fn } } }
admin/login.js -> { controller: { admin: { login: { auth: fn } } } }导入
CJS 和 ESM:
// ESM
import { loadController, loadControllerAsync, getControllers, getController } from 'ee-core/controller';
// CJS
const { loadController, loadControllerAsync, getControllers, getController } = require('ee-core/controller');API
loadController()
说明:同步加载控制器。使用 require() 加载所有控制器文件,适用于 CJS 项目。内部创建 ControllerLoader 实例并调用其 load() 方法,先检查 globalThis.__EE_CONTROLLER_REGISTRY__(bundle 模式),再回退到文件系统扫描(dev 模式),使用 caseStyle: 'lower'。 参数:无 返回值:Record<string, unknown> — 控制器方法映射对象,结构为 { controller: { module: { method: fn } } }示例:
import { loadController } from 'ee-core/controller';
const controllers = loadController();
// 结果: { controller: { user: { add: fn, delete: fn } } }参见:ee-core/controller/controller_loader 中的 ControllerLoader 类
loadControllerAsync()
说明:异步加载控制器。使用动态 import() 加载所有控制器文件,适用于 ESM 项目。在异步操作期间设置内部 loading 标志以防止并发同步加载。标志在 finally 块中清除,确保即使加载失败也能重置。 参数:无 返回值:Promise<Record<string, unknown>> — 控制器方法映射对象,结构为 { controller: { module: { method: fn } } }示例:
import { loadControllerAsync } from 'ee-core/controller';
const controllers = await loadControllerAsync();getControllers()
说明:获取所有已加载的控制器。如果控制器尚未加载,会自动触发同步加载(loadController())。如果当前正在进行异步加载,则抛出错误——此时必须先等待 loadControllerAsync() 完成。 参数:无 返回值:Record<string, unknown> — 控制器方法映射对象 示例:
import { getControllers } from 'ee-core/controller';
const controllers = getControllers();getController()
说明:getControllers() 的别名。返回相同的控制器方法映射对象。 参数:无 返回值:Record<string, unknown> — 控制器方法映射对象 示例:
import { getController } from 'ee-core/controller';
const controllers = getController();参见:getControllers
ControllerLoader 类
内部加载器类,处理实际的控制器文件扫描和方法包装。从 ee-core/controller/controller_loader 导出,供高级使用。
// ESM
import { ControllerLoader } from 'ee-core/controller/controller_loader';
// CJS
const { ControllerLoader } = require('ee-core/controller/controller_loader');ControllerLoader.constructor()
说明:创建新的 ControllerLoader 实例,包含内部 Timing 对象用于性能追踪。 参数:无 返回值:ControllerLoader 实例
ControllerLoader.load()
说明:同步控制器加载。先检查 globalThis.__EE_CONTROLLER_REGISTRY__(bundle 模式);若无则回退到文件系统扫描(dev 模式)。使用 FileLoader,配置 caseStyle: 'lower' 和自定义 initializer,通过 wrapClass() 包装类控制器。通过 Timing.start() / Timing.end() 记录耗时。 参数:无 返回值:Record<string, unknown> — 控制器方法映射对象,结构为 { controller: { module: { method: fn } } }
ControllerLoader.loadAsync()
说明:异步控制器加载(ESM 支持)。与 load() 流程相同,但使用 FileLoader.loadAsync(),其中用 import() 替代 require() 加载文件。通过 Timing.start() / Timing.end() 记录耗时。 参数:无 返回值:Promise<Record<string, unknown>> — 控制器方法映射对象
