面试题答案
一键面试性能优化
- 大量路由表加载
- 懒加载:使用动态导入(
import()
)来懒加载路由组件,而不是在初始加载时就加载所有路由组件。例如:
- 懒加载:使用动态导入(
const routes = [
{
path: '/home',
component: () => import('./components/Home.vue')
},
{
path: '/about',
component: () => import('./components/About.vue')
}
];
- **分块加载**:将路由表按照功能模块进行划分,根据用户的操作或者需求,逐步加载对应的路由块。
2. 避免频繁DOM操作
- 虚拟DOM:采用虚拟DOM库(如Vue.js、React),这些库会在内存中构建虚拟DOM树,对比前后状态的差异,然后批量更新真实DOM,大大减少了直接操作真实DOM的频率。
- 防抖与节流:对于一些可能频繁触发路由切换的事件(如窗口resize、滚动等),使用防抖(Debounce)或节流(Throttle)技术。例如,使用Lodash库的_.debounce
和_.throttle
方法:
import _ from 'lodash';
window.addEventListener('resize', _.debounce(() => {
// 处理路由相关操作
}, 300));
权限控制
- 全局前置守卫:在路由配置中使用全局前置守卫(如Vue Router的
router.beforeEach
)。在用户每次导航到新路由时,检查用户的权限信息。
import router from './router';
import { getCurrentUser } from './auth';
router.beforeEach((to, from, next) => {
const user = getCurrentUser();
if (to.meta.requiresAuth && (!user ||!user.isAuthenticated)) {
next('/login');
} else {
next();
}
});
- 路由元信息:在路由配置中添加元信息(
meta
)来标记该路由所需的权限。例如:
const routes = [
{
path: '/admin',
component: () => import('./components/Admin.vue'),
meta: { requiresAuth: true, roles: ['admin'] }
},
{
path: '/user',
component: () => import('./components/User.vue'),
meta: { requiresAuth: true, roles: ['user'] }
}
];
动态加载路由组件
- 根据权限动态生成路由表:在用户登录成功后,根据用户的角色和权限动态生成路由表。例如,在Vue中:
import { getRoutesByRole } from './routeGenerator';
import { getCurrentUser } from './auth';
const user = getCurrentUser();
const dynamicRoutes = getRoutesByRole(user.role);
const router = new VueRouter({
routes: dynamicRoutes
});
- 异步组件加载:如前文所述,使用动态导入(
import()
)实现组件的异步加载,这样只有在路由被访问时才会加载对应的组件,提高页面加载性能。