插件加载失败排查指南:plugin.json、TypeScript SDK与CLI实战
1. 从“plugins”这个词说起为什么它值得单独拎出来聊“plugins”这个词放在任何技术栈里都不算新鲜但最近它被反复推上热搜背后其实是一整套开发工具链的范式转移。你搜“Cursor plugins”“plugin.json”“TypeScript SDK”“CLI”这几个词会发现它们指向的是同一个趋势编辑器、命令行工具、AI 辅助编程助手正在从“单体应用”变成“可插拔平台”。插件不再只是给 IDE 加个主题、换个图标的小玩意而是决定一个工具能不能真正嵌入你日常工作流的关键。我最早接触插件体系是给编辑器写语法高亮扩展那时候插件就是一个文件夹加一个package.json声明一下激活事件和贡献点就完事了。但现在不一样了Cursor、Codex CLI、Zcode CLI 这类工具把插件做成了运行时动态加载的能力单元插件可以注册命令、拦截请求、注入上下文、甚至改写模型行为。这就带来一个很现实的问题插件加载失败、激活条目对不上、SDK 版本不匹配这些报错会直接让你整个工具链瘫痪。热搜里那些“failed to load plugins web boot: 2 entries did not activate”“harness failed to load plugins”就是活生生的例子。这篇文章我想把“plugins”这件事拆开讲透。不管你是刚下载 Cursor 想装个中文语言包的新手还是已经在用 TypeScript SDK 写自定义 CLI 插件的老手都能从里面找到能直接抄作业的东西。我会从插件体系的设计逻辑讲起然后落到plugin.json的字段含义、TypeScript SDK 的接入方式、CLI 工具的插件加载机制最后给一份常见报错的排查清单。全程按我实际踩坑的顺序来不绕弯子。2. 插件体系到底解决了什么问题从单体工具到可插拔平台2.1 为什么现在的开发工具都在做插件化先想一个最朴素的问题为什么 Cursor 不直接把所有功能都做进主程序非要搞插件答案很简单需求的分裂速度远快于主程序的迭代速度。有人要用中文界面有人要接自己的代码检索服务有人要在保存文件时自动跑格式化还有人想把 CLI 工具的输出直接喂给 AI 助手。这些需求如果全部由官方团队实现排期能排到明年而且很多需求彼此冲突硬塞进主程序只会让软件越来越臃肿。插件化本质上是把“能力供给”和“能力消费”解耦。主程序提供一套稳定的扩展点extension points和运行时环境插件开发者按约定实现具体逻辑。这样官方只需要维护核心的编辑、渲染、通信能力剩下的交给社区。你在热搜里看到的linxin666/dsh-p、huayu-yuan这类插件名就是社区开发者按这套约定做出来的东西。但插件化不是没有代价的。一旦主程序开放了扩展点就要面对版本兼容、加载顺序、权限隔离、错误边界这一堆问题。plugin.json里的activationEvents写错一个字段插件就不会被激活TypeScript SDK 的接口签名变了老插件直接编译不过CLI 工具在启动时扫描插件目录某个插件抛异常可能导致整个 CLI 起不来。这些就是热搜里那些报错的技术根源。2.2 插件、扩展、模块三个容易混淆的概念在动手之前有必要把几个词理清楚不然看文档会越看越晕。概念典型载体加载时机能力范围插件 Pluginplugin.json 入口文件运行时按需激活可注册命令、监听事件、注入上下文扩展 Extensionpackage.json的contributes字段编辑器启动时扫描主要做 UI 贡献点如主题、语言包模块 Modulenpm 包或本地文件代码 import 时加载纯逻辑复用不感知宿主环境简单说插件是能跟宿主环境对话的扩展是给宿主环境加外观的模块是纯代码复用。Cursor 里的中文语言包严格来说更接近扩展但它走的是插件加载通道所以你会看到plugin.json里声明了语言相关的贡献点。而 TypeScript SDK 写出来的东西通常是插件和模块的混合体既有入口文件注册命令又有独立的逻辑模块被入口调用。这个区分很重要因为排查加载失败时你得先判断问题出在哪个层面。如果是plugin.json解析失败那是插件层面的问题如果是contributes里的字段不被识别那是扩展层面的问题如果是 import 路径找不到那是模块层面的问题。热搜里“failed to load plugins web boot: 1 entry did not activate”这种报错通常就是插件层面的激活条件没满足。2.3 插件加载的生命周期从扫描到激活理解生命周期是排查一切插件问题的前提。我把它拆成五个阶段扫描阶段宿主程序启动时会去约定目录比如~/.cursor/plugins或项目下的.plugins扫描所有含plugin.json的文件夹。解析阶段读取plugin.json校验必填字段检查engines版本约束是否满足。注册阶段把插件声明的命令、菜单项、快捷键等贡献点注册到宿主的能力表里但此时插件代码还没执行。激活阶段当某个activationEvents被触发比如用户执行了某个命令、打开了某种文件宿主才真正加载插件入口文件并执行。运行阶段插件开始响应事件、调用 SDK 接口、与宿主双向通信。大部分“加载失败”发生在第 2 和第 4 阶段。第 2 阶段失败通常是 JSON 格式错误或版本不匹配第 4 阶段失败通常是入口文件抛异常或激活事件写错了。热搜里“2 entries did not activate”明确指向第 4 阶段——有两个插件条目满足了扫描和解析但激活条件始终没被触发。3. plugin.json 逐字段拆解写错一个就加载不了3.1 必填字段与常见错误plugin.json是插件的身份证宿主程序全靠它来认识你。我见过太多加载失败是因为这个文件写得不规范。下面是一个最小可用的示例{ name: my-first-plugin, version: 1.0.0, engines: { cursor: ^0.40.0 }, main: ./dist/index.js, activationEvents: [ onCommand:myPlugin.hello ], contributes: { commands: [ { command: myPlugin.hello, title: Say Hello } ] } }逐字段说name插件唯一标识只能用字母、数字、连字符不能有空格。我踩过的坑是用下划线结果宿主解析时直接跳过。version语义化版本宿主用它来判断是否需要更新。engines声明兼容的宿主版本范围。这个字段最容易被忽略但它是解析阶段失败的头号原因。如果你写的范围跟当前宿主版本不匹配插件会被静默跳过日志里只留一句“entry did not activate”。main入口文件路径相对于插件根目录。路径写错会导致激活阶段报“module not found”。activationEvents激活事件数组决定插件什么时候被加载。写得太宽会拖慢启动写得太窄会导致插件“看起来没生效”。contributes贡献点声明告诉宿主这个插件提供了哪些命令、菜单、配置项。注意activationEvents里的事件名必须和contributes.commands里的command字段完全一致大小写敏感。我见过有人写onCommand:MyPlugin.hello但命令注册的是myPlugin.hello结果就是永远不激活。3.2 activationEvents 的写法与性能权衡activationEvents是插件体系里最需要动脑子设计的部分。写得好插件按需加载启动飞快写得烂要么插件不生效要么每次启动都拖慢宿主。常见的激活事件类型onCommand:xxx用户执行某个命令时激活。最常用也最推荐。onLanguage:python打开某种语言的文件时激活。适合语言相关插件。onFileSystem:xxx访问某种文件系统时激活。*宿主启动就激活。除非你的插件必须常驻否则千万别用它会显著拖慢启动速度。我个人的经验是能用onCommand就用onCommand。比如你做一个代码格式化插件不要写成onLanguage:javascript而是注册一个formatDocument命令让用户在需要时手动触发或者通过快捷键绑定。这样插件在用户没用到的时候完全不占资源。但有些场景确实需要提前激活。比如中文语言包它需要在界面渲染前就注入翻译资源这时候就得用onStartup之类的早期事件。热搜里“cursor中文怎么设置”“cursor汉化”这类需求对应的插件通常就是靠早期激活事件来替换界面文案的。3.3 contributes 字段命令、菜单、配置的注册规范contributes是插件的“能力清单”宿主根据它来构建 UI 和命令面板。结构不对插件即使激活了也看不到效果。{ contributes: { commands: [ { command: myPlugin.format, title: 格式化当前文件, category: My Plugin } ], keybindings: [ { command: myPlugin.format, key: ctrlaltf, when: editorTextFocus } ], configuration: { title: My Plugin 设置, properties: { myPlugin.indentSize: { type: number, default: 2, description: 缩进空格数 } } } } }这里有几个细节值得说commands里的command必须全局唯一建议用插件名.功能名的格式避免和其他插件冲突。keybindings的when条件很重要不写的话快捷键在任何时候都会触发可能干扰用户正常输入。configuration里的properties键名建议也带插件前缀否则用户在设置里看到一堆indentSize根本不知道是谁的。提示修改plugin.json后必须重启宿主程序才能生效热重载只对插件代码生效不对清单文件生效。这个坑我踩过不止一次改完字段发现没反应折腾半天才发现是没重启。4. TypeScript SDK 接入实战从零写一个可加载的插件4.1 环境准备与项目初始化用 TypeScript 写插件的好处是类型安全SDK 会提供完整的接口定义编译期就能发现大部分字段拼写错误。下面是我常用的初始化流程mkdir my-plugin cd my-plugin npm init -y npm install typescript types/node --save-dev npm install cursor/plugin-sdk --save npx tsc --inittsconfig.json需要调整几个关键项{ compilerOptions: { target: ES2020, module: commonjs, outDir: ./dist, rootDir: ./src, strict: true, esModuleInterop: true, skipLibCheck: true }, include: [src/**/*] }outDir要和plugin.json里的main字段对应否则编译出来的文件宿主找不到。strict建议打开SDK 的类型定义很完整开着能帮你避开很多运行时错误。4.2 入口文件与激活逻辑入口文件是插件被激活时执行的第一段代码。它的核心任务是注册命令处理器、绑定事件监听。import * as cursor from cursor/plugin-sdk; export function activate(context: cursor.ExtensionContext) { const disposable cursor.commands.registerCommand(myPlugin.hello, () { cursor.window.showInformationMessage(Hello from my plugin!); }); context.subscriptions.push(disposable); } export function deactivate() { // 清理资源SDK 会自动释放 subscriptions 里的内容 }这段代码看起来简单但有几个关键点activate是宿主调用的入口参数context提供了订阅管理、存储、日志等能力。所有注册的 disposable 都要 push 到context.subscriptions这样插件停用时能自动清理避免内存泄漏。deactivate里不需要手动释放 subscriptionsSDK 会处理但如果你开了文件句柄、网络连接要在这里手动关掉。我见过有人把activate写成 async 函数然后在里面 await 一个长时间操作结果宿主以为插件卡死了。activate应该尽快返回耗时操作放到命令处理器里异步执行。4.3 调用宿主能力命令、窗口、工作区SDK 把宿主能力分成几个命名空间常用的有cursor.commands注册和执行命令。cursor.window显示消息、输入框、进度条。cursor.workspace读写文件、获取配置、监听文件变化。cursor.languages注册语言特性如补全、悬停提示。举个例子读取用户配置并格式化当前文件cursor.commands.registerCommand(myPlugin.format, async () { const editor cursor.window.activeTextEditor; if (!editor) { cursor.window.showWarningMessage(没有打开的文件); return; } const config cursor.workspace.getConfiguration(myPlugin); const indentSize config.getnumber(indentSize, 2); const text editor.document.getText(); const formatted text.replace(/\t/g, .repeat(indentSize)); await editor.edit((builder) { const fullRange new cursor.Range( editor.document.positionAt(0), editor.document.positionAt(text.length) ); builder.replace(fullRange, formatted); }); });这里getConfiguration读的就是plugin.json里contributes.configuration声明的配置项。配置项的键名要和声明里完全一致否则读出来永远是默认值。这个坑很隐蔽因为不会报错只是行为不符合预期。5. CLI 工具的插件加载机制为什么命令行也会加载失败5.1 CLI 插件与编辑器插件的差异CLI 工具的插件体系和编辑器插件看起来像但底层逻辑差别很大。编辑器插件运行在宿主进程里有完整的 UI 和事件循环CLI 插件通常是独立进程或动态链接库通过标准输入输出或 IPC 与主程序通信。热搜里“codex cli”“zcode cli”“trae cli”这些工具它们的插件加载流程大致是CLI 启动时读取配置文件通常是~/.xxx/config.json或项目下的.xxxrc。根据配置里的plugins数组去指定路径扫描插件。对每个插件执行入口脚本或加载动态库。把插件注册的命令挂到 CLI 的子命令树上。这个流程里最容易出问题的是第 3 步。CLI 环境没有编辑器的容错机制插件入口抛异常会直接导致整个 CLI 退出报错信息往往就是“failed to load plugins”加一行堆栈。5.2 插件目录结构与发现规则CLI 工具通常按以下顺序查找插件项目根目录下的.plugins/文件夹用户主目录下的~/.config/tool-name/plugins/环境变量XXX_PLUGIN_PATH指定的路径每个插件是一个独立文件夹里面必须有plugin.json和入口文件。CLI 会读取plugin.json里的main字段来决定加载哪个文件。如果main指向的文件不存在或者文件里没有导出约定的接口加载就会失败。我实测下来CLI 插件对入口文件的导出格式要求比编辑器插件更严格。编辑器插件可以只导出activate和deactivateCLI 插件通常还需要导出一个commands对象或register函数具体看工具的约定。写之前一定要翻官方文档的“插件开发”章节别凭感觉写。5.3 一个最小 CLI 插件的完整实现假设某个 CLI 工具约定插件入口导出一个register函数// src/index.ts export function register(cli: any) { cli.command(hello, { description: 打印问候语, action: () { console.log(Hello from CLI plugin!); } }); }对应的plugin.json{ name: cli-hello, version: 1.0.0, main: ./dist/index.js, commands: [hello] }编译后把整个文件夹放到插件目录重启 CLI执行xxx hello就能看到输出。如果没反应按这个顺序排查plugin.json是否被正确解析、main路径是否存在、register是否被调用、命令名是否冲突。注意CLI 插件的调试比编辑器插件麻烦因为很多 CLI 工具不提供插件日志。我的做法是在插件入口第一行写console.error([plugin] loaded)用标准错误输出确认插件是否被加载。确认加载后再逐步加日志定位问题。6. 常见加载失败与排查技巧实录6.1 “entries did not activate”到底在说什么热搜里“failed to load plugins web boot: 2 entries did not activate”这个报错翻译成人话就是宿主扫描到了两个插件条目但它们的激活条件始终没被满足所以代码从未执行。可能的原因按概率排序activationEvents写的事件名和实际触发的事件不匹配。engines版本范围不包含当前宿主版本插件在解析阶段就被标记为不兼容。插件依赖的某个模块缺失激活时 import 失败。插件入口文件路径错误宿主找不到文件。排查方法先看宿主日志里有没有更详细的错误信息通常在~/.cursor/logs/或 CLI 的--verbose输出里。如果日志只给一句“did not activate”那就手动把activationEvents改成*测试如果能激活说明是事件名写错了如果还是不行那就是解析或路径问题。6.2 插件冲突与加载顺序问题多个插件注册同一个命令名时后加载的会覆盖先加载的而且不会有任何提示。这种问题在装了一堆社区插件后特别常见。我的建议是所有自定义命令都加插件名前缀比如myPlugin.format而不是format。如果必须覆盖别人的命令在plugin.json里显式声明优先级如果宿主支持。定期清理不用的插件减少冲突面。加载顺序方面大部分宿主按插件目录的字母序加载但这个行为没有标准化。不要依赖加载顺序来实现功能如果插件之间有依赖关系应该通过事件或消息机制通信而不是假设谁先谁后。6.3 常见问题速查表现象可能原因排查动作插件完全不生效activationEvents未触发临时改成*测试报“did not activate”engines版本不匹配检查宿主版本放宽范围命令面板找不到命令contributes.commands未声明补全声明并重启激活时报 module not foundmain路径错误或未编译检查outDir和main是否对应配置项读不到键名与声明不一致逐字符比对configuration.propertiesCLI 启动直接崩溃插件入口抛异常在入口首行加日志逐步定位中文界面不生效语言包插件未早期激活检查activationEvents是否含启动事件6.4 我踩过的三个真实坑第一个坑是plugin.json里用了中文逗号。JSON 标准不允许中文标点但有些编辑器不会高亮报错宿主解析时直接跳过整个插件。后来我养成了用jq校验的习惯jq . plugin.json有语法错误立刻就能看到。第二个坑是 TypeScript 编译目标设成了ESNext但宿主运行环境只支持到ES2020结果插件加载时报语法错误。编译目标要跟宿主运行时对齐不确定就设成ES2019或ES2020兼容性最好。第三个坑是插件目录里有node_modules宿主扫描时把里面的package.json也当成插件清单解析导致报一堆无关错误。解决办法是在插件目录放一个.pluginignore文件如果宿主支持或者把依赖打包进入口文件不要留node_modules。7. 插件生态的延伸思考从工具到工作流插件体系发展到今天已经不只是“给编辑器加功能”这么简单。它正在变成一种工作流的组装方式。你用 Cursor 写代码用 CLI 工具跑构建用 AI 助手做代码审查这些环节之间的衔接如果全靠手动操作效率损耗很大。而插件可以把它们串起来保存文件时自动触发 CLI 检查检查结果通过插件注入到编辑器的问题面板AI 助手读取问题面板的内容给出修复建议。热搜里“uiuxpromax 集成cursor”“cursor 和idea同时编辑”这些词反映的就是这种工作流组装的诉求。用户不再满足于单个工具好用而是希望工具之间能通过插件互相调用。这对插件开发者提出了更高要求你写的插件不能只考虑自己还要考虑怎么跟其他插件协作怎么暴露接口给别人调用。我个人的判断是未来一年插件体系会往两个方向走。一个是标准化plugin.json的字段定义、TypeScript SDK 的接口签名会逐渐收敛不同工具的插件可能互相兼容。另一个是沙箱化宿主会对插件做更严格的权限隔离插件不能随便读写文件、发起网络请求必须显式声明权限。这对用户是好事对开发者意味着要多写一些声明代码。如果你现在刚开始写插件我的建议是先把plugin.json的字段含义吃透把激活事件设计对把错误处理做扎实。功能可以慢慢加但加载失败这种基础问题一旦出现用户直接就把插件卸载了根本不会给你排查的机会。

相关新闻

Python人脸识别实战:5种落地方案与核心代码解析

Python人脸识别实战:5种落地方案与核心代码解析

人脸识别技术本质是让计算机在图像中定位人脸并确认身份。技术流程分为人脸检测、人脸对齐、特征提取和特征比对四个步骤。特征提取是将人脸图像映射到高维向量空间,使得同一人的特征向量距离较近,不同人的距离较远。特征比对则是通过计算余弦相似度或欧…

2026/10/4 3:33:48 阅读更多 →
宝塔面板添加站点与SSL证书配置详解:从HTTP到HTTPS

宝塔面板添加站点与SSL证书配置详解:从HTTP到HTTPS

干这行久了,你会发现一件事:不管你是刚买了台服务器准备折腾个小站,还是公司项目正式上线要挂域名,最常打开的面板界面就是“网站”和“SSL”那两页。宝塔面板这几年能这么普及,很大程度是因为它把这俩高频操作都做成了…

2026/10/4 3:33:48 阅读更多 →
RAG第一步:用LangChain高效读取文本数据

RAG第一步:用LangChain高效读取文本数据

1. 什么是 RAG,为什么第一站是读取文本数据1.1 RAG 的核心思路:给大模型配一个外挂资料库RAG(Retrieval-Augmented Generation,检索增强生成)这两年已经成了大模型落地场景里默认出镜率最高的手法。无论是企业内部的知…

2026/10/4 3:33:48 阅读更多 →

最新新闻

插件系统原理与加载失败排查:从failed to load plugins到解决

插件系统原理与加载失败排查:从failed to load plugins到解决

1. 插件这东西,怎么会让这么多人在同一句报错上翻车先说个真实场景。你装了一款笔记软件,或者在公司 CI 平台上配了个构建流程,又或者在某个音乐播放器里加了个音源扩展,结果启动日志里冷不丁冒出来一行:failed to loa…

2026/10/4 4:16:11 阅读更多 →
3种方式让任意AI接入PenEcho:API密钥、Codex/Claude CLI与云端模型完整指南

3种方式让任意AI接入PenEcho:API密钥、Codex/Claude CLI与云端模型完整指南

3种方式让任意AI接入PenEcho:API密钥、Codex/Claude CLI与云端模型完整指南 【免费下载链接】penecho Think with AI beyond the chat box. A shared canvas for handwriting, equations, diagrams, and spatial reasoning. 项目地址: https://gitcode.com/gh_mir…

2026/10/4 4:16:11 阅读更多 →
插件加载与激活机制深度解析:从failed to load plugins到did not activate

插件加载与激活机制深度解析:从failed to load plugins到did not activate

最近一周我收到好几条几乎一模一样的提问:“iar plugins 是干什么的”“MusicFree plugins 怎么装”“failed to load plugins web boot: 2 entries did not activate linxin666/dsh-p 这是什么意思”。把这几条放在一起看,除了“plugins”这个词反复出现…

2026/10/4 4:16:11 阅读更多 →
LabVIEW调用adb shell实现Android设备自动化测试实战指南

LabVIEW调用adb shell实现Android设备自动化测试实战指南

去年有段时间我一直在做手机产线的老化测试上位机。测的产品是 Android 系统的移动终端,但整个测试框架必须用 LabVIEW 搭,两边要联动:装 App、清缓存、模拟点击、抓日志、读系统版本、控制相机拍照,这些操作全都夹在整套 LabVIEW…

2026/10/4 4:16:11 阅读更多 →
插件加载失败排查指南:从原理到实战,覆盖IAR与MusicFree

插件加载失败排查指南:从原理到实战,覆盖IAR与MusicFree

"plugins"这个词,这几年几乎是所有软件都在提的东西。打开 IAR 遇到插件加载警告,跑测试框架报failed to load plugins web boot: 2 entries did not activate,就连手机上的 MusicFree 听歌软件,也要靠 plugins 才能解锁…

2026/10/4 4:16:11 阅读更多 →
MSRP客户端开发指南:从SIP SDP协商到消息传输与调试避坑

MSRP客户端开发指南:从SIP SDP协商到消息传输与调试避坑

简介:MSRP(Message Session Relay Protocol)是SIP会话中承载富媒体内容的重要扩展,这套C源码以轻量实现展示了SIP客户端如何集成MSRP协议,适合VoIP、即时通信及SIP协议栈开发者作为参考样例。压缩包内共46个文件&#…

2026/10/4 4:15:11 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:36 阅读更多 →