dsh-plugin-mobile-ux

安装指南

把这个插件装到你的 DSH 上

一条命令,不需要构建、不需要服务端组件、不需要改产品源码。装完重启 dsh web 并刷新页面即可,卸载同样是一条命令。

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,也不需要手动拷文件。已实测走通。

1

一条命令装进 profile

github:
你的电脑pnpm
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
2

重启 dsh web

必须
服务器systemctl
systemctl restart dsh-web   # 或用你自己托管 dsh web 的方式

不重启等于没装:DSH 用文件 mtime/ctime/size 算 bundle 版本号,响应头又是 immutable 一年缓存。不重启则磁盘上是新的、服务端也可能返回新内容,但浏览器仍执行旧代码。

3

强制刷新页面

电脑 / 手机都行
  • 电脑:Ctrl/Cmd + Shift + R
  • iPhone Safari:下拉刷新,或关掉标签页重新打开
  • 装到主屏幕的独立窗口:从任务切换器划掉再重开

方案 B:从 npm 安装(暂不可用)

本包尚未发布到 npm。下面是发布后会变成的样子,以及目前卡在哪里。

1

发布后会是这样

npm
terminal
dsh plugin --profile web add @yourscope/dsh-plugin-mobile-ux
systemctl restart dsh-web
  • 包名会带发布者的作用域,装起来比走 GitHub 快,也不依赖 GitHub 可达
  • registry 是镜像时新版本可能还没同步,加 --registry=https://registry.npmjs.org/
2

目前卡在哪里

发布方的问题

发布者的 npm 账号启用了安全密钥型的 2FA(Auth & Writes),而这台服务器没有 TOTP 验证器;npm 对这类账号要求发布时必须提供 OTP,或使用能绕过 2FA 的 token。已实测三种写法均被 registry 拒绝。

  • 对使用者没有影响:方案 A 装的是一模一样的包,已验证逐字节一致
  • 将来要发 npm,改用 GitHub Actions + Trusted Publishing(OIDC)即可完全绕开 token 与 OTP

方案 C:本地目录 / 离线安装

不想依赖 GitHub,或者机器不能出网时用这个。

1

把仓库拷到服务器上

任选一种
服务器clone
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/
2

按目录安装并重启

link:
terminal
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

装完怎么确认成功了

三层验证:装上了、服务认了、浏览器真的跑了。

  1. 第一层:包在 profile 里
    服务器cat
    # 应该看到插件出现在 dependencies 与 bundles 里
    cat ~/.dsh/profiles/web/package.json
  2. 第二层:服务能解析它(这一步最容易被忽略)
    服务器verify
    # 组装配置里应出现插件的行;出现 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
  3. 第三层:浏览器控制台里摸得到它 在装了插件的页面里打开控制台(手机可用 Safari 的「检查」或地址栏 javascript: 前缀),执行:
    浏览器控制台console
    typeof window.__dshMobileUx   # object 表示插件已执行
    window.__dshMobileUx.metrics()   # 打印可视视口、外壳高度等实时数据
    # 加载前覆盖某一节(与上面的读数 API 是两个属性,互不覆盖):
    window.__dshMobileUxOptions = { keyboard: false }
  4. 肉眼验收(手机上最直观)
    • 侧边栏浮在对话之上并带遮罩,点空白处收起
    • 输入框底部按钮保持一行;设置面板全屏纵向
    • 点输入框页面不放大;打字与回撤时输入框不掉到键盘后面
    • 点一个未选中的会话:单击即切换,且抽屉自动收起

想要实时诊断面板,在页面地址后加 ?dshMobileUx=hud —— 左上角会出现 vvH / root / kb / lock 等读数,手机截图就能定位问题。

不想全要?按需开关

装完就能用;下面是常用的两个开关,完整清单见首页。

用法 作用
?dshMobileUx=hud 左上角显示实时读数,排障用
?dshMobileUx=0 整包临时停用(不改安装状态)
?dshMobileUx=notap 只关「单击切换会话」,保留其余各节
?dshMobileUx=nokeyboard 关掉键盘跟随与滚动锁,其余各节照常
?dshMobileUx=notrajectory 关掉「轨迹打开即到最新」
?dshMobileUx=freezoom 允许页面被放大(默认钉住缩放,防止聚焦时整页放大)
?dshMobileUx=tap,hud 只留一节时,hud 这类读数开关不会被当成节来挤掉别节

卸载与升级

完全可逆:插件只注入样式、挂监听器和几个内联样式,卸载时逐一还原。

卸载

一条命令 + 重启

terminal
dsh plugin --profile web remove dsh-plugin-mobile-ux
systemctl restart dsh-web

升级

必须用 update,add 不会更新

terminal
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 这种不存在的服务。