查看: 275|回复: 0

鸿蒙ASCF app.json pages到tabBar配置踩坑

[复制链接]
发表于 1 小时前 | 显示全部楼层 |阅读模式
在鸿蒙元服务(ASCF)开发中,app.json 是每个工程最先接触的全局配置文件。页面路由、窗口样式、底部 Tab、分包结构等都由它控制。文档里有些字段写得比较简略,实际配置时容易踩坑。本文结合实践把 app.json 的完整配置项过一遍,并整理需要注意的细节。

一、pages 与 entryPagePath:页面路由表

pages 是必填配置,第一项就是默认启动页面。路径不需要写文件后缀名,系统会自动查找对应的 .hxml 文件。例如:
  1. {
  2.   "pages": [
  3.     "page/index/index",
  4.     "page/API/pages/make-phone-call/make-phone-call",
  5.     "page/API/pages/share-api/share-api"
  6.   ]
  7. }
复制代码

如果不想用第一项作为首页,可以通过 entryPagePath 覆盖,但注意不能带页面参数。

需要特别留意的是 pages 数组的顺序。它不只是路由表,第一项直接决定默认启动页。如果不写 entryPagePath,删掉或重排 pages 中的第一项,首页就会跟着变。笔者第一次重排页面顺序时,就把首页搞乱了。

二、window:窗口与导航栏配置

window 控制全局导航栏和窗口样式,常见配置如下:
  1. {
  2.   "window": {
  3.     "navigationBarBackgroundColor": "#0A59F7",
  4.     "navigationBarTextStyle": "white",
  5.     "navigationBarTitleText": "我的元服务",
  6.     "navigationStyle": "default",
  7.     "backgroundColor": "#f5f5f5",
  8.     "backgroundTextStyle": "dark",
  9.     "enablePullDownRefresh": true,
  10.     "onReachBottomDistance": 50
  11.   }
  12. }
复制代码

这里有几个注意点:

navigationBarTextStyle 在 API 12 时限制较多:custom 模式下可以设置 black/white,default 模式只能 black。API 13 及以上才都支持。

navigationStyle 设为 custom 会隐藏导航栏,但右上角的胶囊按钮仍然保留。同时页面顶部会多出状态栏高度的空白区域,需要自己处理,否则页面内容会被状态栏挡住。

onReachBottomDistance 的单位是 px 而不是 dp,在低分辨率设备上触底距离看起来会不一样。

三、tabBar:底部 Tab 栏配置

tabBar 用于配置底部导航,示例:
  1. {
  2.   "tabBar": {
  3.     "color": "#999999",
  4.     "selectedColor": "#0A59F7",
  5.     "backgroundColor": "#ffffff",
  6.     "borderStyle": "black",
  7.     "position": "bottom",
  8.     "custom": false,
  9.     "list": [
  10.       {
  11.         "pagePath": "page/index/index",
  12.         "text": "首页",
  13.         "iconPath": "image/tab/home.png",
  14.         "selectedIconPath": "image/tab/home-active.png"
  15.       },
  16.       {
  17.         "pagePath": "page/API/index",
  18.         "text": "API",
  19.         "iconPath": "image/tab/api.png",
  20.         "selectedIconPath": "image/tab/api-active.png"
  21.       }
  22.     ]
  23.   }
  24. }
复制代码

实际踩坑记录如下:

图标限制 40kb,图片太大不会显示。一开始没有使用工具自带的图标,自己切图结果超了,排查半天。

tabBar 页面必须在主包中,不能放在分包里。文档虽然写了,但很容易忽略。笔者分包写好后发现 tabBar 页面跳转不了,折腾了很久。

颜色支持十六进制,简写(如 #fff)其实也支持,但建议写完整六位,避免不同平台解析差异。

另外,list 中的 pagePath 必须在 pages 数组中有对应路径,否则 tabBar 页面会报错跳转不了。

四、subpackages:分包配置

分包可以把页面按功能拆分,减少首屏加载体积。示例:
  1. {
  2.   "subpackages": [
  3.     {
  4.       "resource": "packageMore",
  5.       "root": "packageMore",
  6.       "pages": [
  7.         "more/more",
  8.         "detail/detail"
  9.       ]
  10.     }
  11.   ]
  12. }
复制代码

分包后的路径写法保持不变,但编译后只会保留 pages 字段,其他字段对齐。注意 tabBar 页面不能被分到子包中。

五、resolveAlias:模块路径别名

当页面层级较深时,长长的相对路径写起来很痛苦。resolveAlias 可以给模块路径起别名:
  1. {
  2.   "resolveAlias": {
  3.     "~/*": "/*",
  4.     "~/index/*": "index/*",
  5.     "@utils/*": "utils/*",
  6.     "subBView/*": "subpackageB/view/*"
  7.   }
  8. }
复制代码

配置之后,代码里就可以这样引用:
  1. // 不用再写 ../../../utils/test.js
  2. const { formatDate } = require('@utils/test');
复制代码

使用 resolveAlias 有两点限制:

key 和 value 都必须以 /* 结尾,少了结尾通配符会导致匹配失败。

如果多条规则同时匹配,会选取最长的规则映射,需要注意优先级。

该能力需要 ASCF Toolkit 版本不低于 1.0.4。

六、lazyCodeLoading:代码按需注入

lazyCodeLoading 可以配置自定义组件代码按需注入,目前只支持 requiredComponents:
  1. {
  2.   "lazyCodeLoading": "requiredComponents"
  3. }
复制代码

配置后,只有页面真正用到的组件才会被加载,有助于减少首屏体积。该配置起始版本为 1.0.13,Toolkit 需要不低于 1.0.6。

七、后台运行与隐私保护

如果元服务需要在后台运行(目前仅支持后台音乐播放 audio),可以这样声明:
  1. {
  2.   "requiredBackgroundModes": ["audio"]
  3. }
复制代码

另外,从 2.0.1 版本开始,支持 visualEffectInBackground 配置,用于切入后台时隐藏页面内容,防止敏感信息泄露:
  1. {
  2.   "visualEffectInBackground": "hidden"
  3. }
复制代码

该字段支持 none(不处理)和 hidden(隐藏内容)两个值。金融类元服务建议开启 hidden。

八、实际项目配置示例

下面是一个实际项目中的 app.json 配置,综合了上述常用配置项:
  1. {
  2.   "pages": [
  3.     "page/index/index",
  4.     "page/API/index",
  5.     "page/API/pages/share-api/share-api",
  6.     "page/API/pages/make-phone-call/make-phone-call",
  7.     "page/API/pages/battery/battery",
  8.     "page/API/pages/accelerometer/accelerometer",
  9.     "page/API/pages/gyroscope/gyroscope"
  10.   ],
  11.   "window": {
  12.     "navigationBarBackgroundColor": "#ffffff",
  13.     "navigationBarTextStyle": "black",
  14.     "navigationBarTitleText": "ASCF 演示",
  15.     "backgroundColor": "#f5f5f5",
  16.     "backgroundTextStyle": "dark"
  17.   },
  18.   "tabBar": {
  19.     "color": "#999999",
  20.     "selectedColor": "#0A59F7",
  21.     "backgroundColor": "#ffffff",
  22.     "borderStyle": "black",
  23.     "list": [
  24.       {
  25.         "pagePath": "page/index/index",
  26.         "text": "首页",
  27.         "iconPath": "image/tab/home.png",
  28.         "selectedIconPath": "image/tab/home-active.png"
  29.       },
  30.       {
  31.         "pagePath": "page/API/index",
  32.         "text": "API",
  33.         "iconPath": "image/tab/api.png",
  34.         "selectedIconPath": "image/tab/api-active.png"
  35.       }
  36.     ]
  37.   },
  38.   "resolveAlias": {
  39.     "@utils/*": "utils/*",
  40.     "@components/*": "components/*"
  41.   }
  42. }
复制代码

九、避坑清单总结

结合上述配置,最需要记住的坑有:

pages 顺序决定默认首页,重排时务必确认 entryPagePath。

tabBar 的 pagePath 必须与 pages 对应,且 tabBar 页面必须在主包。

tabBar 图标大小不能超过 40kb,否则不显示。

navigationStyle: custom 会带来状态栏遮挡问题,需要自行适配。

resolveAlias 的 key/value 必须以 /* 结尾,多规则匹配时按最长规则生效。

visualEffectInBackground 只在 2.0.1+ 生效,低版本不报错但不生效。

app.json 的配置项不算复杂,但很多错误不会直接报错,而是表现为页面显示异常,排查起来比较费时间。建议在工程初始化时就把这些字段确认好,避免后期返工。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-8-26 14:37 , Processed in 0.022560 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部