interface RenderStartupErrorOptions { reload?: () => void; root?: HTMLElement | null; } /** * 在 Vue 应用尚未挂载时展示可恢复的启动错误,避免异常后只剩白屏。 */ function renderStartupError(options: RenderStartupErrorOptions = {}) { const root = options.root ?? document.querySelector('#app'); if (!root) { return false; } const container = document.createElement('main'); container.className = 'startup-error'; container.setAttribute('role', 'alert'); const content = document.createElement('div'); content.className = 'startup-error__content'; const title = document.createElement('h1'); title.className = 'startup-error__title'; title.textContent = '页面加载失败'; const description = document.createElement('p'); description.className = 'startup-error__description'; description.textContent = '请刷新后重试'; const retryButton = document.createElement('button'); retryButton.className = 'startup-error__retry'; retryButton.type = 'button'; retryButton.textContent = '重新加载'; retryButton.addEventListener('click', () => { (options.reload ?? (() => window.location.reload()))(); }); content.append(title, description, retryButton); container.append(content); root.replaceChildren(container); retryButton.focus(); return true; } export { renderStartupError };