一、前言:为什么全局配置如此重要?
在微信小程序项目中,app.json 是整个应用的"中枢神经"。它决定了:
- 应用有哪些页面?
- 启动页是哪个?
- 导航栏长什么样?
- 是否支持下拉刷新?
- 如何组织分包提升性能?
📌 一句话总结 :
没有app.json,小程序无法运行;配不好app.json,体验大打折扣。
本文将带你:
✅ 深入解析 app.json 所有核心字段
✅ 掌握页面注册、tabBar、分包等关键配置
✅ 避开常见配置错误
✅ 提供可直接复用的最佳实践模板
二、app.json 是什么?
app.json 是小程序的全局配置文件 ,位于项目根目录,采用 JSON 格式(不支持注释)。
⚠️ 注意:
- 文件名必须是
app.json- 必须是合法 JSON(逗号、引号不能错)
- 修改后需重新编译才能生效
三、核心配置项详解
1. pages ------ 页面路径列表(必填)
定义小程序所有页面,第一项为启动页。
javascript
{
"pages": [
"pages/index/index",
"pages/user/profile",
"pages/order/list"
]
}
✅ 规则:
路径相对于项目根目录
不需要写
.js/.wxml后缀每个页面必须有对应的四个文件(.js/.json/.wxml/.wxss)
❌ 常见错误:路径写错(如多写
/)忘记注册新页面 → 导致 "page not found"
2. window ------ 全局默认窗口表现
设置导航栏、背景色、下拉刷新等默认样式 ,可被页面级 json 覆盖。
javascript
{
"window": {
"navigationBarTitleText": "我的小程序",
"navigationBarBackgroundColor": "#07c160",
"navigationBarTextStyle": "white",
"backgroundColor": "#f5f5f5",
"backgroundTextStyle": "dark",
"enablePullDownRefresh": false,
"onReachBottomDistance": 50
}
}
🔑 常用字段说明:
字段 作用 navigationBarTitleText导航栏标题 navigationBarBackgroundColor导航栏背景色(十六进制) navigationBarTextStyle标题颜色( black/white)enablePullDownRefresh是否开启全局下拉刷新 onReachBottomDistance触底距离(单位 px)
💡 提示:若某页面不需要下拉刷新,在该页面的
xxx.json中设"enablePullDownRefresh": false
3. tabBar ------ 底部标签栏配置
当应用需要多个入口时使用(至少 2 个,最多 5 个)。
javascript
{
"tabBar": {
"color": "#999",
"selectedColor": "#07c160",
"backgroundColor": "#fff",
"borderStyle": "black",
"position": "bottom",
"list": [
{
"pagePath": "pages/index/index",
"text": "首页",
"iconPath": "assets/icons/home.png",
"selectedIconPath": "assets/icons/home-active.png"
},
{
"pagePath": "pages/user/profile",
"text": "我的",
"iconPath": "assets/icons/user.png",
"selectedIconPath": "assets/icons/user-active.png"
}
]
}
}
✅ 关键规则:
pagePath必须在pages数组中- 图标尺寸建议 81px × 81px(仅显示中间 44px)
iconPath和selectedIconPath必须同时存在- 不支持 tabBar 页面内嵌
web-view
📱 效果:底部常驻导航,提升用户留存
4. subpackages / subPackages ------ 分包加载(性能优化必备)
解决主包超过 2MB 限制,提升启动速度。
javascript
{
"subpackages": [
{
"root": "pages/user",
"pages": ["profile", "settings", "address"]
},
{
"root": "pages/order",
"pages": ["list", "detail"]
}
]
}
📦 分包规则:
- 主包 ≤ 2MB(包含
app.js、app.wxss、pages中未分包的页面)- 总包 ≤ 20MB(基础库 2.11.0+)
- 分包内可引用自身资源,不能 require 主包 JS
- 公共资源建议放
utils/或通过npm管理
⚡ 优势:首屏加载更快,用户体验更流畅
5. networkTimeout ------ 网络超时配置
设置各类网络请求的超时时间(单位:毫秒)。
javascript
{
"networkTimeout": {
"request": 10000,
"downloadFile": 10000,
"uploadFile": 10000,
"connectSocket": 10000
}
}
✅ 建议:根据业务调整,避免用户长时间等待
6. requiredBackgroundModes ------ 后台运行能力
申请后台运行权限(如音乐播放、定位)。
javascript
{
"requiredBackgroundModes": ["audio", "location"]
}
⚠️ 注意:需在【小程序管理后台】提交相关类目审核
7. permission ------ 权限声明(iOS 必填)
从 iOS 13 起,访问相册、摄像头等需声明用途。
javascript
{
"permission": {
"scope.userLocation": {
"desc": "用于获取您的位置,以便推荐附近服务"
},
"scope.writePhotosAlbum": {
"desc": "用于保存图片到相册"
}
}
}
❗ 若不声明,iOS 用户调用
wx.authorize会静默失败!
四、完整 app.json 示例(生产级模板)
javascript
{
"pages": [
"pages/index/index",
"pages/user/login"
],
"window": {
"navigationBarBackgroundColor": "#07c160",
"navigationBarTextStyle": "white",
"navigationBarTitleText": "商城",
"backgroundColor": "#f5f5f5",
"enablePullDownRefresh": false
},
"tabBar": {
"color": "#999",
"selectedColor": "#07c160",
"backgroundColor": "#fff",
"list": [
{
"pagePath": "pages/index/index",
"text": "首页",
"iconPath": "assets/tab/home.png",
"selectedIconPath": "assets/tab/home-active.png"
},
{
"pagePath": "pages/user/profile",
"text": "我的",
"iconPath": "assets/tab/user.png",
"selectedIconPath": "assets/tab/user-active.png"
}
]
},
"subpackages": [
{
"root": "pages/user",
"pages": ["profile", "settings"]
}
],
"networkTimeout": {
"request": 8000
},
"permission": {
"scope.userLocation": {
"desc": "用于展示附近门店"
}
},
"sitemapLocation": "sitemap.json"
}
五、常见问题与避坑指南
❓ Q1:修改 app.json 后页面白屏?
A:检查 JSON 格式是否合法(可用 JSONLint 验证)
❓ Q2:tabBar 不显示?
A:确认:
pages包含 tabBar 的pagePath- 图标路径正确且存在
- 页面数量 ≥2 且 ≤5
❓ Q3:分包后页面 404?
A:确保分包路径正确,且未在主包
pages中重复注册
❓ Q4:iOS 无法获取定位?
A:检查
permission是否声明scope.userLocation及描述文案
六、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!