ARTICLE DETAIL

资讯详情

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

wigolo插件架构解析:loader、registry、validate三层设计与失败行为

wigolo插件架构解析:loader、registry、validate三层设计与失败行为 wigolo插件架构解析loader、registry、validate三层设计与失败行为【免费下载链接】wigoloThe go-to web for your AI coding agent — local-first search, fetch, crawl research over MCP. No API keys, no cloud, $0/query. Public beta.项目地址: https://gitcode.com/GitHub_Trending/wi/wigolowigolo 是一个本地优先local-first的 AI 编程代理网络工具通过 MCP 提供搜索、抓取、爬取与研究能力无需 API 密钥、不依赖云端、零查询成本。它的插件系统支持扩展搜索引擎和内容提取器两类能力而整个插件加载流程由 loader、registry、validate 三个模块分层协作完成。本文带你逐层拆解 src/plugins/ 下的源码搞清楚每一层各干什么、插件加载失败时系统如何优雅降级。一图看懂插件系统的三层分工wigolo 从~/.wigolo/plugins目录可用环境变量WIGOLO_PLUGINS_DIR覆盖加载插件。每个插件就是一个普通的 Node 模块目录没有构建步骤、不依赖框架。三层各司其职层级文件职责① Loader 加载层loader.ts扫描插件目录、解析package.json、动态import入口文件② Validate 校验层validate.ts检查插件导出是否符合extractor/searchEngine接口契约③ Registry 注册层registry.ts去重登记已加载的提取器与搜索引擎供全局查询loader如何发现并导入一个插件核心入口是 loadPlugins()它的流程非常直白目录不存在直接返回空结果——插件是可选能力没有插件目录完全合法逐个遍历子目录非目录条目散落的文件被安全跳过读取package.json取出name和main字段main缺失或入口文件不存在都会记为该插件的专属错误并继续处理下一个插件动态import入口模块捕获导入时抛出的异常不让一个坏插件拖垮整个服务调用validatePluginExports校验导出把结果汇总进extractors、searchEngines和errors三个数组返回。值得一提的是 loader.ts 用statSync跟随符号链接因此符号链接方式安装的插件目录同样有效。validate如何用接口契约把关校验逻辑集中在 validatePluginExports()规则清晰extractor必须提供name非空字符串、canHandle(url, html)、extract(html, url)三个成员searchEngine必须提供name非空字符串和search(query, options?)函数一个插件至少要通过其一的校验否则报错neither a valid extractor nor a valid searchEngine。校验结果中hasExtractor与hasSearchEngine是独立的布尔值——一个插件可以只导出搜索引擎、只导出提取器或两者都导出组合插件互不干扰。完整的可运行示例见 examples/plugin-search-engine/index.mjs整个插件不到 20 行代码。registry如何登记并对外提供查询PluginRegistry 是一个轻量类负责把校验通过的插件去重登记registerExtractor/registerSearchEngine注册时检查重名重名直接忽略并打警告先注册的赢getExtractors/getSearchEngineByName等方法供运行时按名查找getState()输出当前所有插件的名称与归属clear()支持热清理。在服务端server.ts 在启动时实例化PluginRegistry调用loadPlugins()后把插件搜索引擎推入内置的多引擎调度池与 Bing、DuckDuckGo 平级参与融合、去重和本地重排同时收集pluginResult.errors输出警告日志。失败行为清单为什么坏插件永远不会弄垮服务wigolo 插件加载是端到端防御式设计官方文档 docs/plugins.md 将其总结为一个插件的失败只产生 per-plugin error其他插件和服务本身照常工作。常见失败场景对照如下失败场景系统行为插件目录不存在静默跳过返回空结果debug 日志package.json无法解析记录该插件错误跳过缺少main字段记录错误has no main field跳过入口文件不存在记录错误entry point not found跳过import时抛异常捕获异常、记录错误warn 日志跳过导出不符合接口契约validate 层报告具体缺少哪个成员跳过两个插件导出同名引擎/提取器保留先注册者后者打警告跳过所有失败都会通过wigolo plugin validate命令显式报告并附带精确原因单元测试覆盖了上述每种场景见 tests/unit/plugins/loader.test.ts。实战验证与安装插件日常使用只需记住一条命令链详见 docs/plugins.mdwigolo plugin list # 查看已安装插件 wigolo plugin validate # 检查所有插件能否加载、导出是否合规 wigolo plugin remove name # 卸载问题插件由于插件代码会在每次 wigolo 服务启动时以你的凭据和网络访问权限运行plugin add会在克隆前强制显示仓库名与目标目录并要求确认脚本场景可用--yes跳过——这也是失败行为设计之外的另一道安全防线。相关源码与文档索引加载层src/plugins/loader.ts校验层src/plugins/validate.ts注册层src/plugins/registry.ts服务端接线src/server.ts插件文档docs/plugins.md最小插件示例examples/plugin-search-engine/行为测试tests/unit/plugins/总结loader 负责找到并跑起来validate 负责长得像插件吗registry 负责登记在册、查重可用。三层解耦让插件扩展既简单纯 Node 模块即可又健壮——任何一个插件写坏了都只会换来一条带具体原因的错误日志而不会让搜索、抓取、研究主流程停摆。【免费下载链接】wigoloThe go-to web for your AI coding agent — local-first search, fetch, crawl research over MCP. No API keys, no cloud, $0/query. Public beta.项目地址: https://gitcode.com/GitHub_Trending/wi/wigolo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表