前言¶
在 DSH 里用侧栏预览 HTML、PDF 或图片时,内置预览往往够用;但一旦页面依赖 fetch、ES 模块、绝对路径、Service Worker 或真实 origin,沙箱里的 iframe(srcDoc/blob)常会一片空白。有些格式干脆无法预览,侧栏只会显示「无法预览此文件」。换用系统默认浏览器打开,是相对路径资源和 origin 相关 API 最直接的出路。
下面介绍社区插件 dsh-plugin-open-in-browser(维护者 haoqiya138-source):从侧栏标签页芯片的右键菜单,或「无法预览」空状态,一键把当前文件交给系统默认浏览器,而不是继续卡在应用内预览里。
这是什么¶
dsh-plugin-open-in-browser 是面向 DSH 桌面客户端的 Cordis 插件,npm 包名同为 dsh-plugin-open-in-browser(当前发布版本见 npm 与仓库 package.json)。它不做「用编辑器 / Git GUI 打开」那类泛用入口——DSH 自带的 @deepseek-ai/dsh-host-open-in-app 已覆盖文档预览区的「在应用中打开」。本插件只做一件事:在浏览器里打开侧栏里的工作区文件,并补上标签页菜单入口,以便预览失败时仍能打开文件。
插件在 DSH 社区插件目录 归类为客户端;源码与说明见 GitHub 仓库(MIT 许可证)。
核心功能¶
一个插件包内注册两个 UI 席位(Seat),对应两种入口:
| 席位 | 出现位置 | 依赖 Host 提供的信息 |
|---|---|---|
sidebar.right.tab.document.unpreviewable |
「无法预览此文件」空状态 | 文件的 Host 路径(absolutePath) |
sidebar.right.tab.menu.item |
侧栏标签页芯片右键菜单 | 仅标签的 contentId(dsh-resource://file/session/…) |
有意未注册 sidebar.right.tab.document.actions。预览正常时,文档区标题栏已有预览自带控件;再在旁边叠一个「在浏览器中打开」收益不大,而标签芯片右键菜单对所有标签都可用,且一步可达。更重要的是:当第三方预览返回错误(例如 HTTP 405)时,内置预览可能读不到完整元数据,文档区没有 absolutePath,但标签菜单仍持有 dsh-resource://… 地址,足以解析、校验并打开文件。
打开流程上,客户端向本插件 Host 半部注册的固定路由发起请求:
POST /dsh-plugin-open-in-browser/open
content-type: application/json
{ "path": "C:\\Users\\me\\project\\preview.html" }
{ "address": "dsh-resource://file/session/<sessionId>/pages/preview.html" }
address 由标签菜单产生:Host 根据 Session 工作区根目录拼接相对路径并做安全校验。成功时返回 { ok: true, mode: "browser" | "association", path };失败为 { ok: false, code } 及 4xx/5xx。
Host 会解析用户实际的默认浏览器(Windows 上经注册表 UserChoice → ProgId → 命令行,并辅以常见安装路径;再不行才回退到系统文件关联)。对图片、PDF 等,内置 session.openWorkspacePath Remote 往往走系统关联(例如 Windows 上用「照片」打开 .png),本插件则明确尽量用浏览器。若 Host 路由不可用(旧版或未部署 Host 半部),客户端会降级调用该 Remote,避免控件完全失效。
安全层在 Host 与客户端两侧共用:绝对路径检查、路径遍历/UNC/设备名拒绝、扩展名白名单、工作区 containment、符号链接逃逸检测,以及 dsh-resource://file/… 地址解析(实现见仓库 src/security.ts)。
安装与启用¶
发布包已包含预构建产物 dist/,安装无需本地构建,也无运行时 npm 依赖。
从 npm 安装(README 推荐方式):
- 打开 DSH → 插件 → 添加插件。
- 输入包名
dsh-plugin-open-in-browser。 - 完全退出并重新打开 DSH,以便加载新的 Host 半部与客户端产物(模块加载器会缓存客户端 bundle)。
等价地,也可用插件工具安装:
plugin_manager action=install_bundle target=dsh-plugin-open-in-browser
若从本地检出目录安装(目录内已含 dist/):
plugin_manager action=install_bundle target=<检出目录的绝对路径>
环境要求:需要 DSH 桌面应用(Host 要能启动本机程序)。远程 / SSH 部署没有可启动的桌面浏览器时,控件会明确提示,而不是静默失败。仅从源码构建时需要 Node ≥ 20;日常使用 npm 包不要求本机 Node。
安装、更新或本地重新构建后,同样应完全退出再打开 DSH。
典型用法¶
- 在侧栏打开某个 HTML 标签页;若内置预览空白或报错,在标签页芯片上右键,选择插件提供的在浏览器中打开项(具体文案见插件
locale/zh.json中的meta.title)。 - 若文件类型无法预览,侧栏显示「无法预览此文件」时,使用空状态上的同一能力(此时使用
absolutePath入口)。 - 系统默认浏览器会打开经校验后的工作区文件路径;复杂 HTML 在真实 origin 下加载相对资源,行为与在 DSH 沙箱预览中不同,属预期现象。
本地开发插件时,README 建议先 npm run build 与 npm test(node:test 覆盖安全层、浏览器解析、Host 路由与客户端 bundle),再通过 install_bundle 指向检出目录验证。
适用场景与注意¶
适合:需要在真实浏览器里调试侧栏 HTML/静态站;预览 iframe 无法满足的脚本或模块;PDF、图片等在预览失败或你希望统一用浏览器查看时;标签页已打开但文档预览席因元数据错误无法渲染的场景。
不适合或受限:无桌面环境的远程 Session;期望用系统默认「图片查看器」而非浏览器打开时——本插件优先浏览器,与内置 open-in-app 的定位不同,可按需同时安装官方 open-in-app 插件。
安全与信任:插件 Host 半部在 DSH Host 进程内注册 HTTP 路由并启动外部浏览器,路径与地址均经白名单与工作区边界校验,但仍会以当前 DSH 进程权限访问工作区文件。安装前请阅读 源码 与 MIT 许可证,确认符合你的安全策略。社区目录 skillhub.cn 与 DeepSeek / 幻方无官方从属关系,插件为社区维护。
结尾¶
dsh-plugin-open-in-browser 用标签右键和「无法预览」两个入口,把侧栏文件一键交给系统默认浏览器,并针对预览失败、沙箱限制和 OS 文件关联与「用浏览器打开」之间的差异做了专门处理。需要安装或源码时,可访问 社区目录页 与 GitHub 仓库。