首页/新闻资讯/正文详情

HarmonyOS开发实战:笔友-main_pages.json 路由表与页面注册机制

发布时间:2026/11/15 20:50:04 来源:云帆数科 栏目:资讯中心
HarmonyOS开发实战:笔友-main_pages.json 路由表与页面注册机制
前言在 HarmonyOS ArkTS 声明式开发范式中路由表是页面注册与跳转的中枢神经。它以一个简单的 JSON 文件描述了应用中所有可访问的页面配合router.pushUrl、router.replaceUrl等 API 完成页面间导航。本文将以开源鸿蒙笔友通信应用 xiexin 的main_pages.json为蓝本详细剖析路由表的格式、与module.json5的契约关系、windowStage.loadContent如何依赖路由表以及路由表设计中的常见陷阱。提示本文假设你已经了解 HarmonyOS Stage 模型基础。如果还不熟悉建议先阅读前两篇文章。一、main_pages.json 的定位main_pages.json是 ArkTS 声明式开发范式下的页面路由表它告诉系统“我的应用里有哪些页面可以被加载”。这个文件位于entry/src/main/resources/base/profile/main_pages.json路径解析如下路径段含义entry/src/main主模块源码根目录resources资源目录base默认资源限定无特殊配置时的资源目录profileprofile 类型的资源用于存放 JSON 配置main_pages.json文件名可自定义但需在 module.json5 中引用提示除了base目录资源还可以放在dark、zh_CN、en_US等限定目录中。系统会根据设备状态自动选择匹配的资源。这部分内容将在后续文章中详细讲解。二、xiexin 的路由表完整内容xiexin 的main_pages.json内容非常简洁{src:[pages/Index,pages/SplashPage,pages/ComposePage,pages/ReadLetterPage,pages/PenPalDetailPage,pages/AddPenPalPage,pages/StatsPage,pages/EditProfilePage]}整个文件只有两个字段src字符串数组列出所有页面路径隐式文件位置决定了路由表如何被 module.json5 引用三、src 数组中的路径约定src数组中的每个字符串代表一个页面路径。这个路径有几条重要约定3.1 路径前缀pages/路径中的pages/前缀对应文件系统中的实际位置entry/src/main/ets/pages/Index.ets ^^^^^^^^^^^^^^^^^ 对应路由表中的 pages/Index注意几个细节省略.ets后缀路由表中不写.ets系统自动补全路径分隔符使用正斜杠/即使在 Windows 上也保持一致大小写敏感pages/Index和pages/index是不同的页面路径无ets/前缀因为ets已经是默认源码根目录3.2 路径与 Entry 装饰器的对应src数组中的每个路径必须对应一个使用Entry装饰的 ArkTS 文件。以pages/Index为例// entry/src/main/ets/pages/Index.etsEntryComponentstruct Index{StatecurrentTab:number0;build(){Tabs({barPosition:BarPosition.End,index:this.currentTab}){// ...}}}注意以下几点一个文件只能有一个EntryEntry标识这是路由表入口多入口会引发编译错误Entry必须搭配ComponentEntry修饰的struct必须同时用Component修饰struct名称可以任意与路由路径无关但建议与文件名保持一致以便维护3.3 路径顺序与首屏加载src数组中的第一个路径默认是应用的首屏。但 xiexin 的路由表第一个是pages/Index{src:[pages/Index,// 首屏pages/SplashPage,// ...]}这看起来与应用启动时先看到 SplashPage的设计矛盾。实际上首屏加载由EntryAbility控制// entry/src/main/ets/entryability/EntryAbility.etsonWindowStageCreate(windowStage:window.WindowStage):void{windowStage.loadContent(pages/Index,(err){// ...});}loadContent(pages/Index)显式指定加载pages/Index而不是默认的pages/SplashPage。这是 xiexin 的一个设计取舍方案 A首屏加载pages/SplashPage引导结束后跳转到pages/Index方案 B首屏直接加载pages/Index引导页通过条件渲染内嵌xiexin 当前采用了方案 A的变体路由表首项是pages/Index但Index内部会根据hasSeenSplash标志决定是否显示引导内容。这种设计避免了启动时的一次页面跳转提升了首屏速度。四、路由表与 module.json5 的契约main_pages.json不是孤立的配置文件它通过module.json5的pages字段被引用// entry/src/main/module.json5 { module: { name: entry, type: entry, mainElement: EntryAbility, deviceTypes: [phone, tablet, 2in1], pages: $profile:main_pages, abilities: [/* ... */] } }pages字段的值$profile:main_pages是一个资源引用解析规则如下引用格式含义$profile:main_pages引用resources/base/profile/main_pages.json$media:app_icon引用resources/base/media/app_icon.png$string:app_name引用resources/base/element/string.json中的app_name$color:start_window_background引用resources/base/element/color.json中的颜色提示$profile:main_pages中的main_pages是文件名不含.json后缀$profile:是资源类型前缀。系统会在resources/qualifier/profile/目录下查找匹配的 JSON 文件。五、路由表的加载时机理解路由表的加载时机对于排查页面找不到问题至关重要。整个加载过程分为三个阶段5.1 编译阶段在工程编译时hvigor 工具会扫描module.json5中的pages字段找到对应的main_pages.json然后校验路径合法性检查每个路径是否对应真实的.ets文件生成路由映射表将路径字符串映射到编译后的字节码位置注入路由元数据把映射表打包进 HAP 文件如果某个路径对应的文件不存在编译时会报错ERROR: Bundle pages/NotExist is not found in routes.5.2 安装阶段HAP 文件被安装到设备后系统会在首次启动应用时读取路由映射表并预加载页面元数据。这一步通常很快但页面代码本身不会立即加载。5.3 运行时加载当调用router.pushUrl({ url: pages/ComposePage })或windowStage.loadContent(pages/Index)时系统才会查找路由映射根据路径字符串找到对应的字节码位置加载字节码动态加载对应页面的字节码到 ArkTS 运行时实例化组件调用Entry修饰的struct构造函数触发aboutToAppear执行组件初始化逻辑执行build生成 UI 树并渲染这种按需加载的设计有两个好处减少首屏内存占用未访问的页面字节码不加载加速冷启动只加载首屏需要的代码提示如果你想进一步优化冷启动可以使用 ArkTS 的lazy import语法延迟加载非首屏模块的代码。六、路由表的扩展实践让我们看看如何在 xiexin 中扩展一个新的设置页面。6.1 创建页面文件// entry/src/main/ets/pages/SettingsPage.etsEntryComponentstruct SettingsPage{StatedarkMode:booleanfalse;build(){Column({space:16}){Text(设置).fontSize(24).fontWeight(FontWeight.Bold)Row(){Text(深色模式).fontSize(16)Toggle({type:ToggleType.Switch,isOn:this.darkMode}).onChange((isOn:boolean){this.darkModeisOn;AppStorage.setOrCreate(darkMode,isOn);})}.width(100%).justifyContent(FlexAlign.SpaceBetween).padding(16).backgroundColor(AppColors.WHITE).borderRadius(12)}.height(100%).backgroundColor(AppColors.PRIMARY_BG).padding(16)}}6.2 注册路由{src:[pages/Index,pages/SplashPage,pages/ComposePage,pages/ReadLetterPage,pages/PenPalDetailPage,pages/AddPenPalPage,pages/StatsPage,pages/EditProfilePage,pages/SettingsPage]}6.3 跳转到设置页import{router}fromkit.ArkUI;// 在 Index 页面添加设置入口Button(设置).onClick((){router.pushUrl({url:pages/SettingsPage});});这样就完成了一个新页面的接入。七、路由表设计的常见陷阱7.1 路径拼写错误{src:[page/Index]}错误page应为pages。这种错误在编译期不会被捕获但运行时调用loadContent会失败。7.2 忘记更新路由表新增了一个ComposePage.ets文件但忘记在路由表中添加pages/ComposePage。结果是编译通过文件本身被编译进 HAP运行时失败router.pushUrl({ url: pages/ComposePage })报错路由不存在提示建议在 CI/CD 流程中加入路由表校验步骤自动扫描src/main/ets/pages/下的.ets文件与main_pages.json比对是否一致。7.3 路由表条目过多随着业务增长main_pages.json可能膨胀到几十甚至上百个条目。这本身不是问题但会带来两个隐患首屏代码量增加路由表本身不大但页面越多编译产物中元数据越多维护成本上升手动维护大列表容易遗漏解决方案是采用模块化路由把不同业务模块的路由表拆分到不同 profile 文件在module.json5中按需引用。7.4 大小写敏感问题{src:[pages/index]}错误文件实际是Index.ets首字母大写路由路径却写成index。在 Linux/macOS 文件系统上可能不报错但路由查找时找不到匹配项。八、main_pages.json 与路由跳转 API 的协作理解路由表后我们来看看它如何与 ArkUI 的routerAPI 协作。8.1 router.pushUrlrouter.pushUrl({url:pages/ComposePage});pushUrl会将目标页面压入路由栈当前页面保留在栈底。用户点击返回键时会自动出栈回到之前的页面。8.2 router.replaceUrlrouter.replaceUrl({url:pages/Index});replaceUrl会替换当前页面原页面从栈中移除。这种跳转方式常用于启动引导页跳转主页的场景——引导页不应该出现在返回栈里。xiexin 的SplashPage就采用了这种模式// SplashPage 的开始写信按钮Button(开始写信).onClick((){router.replaceUrl({url:pages/Index});})这样用户从 SplashPage 进入 Index 后按返回键不会回到 SplashPage而是直接退出应用。8.3 router.pushUrl 带参数router.pushUrl({url:pages/PenPalDetailPage,params:{id:123}});目标页面通过router.getParams()获取参数EntryComponentstruct PenPalDetailPage{StatepenPalId:number0;aboutToAppear():void{constparamsrouter.getParams()asRecordstring,number;this.penPalIdparams.id;}build(){/* ... */}}提示router.getParams()必须在aboutToAppear或之后的生命周期调用在build之外的其他时机可能返回undefined。8.4 router.back 返回上一页// 返回上一页router.back();// 返回指定页面清除中间页面router.back({url:pages/Index});router.back({ url: pages/Index })会一直出栈直到遇到pages/Index。如果栈中没有这个页面调用无效。九、路由栈深度管理HarmonyOS 的路由栈有最大深度限制默认 32 层。如果应用业务复杂可能触发栈溢出Error: The route stack exceeds the maximum limit.管理路由栈深度的几个建议用replaceUrl替代pushUrl当不需要保留历史页面时用 replace 避免栈增长用router.clear()清栈在退出登录等场景清空整个路由栈用router.back({ url: ... })深度返回避免逐层 pop十、main_pages.json 的进阶用法10.1 多 profile 文件module.json5的pages字段只能引用一个 profile 文件但这个文件可以包含多个 src 数组{src:[pages/Index,pages/SplashPage],src-extension:[pages/ComposePage,pages/ReadLetterPage,pages/PenPalDetailPage,pages/AddPenPalPage,pages/StatsPage,pages/EditProfilePage]}这种写法允许按业务场景组织页面但实际加载时仍会合并所有src*数组中的路径。10.2 路由表与动态加载对于大型应用可以把按需加载的页面放在独立的 HAR/HSP 模块中每个模块有自己的路由表。这种模块化路由是 HarmonyOS 多模块架构的关键能力。总结本文详细剖析了 HarmonyOS ArkTS 路由表main_pages.json的格式、契约关系、加载机制和扩展实践。我们看到 xiexin 的路由表虽然只有 8 个条目却完整覆盖了笔友通信场景的所有页面体现了小而美的设计哲学。理解路由表的关键是把握四个一原则一个 src 数组、一个路径约定、一个 module.json5 引用、一个 EntryAbility 首屏加载。这四个环节环环相扣共同构成了 HarmonyOS 应用页面注册与跳转的基础设施。下一篇文章我们将深入module.json5剖析模块能力声明、权限配置、abilities 数组等核心配置项。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.netHarmonyOS 应用配置文件概述https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/application-configuration-file-overview-stageHarmonyOS module.json5 配置https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/module-configuration-fileHarmonyOS 资源分类与访问https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/resource-categories-and-accessHarmonyOS 路由 Router 开发指导https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-routingHarmonyOS ArkTS 声明式开发基础语法https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-basic-syntax-overviewHarmonyOS 应用程序包结构https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/application-package-structure-stageHarmonyOS ArkUI router APIhttps://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-arkui-router

相关推荐

CoolProp热物理性质计算库:开源免费的100+流体数据库终极指南
CoolProp热物理性质计算库:开源免费的100+流体数据库终极指南

CoolProp热物理性质计算库:开源免费的100流体数据库终极指南 【免费下载链接】CoolProp Thermophysical properties for the masses 项目地址: https://gitcode.com/gh_mirrors/co/CoolProp 作为一名工程师或研究人员,您是否曾为寻找可靠的热物理… · 2026/9/14 17:01:52

应对多平台直播监控碎片化的统一录制引擎:StreamCap技术架构解析
应对多平台直播监控碎片化的统一录制引擎:StreamCap技术架构解析

应对多平台直播监控碎片化的统一录制引擎:StreamCap技术架构解析 【免费下载链接】StreamCap Multi-Platform Live Stream Automatic Recording Tool | 多平台直播流自动录制客户端 基于FFmpeg 支持监控/定时/转码 项目地址: https://gitcode.com/gh_mirrors/st… · 2026/9/21 3:33:38

终极指南:Python大麦网自动抢票脚本完整实战教程
终极指南:Python大麦网自动抢票脚本完整实战教程

终极指南:Python大麦网自动抢票脚本完整实战教程 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 还在为热门演唱会门票秒光而烦恼吗?当周杰伦、五月天… · 2026/10/2 18:55:11

济宁哪里可以办电工证 2026河南最新政策下怎么应对
济宁哪里可以办电工证 2026河南最新政策下怎么应对

济宁哪里可以办电工证 2026河南最新政策下怎么应对 工地太忙根本没时间复习考试,这是很多一线工人的真实写照。特别是像电工这样的特种作业岗位,持证上岗是硬性要求,但复习时间却总是被工作挤占。2026年河南最新政策对电工证的报考、考试、复审等… · 2026/11/15 20:49:53

电工证考试挂科别慌,网上查询复审流程全在这儿
电工证考试挂科别慌,网上查询复审流程全在这儿

电工证考试挂科别慌,网上查询复审流程全在这儿 证书过期了不知道怎么复审延期,很多电工朋友都遇到过这个问题。特别是在开封这样的建筑工地,电工证是从事电力作业的必备门槛,一旦证书过期不及时复审,轻则影响工作,重则可能面临被清退甚至罚款。别急,今… · 2026/11/15 20:49:53

高低压电工证项目代号怎么查?实操考试心里没底怕挂科?官方报名入口帮你搞定!
高低压电工证项目代号怎么查?实操考试心里没底怕挂科?官方报名入口帮你搞定!

高低压电工证项目代号怎么查?实操考试心里没底怕挂科?官方报名入口帮你搞定! 实操考试心里没底怕挂科?别慌,高低压电工证项目代号是你的关键线索,搞懂它,报名考试流程就清晰了。现在,很多电工从业者在准备考试时,对高低压电工证项目代号一头雾水,导… · 2026/11/15 20:49:53

赣榆区电工证多久拿证?学历不高也能报考的实操指南
赣榆区电工证多久拿证?学历不高也能报考的实操指南

赣榆区电工证多久拿证?学历不高也能报考的实操指南 你是不是也担心自己学历不高,赣榆区电工证根本报不了名?别急,今天就来告诉你, 学历不高也能考电工证 ,关键是你得知道怎么操作。赣榆区电工证 多久拿证… · 2026/11/15 20:49:53

电工证江西抚州能用吗?外省证怎么转?在哪考最靠谱?
电工证江西抚州能用吗?外省证怎么转?在哪考最靠谱?

电工证江西抚州能用吗?外省证怎么转?在哪考最靠谱? 之前考的证在外省能不能转过来?这是很多电工朋友最关心的问题,尤其是那些在外地考了电工证,现在回到江西抚州找工作或者换岗位的,最怕证书不能在当地使用。实际上, 电工证江西抚州能用吗… · 2026/11/15 20:49:53

电工证有什么 用合格标准与通过率
电工证有什么 用合格标准与通过率

开封电工证有什么用?真实经历告诉你考试难度与执业范围 工地太忙根本没时间复习考试,这是很多电工从业者的真实写照。尤其是在开封这样的工程大市,电工证几乎成了从事电力相关工作的“入场券”。但很多人心里都有疑问,电工证到底有什么用?能不能靠它找到… · 2026/11/15 20:48:53

长春初级电工证怎么考?通过率揭秘全在这里
长春初级电工证怎么考?通过率揭秘全在这里

长春初级电工证怎么考?通过率揭秘全在这里 之前考的证在外省能不能转过来?这几乎是每个想从事电工工作的人都会问的问题。特别是那些在外地打拼多年、手里握着一张“外地电工证”的人,到了长春想继续干这一行,第一反应就是“我的证能用吗?”。今天我们就… · 2026/11/15 0:00:50

国内电工证报考条件与考试时间
国内电工证报考条件与考试时间

低压电工证怎么考?学历不高也能报名,官方报名入口全在这 你是不是经常听说“电工证是入行门槛”,但又担心自己学历不够、经验不足,根本报不了名?别急,今天就带你从零了解【国内电工证】的报考流程、考试内容,还有怎么在 官方报名入口… · 2026/11/15 0:00:50

电工作业时如何断电?电子证书到底能不能全国通用?
电工作业时如何断电?电子证书到底能不能全国通用?

电工作业时如何断电?电子证书到底能不能全国通用? 实操考试心里没底怕挂科,特别是电工作业时如何断电这一操作,不仅关系到你能不能拿到证书,更关系到以后能不能顺利上岗。很多人觉得这不过就是“断个电”,但其实这里面的门道可不少,稍有不慎就可能出错… · 2026/11/15 0:00:50

长春初级电工证怎么考?通过率揭秘全在这里
长春初级电工证怎么考?通过率揭秘全在这里

长春初级电工证怎么考?通过率揭秘全在这里 之前考的证在外省能不能转过来?这几乎是每个想从事电工工作的人都会问的问题。特别是那些在外地打拼多年、手里握着一张“外地电工证”的人,到了长春想继续干这一行,第一反应就是“我的证能用吗?”。今天我们就… · 2026/11/15 0:00:50

国内电工证报考条件与考试时间
国内电工证报考条件与考试时间

低压电工证怎么考?学历不高也能报名,官方报名入口全在这 你是不是经常听说“电工证是入行门槛”,但又担心自己学历不够、经验不足,根本报不了名?别急,今天就带你从零了解【国内电工证】的报考流程、考试内容,还有怎么在 官方报名入口… · 2026/11/15 0:00:50

电工作业时如何断电?电子证书到底能不能全国通用?
电工作业时如何断电?电子证书到底能不能全国通用?

电工作业时如何断电?电子证书到底能不能全国通用? 实操考试心里没底怕挂科,特别是电工作业时如何断电这一操作,不仅关系到你能不能拿到证书,更关系到以后能不能顺利上岗。很多人觉得这不过就是“断个电”,但其实这里面的门道可不少,稍有不慎就可能出错… · 2026/11/15 0:00:50

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/15 1:51:20

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/15 4:02:19

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/15 3:02:05

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码