3文档

Core · 开发应用

管理插件

查看应用实际注册的插件,使用已有能力,并管理插件的注册、更新、移除和扩展。

默认模板已经包含多种插件。开发应用时,通常直接使用它们提供的认证、用户、权限、文件等能力;只有确认当前应用缺少所需能力时,才需要增加插件。任务和项目这类应用自己的业务代码仍放在应用目录,不必先拆成插件。

本篇说明应用如何管理插件,不是插件开发教程,也不是所有可用插件的产品目录。命令以示例应用已安装的 CLI 为准,执行前可用 --help 确认当前版本支持的选项。

使用 Agent

请检查当前应用已经具备哪些插件能力,以及现有业务实际使用了哪些。

先查看已安装依赖、实际注册和相关使用指引,不要仅凭插件名称判断能力,也不要重复实现已有功能。
本轮先不新增、升级或移除插件。

告诉我每项业务依赖哪些插件、通过什么公开入口使用,以及哪些管理页面或必要配置尚未接通。
如果发现必须变更依赖,请说明具体原因、兼容版本和受影响功能,再给出可检查的改动方案。
不要改变现有用户权限或清理业务数据。

需要真正变更插件时,把目标说清楚,例如“把当前应用的定时任务插件更新到已确认兼容的版本,并验证现有任务定义与执行功能”。是否注册、更新或移除由这次任务决定,不让一次能力检查顺便改变应用依赖。

不使用 Agent

查看安装与注册

先查看 package.json 中的 @nocobase/app-plugin-* 依赖,以及锁文件中的实际解析版本。再检查三个组合入口:

文件 注册内容
client/plugins.ts 浏览器中的插件贡献
server/plugins.ts 服务端的 Provider、路由等贡献
cli/plugins.ts 命令行贡献

包出现在依赖中不等于已注册到运行时;三个入口也不要求完全相同,例如只提供命令的插件只需相应 CLI 入口。数组顺序影响贡献顺序,不应为了排序好看而随意重排。

.agents/skills/ 中存在某个 Skill 也不证明插件已经启用:Skills 可以从直接依赖同步。实际注册以组合入口为准。插件包通常放在应用的 dependencies,以便进入部署产物;不要把客户端插件误认为只能放进 devDependencies。

使用已有能力

先读已安装插件的 Skill,确认公开服务 token、客户端 hooks、组件、路由与管理能力。业务功能通过公开导出调用它们,不直接写插件内部表,也不从插件内部源码路径导入实现。

例如项目功能使用权限插件声明“查看、新建、修改任务项目”,复用用户和角色管理;不需要再安装一套权限包,也不应自己实现另一份角色存储。应用还要把用到的能力接入真实页面和业务接口,安装依赖本身不会自动完成业务功能。

注册确实缺少的插件

下面以定时任务插件为命令示例。若应用已经注册了它,跳过注册;换成目标插件前先确认它的可用性、版本要求和所需配置:

pnpm nocobase plugin register @nocobase/app-plugin-scheduler --dry-run
pnpm nocobase plugin register @nocobase/app-plugin-scheduler

命令负责安装依赖、接入插件导出的组合入口并同步 Skills。检查 package.json、锁文件和实际 Client/Server/CLI 注册变化。需要固定兼容版本时使用 --version,不要把一个新包的默认版本当成一定与当前应用兼容。

单独运行 pnpm add 只解决包安装,不能替代运行时注册。--no-install 需要依赖已经可解析;--disabled 用于安装而不接入运行贡献,不等于现有功能已可使用。根据命令输出检查实际处理了哪些入口。

更新插件

先查看单个插件的更新计划,再执行:

pnpm nocobase plugin update @nocobase/app-plugin-scheduler --dry-run
pnpm nocobase plugin update @nocobase/app-plugin-scheduler

包名是位置参数,不是 --plugin。不提供名称时会更新所有已注册插件,因此只改一项能力时应明确包名。

pnpm 的更新遵循项目声明的版本范围;范围固定时不保证得到更高版本。需要跨范围升级时先确定兼容目标,调整依赖范围并同步锁文件和 Skills,再检查变化。插件更新不等于合并新模板,也不能替代升级 NocoBase Core的整体流程。

更新后检查插件可能带来的迁移、配置和公开接口变化,验证使用它的功能并重新构建应用。已经部署的旧产物不会因为开发目录更新依赖就自动改变。

区分停用功能与移除插件

暂时不展示某个功能时,先决定只是隐藏入口,还是禁止使用。只隐藏菜单不能阻止直接页面或 API 请求;停用策略应覆盖实际操作入口,并保留需要恢复的代码与数据。

彻底移除插件前,查找应用中的 import、Client/Server/CLI 注册、路由、配置、服务、测试,以及其他能力对它的依赖。迁移或移除这些引用后,才执行卸载。

下面的 <name> 是占位符,替换为已经确认不再使用的插件;不要对仍承担业务功能的插件直接执行:

pnpm nocobase plugin unregister '@nocobase/app-plugin-<name>' --dry-run
pnpm nocobase plugin unregister '@nocobase/app-plugin-<name>'

也可以通过 pnpm nocobase package remove <完整包名> 移除直接 NocoBase 依赖;插件包会交给插件注销流程处理。不要只手动删除 package.json 中一行,否则注册和同步文件可能残留。

注销命令不替你决定如何处理历史业务数据,也不是数据库回滚方案。需要保留、迁移或删除数据时,单独设计数据处理;不要顺手删除插件目录或表来“清理干净”。

扩展插件提供的界面

需求 优先使用
插件已有配置选项 注册时传入公开 options
插件提供可组合组件或源码扩展点 使用组件,或按约定在 client/extensions/ 接入
替换插件某个页面的呈现 已支持的 client/route-overrides.ts 或插件提供的覆盖方式
完全属于应用的业务页面 在 client/routes.ts 注册自己的页面

页面覆盖应保持原路由身份、路径和访问条件,按合同替换懒加载组件;不要再声明一个相同路径制造冲突,同一路由也不要叠加多个覆盖来源。当前模板的登录、注册等页面属于应用源码,不能仅因使用认证插件就把它们当作插件拥有的路由。

不要编辑 node_modules/ 或 .agents/skills/ 中的包内容。应用特有约定放入 .agents/rules/;共享插件本身的问题在它的源码仓库修复。

验证结果

检查依赖与锁文件、三个组合入口、同步 Skills 和实际消费者。运行受影响的类型检查、测试和构建;涉及迁移时验证升级后的旧数据,涉及 API 时检查应用 API 文档。浏览器里同时验证正常访问和普通用户的权限边界。

如果手动修改依赖或中途失败导致 Skills 不一致,可以重新同步:

pnpm nocobase skills sync

同步只修复指引副本,不会自动注册插件或修复应用代码。进一步阅读应用开发概览和测试与验收。

NocoBase 3 文档 · 草稿 2026-10-24