十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

TypeSpec HTTP Server JS Emitter 使用与配置指南:从 `tsp compile` 生成到可运行的 Node.js 服务器

TypeSpec HTTP Server JS Emitter 使用与配置指南:从 `tsp compile` 生成到可运行的 Node.js 服务器 TypeSpec HTTP Server JS Emitter 使用与配置指南从tsp compile生成到可运行的 Node.js 服务器【免费下载链接】typespec项目地址: https://gitcode.com/GitHub_Trending/ty/typespectypespec/http-server-js是 TypeSpec 生态中面向 JavaScript 的 HTTP 服务端代码生成器emitter它读取用 TypeSpec 描述的 HTTP 服务定义输出一套类型安全的 Node.js 服务端脚手架路由器、服务接口、模型类型与操作函数让你只需实现业务逻辑即可获得完整可运行的服务器。本文以官方文档 emitter.md 为主体结合仓库内 lib.ts、index.ts 等源码完整讲解该 emitter 的安装、两种调用方式、全部配置选项的含义与默认值以及生成代码的运行模型读完即可在自己的 TypeSpec 项目中接入并调优该 emitter。安装在 TypeSpec 项目spec中作为普通依赖安装npm install typespec/http-server-js如果要在你自己的 TypeSpec 库中引用它则建议作为 peer 依赖安装npm install --save-peer typespec/http-server-js需要说明的是该包在 README.md 中被明确标注为高度实验性highly experimental可能包含破坏性变更与缺陷升级版本时请留意 CHANGELOG.md并注意代码可能需要随之更新。使用方式方式一命令行直接编译在包含 TypeSpec 服务定义如main.tsp的目录下执行tsp compile . --emittypespec/http-server-js--emit指定要运行的 emitter生成的代码默认输出到{output-dir}/typespec/http-server-js目录关于输出目录的调整见下文emitter-output-dir。方式二通过 tspconfig.yaml 配置在项目根目录的tspconfig.yaml中声明 emitteremit: - typespec/http-server-js需要附加选项时在options节点下按 emitter 名称分组书写emit: - typespec/http-server-js options: typespec/http-server-js: option: value仓库内部的真实用法可参考 eng/scripts/tspconfig.yaml它展示了在工程中把输出目录指到{output-dir}的写法emit: - typespec/http-server-js options: typespec/http-server-js: emitter-output-dir: {output-dir}Emitter options 详解官方文档在 emitter.md 中列出的选项包括features、omit-unreachable-types、no-format。结合源码 lib.ts 中的EmitterOptionsSchema我们可以在文档基础上补全每个选项的默认值、取值枚举与底层行为并补充文档未列出但源码中实际支持的express、datetime、emitter-output-dir选项。features类型object该选项用于按功能特性粒度控制生成的代码内容例如启用路由器、序列化、帮助函数等子模块的生成。需要说明的是在当前仓库的源码中http-server-js 的JsEmitterOptions接口见 lib.ts并未将features定义为结构化子选项features更接近于编译器层面的项目级功能开关——编译器配置中features为字符串数组用于启用对应的 compiler features见 config-schema.ts 与 config-loader.ts 中的校验逻辑。因此如果你的配置中确实需要声明features应以键值对象形式传入并确保键名与 emitter 支持的功能名称一致由于该选项处于演进中建议以当前安装版本的文档为准。omit-unreachable-types类型boolean默认值false控制模型接口的生成范围默认falseemitter 会为服务命名空间中的所有模型生成接口无论它们是否被某个 HTTP 操作引用设为true只生成从某个 HTTP 操作可达的类型从而显著缩减输出体积。这一行为在 index.ts 中有直接实现当未开启该选项时emitter 会调用visitAllTypes(jsCtx, jsCtx.service.type)遍历服务命名空间中的全部类型以确保输出完整的models模块而不是仅输出服务实现可达的子集if (!context.options[omit-unreachable-types]) { // Visit everything in the service namespace to ensure we emit a full models module // and not just the subparts that are reachable from the service impl. visitAllTypes(jsCtx, jsCtx.service.type); }配置示例options: typespec/http-server-js: omit-unreachable-types: trueno-format类型boolean默认值false控制生成代码的格式化默认falseemitter 会使用 Prettier 对生成的所有 TypeScript 代码进行格式化设为true跳过格式化步骤适合你已经配置了自己的格式化流水线、希望缩短生成时间的场景。该逻辑同样位于 index.tswriteModuleTree的最后一个参数由!context.options[no-format]决定是否格式化await writeModuleTree( jsCtx, context.emitterOutputDir, jsCtx.rootModule, !context.options[no-format], );express源码补充类型boolean默认值false开启后生成的路由器除了提供面向 Node.js 原生 HTTP 服务器的dispatch方法外还会暴露符合 Express.js 中间件接口的expressMiddleware属性。关闭时生成的 router 上不存在该属性。datetime源码补充类型temporal-polyfill | temporal | date-duration默认值temporal-polyfill决定 TypeSpec 的DateTime/Duration类型映射为哪种 JavaScript 日期时间模型temporal-polyfill默认使用temporal-polyfill包提供的 Temporal APItemporal使用目标环境原生支持的 Temporal API未来将成为默认值date-duration使用内置Date加自定义Duration类型官方不推荐。emitter-output-dir源码补充类型absolutePath默认值{output-dir}/typespec/http-server-js定义生成代码的输出目录。可在tspconfig.yaml中覆盖为{output-dir}或其他绝对路径参见上文工程内示例。注意运行 emitter 时会先删除该目录下已生成的src/generated子目录再重新生成以保证输出与最新 TypeSpec 定义一致见 index.ts因此请勿把手工维护的代码放进src/generated。生成代码结构与运行模型除选项外README.md 还系统介绍了生成代码的四大组成部分它们是理解上述选项实际作用尤其是omit-unreachable-types影响的模型接口的关键路由器Router生成代码中与你直接交互的顶层组件。emitter 会为每个服务生成一个静态路由器位于输出目录的http/router.js模块中。例如服务命名空间名为Todo时会导出createTodoRouter工厂函数import { createTodoRouter } from ../tsp-output/typespec/http-server-js/http/router.js; const router createTodoRouter(users, todoItems, attachments);createTodoRouter的参数是底层服务接口的实现见下文。随后可将路由器绑定到 Node.js HTTP 服务器const server http.createServer(); server.on(request, router.dispatch); server.listen(8080, () { console.log(Server listening on http://localhost:8080); });若开启了express选项还可以直接作为 Express 中间件使用import express from express; const app express(); app.use(router.expressMiddleware); app.listen(8080, () { console.log(Server listening on http://localhost:8080); });服务接口Service interfacesemitter 会为服务命名空间中的每一组操作方法生成对应的 TypeScript 接口。例如 TypeSpec 中定义namespace Users { route(/users) post op create(user: User): WithStandardErrors | UserCreatedResponse | UserExistsResponse | InvalidUserResponse; }则会生成输出于models/all/todo/index.js/** An interface representing the operations defined in the Todo.Users namespace. */ export interface UsersContext unknown { create( ctx: Context, user: User, ): Promise | UserCreatedResponse | UserExistsResponse | InvalidUserResponse | Standard4XxResponse | Standard5XxResponse ; }你需要提供该接口的实现并传入路由器。若实现中需要直接访问 HTTP 请求/响应对象请以HttpContext作为Context类型参数import { HttpContext } from ../tsp-output/typespec/http-server-js/helpers/router.js; import { Users } from ../tsp-output/typespec/http-server-js/models/all/todo/index.js; export const users: UsersHttpContext { async create(ctx, user) { // Implementation }, };这里正是omit-unreachable-types的用武之地关闭它默认会为命名空间内所有模型生成接口方便整体浏览开启后则只保留 HTTP 操作实际可达的类型。模型类型Modelsemitter 为服务操作涉及的每个模型类型生成 TypeScript 接口使服务实现能以类型安全的方式处理 HTTP 协议中传输的数据结构。操作函数Operation functions每个 HTTP 操作会生成一个操作函数负责请求的解析、校验与响应的序列化业务代码通常无需直接调用。整体调用链为HTTP 服务器 / Express 应用你的代码→ 路由器生成代码按路由、方法与共享路由元数据分发→ 操作函数生成代码反序列化 body / query / header 并校验→ 服务实现你的代码→ 操作函数生成代码把结果或错误转换为 HTTP 响应。该调用模型在源码中可得到印证入口 index.ts 依次执行createInitialContext创建上下文并解析服务、emitHttp生成 HTTP 相关代码、按需visitAllTypes、emitSerialization为所有需要的类型生成序列化代码最后清理旧目录并写回模块树。输出前的注意事项dry-run 支持该 emitter 声明了dryRun能力见 lib.ts可在不落盘的情况下预览生成逻辑诊断信息createInitialContext会在程序中找不到任何服务时报告no-services-in-program警告并中止输出程序中存在多个服务定义时则直接报错见 ctx.ts因此一个程序请只描述一个 HTTP 服务输出目录勿手工修改src/generated在每次编译时都会被整体删除重建实验性 API接口与生成代码结构仍可能随版本演进升级后建议先跑一遍编译并对比输出 diff。小结typespec/http-server-js的使用路径非常清晰安装依赖 → 用--emit或tspconfig.yaml声明 emitter → 按需调整express、datetime、omit-unreachable-types、no-format等选项 → 编译后拿到路由器、服务接口与模型类型 → 实现服务接口并挂载到 Node.js 或 Express 即可运行。在动手前建议同时阅读本文所引的 emitter.md官方参考、README.md生成代码模型以及 lib.ts选项 Schema以获取与所安装版本完全一致的细节。【免费下载链接】typespec项目地址: https://gitcode.com/GitHub_Trending/ty/typespec创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表