UniApp路由配置升级:pages.json权威指南

版本:0.2.4 | 协议:MIT | 依赖:Vite >=5.0.0 <8.0.0


写在前面

v0.2.4 的主题是:让 pages.json 成为路由配置的唯一权威来源

本次更新聚焦两个方面:一是为 UniAppPageConfig 新增 name 属性,支持在 pages.json 中直接配置页面路由名称,优先级高于 nameStrategy 自动生成;二是优化 preserveRouteChanges 合并策略,明确 pages.json

是自动生成字段的唯一来源,namemeta 中来自 pages.json 的字段始终使用新值,仅保留用户自定义的额外字段。

本版重点

能力 一句话说明 你需要做什么
页面级 name 字段支持 pages.json 中可直接为页面配置路由名称,优先级高于 nameStrategy 在 pages.json 中配置
preserveRouteChanges 策略优化 pages.json 是自动生成字段的唯一来源,name/meta 始终使用新值 自动生效

升级方式 :修改 devDependencies 中版本号为 ^0.2.4。无 Breaking Changes,完全向后兼容。


一、5 分钟快速上手

1.1 安装与升级

json 复制代码
{
	"devDependencies": {
		"@meng-xi/vite-plugin": "^0.2.4"
	}
}

1.2 在 pages.json 中直接配置 name

json 复制代码
{
	"pages": [
		{
			"path": "pages/index/index",
			"name": "Home",
			"style": {
				"navigationBarTitleText": "首页"
			}
		},
		{
			"path": "pages/user/profile",
			"name": "UserProfile",
			"style": {
				"navigationBarTitleText": "个人中心"
			}
		}
	]
}

生成的路由配置:

typescript 复制代码
import type { RouteConfig } from '@meng-xi/uni-router'

export const routes: RouteConfig[] = [
	{
		path: '/pages/index/index',
		name: 'Home',
		meta: { title: '首页', isTab: true }
	},
	{
		path: '/pages/user/profile',
		name: 'UserProfile',
		meta: { title: '个人中心' }
	}
]

export default routes

二、页面名称 name 字段

2.1 优先级规则

name 字段的取值优先级:

优先级 来源 说明
1(高) pageConfig.name pages.json 中页面直接配置的 name 字段
2(低) nameStrategy 根据 path 和命名策略自动生成
typescript 复制代码
// pages.json
{
	"path": "pages/user/profile",
	"name": "UserProfile",
	"style": { "navigationBarTitleText": "个人中心" }
}

// 生成的路由中 name 为 'UserProfile',而非 nameStrategy 自动生成的 'pagesUserProfile'

2.2 与 nameStrategy 共存

未配置 name 的页面仍使用 nameStrategy 自动生成:

json 复制代码
{
	"pages": [
		{
			"path": "pages/index/index",
			"name": "Home",
			"style": { "navigationBarTitleText": "首页" }
		},
		{
			"path": "pages/about/about",
			"style": { "navigationBarTitleText": "关于" }
		}
	]
}
typescript 复制代码
// Home 使用 pageConfig.name,about 使用 nameStrategy 自动生成
export const routes: RouteConfig[] = [
	{ path: '/pages/index/index', name: 'Home', meta: { title: '首页' } },
	{ path: '/pages/about/about', name: 'pagesAboutAbout', meta: { title: '关于' } }
]

三、preserveRouteChanges 合并策略优化

3.1 设计原则

pages.json 是自动生成字段的唯一权威来源。 用户不应在 router.config.ts 中手动修改来自 pages.json 的字段值,因为这些值会在下次生成时被覆盖。

3.2 字段合并规则

字段 优化前 优化后
name 用户修改的值优先保留 始终以 pages.json 为准(pageConfig.namenameStrategy
meta 自动生成字段 用户修改的值优先保留 pages.json 生成的字段始终使用新值
meta 用户自定义字段 保留 保留(不变)

3.3 实际场景

typescript 复制代码
// pages.json 中修改了标题
{ "path": "pages/index/index", "style": { "navigationBarTitleText": "新标题" } }

// 用户在 router.config.ts 中添加了自定义字段
{
  path: '/pages/index/index',
  name: 'pagesIndexIndex',
  meta: { title: '旧标题', customField: 'value' },
  beforeEnter: (to, from, next) => { next() }
}

// 优化前:meta.title 保留 '旧标题'(用户修改优先)
// 优化后:meta.title 更新为 '新标题'(pages.json 为准),customField 保留
{
  path: '/pages/index/index',
  name: 'pagesIndexIndex',
  meta: { title: '新标题', customField: 'value' },
  beforeEnter: (to, from, next) => { next() }
}

四、完整配置项

typescript 复制代码
interface GenerateRouterOptions extends BasePluginOptions {
	pagesJsonPath?: string // pages.json 路径,默认 'src/pages.json'
	outputPath?: string // 输出文件路径,默认 'src/router.config.ts'
	outputFormat?: 'ts' | 'js' // 输出格式,默认 'ts'
	nameStrategy?: NameStrategy // 命名策略,默认 'camelCase'
	customNameGenerator?: (path: string) => string // 自定义命名函数
	includeSubPackages?: boolean // 包含子包,默认 true
	watch?: boolean // 监听变化,默认 true
	metaMapping?: Record<string, string> // meta 字段映射
	exportTypes?: boolean // 导出类型,默认 true
	preserveRouteChanges?: boolean // 保留用户修改,默认 true
	dts?: string | boolean // 类型声明文件,默认 false
	fileHeader?: boolean // 文件注释头,默认 false
}

五、实战场景

5.1 使用页面名称 + 自定义守卫

typescript 复制代码
// vite.config.ts
import { generateRouter } from '@meng-xi/vite-plugin'

export default defineConfig({
	plugins: [
		generateRouter({
			fileHeader: true,
			preserveRouteChanges: true,
			metaMapping: {
				navigationBarTitleText: 'title'
			},
			dts: true
		})
	]
})
json 复制代码
// pages.json --- 使用 name 字段配置路由名称
{
	"pages": [
		{
			"path": "pages/index/index",
			"name": "Home",
			"style": { "navigationBarTitleText": "首页" }
		},
		{
			"path": "pages/admin/dashboard",
			"name": "AdminDashboard",
			"style": { "navigationBarTitleText": "管理后台" },
			"meta": { "requireAuth": true, "role": "admin" }
		}
	]
}

六、内置插件全景

v0.2.4 共包含 15 个实用插件,覆盖构建优化的各个方面:

插件 enforce 描述
assetManifest post 构建后生成资源映射清单,支持 Vite/Webpack/自定义格式、按入口分组和运行时注入
autoImport pre 自动导入,支持预设映射、通配符('*')、目录扫描、Vue 模板自动导入和类型声明生成
buildProgress - 终端实时构建进度条,支持 bar / spinner / minimal
bundleAnalyzer post 构建产物体积分析,支持 JSON/HTML 报告、gzip 计算和阈值告警
compressAssets post 构建产物压缩,支持 gzip / brotli / both,并发压缩和统计报告
copyFile post 构建完成后复制文件或目录,支持增量复制
envGuard post 环境变量校验,支持类型检查、范围验证、自定义规则和运行时守卫
faviconManager post 管理网站图标链接注入和文件复制
generateRouter post 根据 pages.json 自动生成路由配置与类型声明(uni-app)
generateVersion post 自动生成版本号,支持文件输出和全局变量注入
htmlInject post HTML 内容注入,支持多种位置、选择器定位、条件注入和安全过滤
imageOptimizer post 图片优化压缩与格式转换,支持 WebP/AVIF 转换、SVG 优化、并发处理
loadingManager post 全局 Loading 状态管理,支持请求拦截、防抖、过渡动画
proxyManager - 开发代理管理,支持环境切换、规则文件、请求日志、延迟模拟和响应修改
versionUpdateChecker post 运行时版本更新检查,支持多种提示样式和自定义回调

七、子路径导出变更

新增

  • UniAppPageConfig 类型新增 name 可选字段,支持页面级路由名称配置