From dcc10eb0a92b69266503549972f05757ec0149ca Mon Sep 17 00:00:00 2001 From: yiliang114 <1204183885@qq.com> Date: Thu, 20 Nov 2025 11:07:09 +0800 Subject: [PATCH] =?UTF-8?q?fix(vscode-ide-companion):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=20useVSCode=20hook=20=E5=AE=9E=E7=8E=B0,=20=20=E8=A7=A3?= =?UTF-8?q?=E5=86=B3=20webview=20=E4=B8=AD=20vscode=20api=20=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E5=A3=B0=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/webview/hooks/useVSCode.ts | 56 +++++++++++++------ 1 file changed, 38 insertions(+), 18 deletions(-) diff --git a/packages/vscode-ide-companion/src/webview/hooks/useVSCode.ts b/packages/vscode-ide-companion/src/webview/hooks/useVSCode.ts index 05756bda..51282961 100644 --- a/packages/vscode-ide-companion/src/webview/hooks/useVSCode.ts +++ b/packages/vscode-ide-companion/src/webview/hooks/useVSCode.ts @@ -4,8 +4,6 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { useMemo } from 'react'; - export interface VSCodeAPI { postMessage: (message: unknown) => void; getState: () => unknown; @@ -14,21 +12,43 @@ export interface VSCodeAPI { declare const acquireVsCodeApi: () => VSCodeAPI; -export function useVSCode(): VSCodeAPI { - return useMemo(() => { - if (typeof acquireVsCodeApi !== 'undefined') { - return acquireVsCodeApi(); - } +/** + * 模块级别的 VS Code API 实例缓存 + * acquireVsCodeApi() 只能调用一次,必须在模块级别缓存 + */ +let vscodeApiInstance: VSCodeAPI | null = null; - // Fallback for development/testing - return { - postMessage: (message: unknown) => { - console.log('Mock postMessage:', message); - }, - getState: () => ({}), - setState: (state: unknown) => { - console.log('Mock setState:', state); - }, - }; - }, []); +/** + * 获取 VS Code API 实例 + * 使用模块级别缓存确保 acquireVsCodeApi() 只被调用一次 + */ +function getVSCodeAPI(): VSCodeAPI { + if (vscodeApiInstance) { + return vscodeApiInstance; + } + + if (typeof acquireVsCodeApi !== 'undefined') { + vscodeApiInstance = acquireVsCodeApi(); + return vscodeApiInstance; + } + + // Fallback for development/testing + vscodeApiInstance = { + postMessage: (message: unknown) => { + console.log('Mock postMessage:', message); + }, + getState: () => ({}), + setState: (state: unknown) => { + console.log('Mock setState:', state); + }, + }; + return vscodeApiInstance; +} + +/** + * Hook to get VS Code API + * 多个组件可以安全地调用此 hook,API 实例会被复用 + */ +export function useVSCode(): VSCodeAPI { + return getVSCodeAPI(); }