initPageLoader
源码:packages/ui-default/hydro.ts,从 packages/ui-default/api.ts 重新导出
函数
initPageLoader
ts
async function initPageLoader(): Promise<void>初始化前端页面加载器:创建 PageLoader,从 data-page 属性解析当前页面名称,构建生命周期回调序列(autoload beforeLoading → 命名 beforeLoading → autoload afterLoading → 命名 afterLoading),并按顺序执行每个回调。完成后隐藏页面加载遮罩层,触发区块动画,并触发 vjPageFullyInitialized DOM 事件。
行为细节:
- 页面解析 — 读取
document.documentElement.getAttribute('data-page')确定当前路由名称。 - 回调序列 — 调用
buildSequence()收集具有匹配beforeLoading/afterLoading钩子的页面,然后按以下顺序迭代:autoload before → 命名 before → autoload after → 命名 after。 - 嵌套加载 — 每个回调接收一个
loadPage(depth, type)函数,可以按模块名递归调用另一个页面的生命周期钩子,深度上限为 32。 - 错误处理 — 单个回调失败会被捕获,通过
window.captureException?.(e)(Sentry)报告,并以Notification.warn()通知;继续执行剩余回调。 - 性能日志 — 开发模式下,耗时 >16ms 的回调会被记录;生产环境下仅记录 >256ms 的回调。
- 加载后处理 — 所有回调完成后:隐藏
.page-loader,运行区块淡入动画,在.section元素上触发vjLayout事件,并在$(document)上触发vjPageFullyInitialized。
内部辅助函数
以下函数未导出,但被 initPageLoader 引用:
buildSequence
ts
function buildSequence(pages: Page[], type: 'before' | 'after'): Array<{ page: Page; func: Callback; type: string }>过滤具有 beforeLoading 或 afterLoading 钩子的页面,返回 { page, func, type } 对象数组用于顺序执行。
PageLoader (类)
源码:packages/ui-default/misc/PageLoader.js
ts
class PageLoader {
pageInstances: Page[]
constructor()
getAutoloadPages(): Page[]
getNamedPage(pageName: string): Page[]
getPage(moduleName: string): Page[]
}收集所有已注册页面(通过 require.context 从 pages/ 和 components/ 目录加载的内置页面,加上 window.Hydro.extraPages),过滤出有效的 Page 实例,并立即调用纯函数入口。
| 方法 | 说明 |
|---|---|
getAutoloadPages() | 返回所有 autoload = true 的页面实例。 |
getNamedPage(pageName) | 通过 isNameMatch() 返回名称匹配给定路由名称的页面实例。 |
getPage(moduleName) | 返回匹配给定 moduleName 属性的页面实例。 |
另见
- 页面注册系统 —
Page、NamedPage、AutoloadPage、addPage()