generator 是 javascript 原生协程机制,通过 yield 拆解请求生命周期为可插拔、可测试、可跳过的拦截单元,强调职责单一、契约显式、副作用外移与可维护性。

Generator 本身不是“语法糖”,而是 JavaScript 中原生的协程机制;它不直接提供“防腐拦截层”能力,但能成为构建高可维护网关系统的核心控制流骨架——关键在于用它的暂停/恢复特性,把请求生命周期中各环节(鉴权、参数校验、路由分发、响应转换、错误兜底)拆解为可独立测试、可插拔替换、可按需跳过的逻辑单元。
用 yield 拆解拦截链,每个环节自描述、可隔离
不要把所有逻辑塞进一个函数。每个 yield 应代表一个明确职责的拦截步骤,返回结构化指令而非原始数据:
- 统一返回 { type: 'AUTH_CHECK', payload: { token } } 而非直接 throw 或 return boolean
- 每个步骤只做一件事:校验就只校验,转换就只转换,不混杂副作用(如修改全局状态、发起请求)
- 为每个 yield 添加唯一 id 字段(如 'auth-jwt-v2'),调用方据此启用/禁用特定拦截器,无需改 Generator 内部代码
输入输出契约显式化,杜绝隐式行为
Generator 的参数和 yield 值必须类型固定、字段稳定:
PigX UI Pro 前端开发指南 - Vue 3 + TypeScript + Element Plus。当用户提到 PigX UI、PigX 前端、lgb-mgui 项目、Vue 3 企业级后台开发、Element Plus 后台开发时使用此技能。
- 用 TypeScript interface 定义入参:interface GatewayContext { request: Request; config: GatewayConfig }
- yield 值强制为 { type: string; payload: any; meta?: { id: string; skipIf?: (ctx) => boolean } }
- 禁止根据环境变量或配置动态改变 yield 结构(例如 PROD 下多 yield 一个日志步骤),那会破坏调用方对流程的静态推断
副作用外移,Loader + Handler 分离
Generator 本身不执行 I/O、不读本地缓存、不调 API:
- 所有外部依赖收口到 loader 函数(如 loadUserFromToken(token)),由调用方注入并控制缓存策略
- Generator 只接收 loader 返回的纯数据,再决定是否 yield AUTH_FAILED 或继续下一步
- 错误处理统一交由外部执行器捕获 throw,Generator 内部不 try/catch 网络异常,保持逻辑干净
可跳过性与可重放性设计
真实网关需支持灰度、AB 测试、故障降级——这要求每步拦截能被安全跳过或重试:
- yield 指令带 skipIf 函数,执行器在调用 next() 前判断是否跳过该步(如 skipIf: ctx => ctx.headers['x-bypass-auth'] === '1')
- yield 指令带 id 和 version(如 id: 'cors-header-v3'),执行器可基于版本号决定是否重放某步(用于调试或热修复)
- 避免 yield 大对象(如整个 request.body),只 yield 操作意图 + 关键标识符,具体数据延迟加载
不复杂但容易忽略:防腐层的价值不在“拦得多”,而在“换得快”。Generator 提供的不是魔法,而是让每个拦截点变成螺丝钉——型号统一、拧紧松开方便、坏了即换不牵连。真正提升可维护性的,是接口定义的刚性,不是语法的炫技。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










