标准答案

  1. 路由懒加载通常用 lazy、动态 import 或框架路由能力,把页面组件拆成独立 chunk。
  2. 权限控制要先区分登录态、角色权限、资源权限和按钮权限,不能只靠菜单是否展示。
  3. 常见做法是在路由配置里声明 meta 或 handle 信息,再用 RequireAuth、RequirePermission 这类包装组件判断是否允许渲染。
  4. 未登录时跳转登录页,权限不足时展示 403 或引导申请权限,不要让页面空白。
  5. 后端接口仍然必须做权限校验,前端路由权限只是体验层和入口控制。

题目解析

这道题的重点是把加载边界和权限边界分开。懒加载不等于权限控制,权限控制也不能只靠懒加载隐藏代码。

权限判断不要散落在每个页面里。集中到路由配置和权限组件中,后续新增页面时更容易保持一致。

如果权限依赖异步用户信息,要处理初始化 loading,否则刷新受保护路由时可能先误判再跳转。

代码示例

下面展示了用懒加载页面和权限包装组件组织受保护路由。

TSX
const OrderPage = lazy(() => import('./pages/OrderPage'))

function RequirePermission({
  permission,
  children
}: {
  permission: string
  children: ReactNode
}) {
  const auth = useAuth()

  if (auth.loading) {
    return <span>加载中</span>
  }

  if (!auth.user) {
    return <Navigate to="/login" replace />
  }

  if (!auth.permissions.includes(permission)) {
    return <ForbiddenPage />
  }

  return children
}

常见误区

  • 只隐藏菜单,不拦截直接访问受保护路由。
  • 前端通过权限路由控制后,后端接口就不再校验权限。
  • 权限数据异步加载时没有 loading 态,刷新页面会误跳登录或 403。

作者信息