Files
Nexus/docs/changelog/2026-06-18-terminal-persist-navigation.md
T
r 7add9384c1 feat: 终端路由保持会话 + 服务器列表按创建时间倒序
keep-alive 下终端切换不 dispose SSH;列表/推送/终端默认 newest first。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-21 11:11:00 +08:00

1.6 KiB
Raw Blame History

终端页切换路由保持 SSH 会话

日期2026-06-18

摘要

用户从「终端」页导航至其他 SPA 页面时,WebSSH 会话不再被主动断开;返回终端页可继续操作同一标签与会话。

动机

此前 TerminalPage 被刻意排除在 keep-alive 之外,且 onBeforeUnmount 中调用 disposeAllSessions(),路由切换即卸载组件并关闭全部 WebSocket/SSH 连接,与运维「开终端查问题、切页看列表、再回来继续敲命令」的工作流冲突。

方案

  1. TerminalPage 加入 CACHED_PAGE_NAMES,由 App.vue 现有 <keep-alive> 缓存实例。
  2. 生命周期调整:
    • onDeactivated:仅移除全局快捷键监听, dispose 会话。
    • onActivated:恢复快捷键、refit xterm、聚焦当前标签。
    • onBeforeUnmount:仅在缓存淘汰或组件真正销毁时 dispose(与 keep-alive max=12 一致)。
    • 监听 auth.isLoggedIn:登出时 dispose,避免缓存中残留 SSH 连接。

未将会话提升到全局 storetermNativeStore 已是模块级单例,配合 keep-alive 即可,改动最小。

涉及文件

  • frontend/src/constants/cachedPages.ts
  • frontend/src/pages/TerminalPage.vue

迁移 / 重启

无。仅前端构建/热更新。

验证

cd frontend && npm run build
pytest tests/test_webssh_terminal_payload.py tests/test_terminal_quick_commands.py -q

手动:登录 → 终端连接一台服务器 → 侧栏切「服务器」→ 再切回「终端」→ 会话仍 connected,可继续输入;登出后重进终端应为空会话。