definePage 宏

definePage 是一个编译时宏,允许你在页面组件中声明路由配置,无需在单独的路由文件中手动定义。

基本用法

在页面组件的顶层直接调用 definePage,无需导入:

tsx
// src/pages/about.tsx
definePage({
  name: 'about',
  meta: {
    title: '关于我们',
    requiresAuth: false
  }
})

export default function About() {
  return <div>关于页面</div>
}

INFO

definePage 是编译时宏,构建时会被自动移除,不会出现在运行时代码中。你不需要手动导入它。

支持的配置项

definePage 支持以下配置项:

name

自定义路由名称,用于编程式导航。优先级高于基于路径自动生成的名称。

tsx
definePage({
  name: 'user-detail'
})

meta

路由元数据,必须是 JSON 可序列化的对象。常用于存储页面标题、权限标记等信息。

tsx
definePage({
  meta: {
    title: '用户详情',
    requiresAuth: true,
    order: 1
  }
})

pattern

动态参数的匹配约束,值为正则表达式对象。

tsx
definePage({
  pattern: {
    id: /^d+$/ // id 参数只匹配数字
  }
})

redirect

路由重定向配置,支持字符串或配置对象:

tsx
// 字符串形式 — 重定向到指定路径
definePage({
  redirect: '/new-about'
})

// 配置对象形式 — 重定向并携带参数
definePage({
  redirect: {
    index: 'user-detail',
    params: { id: 'default' }
  }
})

alias

路由别名,支持字符串或字符串数组:

tsx
definePage({
  alias: '/info'
})

// 多个别名
definePage({
  alias: ['/info', '/company']
})

注意事项

WARNING

meta 的值必须是 JSON 可序列化的对象。不支持函数、DateRegExp 等非序列化类型。pattern 中的正则表达式是例外,它们由 AST 解析器单独处理。

WARNING

definePage 必须在组件的顶层调用,不能放在条件语句、循环或函数内部。以下写法是错误的:

tsx
// ❌ 错误:不能在条件语句中调用
if (someCondition) {
  definePage({ name: 'conditional' })
}

// ❌ 错误:不能在函数中调用
function setup() {
  definePage({ name: 'dynamic' })
}

完整示例

tsx
// src/pages/custom-route.tsx
definePage({
  name: 'custom-route-demo',
  meta: {
    title: '自定义路由配置示例',
    requiresAuth: true,
    order: 1
  },
  pattern: {
    id: /^d+$/
  },
  alias: '/demo'
})

export default function CustomRoute() {
  return (
    <div>
      <h1>自定义路由页面</h1>
      <p>此页面使用了 definePage 宏配置路由</p>
    </div>
  )
}