Skip to content

[Bug] 插件宿主半不能热重载;客户端半改动必须 touch 才生效(immutable 缓存 + rev 不变) #474

Description

@greyoak111

Bug 6 · 插件宿主半不能热重载;客户端半改动必须 touch 才生效(无文档)

严重度:中 —— 每次改动都要重启宿主,且客户端改动极易被误判为「没生效」

症状

插件改完之后无法通过「刷新页面」或「等待」看到效果 —— 表现成
「我的改动没生效」,而开发者会去怀疑自己的代码。

两种改动、两种失效方式、都没有文档说明。

6a · 宿主半(lib/index.js)不能热重载

两个版本各实测一次:

改 PROBE_REV: 'rev-12' → 'rev-13',touch lib/index.js
等 9 秒后查探针 → 仍返回 rev-12

⇒ 改宿主半必须重启 harness。

6b · 客户端半(lib/client.js)改动必须 touch 文件,否则刷新是假刷新

响应头:

cache-control: public, max-age=31536000, immutable

插件 bundle 的 URL 带 rev:

{"id":"<plugin>","url":"/plugins/??<plugin>/client.js&rev=<hash>","rev":"<hash>"}

实测:

动作 rev 是否变化
改 lib/client.js 内容 ❌ 不变
touch package.json ❌ 不变
touch lib/client.js ✅ 变

⇒ 只改内容不 touch,rev 不变 ⇒ URL 不变 ⇒ immutable 让浏览器一年不回源 ⇒
用户「刷新」后跑的仍是旧代码。

而服务器侧其实早就是新内容(直接 curl 该 URL 可以验证)⇒
开发者会以为是自己的代码有问题,实际是缓存。

根因

  • 6a:插件宿主半在加载时被实例化一次,没有文件监听。
  • 6b:客户端 bundle 的 rev 不是内容哈希的实时结果 ——
    改内容不改变它,只有 touch 才改变。
    而响应头是 immutable + 一年,rev 不变 ⇒ URL 不变 ⇒ 浏览器根本不回源。
    (服务端本身是新的:直接 curl 该 URL 能取到新内容 —— 所以问题完全在缓存层。)

期望

  1. touch 这一步要求应写进插件开发文档;或
  2. 内容变化时 rev 自动更新(毕竟它应当是内容哈希);或
  3. 开发模式下对插件 bundle 改为 no-cache

影响面

所有插件开发者。这条的代价不是「多敲一次命令」,而是
「服务器是新代码、浏览器跑旧代码」这个中间态——
开发者最自然的反应是去翻自己的代码找 bug,方向完全错了。

⇒ 建议至少在插件开发文档里用醒目位置写明。



被测版本:DSH Desktop 0.9.0(内核 @deepseek-ai/* = 0.1.5-rc.2) · macOS / Apple Silicon (arm64)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions