把 Effect 约定变成机器可检查的规则:language service 与 effect-scan
约定写在文档里会过期。用 @effect/language-service 查类型层,用 effect-scan 与 rules.json 查语法层:一个规则一个 owner、合同与生成物分离、信号与阻断分开。
按主题展开的 Effect 实践:服务与 Layer、Schema、Stream、HTTP、SQL、可观测性、迁移与规则。(共 16 篇)
约定写在文档里会过期。用 @effect/language-service 查类型层,用 effect-scan 与 rules.json 查语法层:一个规则一个 owner、合同与生成物分离、信号与阻断分开。
在 effect 4.0.5 上逐条验证的 v3 到 v4 迁移清单:catchAll、Either、Effect.Service、fork 等改名,以及 runPromise 拒绝值等行为差异。
用 effect/ai 把 LLM 调用建模成 LanguageModel 服务:AiError 的 reason、重试与超时的顺序、ExecutionPlan 回退,全部用本地替身验证,不调用真实 API。
当一个业务流程要跨越进程重启与人工等待,普通 Effect.gen 就不够了。本文用 effect/workflow 讲 Activity 记忆化、三层幂等、补偿的真实语义,并用 SQLite 实测重启后的恢复。
前端状态混乱,往往因为同一个事实被多处持有。本文用 effect/reactivity 与 @effect/atom-react 讲 Atom 数据流、Layer 注入与持久化,以及 Schema 与表单库的边界,代码已实测。
可观测性不是多打点,而是决定哪些事实进 span、哪些进日志、哪些进 Metric。本文讲 Effect.fn 命名约定、Metric 的基数纪律、OTLP 导出与 ErrorReporter,并给出可运行的 span 断言写法。
用 effect/sql 的 Model 从一份字段声明派生数据库与 JSON 变体,用 withTransaction 保证回滚,再用 effect/rpc 把契约放进共享文件,让传输失败和业务错误在类型里各归其位。
用 effect/http 的 HttpClient 把传输、状态码、解码与超时放进错误通道,用 HttpApi 一份定义同时得到服务端、客户端和文档,再用 toWebHandler 接到 Workers 这类 fetch 运行时。
把重试、轮询、定时任务统一成 Schedule 策略值:怎么组合退避、上限与抖动,哪些错误该重试,以及 repeat、timeout、cron 和限流的边界。
讲清 Effect Stream 的 pull 背压、数组分块、buffer 策略,以及它与 Queue、PubSub 的分工,并给出何时该用 Stream 而不是数组或 async iterator 的判断标准。
Effect 程序只应在入口被运行:Node 用 runMain,长驻服务用 ManagedRuntime,Workers 按请求提供 Layer。再讲 @effect/vitest、TestClock 与内置的 tracing。
从 Fiber 和 Effect.all/forEach 的并发选项讲到 Scope、acquireRelease,再到中断如何保证清理一定执行。所有代码在 Effect v4 下通过 strict 编译,并标出与 v3 的命名差异。
用 Effect v4 的 Schema 在系统边界解码未知数据:定义 Schema、拿到类型化的 SchemaError、累积全部字段错误,并让 TypeScript 类型、编码格式与校验逻辑都来自同一份定义。
用 Effect v4 的 Context.Service 与 Layer 做依赖注入:如何定义服务、构造与组合 Layer、写测试替身,以及为什么 Effect<A, E, R> 里的 R 参数是一个值得喜欢的设计。
用 Data.TaggedError 把错误写进 Effect 的 E 参数,用 catchTag 精确恢复,再分清预期失败与缺陷 defect。代码均已通过 tsc strict 编译验证。
用 async/await 写 TypeScript 时,错误和依赖都藏在类型之外。本文从 Effect<A, E, R> 三个类型参数和 Effect.gen 讲起,说明 Effect v4 到底改变了什么。