三、uni-app页面配置(pages.json)
一、核心配置页面
uni-app 的 pages.json,是 uni-app 项目里最核心的配置文件,堪称整个应用的“大脑和地图”。它负责告诉应用:有哪些页面、页面在哪里、页面长什么样、如何跳转。
| 配置字段 | 作用描述 | 实际开发举例 |
|---|---|---|
pages | 页面路由配置。注册应用的所有页面,数组的第一项就是应用的启动首页。 | 配置首页"path": "pages/index/index",并设置标题"navigationBarTitleText": "首页"。 |
globalStyle | 全局窗口样式。设置所有页面默认的导航栏样式、背景色等。 | 设置全局导航栏背景为白色"navigationBarBackgroundColor": "#ffffff"。 |
tabBar | 底部导航栏配置。设置原生体验的底部多 Tab 切换(图标、文字、对应页面)。 | 配置底部的“首页”、“发现”、“我的”三个 Tab 及对应的图标。 |
subPackages | 分包加载配置。将大型应用拆分为多个子包,优化首次加载速度(H5 不支持)。 | 将“商城模块”独立为一个分包"root": "pages-mall",按需加载。 |
easycom | 组件自动引入规则。配置后无需手动 import 和注册组件,直接在页面使用。 | 配置后,直接在页面写<uni-badge></uni-badge>就能自动识别。 |
condition | 启动模式配置。仅在开发阶段生效,用于模拟直达某个页面,方便调试。 | 开发时直接启动到“商品详情页”,不用每次都从首页点进去。 |
二、示例
{// 1. pages:页面路由配置(应用骨架)// 数组的第一项就是应用的启动首页。这里配置的是主包页面。"pages":[{"path":"pages/index/index","style":{"navigationBarTitleText":"好物商城","navigationBarBackgroundColor":"#FF5722","navigationBarTextStyle":"white"}},{"path":"pages/category/category","style":{"navigationBarTitleText":"商品分类"}},{"path":"pages/cart/cart","style":{"navigationBarTitleText":"购物车"}},{"path":"pages/my/my","style":{"navigationBarTitleText":"个人中心","enablePullDownRefresh":true}}],// 2. globalStyle:全局样式配置(默认皮肤)// 定义所有页面默认的窗口表现。如果某个页面需要特殊样式,可以在 pages 里的 style 中覆盖。"globalStyle":{"navigationBarTextStyle":"black","navigationBarTitleText":"我的小店","navigationBarBackgroundColor":"#FFFFFF","backgroundColor":"#F8F8F8","enablePullDownRefresh":false,"onReachBottomDistance":50},// 3. tabBar:底部导航栏配置// 依赖前面的 pages 路径,配置底部多 Tab 切换。"tabBar":{"color":"#909399","selectedColor":"#FF5722","backgroundColor":"#FFFFFF","borderStyle":"black","list":[{"pagePath":"pages/index/index","text":"首页","iconPath":"static/tabbar/home.png","selectedIconPath":"static/tabbar/home-active.png"},{"pagePath":"pages/category/category","text":"分类","iconPath":"static/tabbar/category.png","selectedIconPath":"static/tabbar/category-active.png"},{"pagePath":"pages/cart/cart","text":"购物车","iconPath":"static/tabbar/cart.png","selectedIconPath":"static/tabbar/cart-active.png"},{"pagePath":"pages/my/my","text":"我的","iconPath":"static/tabbar/my.png","selectedIconPath":"static/tabbar/my-active.png"}]},// 4. subPackages:分包加载配置// 将大型应用拆分,减少主包体积,加快首次加载速度。// 这里把“订单模块”独立为一个分包,只有用户进入订单相关页面时才会下载。"subPackages":[{"root":"sub_packages/order","pages":[{"path":"orderList/orderList","style":{"navigationBarTitleText":"我的订单"}},{"path":"orderDetail/orderDetail","style":{"navigationBarTitleText":"订单详情"}}]}],// 5. easycom:组件自动引入规则// 优化开发体验。配置后,只要组件放在 components 目录下,// 就可以直接在页面里使用,无需手动 import 和注册。"easycom":{"autoscan":true,"custom":{"^uni-(.*)":"@/components/uni-$1.vue"}},// 6. condition:启动模式配置// 仅在开发期间生效!用于模拟直达某个页面的场景,方便调试。// 上线前通常会被忽略,放在最后面不会干扰核心业务代码的阅读。"condition":{"current":0,"list":[{"name":"直接打开订单列表","path":"sub_packages/order/orderList/orderList","query":"status=1"}]}}三、pages
pages 是整个应用最核心的配置项(相当于应用的“骨架”),它是一个数组,里面包含了你应用的所有页面信息。
1. 属性
- path(必填):页面的路径。相当于告诉应用这个页面放在哪个文件夹里。
- 实战注意:路径不需要写
.vue后缀,比如写成"pages/index/index"即可。
- 实战注意:路径不需要写
- style(可选):页面的窗口样式配置。用来设置当前页面的导航栏标题、背景色、是否支持下拉刷新等。
- 实战注意:这里的配置优先级高于全局的
globalStyle。如果全局是白色背景,你在style里配置了蓝色,这个页面就会显示蓝色。
- 实战注意:这里的配置优先级高于全局的
- needLogin(可选):标识该页面是否需要登录后才能访问。默认是
false,如果设为true,未登录用户访问时会被拦截。
2. style属性
| 属性名 | 类型 | 作用描述 | 实际开发举例 |
|---|---|---|---|
navigationBarBackgroundColor | HexColor | 导航栏背景颜色 | 设置为红色主题"#FF5722" |
navigationBarTextStyle | String | 导航栏标题及状态栏前景颜色,仅支持black/white | 浅色背景配黑色文字"black" |
navigationBarTitleText | String | 导航栏标题文字内容 | "navigationBarTitleText": "商品详情" |
navigationStyle | String | 导航栏样式,支持default(默认)或custom(自定义) | 设为"custom"可隐藏原生导航栏,自己写一个炫酷的头部 |
backgroundColor | HexColor | 窗口的背景色(下拉时露出的底色) | 下拉时露出灰色背景"#F8F8F8" |
enablePullDownRefresh | Boolean | 是否开启当前页面的下拉刷新功能 | 列表页设为true,详情页设为false |
backgroundTextStyle | String | 下拉 loading 的样式,仅支持dark/light | 深色背景下拉刷新用"light" |
onReachBottomDistance | Number | 页面上拉触底事件触发时,距页面底部的距离(单位px) | 设为50,用于实现列表无限滚动加载 |
3. 实战避坑小贴士
- 首页的诞生:
pages数组里的第一项,就是整个应用的启动页(首页)。无论你给它起什么名字,只要它排在第一位,它就是老大。 - 必须注册:所有业务页面都必须在这里注册。如果你在文件夹里新建了一个页面,但没有在
pages数组里添加它,这个页面在编译时会被直接忽略,无法访问。
四、globalStyle
globalStyle用于配置整个应用所有页面的默认窗口表现(可以理解为应用的“默认皮肤”)。
1. 属性
| 属性名 | 类型 | 作用描述 | 实际开发举例 |
|---|---|---|---|
navigationBarBackgroundColor | HexColor | 全局导航栏的背景颜色 | 设置全局统一的主题色"#007AFF" |
navigationBarTextStyle | String | 全局导航栏标题及状态栏前景颜色,仅支持black/white | 默认使用黑色文字"black" |
navigationBarTitleText | String | 全局默认的导航栏标题文字 | 比如统一叫"我的应用" |
navigationStyle | String | 全局导航栏样式,支持default(默认)或custom(自定义) | 设为"custom"时,所有页面默认隐藏原生导航栏 |
backgroundColor | HexColor | 全局窗口的背景色(下拉刷新时露出的底色) | 统一设置为"#F8F8F8" |
enablePullDownRefresh | Boolean | 是否全局开启下拉刷新功能 | 默认设为false,需要时再在单页style中开启 |
backgroundTextStyle | String | 下拉 loading 的样式,仅支持dark/light | 配合深色背景使用"light" |
onReachBottomDistance | Number | 全局上拉触底事件触发时,距页面底部的距离(单位px) | 统一设为50,方便处理列表触底加载 |
五、tabBar
tabBar用于配置应用底部的多 Tab 导航栏。它包含全局样式属性和页面列表(list)两大部分。
1. 全局样式属性
这些属性控制整个底部导航栏的外观表现:
| 属性名 | 类型 | 作用描述 | 实际开发举例 |
|---|---|---|---|
color | HexColor | Tab 上文字/图标的默认(未选中)颜色 | 设置为灰色"#999999" |
selectedColor | HexColor | Tab 上文字/图标的选中颜色 | 设置为主题色"#FF5722" |
backgroundColor | HexColor | 底部导航栏的背景颜色 | 设置为白色"#FFFFFF" |
borderStyle | String | 导航栏上边框的颜色,仅支持black/white | 默认使用"black" |
position | String | TabBar 的位置,默认bottom,可选top | 放在底部"bottom" |
2. 页面列表(list 数组)
这是 tabBar 的核心,是一个数组,包含了每一个底部导航项的具体配置。
| 属性名 | 类型 | 作用描述 | 实际开发举例 |
|---|---|---|---|
pagePath | String | 页面路径。必须在pages数组中先定义过 | "pages/index/index" |
text | String | Tab 上显示的文字标签 | "首页" |
iconPath | String | 未选中时的图标路径(必须放在static目录下) | "static/tabbar/home.png" |
selectedIconPath | String | 选中时的图标路径(必须放在static目录下) | "static/tabbar/home-active.png" |
3. 实战避坑小贴士
- 数量限制:
list数组最少配置 2 个,最多配置 5 个 Tab。 - 图标路径铁律:
iconPath和selectedIconPath必须使用本地相对路径,并且图片必须存放在项目的static目录下。千万不要使用网络图片或@/static别名,否则小程序端会无法解析。 - 暗黑模式适配:如果你需要支持暗黑模式(DarkMode),
tabBar里的颜色属性(如color、backgroundColor)和图标路径(iconPath)都支持通过@符号引用theme.json中定义的变量,从而实现一键切换深浅主题。 - 跳转方式:一旦使用了
tabBar,在代码中跳转这些页面时,不能使用普通的uni.navigateTo,必须使用uni.switchTab方法。
六、subPackages
subPackages(分包加载配置)是优化小程序体积、提升首次启动速度的核心利器。它主要包含分包基础配置、分包预加载策略以及分包优化开关三个核心部分。
1. 分包基础配置 (subPackages)
这是分包的核心节点,它是一个数组,数组中的每一项代表一个独立的子包。
| 属性名 | 类型 | 作用描述 | 实际开发举例 |
|---|---|---|---|
root | String | 子包的根目录(必填)。主包和分包不能在同一目录下。 | 将订单模块独立分包:"root": "pagesA" |
pages | Array | 子包由哪些页面组成(必填)。这里的path是相对于root的相对路径。 | 包含订单列表页:"path": "list/list" |
name | String | 分包别名(选填)。可用于预加载配置。 | "name": "packageA" |
plugins | Object | 在分包内引入的插件代码包(选填)。仅微信小程序支持,且同一插件不能被多个分包同时引用。 | 配置特定分包使用的微信插件。 |
2. 分包预加载策略 (preloadRule)
为了提升用户体验,避免用户点击分包页面时长时间等待,可以配置预加载策略。当用户进入某个页面时,框架会自动预下载可能需要的分包。
| 属性名 | 类型 | 作用描述 | 实际开发举例 |
|---|---|---|---|
key | String | 触发预下载的页面路径。 | "pages/index/index"(进入首页时触发) |
packages | StringArray | 进入该页面后,需要预下载的分包root或name(必填)。 | ["pagesA", "pagesB"] |
network | String | 指定在何种网络下预下载(选填)。可选all(不限网络)或wifi(仅WiFi)。 | "network": "wifi" |
3. 分包优化开关 (manifest.json)
除了pages.json中的配置,还需要在manifest.json中开启分包优化,才能让静态资源和 JS 文件真正放入分包内,从而减小主包体积。
| 配置位置 | 作用描述 | 实际开发举例 |
|---|---|---|
mp-weixin->optimization->subPackages | 开启微信小程序的分包优化。 | "optimization": {"subPackages": true} |
4. 实战避坑小贴士
- 体积限制(微信小程序):主包最大不超过 2MB,单个分包最大不超过 2MB,整个项目(主包+所有分包)总大小不超过 20MB。
- 资源隔离原则:
- 静态文件:分包目录下放置的
static静态资源不会被打包到主包中,且不可在主包中使用。 - JS 文件:当某个 JS 文件仅被这一个分包引用时,它会被打包进分包;如果被主包或多个分包同时引用,它依然会被打包到主包中。
- 静态文件:分包目录下放置的
- 最佳实践:将启动页、TabBar 页面等高频访问的页面放在主包;将设置、帮助、订单详情等次要功能放入分包。
七、easycom
easycom是一种组件自动引入机制,它能让你告别繁琐的 import 和 components 注册步骤,直接在页面中使用组件。
1. 核心配置项总结
| 属性名 | 类型 | 默认值 | 作用描述 | 实际开发举例 |
|---|---|---|---|---|
autoscan | Boolean | true | 是否开启自动扫描功能。开启后,框架会自动扫描符合默认目录规范的组件并注册。 | 保持默认的true,组件放在components/组件名/组件名.vue即可自动识别。 |
custom | Object | {} | 自定义匹配规则。当你的组件路径或命名不符合默认规范时,可以使用正则表达式进行自定义映射。 | 将^my-(.*)映射到@/components/my/$1.vue,这样使用<my-button>时就会自动找到对应文件。 |
2. 实战避坑小贴士
- 默认规范(autoscan 的底层逻辑):只要你的组件安装在项目的
components目录或uni_modules目录下,并且严格符合components/组件名称/组件名称.vue的目录结构,就可以免注册直接使用。 - 自定义规则(custom 的语法):
custom的键(Key)是组件标签名的正则表达式,值(Value)是组件文件的路径模板。例如:你有一个组件放在src/components/common/button.vue,想通过<app-button>使用,可以配置为:
"^app-(.*)":"src/components/common/$1.vue"- 命名规范:组件命名必须是小写字母,并使用短横线(kebab-case)连接单词,例如
my-component。 - 性能优势:不管
components目录下安装了多少组件,easycom在打包后会自动剔除没有使用的组件,实现真正的“按需打包”,对包体积优化非常友好。 - 修改配置不热更新:考虑到编译速度,直接在
pages.json内修改easycom配置通常不会触发重新编译,你需要稍微改动一下页面内容才能触发更新。
八、condition
condition被称为启动模式配置。它仅在开发期间生效,打包上线后没有任何作用。
它的核心作用是:模拟直达某个深层页面的场景(例如小程序转发后用户点击打开的页面)。在开发时,你可以省去从首页一层层点击跳转的麻烦,直接启动到目标页面进行调试。
1. 核心配置项总结
| 属性名 | 类型 | 是否必填 | 作用描述 | 实际开发举例 |
|---|---|---|---|---|
current | Number | 是 | 当前激活的模式。值为list数组中节点的索引值(从 0 开始)。 | 设为0,表示启动时激活list中的第一个配置模式。 |
list | Array | 是 | 启动模式列表。包含一个或多个启动模式的对象。 | 配置一个直达“商品详情页”的启动模式。 |
2. list 数组内部配置项
list数组里的每一项都是一个对象,包含以下属性:
| 属性名 | 类型 | 是否必填 | 作用描述 | 实际开发举例 |
|---|---|---|---|---|
name | String | 是 | 启动模式的名称。 | "name": "商品详情页" |
path | String | 是 | 启动页面的路径(必须是已注册的页面)。 | "path": "pages/detail/detail" |
query | String | 否 | 启动参数。在目标页面的onLoad生命周期函数中获取。 | "query": "id=10&status=1" |
3. 实战避坑小贴士
- 不同平台的生效方式:
- 在 App 真机运行时:配置后,运行项目会自动直接打开配置的页面。
- 在微信小程序开发者工具中:配置后,你需要在开发者工具顶部的“编译模式”下拉框中,手动选择对应的模式(如“商品详情页”)才会生效。
- 参数接收:如果你在
query中配置了id=10&status=1,记得在目标页面的<script>中通过onLoad((option) => { console.log(option.id) })来接收这些参数。 - 上线前清理:因为
condition纯粹是为了开发调试,建议在项目上线打包前,将这段配置注释掉或删除,保持pages.json的整洁。
