
基于 GitHub Copilot 指令的 Azure Functions TypeScript 开发规范azure/functions4 与现代 Node.js 实践【免费下载链接】awesome-copilotCommunity-contributed instructions, agents, skills, and configurations to help you make the most of GitHub Copilot.项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-copilot导读本文以 awesome-copilot 仓库中的 Azure Functions TypeScript 开发指令 为核心系统讲解如何让 GitHub Copilot 为 Node.js 与 Azure Functions 项目生成高质量 TypeScript 代码从自定义指令文件的前置元数据frontmatter与applyTo生效范围到azure/functions4编程模型、按src/functions/resource-name-http-verb.ts规范组织端点文件再到优先使用 Node.js v22 LTS 内置模块与node:fs/promises等异步 API 的工程纪律。读完本文你将掌握一套可直接复制进工作区、可被 Copilot 自动加载执行的 Azure Functions TypeScript 编码规约以及同步维护 OpenAPI 与 README 的变更流程。一、这是什么一份面向 AI 编码助手的“行为契约”在 awesome-copilot 仓库中instructions/目录存放的是一系列自定义指令Custom Instructions文件用于定制 GitHub Copilot 在特定技术栈下的行为。与面向人类读者的教程不同这类文件的读者是 Copilot 本身——它以精确、命令式的条目约束模型在生成代码时的默认倾向。Azure Functions TypeScript 开发指令 正是其中之一。它的仓库索引描述只有一句话TypeScript patterns for Azure Functions见 docs/README.instructions.md 中的条目表但正文承载了完整的代码生成规范覆盖语言选型、异步风格、依赖管理、函数文件布局与文档同步五个维度。1.1 前置元数据指令如何被“定点”激活文件开头是 YAML frontmatter--- description: TypeScript patterns for Azure Functions applyTo: **/*.ts, **/*.js, **/*.json ---description用一句话说明该指令的目的与适用范围供 Copilot 在检索与加载时理解语义applyToglob 模式声明指令作用于哪些文件。这里覆盖.ts、.js与.json三类文件意味着只要工作区中打开或引用这些类型的文件该指令就有机会参与上下文。关于 frontmatter 的完整规范如applyTo支持单模式**/*.ts、多模式逗号分隔、指定目录src/**/*.py、全量**可参阅仓库中的 自定义指令文件编写指南该文件本身就是一份关于如何写指令的指令与本文件互为印证。1.2 安装与生效方式按 docs/README.instructions.md 中的使用说明将该文件接入项目有两种途径将内容复制到工作区根目录的.github/copilot-instructions.md放到工作区的.github/instructions/目录下例如.github/instructions/azure-functions-typescript.instructions.md作为任务级指令文件。安装后Copilot 在对应文件上工作时会自动遵循这些规则无需人工切换模式。仓库 CONTRIBUTING.md 也强调此类指令文件应当具体、可执行、聚焦单一技术栈这正是本文件短小精悍却信息密度高的原因。二、代码生成总纲现代 TypeScript × Node.js v22 LTS指令正文的第一组条目定义了所有生成代码必须遵守的基调2.1 生成现代 TypeScript- Generate modern TypeScript code for Node.js这意味着默认产出带类型标注、面向当前 Node.js 生态的 TypeScript 代码而不是能跑的 JS 加类型注释。在 Azure Functions 的 v4 编程模型azure/functions4下函数入口的类型、绑定输入/输出类型都应由类型系统完整表达从而获得编译期检查与编辑器的 IntelliSense 支持。2.2 异步优先async/await是唯一风格- Use async/await for asynchronous code指令明确要求所有异步逻辑一律使用async/await而非回调或裸 Promise 链。在 Azure Functions 的 Node.js 运行时中函数处理器handler本身即被声明为async函数await贯穿 I/O 操作全流程既能保证异常通过拒绝的 Promise 向上传播进而被运行时捕获、记录、触发重试也让代码顺序可读、易于测试。2.3 优先内置模块Node.js v22 LTS 的工程红利- Whenever possible, use Node.js v22 LTS built-in modules instead of external packages这是本文件最具特色的约束之一能用 Node.js v22 LTS 内置模块解决的就不要引入外部依赖。理由很实际减少node_modules体积与安装时间降低供应链攻击面内置模块随运行时升级获得安全修复无需自行跟进版本在 Azure Functions 这种冷启动敏感的无服务器环境中更少的依赖解析意味着更快的启动。Node.js v22 LTS 的常用内置模块包括node:fs、node:path、node:url、node:crypto、node:http、node:stream、node:util、node:assert、node:os等。撰写文件、解析 URL、生成哈希这类常见场景都应当优先使用它们而不是引入 lodash、fs-extra、uuid 等替代品。2.4 用node:fs/promises代替fs永不阻塞事件循环- Always use Node.js async functions, like node:fs/promises instead of fs to avoid blocking the event loopNode.js 的fs模块提供同步readFileSync与回调readFile两类 API其中同步 API 会阻塞事件循环在函数执行期间暂停对所有其他请求的处理。指令给出的替代方案是node:fs/promises——Promise 风格的异步文件系统 API// ❌ 阻塞事件循环函数执行期间其他请求全部排队 import { readFileSync } from node:fs; const data readFileSync(/path/to/config.json, utf8); // ✅ 异步非阻塞配合 async/await 风格统一 import { readFile } from node:fs/promises; const data await readFile(/path/to/config.json, utf8);node:fs/promises与async/await天然契合它返回 Promise可以直接被函数处理器await异常也会被正常捕获。从源码结构看该仓库中大量扩展脚本如 extensions/pr-artifact-explorer/server.mjs、extensions/signals-dashboard/extension.mjs 等都采用了node:fs/promises风格印证了这一模式在仓库内部的普遍性。2.5 依赖纪律加包前先问- Ask before adding any extra dependencies to the project指令要求 Copilot 在引入任何新依赖前先向开发者确认。这是一道针对模型幻觉式加依赖的闸门——AI 在生成代码时容易顺手引入实际上并不需要的包或引入并不存在/版本错误的包。遵循此规则时Copilot 应在生成代码前明确说明需要哪个包、解决什么问题、是否有内置模块或现有依赖可替代经确认后再写入package.json。三、项目骨架azure/functions4与函数文件布局3.1 技术底座azure/functions4- The API is built using Azure Functions using azure/functions4 package.指令明确 API 层使用 Azure Functions 的v4 Node.js 编程模型azure/functions4。v4 模型的核心特征是基于app对象的注册式 API不再需要单独的function.json配置文件触发器与绑定直接在 TypeScript 代码中通过app.http()、app.timer()、app.storageQueue()、app.serviceBusQueue()、app.cosmosDB()等方法声明。仓库中的 Azure Static Web Apps 技能 给出了一个 v4 模型下 HTTP 触发器的完整示例可作为本指令落地的参照const { app } require(azure/functions); app.http(message, { methods: [GET, POST], authLevel: anonymous, handler: async (request) { const name request.query.get(name) || World; return { jsonBody: { message: Hello, ${name}! } }; } });对照可见 v4 模型的几个要点app.http(name, options)的第一参数是函数名称第二参数用methods声明 HTTP 方法、authLevel声明授权级别handler是async函数接收HttpRequest返回包含jsonBody的响应对象请求查询参数通过request.queryURLSearchParams读取。指令与示例共同强调的正是本文开头的总纲async/await、现代模块风格、声明式注册。3.2 命名规范一个端点一个文件- Each endpoint should have its own function file, and use the following naming convention: src/functions/resource-name-http-verb.ts指令为 API 目录布局定下了硬性规范每个端点一个独立文件——禁止把多个 HTTP 处理器堆在同一个文件里便于定位、评审与测试统一路径前缀src/functions/——函数源码全部位于src/functions目录下命名模板resource-name-http-verb.ts——资源名名词 HTTP 动词小写动词直接标注入文件名。典型目录如下src/functions/ ├── users-get.ts # GET /api/users ├── users-post.ts # POST /api/users ├── users-userId-get.ts # GET /api/users/{userId} └── users-userId-delete.ts # DELETE /api/users/{userId}这种资源-动词命名使 Copilot 在生成新端点时能自动匹配既有风格新建创建订单接口即生成orders-post.ts修改查询订单即定位orders-get.ts文件名本身就是一份微型的 API 清单。结合 3.1 的app.http()写法每个文件的大致形态为// src/functions/users-post.ts import { app, HttpRequest, HttpResponseInit, InvocationContext } from azure/functions; app.http(users-post, { methods: [POST], authLevel: function, route: users, handler: async (request: HttpRequest, context: InvocationContext): PromiseHttpResponseInit { context.log(Creating user); const body await request.json() as { name: string }; // ...业务逻辑建议委托给独立 service保持 handler 薄 return { status: 201, jsonBody: { id: new-id, name: body.name } }; } });需要说明的是指令文件本身只规定了命名规范与app.http所在技术栈azure/functions4上述route、HttpResponseInit等具体用法属于 v4 模型的通用能力以仓库 skills/azure-static-web-apps/SKILL.md 中的示例为证methods、authLevel、handler、request.query、jsonBody均是仓库内实际出现的 API 形态。3.3 与 C# 版指令的呼应仓库中另有一份 Azure Functions C# 开发指令采用完全相同的instructions体裁但面向 .NET isolated worker 模型。两相对照可以看出这套指令集的统一设计哲学维度TypeScript 版本文C# 版运行模型azure/functions4v4 编程模型isolated worker 模型异步纪律async/awaitnode:fs/promisesasync/await禁止.Result/.Wait()依赖纪律加包前先确认通过 DI 注入避免外部客户端滥用业务逻辑端点文件保持精简命名即 API 清单业务逻辑抽到可测试的 service经 DI 注册可观测性未在本文件展开ILoggerT结构化日志、Application Insights两份指令都强调保持函数薄、不阻塞、关注可测试性只是落点在不同语言生态。若你的团队同时维护 Node 与 .NET 两套函数应用可对照阅读两份文件保持规约一致。四、变更流程纪律改 API 必改 OpenAPI 与 README- When making changes to the API, make sure to update the OpenAPI schema (if it exists) and README.md file accordingly.指令最后一条是变更时的文档同步义务任何对 API 的改动都必须同步更新OpenAPI schema如果项目存在——新增/删除端点、修改参数或响应结构都要反映到 OpenAPI 描述文件中保证 API 文档与实现一致供 API 网关、代码生成器和客户端团队消费README.md——项目根 README 中关于接口清单、调用方式、示例的部分需要同步更新。这是一条典型的防止文档漂移规则AI 生成的代码容易只改实现不碰文档导致文档过期、误导下游。将同步文档列为硬性要求等于把文档维护纳入了每次代码变更的完成定义Definition of Done。仓库整体也遵循同样的精神——CONTRIBUTING.md 要求新增内容后运行npm start更新 README 生成表说明代码变更伴随文档更新是该仓库的一贯约定。五、落地检查清单与延伸阅读5.1 如何验证指令已生效在 VS Code 中打开任意.ts文件向 Copilot 提问给这个项目新增一个获取订单的端点观察生成的目录是否符合src/functions/orders-get.ts检查生成代码是否默认async/await、是否使用node:fs/promises而非fs同步 API观察 Copilot 是否在引入新 npm 包前停下来征询确认。5.2 延伸阅读仓库内资源Azure Functions TypeScript 指令原文本文的直接来源自定义指令文件编写指南frontmatter 字段与applyToglob 的完整规范Azure Static Web Apps 技能azure/functionsv4 模型 SWA 本地模拟/部署的实战示例含apiRuntime配置与 GitHub Actions 工作流Azure Functions C# 开发指令同体裁的 .NET 对照版本docs/README.instructions.md全部自定义指令的索引与安装、使用方式说明CONTRIBUTING.md贡献与维护约定包括指令文件的编写质量准则。将本文作为你接入 awesome-copilot 指令体系的起点把 azure-functions-typescript.instructions.md 安装进工作区即可让 GitHub Copilot 在你的 Azure Functions TypeScript 项目上遵循同一套现代、非阻塞、依赖克制的工程规范。【免费下载链接】awesome-copilotCommunity-contributed instructions, agents, skills, and configurations to help you make the most of GitHub Copilot.项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-copilot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考