fix(chat-build): 避免预渲染阶段请求本地接口

- 移除聊天页 setup 阶段的服务端会话预取\n- 改为客户端挂载后再加载账号和会话数据\n- 修复 nuxt generate 在发布机构建时访问本地聊天接口导致的失败
This commit is contained in:
2977094657
2026-03-16 11:07:52 +08:00
Unverified
parent 4cc87be031
commit 3e7a9560cd
2 changed files with 2 additions and 75 deletions
+1 -74
View File
@@ -7,7 +7,7 @@ const SESSION_LIST_WIDTH_DEFAULT = 295
const SESSION_LIST_WIDTH_MIN = 220
const SESSION_LIST_WIDTH_MAX = 520
export const useChatSessions = async ({ chatAccounts, selectedAccount, realtimeEnabled, api }) => {
export const useChatSessions = ({ chatAccounts, selectedAccount, realtimeEnabled, api }) => {
const showSearchAccountSwitcher = false
const contacts = ref([])
@@ -134,79 +134,6 @@ export const useChatSessions = async ({ chatAccounts, selectedAccount, realtimeE
loadSessionListWidth()
})
const apiBase = useApiBase()
const { data: prefetchedAccounts } = await useAsyncData('chat-accounts', () => {
if (process.server) {
const port = process.env.WECHAT_TOOL_PORT || '10392'
return $fetch('/api/chat/accounts', { baseURL: `http://127.0.0.1:${port}` })
}
return $fetch('/chat/accounts', { baseURL: apiBase })
}, { watch: false, lazy: true })
if (prefetchedAccounts.value?.accounts?.length && !chatAccounts.loaded) {
const response = prefetchedAccounts.value
chatAccounts.accounts = response.accounts
const preferred = chatAccounts.selectedAccount
const fallback = response.default_account || response.accounts[0] || ''
chatAccounts.selectedAccount = (preferred && response.accounts.includes(preferred)) ? preferred : fallback
chatAccounts.loaded = true
}
const ssrSelectedAccount = chatAccounts.selectedAccount || ''
const { data: prefetchedSessions } = await useAsyncData(`chat-sessions-${ssrSelectedAccount}`, () => {
if (!ssrSelectedAccount) return Promise.resolve(null)
const params = new URLSearchParams({
account: ssrSelectedAccount,
limit: '400',
include_hidden: 'false',
include_official: 'false'
})
if (process.server) {
const port = process.env.WECHAT_TOOL_PORT || '10392'
return $fetch(`/api/chat/sessions?${params}`, { baseURL: `http://127.0.0.1:${port}` })
}
return $fetch(`/chat/sessions?${params}`, { baseURL: apiBase })
}, { watch: false, lazy: true })
if (prefetchedSessions.value?.sessions?.length) {
const ssrAvatars = new Map()
contacts.value = prefetchedSessions.value.sessions.map((session) => {
if (session.avatar) ssrAvatars.set(session.username || session.id, session.avatar)
return {
id: session.id,
name: session.name || session.username || session.id,
avatar: null,
lastMessage: normalizeSessionPreview(session.lastMessage || ''),
lastMessageTime: session.lastMessageTime || '',
unreadCount: session.unreadCount || 0,
isGroup: !!session.isGroup,
isTop: !!session.isTop,
username: session.username
}
})
if (process.client && ssrAvatars.size) {
const applySsrAvatars = () => {
const entries = Array.from(ssrAvatars.entries())
const batchSize = 6
let index = 0
const next = () => {
const batch = entries.slice(index, index + batchSize)
if (!batch.length) return
for (const [key, url] of batch) {
const contact = contacts.value.find((item) => (item.username || item.id) === key)
if (contact) contact.avatar = url
}
index += batchSize
if (index < entries.length) setTimeout(next, 150)
}
next()
}
setTimeout(applySsrAvatars, 500)
}
}
const filteredContacts = computed(() => {
const query = String(searchQuery.value || '').trim().toLowerCase()
if (!query) return contacts.value
+1 -1
View File
@@ -84,7 +84,7 @@ if (process.client) {
const searchContext = ref(createEmptySearchContext())
const sessionState = await useChatSessions({
const sessionState = useChatSessions({
chatAccounts,
selectedAccount,
realtimeEnabled,