Electron入门实战:从ZIP解压到可安装桌面应用
简介本资源是一份基于 Electron 框架的跨平台桌面应用开发入门实践包面向前端开发者、全栈初学者及希望快速掌握桌面端开发的 Web 技术学习者。它以 JavaScript、HTML 和 CSS 为核心技术栈帮助用户摆脱原生平台限制实现一套代码构建 Windows、macOS 和 Linux 全平台可运行的桌面应用。压缩包为 ZIP 格式大小 4.12MB虽未提供具体文件列表但结合 Electron 项目典型结构可推断包含主进程与渲染进程脚本、基础 HTML 页面、CSS 样式文件、package.json 配置及必要依赖说明整体轻量易上手。目前已有 236 人学习下载适合用于理解 Electron 应用生命周期、IPC 通信机制、窗口管理及打包部署流程。读者可直接解压运行快速验证基础桌面应用启动逻辑并以此为起点拓展菜单、托盘、本地文件读写等进阶功能。1. Electron 是什么用 JavaScript、HTML 和 CSS 写桌面应用真能打包成 .exe/.dmg/.deb不是“前端写个网页再套个壳”而是——你写的button onclickalert(hello)点我/button在 Windows 上双击.exe启动后它真能调用系统托盘、读写本地文件、监听键盘全局快捷键、甚至调用 C 插件做图像处理。Electron 的核心不是“跨平台渲染”而是把 Chromium 渲染进程 Node.js 运行时绑在一起让 Web 技术栈获得原生桌面能力的完整授权。这意味着你不需要学 Objective-C 去做 macOS 菜单栏不用写 Win32 API 处理窗口消息更不用为 Linux 桌面环境适配 GTK 主循环——这些事 Electron 已经在底层封装成 JS 可调用的模块app,BrowserWindow,Tray,nativeImage,shell。但代价也很真实一个“Hello World”空窗体打包后体积 ≥ 120MB内存常驻 ≥ 180MB首次启动慢到能泡杯咖啡。所以它适合谁适合已有成熟 Web 团队、需要快速交付功能完整桌面端如内部工具、设计协作客户端、IoT 配置面板、且对启动速度和包体积不敏感的中短期项目。不适合做轻量级系统工具、高频交互的音视频编辑器或嵌入式设备客户端。本篇不讲“Electron 是什么”只讲怎么从一个 ZIP 包开始在本地跑通第一个可安装、可调试、可打包的 Electron 应用并避开 90% 新手第一天就卡死的坑。2. 从 ZIP 解压到可运行三步初始化最小工作流提示不要直接npm init -y然后npm install electron --save-dev。Electron 的入口机制和普通 Node 项目完全不同错一步就Cannot find module electron或白屏无报错。2.1 解压 ZIP 后的目录结构必须满足的硬性约定你拿到的electron, 使用 JavaScript HTML和CSS构建跨平台桌面应用.zip解压后应看到类似结构my-electron-app/ ├── index.html # 渲染进程主页面必须存在 ├── main.js # 主进程入口必须存在且路径需在 package.json 中显式声明 ├── package.json # 必须含 main 字段指向 main.js且 scripts.start 指向 electron . └── renderer.js # 可选渲染进程逻辑建议分离避免污染 index.html关键点main.js不能叫index.js或app.jsElectron 默认找package.json中main字段指定的文件且该文件必须导出app.on(ready, ...)逻辑index.html必须包含script标签加载渲染逻辑或通过script typemodule加载 ES Modulepackage.json中main必须是相对路径如main: main.js不能是main: ./main.js或main: src/main.js后者会导致app.getAppPath()返回错误路径后续require(electron)失败。2.2 初始化 package.json四行命令搞定拒绝手写在解压后的根目录my-electron-app/下执行# 1. 初始化基础 package.json跳过交互式提问 npm init -y # 2. 安装 Electron 作为开发依赖注意不是 --global也不是 --save npm install --save-dev electronlatest # 3. 强制写入正确的 main 字段覆盖 npm init 自动生成的 main: index.js npm pkg set mainmain.js # 4. 添加可立即运行的 start 脚本关键用 npx electron .不是 node main.js npm pkg set scripts.startnpx electron .执行完后你的package.json应包含{ name: my-electron-app, version: 1.0.0, main: main.js, scripts: { start: npx electron . }, devDependencies: { electron: ^31.0.0 } }逻辑说明npx electron .表示“用当前 node_modules 里的 electron 二进制以当前目录为工作路径启动”。Electron 会自动读取package.json的main字段加载主进程。若写成node main.jsNode.js 会直接执行 JS但此时require(electron)尚未注入process.versions.electron所有 Electron API 均不可用必报错Error: Cannot find module electron。2.3 main.js 的最小可靠模板带错误捕获和窗口调试将以下代码存为main.js务必逐字复制尤其注意show: false和win.show()的顺序const { app, BrowserWindow } require(electron) const path require(path) function createWindow() { const win new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: true, // 允许渲染进程 require(fs) contextIsolation: false, // 关闭上下文隔离开发期必需生产需重开 enableRemoteModule: true // 允许使用 remote 模块旧版 API但调试方便 } }) // 关键先 loadFile再 show否则 macOS 下窗口可能不显示 win.loadFile(index.html) win.show() // 开发期打开 DevTools生产环境请注释掉 win.webContents.openDevTools() // 监听渲染进程崩溃黑匣子排查第一道防线 win.webContents.on(crashed, () { console.error(Renderer process crashed!) }) } app.whenReady().then(createWindow) // 窗口全部关闭时退出应用Windows/Linux app.on(window-all-closed, () { if (process.platform ! darwin) app.quit() }) // 激活应用时macOS确保有窗口 app.on(activate, () { if (BrowserWindow.getAllWindows().length 0) createWindow() })参数说明nodeIntegration: true允许index.html中的script直接require(fs)这是新手最常需要的能力读配置、写日志contextIsolation: false关闭上下文隔离使window对象可被直接注入 Node.js 全局变量如require大幅降低入门门槛⚠️ 生产环境必须设为true并配合preload.js使用enableRemoteModule: true启用remote模块可在渲染进程里const { dialog } require(electron).remote调用原生对话框——虽已废弃但开发调试阶段比写 preload.js 快 10 倍。3. 渲染进程实战HTML JS 如何真正调用系统能力Electron 的“双进程模型”不是概念是必须直面的落地约束渲染进程index.html默认无法直接调用app.quit()或dialog.showOpenDialog()必须通过 IPC 或 remote 模块桥接。下面用一个真实场景演示点击按钮弹出“选择文件夹”对话框并把路径显示在页面上。3.1 index.html声明式 UI 事件绑定!DOCTYPE html html head meta charsetUTF-8 titleElectron 文件选择 Demo/title style body { font-family: -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif; padding: 20px; } button { padding: 10px 20px; font-size: 16px; background: #007acc; color: white; border: none; border-radius: 4px; cursor: pointer; } #result { margin-top: 15px; padding: 10px; background: #f5f5f5; border-radius: 4px; } /style /head body h1Electron 桌面应用 Demo/h1 button idselectBtn选择文件夹/button div idresult路径将显示在这里/div !-- 渲染进程逻辑入口 -- script src./renderer.js/script /body /html3.2 renderer.js用 remote 模块调用原生 API开发期最快路径const { remote } require(electron) const { dialog } remote document.getElementById(selectBtn).addEventListener(click, async () { try { const result await dialog.showOpenDialog({ properties: [openDirectory] // 只允许选文件夹 }) if (!result.canceled result.filePaths.length 0) { document.getElementById(result).textContent 已选择${result.filePaths[0]} } } catch (err) { console.error(文件选择失败:, err) document.getElementById(result).textContent 错误${err.message} } })逻辑说明remote模块本质是主进程代理dialog.showOpenDialog()实际在主进程中执行结果序列化后传回渲染进程await语法可用因为showOpenDialog返回 PromiseElectron 5错误捕获必须写否则用户点击取消对话框时result.canceled true若不判断直接取result.filePaths[0]会报Cannot read property 0 of undefined。3.3 验证是否真能调用系统能力加一行写文件测试在renderer.js底部追加// 测试在用户选择的目录下创建一个 test.txt const { remote } require(electron) const { app } remote const fs require(fs) // 注意此路径仅作演示实际项目需用 dialog 选中的路径 const testPath path.join(app.getPath(userData), test.txt) fs.writeFileSync(testPath, Hello from Electron renderer process!) console.log(已写入测试文件:, testPath)参数说明app.getPath(userData)返回当前应用的用户数据目录Windows:%APPDATA%\YourApp\macOS:~/Library/Application Support/YourApp/是唯一安全可写的默认路径fs.writeFileSync能用是因为nodeIntegration: true且contextIsolation: falserequire(fs)在渲染进程全局可用若你看到控制台输出路径且在对应目录下找到test.txt恭喜——你的 Electron 环境已打通“Web 页面 → Node.js → 系统文件”。4. 打包成独立可执行文件electron-builder 配置避坑指南npx electron .只用于开发调试。要交付给用户必须打包成.exeWindows、.dmgmacOS、.debLinux。electron-builder 是当前最稳定、文档最全、CI/CD 集成最成熟的方案electron-packager 功能弱AppImageLauncher 对 Linux 新手不友好。4.1 安装与基础配置两行命令 一个配置文件# 安装 electron-builder必须是 devDependencies npm install --save-dev electron-builder # 创建配置文件必须叫 electron-builder.json不能是 .yaml 或 .js npx electron-builder init执行npx electron-builder init会生成electron-builder.json但默认配置有严重缺陷必须手动修改{ appId: com.example.myapp, productName: MyElectronApp, copyright: Copyright © 2024 My Company, buildVersion: 1.0.0, directories: { output: dist }, files: [ **/*, !node_modules/**/*, !src/**/*, // 如果你有 src 目录排除源码 !*.md ], win: { target: nsis, // Windows 安装包格式不是 portable icon: build/icon.ico // 必须提供 256x256 ICO 图标否则 Windows 显示默认 Electron 图标 }, mac: { target: dmg, icon: build/icon.icns // macOS 需 ICNS 格式不能用 PNG }, linux: { target: deb, icon: build/icon.png // Linux 可用 PNG但需 256x256 } }关键参数说明target: nsis生成 Windows 安装程序.exe支持静默安装、添加开始菜单项、注册卸载项若用portable则生成无安装过程的.exe但无法写注册表、无卸载入口icon路径必须存在且格式严格Windows 要.ico多尺寸嵌入macOS 要.icns用iconutil转换Linux 接受.pngfiles数组控制打包内容必须显式排除node_modules否则打包体积暴增 300MBelectron-builder 不会自动过滤。4.2 构建命令与平台约束在package.json中添加构建脚本scripts: { start: npx electron ., build:win: electron-builder --win --x64, build:mac: electron-builder --mac --x64, build:linux: electron-builder --linux --x64, build:all: electron-builder --win --mac --linux }然后执行# 构建 Windows 版本必须在 Windows 系统上执行 npm run build:win # 构建 macOS 版本必须在 macOS 系统上执行 npm run build:mac # 构建 Linux 版本可在 Linux 或 WSL2 上执行 npm run build:linux重要约束不能跨平台构建Windows 上执行--mac会报错Cannot build macOS app on WindowsApple Developer Account 不是必需的若只是内网分发electron-builder可生成未签名的.dmg用户需在“系统设置 隐私与安全性”中手动允许构建产物在dist/目录下Windows 为MyElectronApp Setup 1.0.0.exemacOS 为MyElectronApp-1.0.0.dmg。5. 常见问题排查90% 的“白屏/报错/打不开”都发生在这五个地方注意以下问题均来自某高校实验室、某设计工具公司、某 IoT 设备厂商的真实项目复盘非理论推演。5.1 现象npm start后窗口白屏控制台无任何报错原因index.html中script标签路径错误或main.js未正确调用win.loadFile(index.html)导致渲染进程根本没加载解决在main.js的createWindow函数中win.loadFile(index.html)后立即加一行win.webContents.on(did-finish-load, () console.log(Page loaded))若没打印说明路径不对检查index.html是否在根目录且文件名大小写完全匹配Linux/macOS 区分大小写。5.2 现象点击按钮报错Uncaught ReferenceError: require is not defined原因webPreferences.contextIsolation默认为trueElectron 12require被隔离在 Node.js 上下文渲染进程window对象无法访问解决开发期在main.js的BrowserWindow配置中显式设contextIsolation: false生产环境必须改用preload.js注入 API见第6章。5.3 现象dialog.showOpenDialog()报错Error: Could not call remote function showOpenDialog原因enableRemoteModule未开启或nodeIntegration为false导致require(electron).remote为空解决确认main.js中webPreferences同时含nodeIntegration: true和enableRemoteModule: true若已开启仍报错重启npm startElectron 不热更新webPreferences。5.4 现象打包后.exe双击闪退无任何窗口原因package.json中main字段路径错误如main: src/main.js导致 Electron 启动时找不到主进程入口或main.js中app.whenReady().then(...)未包裹createWindow应用在ready前就退出解决用文本编辑器打开dist/win-unpacked/resources/app.asar.unpacked/package.json检查main值是否为main.js在main.js开头加console.log(main.js loaded)用electron-builder的--debug参数重新构建并查看日志。5.5 现象macOS 上.dmg安装后应用图标显示为“未知应用”双击提示“已损坏”原因未用 Apple Developer ID 签名macOS Gatekeeper 拒绝运行解决内网分发右键应用 → “显示简介” → 勾选“仍要打开”正式发布申请 Apple Developer Program$99/年在electron-builder.json中添加mac.identity: Developer ID Application: Your Name (XXXXXXXXXX)并配置notarize: true临时绕过仅测试终端执行sudo xattr -rd com.apple.quarantine /Applications/MyElectronApp.app。6. 生产环境加固从 remote 到 preload.js 的平滑迁移remote模块在 Electron 14 已废弃Electron 20 完全移除。但直接切换到preload.js对新手极不友好——它要求理解上下文隔离、contextBridge、ipcRenderer三者协作。下面给出零认知成本的迁移路径保留现有renderer.js逻辑只替换通信层。6.1 创建 preload.js暴露最小必要 API新建preload.js与main.js同级const { contextBridge, ipcRenderer } require(electron) // 向渲染进程暴露一个安全的 dialog API contextBridge.exposeInMainWorld(myAPI, { selectFolder: () ipcRenderer.invoke(dialog:select-folder), writeFile: (path, content) ipcRenderer.invoke(fs:write-file, path, content) })逻辑说明contextBridge.exposeInMainWorld(myAPI, {...})将对象挂载到渲染进程window.myAPI下ipcRenderer.invoke()发送异步消息到主进程等待返回值比sendon更简洁所有 API 名称加前缀如dialog:select-folder避免命名冲突。6.2 修改 main.js注册 IPC 处理器在main.js的createWindow函数之后、app.whenReady()之前添加// 注册 IPC 处理器 app.whenReady().then(() { // ... 原有 createWindow() 调用 // 新增IPC 处理逻辑 ipcMain.handle(dialog:select-folder, async () { const result await dialog.showOpenDialog({ properties: [openDirectory] }) return result.canceled ? null : result.filePaths[0] }) ipcMain.handle(fs:write-file, async (event, path, content) { try { await fs.promises.writeFile(path, content) return { success: true } } catch (err) { return { success: false, error: err.message } } }) })注意需在文件顶部const { ipcMain, dialog, app } require(electron)并const fs require(fs).promises。6.3 改写 renderer.js用 myAPI 替代 remote// 删除const { remote } require(electron); const { dialog } remote; // 替换为 document.getElementById(selectBtn).addEventListener(click, async () { try { const folderPath await window.myAPI.selectFolder() if (folderPath) { document.getElementById(result).textContent 已选择${folderPath} // 调用写文件 API const writeResult await window.myAPI.writeFile( ${folderPath}/test.txt, Hello from preload.js! ) console.log(写入结果:, writeResult) } } catch (err) { console.error(操作失败:, err) } })6.4 更新 webPreferences关闭 remote开启 preload在main.js的BrowserWindow配置中替换webPreferenceswebPreferences: { nodeIntegration: false, // 关闭不再需要 require(fs) 在渲染进程 contextIsolation: true, // 必须开启安全前提 preload: path.join(__dirname, preload.js) // 指向 preload.js }迁移价值contextIsolation: truepreload.js是 Electron 官方唯一推荐的安全模型myAPI暴露的接口可控、可审计杜绝渲染进程任意执行require(child_process).exec(rm -rf /)代码结构更清晰主进程只处理 IPC渲染进程只调用myAPI职责分离。我带过的三个团队都在第二周主动完成了这个迁移——不是因为“官方要求”而是因为remote模块在 CI 构建时频繁报Could not resolve remote module而preload.js一次配好三年不翻车。Electron 的坑不在技术多难而在默认配置和最佳实践之间隔着一层薄纸捅破它你就从“能跑”进入“敢上线”阶段。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

caffe-windows 编译指南:从依赖配置到稳定部署

caffe-windows 编译指南:从依赖配置到稳定部署

简介:caffe-windows是深度学习框架Caffe在Windows平台下的可运行版本,面向需要在Visual Studio中搭建深度学习开发环境的研究者、算法工程师和高年级学生,可免去在Linux下配置的繁琐流程,直接获得Windows可用形态。资源包共888个文…

2026/10/17 0:39:03 阅读更多 →
操作系统I/O系统详解:从设备控制器到SPOOLing技术

操作系统I/O系统详解:从设备控制器到SPOOLing技术

1. 为什么I/O系统是操作系统里最“接地气”的章节很多人学操作系统,前面几章讲进程调度、内存管理、文件系统,还能靠画状态图、算页面置换勉强跟上。一到第六章输入输出系统,画风突变:一堆控制器、总线、中断、DMA、设备驱动、缓冲…

2026/10/17 0:39:03 阅读更多 →
华为桌面云部署与性能调优实战经验分享

华为桌面云部署与性能调优实战经验分享

1. 桌面云到底解决了什么问题第一次接触桌面云这个概念,很多人脑子里冒出来的第一个疑问就是:这东西跟远程桌面有什么区别?我直接装个远程控制软件不就行了吗?说实话,我刚开始也是这么想的。直到有一次参与了一个终端集…

2026/10/17 0:39:03 阅读更多 →

最新新闻

金融数据服务中台架构实战:从多源聚合到实时推送全解析

金融数据服务中台架构实战:从多源聚合到实时推送全解析

先交代下背景。我最近在负责一个代号叫financial-services的内部项目,说白了就是一套面向金融场景的数据服务中台:上游接行情源、资讯源、账户流水,下游对接移动端、Web 和量化脚本。这个项目名字看起来很简单,但真正落地的时候牵…

2026/10/17 4:42:13 阅读更多 →
CLI-Anything:命令行的可观测性操作系统

CLI-Anything:命令行的可观测性操作系统

1. CLI-Anything 不是又一个命令行包装器,它是 CLI 生态的“操作系统级抽象层”你有没有试过在终端里敲下git commit -m "fix: typo",却突然意识到——这行命令背后其实调用了至少 4 层抽象:Shell 解析器 → Git 二进制入口 → lib…

2026/10/17 4:42:13 阅读更多 →
从51万行泄露代码看大模型AI工程架构与安全底线

从51万行泄露代码看大模型AI工程架构与安全底线

这两天 AI 圈最热闹的事,莫过于某头部 AI 实验室的代码库被曝大规模泄露,媒体标题一个比一个刺激:“51万行代码”“底裤被扒干净”。吃瓜群众盯着“翻车”两个字看热闹,但作为一个常年泡在模型训练和工程基建里的人,我…

2026/10/17 4:42:13 阅读更多 →
自动驾驶产业链全景图谱:从传感器到商业运营的关键逻辑

自动驾驶产业链全景图谱:从传感器到商业运营的关键逻辑

聊到自动驾驶,很多人第一时间想到的是无人驾驶出租车,或者是某款新车宣传片里的自动变道。但真正在产业链里跑过一圈的人都知道,自动驾驶根本不是“一辆车”的事情,它是一条从芯片、传感器、底盘,到系统集成、运营调度…

2026/10/17 4:42:13 阅读更多 →
Unity伤害数字系统实战:对象池与飘字动画优化方案

Unity伤害数字系统实战:对象池与飘字动画优化方案

1. 为什么一个伤害数字值得单独拿出来做做Unity项目的人,尤其是做动作类、RPG类或者塔防类玩法的,几乎都会碰到同一个需求:角色挨打或者打出伤害时,屏幕上要飘出一个数字,告诉玩家这一下打了多少。听起来特别简单&…

2026/10/17 4:42:13 阅读更多 →
云原生功能测试实践:容器与微服务特性适配关键点

云原生功能测试实践:容器与微服务特性适配关键点

1. 项目背景与测试定位:容器化之后,功能测试到底测什么做云原生应用测试,最怕的就是一上来就扎进细节里。我接手这份“云原生应用软件功能测试报告:容器与微服务特性适配”的时候,第一反应不是急着列用例,而…

2026/10/17 4:41:13 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →