perf(renderer): field-level settings subscriptions, file list virtualization, per-panel error boundary

- TerminalView: replace whole-settings subscription with five useShallow
  field groups; theme writes no longer refit every pane, and unrelated
  settings writes no longer touch xterm options at all. useResolvedTheme
  is now a shallow subscription + memoized lookup. TerminalHandle was dead
  (no caller ever passed a ref) — dropped forwardRef/useImperativeHandle
- FilePanel: fixed-row-height (24px) windowing above 200 entries, no new
  dependency (antd 6 ships @rc-component/virtual-list only transitively);
  per-row Dropdown kept. NOTE: .sftp-row is now box-sizing:border-box
  height:24px, keep in sync with ROW_HEIGHT in FilePanel.tsx
- PanelErrorBoundary wraps each dockview panel so a pane crash no longer
  unmounts the whole workspace (i18n: workspace.error.panelTitle/panelRetry)
- SshBottomPanel: memo(FilePanel) — sessionId is the only prop and constant
- TransferPanel: ref-held Map + version counter replaces per-event Map
  copies; memo rows skip unchanged entries
- MonitorPanel: ResizeObserver/canvas setup runs once, data updates only
  redraw
This commit is contained in:
Bill committed 2026-10-07 22:06:31 +08:00
1 parent 6c04f0e8c1
commit 9c75cdc7d4
13 files changed
+547 -257

No files matched your search

+3 -1
View File
@@ -56,7 +56,9 @@ const workspace: Record<string, string> = {
'workspace.connect.connectingNamed': '正在连接 {name}',
'workspace.connect.action': '连接',
'workspace.error.title': '界面出现异常',
'workspace.error.reload': '重新加载'
'workspace.error.reload': '重新加载',
'workspace.error.panelTitle': '此面板出现异常',
'workspace.error.panelRetry': '重试'
}
export default workspace