deploy-ease-platform/frontend/src/main.tsx
2025-11-06 10:56:17 +08:00

87 lines
2.4 KiB
TypeScript

import React from 'react';
import ReactDOM from 'react-dom/client';
import { Provider } from 'react-redux';
import store from './store';
import './index.css';
import { Toaster } from '@/components/ui/toaster.tsx';
import ErrorBoundary from '@/components/ErrorBoundary';
import { getCurrentUserMenus } from '@/pages/System/Menu/List/service';
import { setMenus } from './store/userSlice';
import App from './App';
import AppSkeleton from './layouts/components/AppSkeleton';
/**
* 应用启动流程 - 性能优化版本
*
* 优化点:
* 1. 优先使用缓存菜单,快速启动
* 2. 减少控制台日志输出
* 3. 使用骨架屏提升体验
* 4. 登录后刷新页面确保路由正确
*/
const rootElement = document.getElementById('root')!;
const root = ReactDOM.createRoot(rootElement);
// 启动应用
async function bootstrap() {
try {
const token = localStorage.getItem('token');
// 如果已登录,预加载菜单数据
if (token) {
// 检查 localStorage 中是否有缓存的菜单数据
const cachedMenus = localStorage.getItem('menus');
if (cachedMenus) {
try {
const menus = JSON.parse(cachedMenus);
if (menus && menus.length > 0) {
// ✅ 优先使用缓存,快速启动
store.dispatch(setMenus(menus));
} else {
throw new Error('缓存菜单为空');
}
} catch (error) {
// 缓存失败,从服务器获取
const menuData = await getCurrentUserMenus();
store.dispatch(setMenus(menuData));
}
} else {
// 没有缓存,从服务器获取
const menuData = await getCurrentUserMenus();
store.dispatch(setMenus(menuData));
}
}
// ✅ 渲染应用
root.render(
<ErrorBoundary>
<Provider store={store}>
<App />
<Toaster />
</Provider>
</ErrorBoundary>
);
} catch (error) {
// 启动失败,清除 token 并渲染应用(会自动跳转到登录页)
localStorage.removeItem('token');
localStorage.removeItem('menus');
root.render(
<ErrorBoundary>
<Provider store={store}>
<App />
<Toaster />
</Provider>
</ErrorBoundary>
);
}
}
// 显示骨架屏(更好的视觉体验)
root.render(<AppSkeleton />);
// 启动应用
bootstrap();