news 2026/10/30 22:45:51

AI Agent Skills 开发指南:基于 Genkit 与 npx 构建可插拔能力模块

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AI Agent Skills 开发指南:基于 Genkit 与 npx 构建可插拔能力模块

1. 从“skills”这个标题说起:它到底指什么

第一次看到“skills”这个标题,很多人会以为是某个泛泛而谈的能力清单,或者一份简历上的技能罗列。但结合热搜词里的 Agent Skills、Genkit、npx、Google Cloud 这些关键词,方向就非常明确了——这里说的 skills,是围绕 AI Agent 生态构建的一套可插拔能力模块,也就是让智能体能够调用外部工具、执行具体任务的能力单元。

我在实际接触这套东西之前,也走过一段弯路。最开始我以为 skills 就是写几个 prompt 模板,后来发现完全不是一回事。Prompt 是告诉模型“怎么说话”,而 skills 是告诉 Agent“怎么做事”。这个区别非常关键。一个 skill 本质上是一个封装好的能力包,里面包含了触发条件、执行逻辑、依赖工具、输入输出定义,以及错误处理策略。它让 Agent 从“只会聊天”变成“能干活”。

这套机制解决的核心问题是:大模型本身只能处理文本,它没法直接读你的本地文件、没法调用你的数据库、没法帮你发请求、没法操作浏览器。Skills 就是把这些外部能力以标准化方式接入 Agent 的桥梁。你不需要每次都从头写一遍工具调用逻辑,而是把常用能力做成 skill,随用随取。

适合谁来参考这篇内容?三类人最需要:一是正在做 AI Agent 应用开发的前端或全栈工程师,二是想把自己的工作流自动化但不想写太多代码的效率工具爱好者,三是已经在用 Claude、Codex 这类工具并想扩展其能力边界的人。如果你完全没接触过 Agent 概念,也没关系,我会从最基础的地方讲起,用生活化的类比帮你建立认知。

2. 核心思路拆解:为什么 skills 要以这种形态存在

2.1 从“硬编码工具调用”到“可插拔能力模块”的演进逻辑

早期做 Agent 开发,工具调用是硬编码的。比如你要让 Agent 能查天气,就得在代码里写一个函数,然后在 prompt 里告诉模型“你可以调用 getWeather 这个函数”。这种方式能用,但问题很明显:每加一个能力就要改代码、重新部署,而且不同项目之间没法复用。

Skills 的思路是把能力做成独立的、自描述的模块。每个 skill 有自己的元数据,声明自己叫什么、能做什么、需要什么参数、返回什么结果。Agent 运行时动态加载这些 skill,根据用户意图自动匹配。这就像从“每个电器都焊死在电路板上”变成了“标准插座加可插拔电器”。

这个演进背后的推动力来自两方面。一是 Agent 应用场景越来越复杂,一个 Agent 可能需要同时具备文件操作、网络请求、数据处理、代码执行等十几种能力,硬编码维护成本太高。二是生态需要分工,有人擅长写爬虫,有人擅长做数据分析,如果每个人都能把自己的能力封装成 skill 发布出来,其他人直接安装使用,整个生态的效率会大幅提升。

2.2 为什么选 npx 和 Genkit 作为技术底座

热搜词里出现了 npx 和 Genkit,这不是偶然的。npx 是 Node.js 生态里的包执行工具,它允许你不安装全局依赖就直接运行某个包。对于 skill 的安装和分发来说,npx 提供了一种极轻量的方式——用户不需要关心依赖树,一条命令就能把 skill 拉起来。

Genkit 则是 Google Cloud 推出的 AI 应用开发框架,它提供了一套标准化的方式来定义工具、编排流程、管理模型调用。用 Genkit 来构建 skill,好处是它天然支持类型定义和参数校验,skill 的输入输出都有 schema 约束,Agent 调用时不容易传错参数。而且 Genkit 的抽象层做得比较干净,你写一个 skill 不需要关心底层用的是哪个模型,换模型时 skill 代码不用动。

我自己的体会是,选技术底座要看两个维度:一是生态成熟度,二是抽象是否合理。npx 的生态不用多说,Node 包管理是前端领域最成熟的体系之一。Genkit 虽然相对新,但它的设计思路是对的——把 AI 应用的复杂性封装在框架里,让开发者专注于业务逻辑。这两个组合在一起,做 skill 的开发和分发就比较顺手。

2.3 一个 skill 的完整生命周期

理解 skill 的生命周期,有助于你建立全局视角。一个 skill 从诞生到被使用,大致经历这几个阶段:

  • 定义阶段:开发者确定 skill 要解决什么问题,需要哪些输入,产生什么输出,依赖哪些外部服务。
  • 实现阶段:用代码实现核心逻辑,通常是一个函数或一组函数,加上参数校验和错误处理。
  • 描述阶段:编写 skill 的元数据,包括名称、描述、参数 schema、返回值 schema。这部分是给 Agent 看的,描述写得好不好直接影响 Agent 能不能正确调用。
  • 打包阶段:把代码和元数据打包成可分发的格式,通常是 npm 包或类似的模块格式。
  • 分发阶段:发布到 skill 市场或私有仓库,供其他人安装。
  • 加载阶段:Agent 运行时发现并加载 skill,注册到自己的能力列表中。
  • 调用阶段:用户提出需求,Agent 匹配到合适的 skill,传入参数,执行并返回结果。
  • 更新阶段:skill 作者修复 bug 或增加功能,发布新版本,使用者更新。

这个生命周期里,最容易出问题的是描述阶段和调用阶段。描述写得太模糊,Agent 匹配不准;参数 schema 定义不严谨,调用时传参出错。后面我会详细讲怎么避这些坑。

3. 核心细节解析:一个高质量 skill 应该长什么样

3.1 元数据设计:让 Agent 一眼看懂你的 skill

元数据是 skill 的“说明书”,但这份说明书不是给人看的,是给 Agent 看的。所以写法要符合机器的理解习惯。一个典型的 skill 元数据包含以下字段:

字段名作用常见错误
nameskill 的唯一标识用中文或特殊字符,导致调用失败
description一句话说明 skill 能做什么写得太泛,如“处理数据”,Agent 无法判断何时调用
parameters输入参数定义缺少类型约束,或必填项没标记
returns返回值定义不写返回结构,Agent 拿到结果不知道怎么用
examples调用示例省略,导致 Agent 不知道实际怎么传参

我踩过的一个坑是 description 写得太“人类友好”。比如我写“这个 skill 可以帮你把乱七八糟的数据整理干净”,人一看就懂,但 Agent 匹配时反而困惑——什么叫“乱七八糟”?什么叫“整理干净”?后来改成“接收 CSV 格式字符串,去除重复行和空值,返回清洗后的 CSV 字符串”,匹配准确率立刻上去了。

注意:description 里要包含具体的输入格式和输出格式关键词,这是 Agent 匹配意图时最重要的信号。

3.2 参数校验:别让脏数据进到你的逻辑里

Agent 调用 skill 时传的参数,质量参差不齐。有时候是用户表达模糊,有时候是 Agent 理解偏差,有时候是多个 skill 之间传递数据出了错。如果你不在 skill 入口做参数校验,脏数据就会一路跑到核心逻辑里,报错信息还很难定位。

参数校验分两层。第一层是类型校验,用 JSON Schema 或类似机制声明每个参数的类型、格式、取值范围。第二层是业务校验,比如日期参数不能是未来时间、文件路径必须存在、数值不能为负。第一层可以靠框架自动完成,第二层需要你自己写。

我的习惯是在 skill 函数的第一段就做业务校验,校验不通过直接返回结构化错误信息,而不是抛异常。结构化错误信息的好处是 Agent 能读懂,它可以据此调整参数重新调用,或者告诉用户哪里出了问题。抛异常的话,Agent 往往只能看到一个堆栈,没法做后续处理。

3.3 错误处理:让失败也可控

Skill 执行失败是常态,不是异常。网络会断、文件会丢、API 会限流、用户会传错参数。好的 skill 设计要把失败当成正常流程的一部分来处理。

我一般把错误分成三类:

  • 可重试错误:网络超时、临时限流。这类错误 skill 内部自动重试,重试次数和间隔可配置。
  • 可修正错误:参数格式不对、缺少必填项。这类错误返回明确的修正建议,让 Agent 或用户补充信息后重新调用。
  • 不可恢复错误:权限不足、资源不存在。这类错误直接返回失败原因,不做重试。

实操心得:重试策略不要写死。我见过一个 skill 对限流错误重试了 10 次,每次间隔 100 毫秒,结果把对方的 API 彻底打挂了。重试次数建议 2 到 3 次,间隔用指数退避,第一次 1 秒,第二次 2 秒,第三次 4 秒。

3.4 依赖管理:skill 不应该是个黑盒

一个 skill 依赖哪些外部服务、哪些 npm 包、哪些环境变量,这些信息必须显式声明。我遇到过最头疼的情况是:从市场装了一个 skill,运行时报错说缺少某个环境变量,但 skill 的文档里根本没提这个变量是干什么的、去哪里获取。

好的做法是在 skill 的元数据里加一个 dependencies 字段,列出所有外部依赖,包括:

  • 需要的环境变量名称和用途说明
  • 依赖的 npm 包及版本范围
  • 需要访问的外部 API 及其权限要求
  • 需要的系统工具(如 ffmpeg、playwright 等)

这样使用者在安装前就能评估自己环境是否满足,而不是装完了才发现跑不起来。

4. 实操过程:从零构建并发布一个 skill

4.1 环境准备与工具链搭建

开始之前,你需要准备以下环境:

  • Node.js 18 或更高版本(npx 需要)
  • npm 或 yarn 作为包管理器
  • 一个代码编辑器,VS Code 就行
  • 如果 skill 涉及浏览器操作,需要安装 Playwright 的浏览器依赖

安装基础工具链的命令如下:

# 确认 Node 版本 node -v # 初始化项目 mkdir my-first-skill && cd my-first-skill npm init -y # 安装 Genkit 相关依赖 npm install genkit @genkit-ai/googleai # 如果涉及浏览器自动化 npm install playwright npx playwright install chromium

这里重点说一下npx playwright install失败的问题。热搜词里有人问这个,我实际遇到过几次。最常见的原因是网络问题导致浏览器二进制下载中断。解决办法是先设置镜像源,或者手动下载浏览器包放到缓存目录。另一个原因是磁盘空间不足,Playwright 的浏览器包解压后有好几百兆,空间不够会静默失败。排查时先看磁盘剩余空间,再看网络。

注意:npx playwright install只安装浏览器,不安装系统依赖。在 Linux 上可能还需要npx playwright install-deps来装系统库。Windows 和 macOS 一般不需要这步。

4.2 定义 skill 的接口契约

假设我们要做一个“读取本地 Markdown 文件并提取标题结构”的 skill。先定义接口:

  • 输入:文件路径(字符串,必填)
  • 输出:标题层级结构(数组,每项包含层级和标题文本)
  • 错误:文件不存在、文件不是 Markdown、文件过大

用 Genkit 的 schema 定义如下:

import { z } from "genkit"; const InputSchema = z.object({ filePath: z.string().describe("Markdown 文件的绝对路径"), maxDepth: z.number().min(1).max(6).optional().default(6) .describe("提取的最大标题层级,默认 6 级") }); const OutputSchema = z.object({ headings: z.array(z.object({ level: z.number(), text: z.string(), line: z.number() })), totalCount: z.number() });

这里maxDepth参数的设计意图是:有些文档标题层级很深,但用户只关心前三级,加这个参数可以过滤掉不需要的层级,减少返回数据量。默认值设为 6 是因为 Markdown 标准支持 6 级标题。

4.3 实现核心逻辑

核心逻辑分三步:读文件、解析标题、组装返回。

import { readFile } from "fs/promises"; import { defineTool } from "genkit"; export const extractHeadings = defineTool({ name: "extractMarkdownHeadings", description: "读取指定路径的 Markdown 文件,提取其中的标题结构,返回标题层级、文本和行号", inputSchema: InputSchema, outputSchema: OutputSchema, }, async (input) => { // 业务校验 if (!input.filePath.endsWith(".md") && !input.filePath.endsWith(".markdown")) { return { error: "FILE_TYPE_ERROR", message: "文件扩展名必须是 .md 或 .markdown", suggestion: "请确认文件路径是否正确" }; } let content; try { content = await readFile(input.filePath, "utf-8"); } catch (err) { if (err.code === "ENOENT") { return { error: "FILE_NOT_FOUND", message: `文件不存在: ${input.filePath}`, suggestion: "请检查路径拼写,或确认文件是否已被移动" }; } throw err; } // 解析标题 const lines = content.split("\n"); const headings = []; const headingRegex = /^(#{1,6})\s+(.+)$/; for (let i = 0; i < lines.length; i++) { const match = lines[i].match(headingRegex); if (match) { const level = match[1].length; if (level <= input.maxDepth) { headings.push({ level, text: match[2].trim(), line: i + 1 }); } } } return { headings, totalCount: headings.length }; });

这段代码有几个细节值得说。第一,错误返回用了结构化对象,包含 error 码、message 和 suggestion,Agent 拿到后可以据此决定下一步动作。第二,正则只匹配行首的#,避免把代码块里的#注释误识别为标题。第三,行号从 1 开始计数,符合大多数编辑器的习惯。

4.4 本地测试与调试

写完 skill 后,不要急着发布,先在本地跑通。Genkit 提供了开发模式,可以启动一个本地服务来测试 skill:

npx genkit start -- npm run dev

这会启动一个本地调试界面,你可以在里面直接输入参数调用 skill,查看返回结果。我一般会准备一组测试用例,覆盖正常情况、边界情况和错误情况:

测试场景输入预期结果
正常文件一个标准 Markdown 文件路径返回标题数组
文件不存在一个不存在的路径返回 FILE_NOT_FOUND
非 Markdown 文件一个 .txt 文件路径返回 FILE_TYPE_ERROR
空文件一个空 Markdown 文件返回空数组,totalCount 为 0
深层标题包含 6 级标题的文件根据 maxDepth 过滤

实操心得:测试时一定要试空文件和只有标题没有正文的文件。我见过一个 skill 在空文件上直接崩溃,就是因为没处理content为空字符串的情况。

4.5 打包与发布

测试通过后,就可以打包发布了。如果是发布到 npm,需要在 package.json 里配置好入口文件和类型声明:

{ "name": "genkit-skill-markdown-headings", "version": "1.0.0", "main": "dist/index.js", "types": "dist/index.d.ts", "files": ["dist"], "keywords": ["genkit", "skill", "markdown"], "peerDependencies": { "genkit": "^0.9.0" } }

发布命令就是标准的 npm 流程:

npm run build npm publish

发布后,其他人就可以通过 npx 或 npm install 来使用你的 skill 了。如果是发布到私有市场,流程类似,只是 registry 地址不同。

5. 常见问题与排查技巧实录

5.1 skill 安装失败怎么办

安装失败最常见的原因有三个:网络问题、权限问题、版本冲突。排查顺序建议从网络开始,因为这是最高频的。

网络问题的表现是下载卡住或超时。可以先试着手动访问 registry 地址,看能不能通。如果通,可能是 npm 缓存坏了,执行npm cache clean --force后重试。如果不通,检查代理设置和 DNS 配置。

权限问题在 Linux 和 macOS 上比较常见,表现是EACCES错误。不要用 sudo 装全局包,正确做法是配置 npm 的全局目录到用户目录下:

mkdir -p ~/.npm-global npm config set prefix '~/.npm-global' export PATH=~/.npm-global/bin:$PATH

版本冲突的表现是安装成功但运行时报模块找不到或 API 不兼容。这时候用npm ls查看依赖树,找到冲突的包,手动指定兼容版本。

5.2 skill 被 Agent 调用了但结果不对

这种情况通常是参数传递出了问题。排查步骤:

  1. 在 skill 入口打印实际收到的参数,和预期对比。
  2. 检查 Agent 的意图匹配日志,看它为什么选了这个 skill。
  3. 检查参数 schema 是否过于宽松,导致 Agent 传了错误类型的值。

我遇到过一个典型案例:skill 期望接收一个数字类型的count参数,但 Agent 传了字符串"5"。因为 schema 里写的是z.number(),Genkit 自动做了类型转换,把字符串转成了数字,所以没报错。但另一个参数date期望的是 ISO 格式字符串,Agent 传了"2024-1-1",格式不标准,导致后续解析失败。后来我在 schema 里加了正则约束,问题就解决了。

5.3 skill 执行超时怎么优化

超时问题要从两个方向排查:是 skill 本身慢,还是外部依赖慢。

如果是 skill 本身逻辑慢,比如处理大文件、做复杂计算,可以考虑分片处理或加缓存。如果是外部依赖慢,比如调用的 API 响应时间长,可以设置合理的超时时间,超时后返回可重试错误。

注意:不要无限制地增加超时时间。我见过有人把超时设成 5 分钟,结果 Agent 卡在那里等 5 分钟,用户体验极差。一般单个 skill 的超时建议控制在 30 秒以内,超过这个时间的任务应该拆成异步流程。

5.4 常见问题速查表

问题现象可能原因排查方法解决方案
安装时卡住网络不通或 registry 不可达手动访问 registry 地址检查网络配置,清理缓存
运行时报模块找不到依赖未安装或版本冲突查看 npm ls 输出安装缺失依赖,锁定版本
Agent 不调用 skilldescription 不清晰查看意图匹配日志优化 description,加关键词
调用后返回错误参数类型或格式不对打印实际参数加严 schema 约束
执行超时逻辑慢或外部依赖慢加日志分段计时优化逻辑,设合理超时
返回结果 Agent 读不懂返回结构不清晰检查 output schema结构化返回,加字段说明

5.5 几个我踩过的坑

第一个坑是 description 里用了太多同义词。我写“提取、获取、读取、解析 Markdown 标题”,本意是增加匹配概率,结果 Agent 反而困惑了,因为它不确定这几个词是不是指同一个操作。后来改成只用一个动词“提取”,匹配反而更准。

第二个坑是没处理并发调用。我的 skill 里有一个写文件的操作,多个 Agent 同时调用时会出现写冲突。后来加了文件锁,问题解决。如果你的 skill 涉及共享资源,一定要考虑并发场景。

第三个坑是忽略了 skill 的版本兼容性。我更新了一个 skill 的返回结构,但没升 major 版本,导致依赖旧结构的 Agent 拿到新结构后解析失败。后来我严格遵守语义化版本,破坏性变更一定升 major。

6. 进阶玩法:让 skills 组合出更强能力

6.1 skill 编排:把多个 skill 串成工作流

单个 skill 的能力有限,但多个 skill 组合起来就能完成复杂任务。比如“读取 Markdown 文件提取标题”这个 skill,可以和“生成目录”skill、“检查标题层级是否规范”skill 组合,形成一个文档质量检查工作流。

Genkit 支持用 flow 来编排多个 tool。你可以定义一个 flow,里面按顺序调用多个 skill,前一个的输出作为后一个的输入。这样 Agent 只需要调用一个 flow,就能完成原本需要多轮对话才能完成的任务。

编排时要注意数据格式的兼容性。前一个 skill 的输出结构,必须能被后一个 skill 的输入 schema 接受。如果格式不匹配,中间需要加一个转换步骤。我一般会在 flow 里加一个轻量的转换函数,而不是修改 skill 本身的输出,这样 skill 保持通用性。

6.2 动态 skill 发现:让 Agent 自己找工具

当 skill 数量多了之后,把所有 skill 都注册给 Agent 会导致 prompt 过长,影响匹配准确率。更好的做法是动态发现——Agent 先根据用户意图搜索相关 skill,再加载匹配的 skill。

实现方式有两种。一种是基于关键词的搜索,给每个 skill 打标签,Agent 根据标签筛选。另一种是基于向量相似度的语义搜索,把 skill 的 description 向量化,用户意图也向量化,算相似度取 top N。

我实测下来,混合方案效果最好:先用标签做粗筛,再用语义相似度做精排。这样既快又准。纯语义搜索在 skill 数量少时没问题,数量上千后延迟会明显上升。

6.3 skill 的版本管理与灰度发布

生产环境里,skill 的更新不能一刀切。新版本可能有 bug,直接全量替换风险太大。灰度发布的思路是:新版本先给一小部分流量,观察一段时间没问题再逐步扩大。

实现上可以在 skill 加载层加一个路由逻辑,根据用户 ID 或请求 ID 的哈希值决定用哪个版本。比如哈希值模 100 小于 10 的用新版本,其余用旧版本。观察期过后调整比例,直到全量。

实操心得:灰度期间一定要同时监控新旧版本的错误率和延迟。我见过新版本错误率没升,但延迟翻倍的情况,这种问题不看监控根本发现不了。

6.4 安全边界:skill 能做什么,不能做什么

Skill 给了 Agent 执行实际操作的能力,这也意味着安全风险。一个恶意的 skill 可能读取敏感文件、发送网络请求、修改系统配置。所以在设计 skill 时,必须明确安全边界。

我的做法是遵循最小权限原则:skill 只申请完成其功能所必需的最小权限。比如一个只读文件的 skill,不应该有写文件的权限。一个只查询数据库的 skill,不应该有删除记录的权限。

另外,所有涉及外部副作用的操作都要加确认机制。比如发送邮件、修改文件、调用支付接口,这些操作在执行前应该让用户确认。确认机制可以是一句提示,也可以是一个显式的确认步骤,取决于操作的风险等级。

7. 我对 skills 生态的一些个人观察

Skills 这个概念现在很热,但我观察到一个现象:很多人把 skill 当成了 prompt 的替代品,觉得写个 skill 就是写一段更长的提示词。这个理解偏差会导致做出来的 skill 质量不高。

Skill 的核心价值在于“可执行”和“可组合”。可执行意味着它真的能操作外部世界,而不只是生成文本。可组合意味着它能和其他 skill 拼装成更大的能力。如果一个 skill 只是把一段 prompt 包装了一下,那它没有发挥 skill 应有的价值。

另一个观察是,skill 的质量比数量重要得多。我见过有人一口气装了上百个 skill,结果 Agent 匹配准确率反而下降了,因为太多相似的 skill 互相干扰。与其追求数量,不如把常用的几个 skill 打磨好,description 写清楚,参数校验做严谨,错误处理做完善。

最后说一个实际体会:skill 的调试成本比写代码高。因为 Agent 的调用行为有不确定性,同样的输入可能因为上下文不同而走不同的路径。所以测试 skill 时不能只测单次调用,要模拟多轮对话场景,看 Agent 在不同上下文下是否能正确选择和使用 skill。这个我踩过好几次坑,后来养成了写集成测试的习惯,每次改完 skill 都跑一遍完整的对话流程,确认没有回归问题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/30 22:45:50

Windows下Codex CLI配置全攻略:从安装到实战排查

上个月在 Windows 上折腾 Codex CLI&#xff08;OpenAI 的终端编程助手&#xff09;&#xff0c;从装 Node.js 到登录账号&#xff0c;再到手动改 config.toml 配模型供应商&#xff0c;前前后后踩了不少坑。趁着热乎劲把这套完整的 Windows 配置流程整理出来&#xff0c;覆盖 …

作者头像 李华
网站建设 2026/10/30 3:13:56

OpenAPI文档秒变Mock API:Ponytail插件前后端联调实战指南

我最近在做一个前后端分离的项目时&#xff0c;一直在为一件事头疼&#xff1a;后端接口文档倒是写得规规整整&#xff0c;可实际接口要两三天后才好&#xff0c;前端这边却已经等着联调了。后来在github上翻到一个叫Ponytail的开源插件&#xff0c;专门用来将OpenAPI文档直接变…

作者头像 李华
网站建设 2026/10/14 7:32:21

Agent-Reach:面向生产环境的大模型CLI调用工具

1. 项目概述&#xff1a;Agent-Reach 是什么&#xff1f;它解决的不是“能不能用”&#xff0c;而是“怎么用得稳、用得准、用得省心”Agent-Reach 这个名字乍看像某个前沿AI代理框架&#xff0c;但实际翻遍 GitHub 仓库&#xff08;shihabal3amri/diplay&#xff09;、相关 CL…

作者头像 李华
网站建设 2026/10/16 6:46:16

Superpowers开发工具链:LLM驱动的AI原生编码实践指南

1. 项目概述&#xff1a;Superpowers 不是超能力&#xff0c;而是开发者工具链的“认知增强层”最近在多个技术社区和开发者群聊里&#xff0c;“superpowers”这个词出现频率陡增——它既不是漫威新片的宣传噱头&#xff0c;也不是某款玄幻手游的更新公告&#xff0c;而是一类…

作者头像 李华
网站建设 2026/10/16 2:44:39

从零跑通Superpowers:浏览器里的开源游戏开发环境详解

最近搜“superpowers”这个词的人突然多起来了&#xff0c;而且大部分一开口就是“怎么安装”。我第一次接触这个项目时也挺迷惑&#xff1a;它既不是某个前端库&#xff0c;也不是传统意义的游戏引擎安装包&#xff0c;而是一整套跑在浏览器里的开源游戏开发环境。本质上&…

作者头像 李华