安装指南
把这个插件装到你的 DSH 上
一条命令,不需要构建、不需要服务端组件、不需要改产品源码。装完重启 dsh web 并刷新页面即可,卸载同样是一条命令。
- Node ≥ 22
- DSH Web profile(0.1.x)
- 纯客户端 · 无构建
- MIT
dsh plugin --profile web add github:68110923/dsh-plugin-mobile-ux
开始之前
三条自查,都不满足的话先补齐再装。
有 dsh CLI 且能启动 Web profile
dsh --version
- 插件装进的是 profile,所以该 profile 必须已经能跑起来
- 本项目在 DSH 0.1.7-rc.1 上实测;0.1.x 系列预期可用
Node ≥ 22
dsh 自带 pnpm
- dsh plugin 底层是 pnpm,由 dsh 自己的运行时提供,不必单独装
- 若报 spawn pnpm ENOENT,说明 dsh 的 bin 目录不在 PATH 里
能连 GitHub 或 npm
github: 安装需要 git + HTTPS
- 内网机器可以先在有网的地方 git clone,再按「方案 C」从目录装
- npm 镜像会拖慢或挡住 GitHub 依赖,必要时显式指定官方源
下文一律用 profile 名 web;你的 profile 叫别的名字就替换掉它。
方案 A:直接从 GitHub 安装(推荐)
不需要发布到 npm,也不需要手动拷文件。已实测走通。
一条命令装进 profile
github:dsh plugin --profile web add github:68110923/dsh-plugin-mobile-ux- pnpm 会拉取仓库并把它登记进 profile 的 dependencies 与 dsh.profile.bundles
- 需要固定版本时可以写 github:68110923/dsh-plugin-mobile-ux#v2.0.0(打标签后)
- 想跟随 main 上的新提交:装完执行 dsh plugin --profile web update dsh-plugin-mobile-ux
重启 dsh web
必须systemctl restart dsh-web # 或用你自己托管 dsh web 的方式不重启等于没装:DSH 用文件 mtime/ctime/size 算 bundle 版本号,响应头又是 immutable 一年缓存。不重启则磁盘上是新的、服务端也可能返回新内容,但浏览器仍执行旧代码。
强制刷新页面
电脑 / 手机都行- 电脑:Ctrl/Cmd + Shift + R
- iPhone Safari:下拉刷新,或关掉标签页重新打开
- 装到主屏幕的独立窗口:从任务切换器划掉再重开
方案 B:从 npm 安装(暂不可用)
本包尚未发布到 npm。下面是发布后会变成的样子,以及目前卡在哪里。
发布后会是这样
npmdsh plugin --profile web add @yourscope/dsh-plugin-mobile-ux
systemctl restart dsh-web- 包名会带发布者的作用域,装起来比走 GitHub 快,也不依赖 GitHub 可达
- registry 是镜像时新版本可能还没同步,加 --registry=https://registry.npmjs.org/
目前卡在哪里
发布方的问题发布者的 npm 账号启用了安全密钥型的 2FA(Auth & Writes),而这台服务器没有 TOTP 验证器;npm 对这类账号要求发布时必须提供 OTP,或使用能绕过 2FA 的 token。已实测三种写法均被 registry 拒绝。
- 对使用者没有影响:方案 A 装的是一模一样的包,已验证逐字节一致
- 将来要发 npm,改用 GitHub Actions + Trusted Publishing(OIDC)即可完全绕开 token 与 OTP
方案 C:本地目录 / 离线安装
不想依赖 GitHub,或者机器不能出网时用这个。
把仓库拷到服务器上
任选一种git clone https://github.com/68110923/dsh-plugin-mobile-ux /opt/dsh-plugin-mobile-ux
# 或从本地机器上传:
scp -r ./dsh-plugin-mobile-ux root@SERVER_IP:/opt/按目录安装并重启
link:dsh plugin --profile web add /opt/dsh-plugin-mobile-ux
systemctl restart dsh-web- 按目录安装是 link(软链)语义:改完源码只要重启 dsh-web 即生效,不用重装
- 离线包也可以先在有网的机器执行 npm pack 生成 tgz,再 dsh plugin --profile web add ./dsh-plugin-mobile-ux-2.0.0.tgz
装完怎么确认成功了
三层验证:装上了、服务认了、浏览器真的跑了。
-
第一层:包在 profile 里
# 应该看到插件出现在 dependencies 与 bundles 里 cat ~/.dsh/profiles/web/package.json -
第二层:服务能解析它(这一步最容易被忽略)
# 组装配置里应出现插件的行;出现 skipping profile bundle 就是没解析到 dsh --profile web --dump-config | grep -A2 dsh-plugin-mobile-ux journalctl -u dsh-web --since "-5 min" | grep -c "skipping profile bundle" # 期望 0 -
第三层:浏览器控制台里摸得到它
在装了插件的页面里打开控制台(手机可用 Safari 的「检查」或地址栏
javascript:前缀),执行:typeof window.__dshMobileUx # object 表示插件已执行 window.__dshMobileUx.metrics() # 打印可视视口、外壳高度等实时数据 # 加载前覆盖某一节(与上面的读数 API 是两个属性,互不覆盖): window.__dshMobileUxOptions = { keyboard: false } -
肉眼验收(手机上最直观)
- 侧边栏浮在对话之上并带遮罩,点空白处收起
- 输入框底部按钮保持一行;设置面板全屏纵向
- 点输入框页面不放大;打字与回撤时输入框不掉到键盘后面
- 点一个未选中的会话:单击即切换,且抽屉自动收起
想要实时诊断面板,在页面地址后加 ?dshMobileUx=hud —— 左上角会出现 vvH / root / kb / lock 等读数,手机截图就能定位问题。
不想全要?按需开关
装完就能用;下面是常用的两个开关,完整清单见首页。
| 用法 | 作用 |
|---|---|
?dshMobileUx=hud |
左上角显示实时读数,排障用 |
?dshMobileUx=0 |
整包临时停用(不改安装状态) |
?dshMobileUx=notap |
只关「单击切换会话」,保留其余各节 |
?dshMobileUx=nokeyboard |
关掉键盘跟随与滚动锁,其余各节照常 |
?dshMobileUx=notrajectory |
关掉「轨迹打开即到最新」 |
?dshMobileUx=freezoom |
允许页面被放大(默认钉住缩放,防止聚焦时整页放大) |
?dshMobileUx=tap,hud |
只留一节时,hud 这类读数开关不会被当成节来挤掉别节 |
卸载与升级
完全可逆:插件只注入样式、挂监听器和几个内联样式,卸载时逐一还原。
卸载
一条命令 + 重启
dsh plugin --profile web remove dsh-plugin-mobile-ux
systemctl restart dsh-web升级
必须用 update,add 不会更新
dsh plugin --profile web update dsh-plugin-mobile-ux
systemctl restart dsh-web为什么 add 不行:从 git 安装的包会被锁在一个具体 commit 上。重复执行 add 时 pnpm 认为 spec 没变,直接打印 Lockfile is up to date, resolution step is skipped 就结束了 —— 文件一个字节都不会变。update 才会重新解析该依赖并拉取远端最新 commit。
安装期排错
按报错原文找就行。
| 报错 / 现象 | 原因与处理 |
|---|---|
spawn pnpm ENOENT |
dsh 找不到自己的 pnpm。把 dsh 的 bin 目录加进 PATH 后重试(本机为 ~/.hermes/node/bin)。 |
skipping profile bundle |
bundle 没能从 profile 的 node_modules 解析出来:确认包已装在同一个 profile 下,然后重启 dsh web。 |
| 装完界面毫无变化 | 九成是没重启 dsh-web,或者页面没硬刷新(immutable 缓存)。 |
404 Not Found - PUT .../dsh-plugin-mobile-ux |
包尚未发布到 npm(见方案 B),改用方案 A 从 GitHub 安装。 |
Failed to connect to github.com |
网络到 GitHub 不通:换 npm 方案,或按方案 C 从目录安装。 |
| 插件在设置里显示为 failed | apply() 执行时抛异常,不是依赖问题。看 journalctl -u dsh-web 里的堆栈,对照 client.js。 |
注意 cordis 的客户端 Context 是 Proxy:访问未声明的服务会直接抛错而不是返回 undefined。写插件时用 ctx.get() 可选查找,别写 ctx.styles 这种不存在的服务。