学任何框架之前先回答三个问题:它替你做了什么决定、凭什么能做到、代价是什么。本章建立 Encore.ts 的完整心智模型,后面所有章节都是这个模型的展开。
官方的两句定位:
"Open source framework for building robust type-safe distributed systems with declarative infrastructure."
"Batteries included TypeScript framework for building distributed systems."
翻译成工程语言:Encore.ts 是一个 TypeScript 后端框架,它把传统上分离的两份资产——应用代码和基础设施配置——合并成同一份类型安全的声明:
写下这些声明后:本地 encore run 自动用 Docker 拉起 Postgres 和消息队列;部署到云上自动映射为 AWS RDS / SNS+SQS 或 GCP Cloud SQL / Pub/Sub;同时自动获得 API 文档、类型化客户端 SDK、分布式追踪 (distributed tracing) 和实时架构图。
| 常见误认 | 为什么不是 |
|---|---|
| "又一个 Express" | Express 只管 HTTP 路由;Encore 管到数据库、消息、定时任务、对象存储、密钥的全生命周期 |
| "TypeScript 版 Terraform" | 基础设施即代码 (Infrastructure as Code, IaC) 工具与应用代码是两份资产、两份漂移;Encore 只有一份 |
| "类似 Serverless 平台" | 它是开源框架,产出标准 Docker 镜像,可部署到任何地方;托管平台 Encore Cloud 是可选项 |
Encore 一切自动化能力的来源是静态分析 (static analysis):
"Encore works by using static analysis to understand your application."
CLI 内置的解析器(TypeScript 侧是用 Rust 写的 tsparser)在编译期扫描源码,识别以下声明并抽成一张依赖图,官方称之为应用模型:
这张图同时驱动五类产物:
关键推论:
"Any deviation is caught as a compilation error."
**写法偏离约定是编译错误,不是运行时惊喜。**忘了 encore.service.ts、api() 的类型写错、引用了不存在的数据库——都活不过 encore run。这既是新手的"框架税",也是团队协作和 AI 生成代码(第 17 章展开)的最大红利。
"When every stack looks different, all tools have to be general purpose."
Express 生态里每个项目的 DB 层、消息层、配置层都不一样,工具只能做通用的、浅层的分析。Encore 的对策是强制收敛技术栈——框架、解析器、运行时由同一团队协同设计,所以应用模型可以做到 100% 准确。代价是丢掉"想怎么写就怎么写"的自由。
Encore.ts 最独特的架构决策:业务代码是 TypeScript,但 HTTP 处理、校验、数据库连接池全部在 Rust 层。
官方基准(150 并发,5 次取最优):
| 框架 | req/s | P99 延迟 |
|---|---|---|
| Encore.ts | 121,005 | 2.3 ms |
| Bun + Zod | 101,611 | 3.7 ms |
| Elysia + TypeBox | 82,617 | — |
| Fastify + Ajv | 62,207 | 4.1 ms |
| Express + Zod | 15,707 | 11.9 ms |
"9x the throughput of Express.js with 80% less latency"
对开发者而言 Rust 完全透明:你写的仍是普通 TypeScript,性能、安全、校验下沉是"白拿"的。
Encore 把后端开发的基础设施需求收敛为一组原语 (primitives),全部以"包级变量声明"的形式表达。本教程为它们各设专章:
| 原语 | 声明方式 | 详见 |
|---|---|---|
| Service & API | new Service(...) + api(...) | 第 3–4 章 |
| SQL Database | new SQLDatabase(...) | 第 5 章 |
| Pub/Sub | new Topic(...) / new Subscription(...) | 第 7 章 |
| Cron Job | new CronJob(...) | 第 8 章 |
| Object Storage / Cache | new Bucket(...) / new CacheCluster(...) | 第 9 章 |
外加横切能力:校验(第 4 章)、鉴权(第 10 章)、流式 API(第 11 章)、中间件与可观测性(第 12 章)、密钥(第 8 章)。
原语声明的统一规则 所有原语必须是包级 (package-level) 变量,不能在函数体内创建——静态分析器要在编译期看见它们。这条规则贯穿全书,违反即编译错误。
| 层 | 内容 | 许可 |
|---|---|---|
| 开源框架 | 框架 + Rust 运行时 + CLI + 解析器 | MPL-2.0,自托管随意 |
| Encore Cloud | 托管控制面:自动开通基础设施到你自己的 AWS/GCP(BYOC)、CI/CD、Preview 环境 | 商业 SaaS,可选 |
自托管路径完全可用:encore build docker 产出标准镜像(第 16 章)。付费才有的是平台便利,不是框架能力。
| 维度 | Encore.ts | NestJS / Express | Terraform / Pulumi | tRPC |
|---|---|---|---|---|
| 范式 | 框架 + 运行时 + 声明式 IaC | Web 框架 | 纯 IaC | RPC SDK |
| 基础设施抽象 | 内置(DB/PubSub/Cron/Bucket) | 无 | 有,但与代码分离 | 无 |
| 类型安全 RPC | 自动生成客户端 | 无 | — | 有 |
| 自动追踪 / 文档 | 全内置 | 手动集成 | 无 | 无 |
| 运行时 | Rust | Node | — | Node |
| 云无关 | AWS / GCP / 自托管 | 是 | 是 | 是 |
Encore 的甜区:多服务 + 多基础设施依赖的分布式后端。反过来,单文件小工具、纯静态站点用它是杀鸡用牛刀。
请继续阅读:第2章:环境搭建。