其他
在 Convex 应用中需要可复用后端组件时…
当你要在 Convex 应用中新建 component、抽取可复用后端逻辑、构建应拥有自己表和流程的第三方集成,或打包跨应用复用的 Convex 功能时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 35/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 39/100 ×0.15
适用场景
在 Convex 应用中需要可复用后端组特定
解决思路
- 先问用户要构建什么以及最终目标是什么;如果仓库已经让答案很明显,说明这一点并在继续前确认。
- 使用决策树选择形态,并阅读匹配的参考文件。
- 判断 component 是否合理;如果功能不需要隔离表、后端函数或可复用持久状态,优先使用普通应用代码或普通库。
- 制定简短计划:列出 component 拥有哪些表。
- 制定简短计划:列出它暴露哪些公开函数。
- 制定简短计划:列出必须从应用传入的数据,包括认证、环境变量、父级 ID。
- 制定简短计划:列出哪些保留在应用中作为 wrapper 或 HTTP mount。
- 使用 `convex.config.ts`、`schema.ts` 和函数文件创建 component 结构。
- 实现函数时使用 component 自己的 `./_generated/server` 导入,而不是应用的生成文件。
- 用 `app.use(...)` 把 component 接入应用;如果应用还没有 `convex/convex.config.ts`,创建它。
- 在应用中通过 `components.<name>` 使用 `ctx.runQuery`、`ctx.runMutation` 或 `ctx.runAction` 调用 component。
- 如果 React 客户端、HTTP 调用方或公共 API 需要访问,在应用中创建 wrapper 函数,而不是直接暴露 component 函数。
- 运行 `npx convex dev`,并在完成前修复 codegen、类型或边界问题。
- 询问用户后选择一条路径:仅用于此应用的 component 选择 Local,参考 `references/local-components.md`。
- 发布或跨应用共享选择 Packaged,参考 `references/packaged-components.md`。
- 用户明确需要 local + shared library 代码选择 Hybrid,参考 `references/hybrid-components.md`。
- 不确定时默认选择 Local,参考 `references/local-components.md`。
- 继续前只阅读一个参考文件。
- 除非用户明确想要 npm package,否则默认使用 local component。
- 将 local component 放在 `convex/components/<componentName>/` 下。
- 在它自己的 `convex.config.ts` 中用 `defineComponent(...)` 定义它。
- 从应用的 `convex/convex.config.ts` 用 `app.use(...)` 安装它。
- 让 `npx convex dev` 生成 component 自己的 `_generated/` 文件。
- 本地 component 最小骨架:在 `convex/components/notifications/convex.config.ts` 中从 `convex/server` 导入 `defineComponent`,并导出 `defineComponent('notifications')`。
- 在 `schema.ts` 中用 `defineSchema`、`defineTable`、`v` 定义表,并为查询字段建索引,例如 `by_user_read`。
- 在 `lib.ts` 中从 component 自己的 `./_generated/server.js` 导入 `mutation`、`query`,实现函数。
- 在应用 `convex/convex.config.ts` 中 `defineApp()`,`app.use(notifications)`,并导出 app。
- 在应用侧 wrapper 中从应用 `./_generated/server` 导入 `mutation`、`query`,从 `./_generated/api` 导入 `components`,解析认证后通过 `ctx.runMutation(components.notifications.lib.send, ...)` 等调用。
- 注意引用路径形态:`convex/components/notifications/lib.ts` 中的函数在应用中以 `components.notifications.lib.send` 调用。
- 将认证保留在应用中,因为 component 内不可用 `ctx.auth`。
- 将环境访问保留在应用中,因为 component 函数不能读取 `process.env`。
- 跨边界传递父应用 ID 时使用字符串,因为 `Id` 类型在面向应用的 `ComponentApi` 中变成普通字符串。
- 不要在 component args 或 schema 中对应用拥有的表使用 `v.id('parentTable')`,因为 component 无法访问应用表命名空间。
- 从 component 自己的 `./_generated/server` 导入 `query`、`mutation`、`action`,不要从应用的生成文件导入。
- 不要直接向客户端暴露 component 函数;需要客户端访问时创建应用 wrapper,因为 component 是内部的,需要应用提供认证/环境接线。
- 如果 component 定义 HTTP handlers,在应用的 `convex/http.ts` 中挂载路由,因为 component 不能注册自己的 HTTP 路由。
- 如果 component 需要分页,使用 `convex-helpers` 的 `paginator`,而不是内置 `.paginate()`,因为 `.paginate()` 不能跨 component 边界工作。
- 为查询字段定义索引,而不是在数据库查询后使用 Convex `.filter()`。
- 为所有公开 component 函数添加 `args` 和 `returns` validators,因为 component 边界需要显式类型契约。
- 认证和环境访问模式:不要在 component 代码中依赖应用认证或环境,例如 `ctx.auth.getUserIdentity()` 或 `process.env.OPENAI_API_KEY`。
- 认证和环境访问模式:应用解析认证和环境,然后传入显式值,例如 `userId`、`apiKey`、`text` 通过 `ctx.runAction(components.translator.translate, ...)`。
- 面向客户端 API 模式:不要假设 component 函数可直接被客户端调用,例如 `export const send = components.notifications.send;`。
- 面向客户端 API 模式:通过应用 `mutation` 或 `query` 重新导出或包装。
- ID 跨边界模式:不要把父应用表 ID 写成 `v.id('users')`。
- ID 跨边界模式:在边界处把父级拥有的 ID 视为字符串,使用 `v.string()`。
- 高级模式:关于回调的函数句柄、从 schema 派生 validators、用 globals 表做静态配置、基于 class 的客户端 wrapper,见 `references/advanced-patterns.md`。
- 按顺序尝试验证:先运行 `npx convex codegen --component-dir convex/components/<name>`。
- 然后运行 `npx convex codegen`。
- 然后运行 `npx convex dev`。
- 重要:新仓库在配置 `CONVEX_DEPLOYMENT` 前可能上述命令失败。
- 重要:在 codegen 运行前,component 本地的 `./_generated/*` 导入和应用侧 `components.<name>...` 引用不会通过类型检查。
- 重要:如果验证因 Convex 登录或部署设置受阻,停止并询问用户该确切步骤,而不是猜测。
- 在用户确认目标后,只阅读 `references/local-components.md`、`references/packaged-components.md`、`references/hybrid-components.md` 中的一个。
- 官方文档:`https://docs.convex.dev/components/authoring`。
- Checklist:已询问用户要构建什么并确认形态。
- Checklist:已阅读匹配的参考文件。
- Checklist:已确认 component 是正确抽象。
- Checklist:已规划表、公开 API、边界和应用 wrapper。
- Checklist:Component 位于 `convex/components/<name>/` 下,或发布时使用 package 布局。
- Checklist:Component 从自己的 `./_generated/server` 导入。
- Checklist:认证、环境访问和 HTTP 路由保留在应用中。
- Checklist:父应用 ID 以 `v.string()` 跨边界。
- Checklist:公开函数有 `args` 和 `returns` validators。
- Checklist:已运行 `npx convex dev` 并修复 codegen 或类型问题。
适用边界 · 注意事项
- 一次性业务逻辑,应放在主应用中。
- 不需要 Convex 表或函数的薄工具;普通 TypeScript 库已经足够。
- 应用级编排,应留在 `convex/` 中。