心智模型与准备
L03 安装、配置与第一次运行
本课目标
- 搭好可运行的最小工程
- 分清 runSync / runPromise / runFork / run*With
前置课时尚未完成:L02
可以自行跳转学习,但按顺序推进会更省力;学情分析会把这类缺口归入「前置缺口」。
最小工程(effect 4.1.4,单依赖零运行时依赖)
← 代码可左右滑动 →
npm install effect@4.1.4
// tsconfig.json 关键项
// { "strict": true, "module": "NodeNext", "target": "ES2022" }
import { Effect } from "effect"
const program = Effect.gen(function* () {
const name = yield* Effect.succeed("world")
yield* Effect.log("Hello, " + name + "!")
})
await Effect.runPromise(program)💡 v4 的 effect 是单包:HTTP、Schema、RPC、SQL 等都从 effect/* 子路径导入,不再需要额外的平台核心包。
运行边界怎么选
- runSync:纯同步程序;遇到异步边界会抛错,适合脚本与测试。
- runPromise / runPromiseExit:常规入口,后者把结果包成 Exit 而不抛。
- runFork:立即返回 Fiber handle,用于需要中断或手动 join 的场景。
- run*With(context):手里已有 Context<R> 时直接带上下文运行,跳过 Effect.provide。
⚠️ 让执行只发生一次
把所有 Effect 组合都留在库代码里,只在应用入口(main / 请求处理器)调用一次 run*。到处 run 会丢掉结构化并发、资源作用域与追踪上下文。
交互演练
关键术语
运行边界
把惰性蓝图交给 runtime 解释执行的唯一位置
default services
不开任何配置就存在的日志/调度/追踪等默认服务
常见误区
× 在工具函数内部随手 runPromise,导致上层无法重试或统一超时。
随堂测验(即时反馈,答题计入掌握度)
Q1一段含 Effect.promise 的程序用 runSync 执行会怎样?
Q2已经手动构造了 Context<R>,最直接的运行方式是?