Runtime 0.3.0:统一的 Serverless 框架(适用于 TypeScript)

发布: (2026年1月7日 GMT+8 08:00)
7 min read
原文: Dev.to

Source: Dev.to

一个代码库。三种上下文。零配置。

我们很高兴宣布 Runtime Web 0.3.0 —— 一个完整的无服务器框架,将 Lambda 后端、AWS CDK 基础设施和 React 前端统一到单一的、类型安全的 TypeScript 代码库中。

什么是 Runtime Web?

Runtime Web 是一个生产就绪的框架,消除在 AWS 上构建全栈无服务器应用的复杂性。将整个应用——后端基础设施前端——写在同一个地方,然后使用单个命令部署。

runtime({
  app: ({ router }) => ,
  router: runtimeRouter({ router, defaults }),
  config: { serviceName: 'my-app', stage: 'prod' },
  register: {
    users: {
      ties: [UsersTies],
      lambdas: [createUserHandler, getUserHandler]
    }
  }
});

这个单一入口点在任何地方都能工作:Lambda 执行、CDK 合成和浏览器水合。

核心特性

统一的 runtime() 入口

一个函数即可自动检测其执行上下文:

上下文检测方式行为
浏览器window 存在为 React 注入水合,客户端路由
LambdaAWS_LAMBDA_FUNCTION_NAME 环境变量使用依赖注入执行处理器
CDKCDK 合成上下文生成 CloudFormation

无需环境检查。无需条件导入。直接可用。

类型安全的依赖注入

通过 event.ties 访问服务,完整的 TypeScript 支持:

type PaymentTies = {
  paymentService: PaymentsService;
  billingService: BillingService;
};

export const chargeHandler: LambdaDefinition = {
  ties: { paymentService: PaymentsService, billingService: BillingService },
  handler: async (event, context) => {
    // 完整的 IntelliSense – 无需魔法字符串,无需哈希键
    const result = await event.ties.paymentService.charge(event.body);
    await event.ties.billingService.record(result);
    return { statusCode: 200, body: JSON.stringify(result) };
  }
};
  • 编译时检测缺失的依赖。
  • IDE 自动补全全部内容。

声明式微服务架构

将后端组织为逻辑微服务,并为每个服务提供独立的 DI 容器:

register: {
  payments: {
    ties: [PaymentsTies, BillingTies],
    lambdas: [chargeHandler, refundHandler, webhookHandler]
  },
  users: {
    ties: [UsersTies, AuthTies],
    lambdas: [createUserHandler, getUserHandler]
  }
}

每个微服务拥有自己的 Lambda Layer,预先构建依赖,避免因未使用的服务导致的冷启动开销。

Lambda 冷启动初始化

一次性执行昂贵操作,而不是在每次请求时都执行:

export const getUserHandler: LambdaDefinition = {
  ties: { db: DatabaseService },

  // 在冷启动期间 **仅运行一次** — 对所有调用进行缓存
  init: async (ties) => ({
    dbPool: await ties.db.createConnectionPool(),
    config: await loadRemoteConfig(),
    warmSdk: await warmupAwsSdk()
  }),

  // 每次请求访问缓存快照 — 零开销
  handler: async (event) => {
    const user = await event.snapshot.dbPool.query(event.pathParameters.id);
    return { statusCode: 200, body: JSON.stringify(user) };
  }
};

为何重要

  • 数据库连接只创建一次,跨数千次请求复用。
  • 远程配置仅加载一次,而不是每次冷启动都加载。
  • SDK 客户端在首次请求前预热。

event.snapshot 完全带类型 —— 对缓存资源的 IDE 自动补全。微服务层面同样适用 —— 在同一服务的所有处理器之间共享昂贵资源。

HTTP API 授权

内置对 JWT、IAM、Cognito 以及自定义 Lambda authorizers 的支持:

http: {
  method: 'POST',
  path: '/api/payments/charge',
  auth: {
    type: 'jwt',
    issuer: 'https://auth.example.com',
    audience: ['api.example.com']
  }
}

或使用最少配置的 Cognito:

auth: {
  type: 'cognito',
  userPoolId: 'us-east-1_xxxxx',
  region: 'us-east-1'
}

HTTP API 授权 – 生命周期与行为

声明式的路由级安全,为你的 API 端点提供保护:

Runtime Web HTTP API Authorization – Lifecycle & Behavior

React SSR 与流式渲染

使用 renderToPipeableStream() 进行服务器端渲染,并结合多层缓存:

  • CloudFront 边缘缓存 – 缓存路由的首字节时间 (TTFB) 可低于 200 ms。
  • S3 HTML 缓存 – 确定性的 ETag,自动失效。
  • 流式 HTML – 更快的 Time‑to‑First‑Byte。

irst‑Byte.

runtimeAsync 数据加载

用框架级抽象替代 React Router 的 loader

const routes: RuntimeRoute[] = [
  {
    path: '/products/:id',
    Component: ProductPage,
    runtimeAsync: [productRetriever, reviewsRetriever] // 并行执行
  }
];
  • 使用 Promise.allSettled 并行获取数据。
  • 自动加载 SEO 元数据。
  • 服务器端执行并在客户端进行 hydration。
  • 类型安全的 useRuntimeData() Hook。

内置 SEO 管理

SEO 元数据存储在 DynamoDB 中,并为每个路由自动提供,确保 Open Graph、Twitter Card 和 JSON‑LD 数据始终保持最新,无需额外操作。

自动更新的数据

// RuntimeHeadManager handles everything

// Access SEO data in components
const seo = useRuntimeSeoMeta();
  • 标题、描述、Open Graph、Twitter 卡片
  • JSON‑LD 结构化数据
  • 客户端导航更新

CLI 工具: runtime seo init, runtime seo sync

开发服务器(带 HMR)

本地开发使用热模块替换(Hot Module Replacement):

npx runtime dev
  • 使用 esbuild 进行文件监视
  • 基于 WebSocket 的实时重载
  • Lambda 模拟
  • 即时反馈循环

零配置 AWS 部署

CDK 构造会自动预置所有资源:

npx runtime deploy --stage prod

创建:

  • API Gateway HTTP API,使用 Lambda 集成
  • Lambda 函数,配备优化的层
  • S3 存储桶,用于静态资源和 SSR 缓存
  • CloudFront 分配,带边缘缓存
  • DynamoDB,用于 SEO 元数据
  • IAM 角色,具备最小权限原则的权限

CloudFront 缓存失效

部署时自动清除缓存:

// Enabled by default
clearCacheOnDeploy: true

无陈旧内容——用户可立即看到更新。

CLI 参考

CLI Commands

# Initialize new project
npx @worktif/runtime init

# Development
npx runtime dev              # Start dev server with HMR
npx runtime build           # Build all targets

# Deployment
npx runtime deploy --stage dev
npx runtime destroy --stage dev

# SEO Management
npx runtime seo init
npx runtime seo sync --stage dev

# Utilities
npx runtime cache-clear --stage dev
npx runtime stacks list
npx runtime doctor

多堆栈架构

可靠的部署,基础设施/运行时分离:

堆栈资源目的
基础设施堆栈S3, DynamoDB, CloudFront长期运行的基础设施
运行时 Web 堆栈Lambda, API Gateway, Layers, 等微服务运行时
运行时堆栈Lambda, API Gateway, Layers浏览器应用运行时

Lambda 函数在首次部署时即可获得正确的环境变量——不存在先有鸡还是先有蛋的问题。

性能目标

  • Lambda bundle: (details omitted in source)
  • Examples: (details omitted in source)

准备好构建吗? Run npx @worktif/runtime init and ship your first unified server‑less application today.

Back to Blog

相关文章

阅读更多 »

测试 z emoji i URL

Twitter X 限制推文为 280 个字符——超出会阻止发布。作为 Senior DevOps Engineer,我浪费了数小时手动裁剪文本。S...

第2章:Linux系统调用

Linux 系统调用 – 通往内核的“前门”。本文是《终极容器安全系列》的一部分,这是一个结构化的多章节指南,涵盖容器安全的各个方面。