uni-app + Vite 项目中使用 @uni-helper/vite-plugin-uni-pages 实现自动路由配置(超详细)

文章目录

前言

在 uni-app 项目中,pages.json 一直是一个绕不开但又非常繁琐的配置文件:

  • 新增页面要手动加路径
  • 删除页面容易忘记同步
  • 分包配置复杂、路径容易写错
  • 页面一多,维护成本直线上升

在项目规模逐渐变大之后,这种手工维护路由配置的方式已经明显不适合团队协作。

本文将介绍一款在 uni-app + Vite 技术栈中非常好用的插件:

@uni-helper/vite-plugin-uni-pages

通过它,可以实现:

  • 目录即路由
  • 自动生成 pages.json
  • 支持分包、全局配置、页面级配置
  • 极大降低页面维护成本

一、插件简介

@uni-helper/vite-plugin-uni-pages是 Uni Helper 团队推出的一款基于 Vite 的页面路由自动生成插件,专门为 uni-app 生态设计。

核心能力

  • 🚀 自动扫描 src/pages 目录生成路由
  • 🥚 原生支持 subPackages(分包)
  • 📘 支持 pages.config.ts 集中管理
  • ⛺️ 支持 definePageMeta 页面内配置
  • 💡 TypeScript 友好

一句话总结:

把 pages.json 交给插件,把精力留给业务开发

二、适用项目技术栈

本文示例基于以下环境:

  • uni-app
  • Vue 3
  • TypeScript
  • Vite
  • pnpm(npm / yarn 同理)

三、安装插件

bash 复制代码
pnpm add @uni-helper/vite-plugin-uni-pages -D

安装完成后无需额外 CLI 操作,直接在 Vite 中配置即可。

四、项目目录结构推荐

txt 复制代码
src/
├─ pages/
│  ├─ index/
│  │  └─ index.vue
│  ├─ login/
│  │  └─ index.vue
│  └─ mine/
│     └─ index.vue
├─ sub-packages/
│  └─ order/
│     ├─ pages/
│     │  └─ detail.vue
│     └─ pages.config.ts
└─ pages.config.ts

说明

  • pages:主包页面
  • sub-packages:分包目录
  • pages.config.ts:替代 pages.json 的配置文件

五、在 Vite 中配置插件

vite.config.ts 示例

ts 复制代码
import { defineConfig } from 'vite'
import uni from '@dcloudio/vite-plugin-uni'
import UniPages from '@uni-helper/vite-plugin-uni-pages'

export default defineConfig({
  plugins: [
    UniPages({
      configPath: 'src/pages.config.ts',
      pagesJsonPath: 'src/pages.json',
      mergePages: true
    }),
    uni()
  ]
})

⚠️ 注意事项

  • 插件 必须放在 uni() 之前
  • pages.json 会自动生成,无需手写

六、使用 pages.config.ts 管理页面

1️⃣创建 pages.config.ts

ts 复制代码
import { defineUniPages } from '@uni-helper/vite-plugin-uni-pages'

export default defineUniPages({
  pages: [
    {
      path: 'pages/index/index',
      style: {
        navigationBarTitleText: '首页'
      }
    }
  ]
})

2️⃣自动扫描页面(推荐方式)

如果你希望完全不写 pages 配置,可以只保留全局样式:

ts 复制代码
export default defineUniPages({
  globalStyle: {
    navigationBarTextStyle: 'black',
    navigationBarBackgroundColor: '#ffffff',
    backgroundColor: '#f8f8f8'
  }
})

插件会自动扫描:

txt 复制代码
src/pages/**/**.vue

并生成对应路由。

七、分包(subPackages)配置

pages.config.ts 示例

ts 复制代码
export default defineUniPages({
  subPackages: [
    {
      root: 'sub-packages/order',
      pages: [
        {
          path: 'pages/detail',
          style: {
            navigationBarTitleText: '订单详情'
          }
        }
      ]
    }
  ]
})

对应目录结构

txt 复制代码
src/sub-packages/order/pages/detail.vue

八、页面级配置的两种方式

方式一:集中写在 pages.config.ts

ts 复制代码
{
  path: 'pages/login/index',
  style: {
    navigationBarTitleText: '登录',
    enablePullDownRefresh: false
  }
}

方式二:页面内 definePageMeta(强烈推荐)

html 复制代码
<script setup lang="ts">
definePageMeta({
  navigationBarTitleText: '个人中心',
  enablePullDownRefresh: false
})
</script>

为什么推荐这种方式?

  • 页面配置与页面代码在一起
  • 删除页面不会残留配置
  • 可维护性更高

九、统一配置所有页面(高频需求)

示例:关闭所有页面下拉刷新

ts 复制代码
export default defineUniPages({
  globalStyle: {
    enablePullDownRefresh: false
  }
})

十、指定页面配置导航栏按钮

1️⃣封装功能方法抽离userOptions

ts 复制代码
// composables/useUniPages.ts
import type { PageContext } from '@uni-helper/vite-plugin-uni-pages'

export const useUniPages = {
    exclude: ['**/components/**/**.*'],
    subPackages: ['src/pages-design'],
    onBeforeWriteFile(ctx: PageContext) {
        ctx.subPageMetaData.forEach((item) => {
            if (item.root === 'pages-design') {
                item.pages.forEach((p) => {
                    if (!p.style) p.style = {}
                    p.style.h5 = {
                        titleNView: {
                            buttons: [{ type: 'share', color: '#892FE8' }]
                        }
                    }
                })
            }
        })
    }
}

2️⃣引入

ts 复制代码
// vite.config.ts
import { defineConfig } from 'vite'
import uni from '@uni-helper/plugin-uni'
import UniPages from '@uni-helper/vite-plugin-uni-pages'
import { useUniPages } from './src/composables/useUniPages'

export default defineConfig({
  plugins: [
    UniPages(useUniPages),
    uni()
  ]
})

以下功能看情况是否封装👇

3️⃣封装公共点击事件处理

ts 复制代码
import { onNavigationBarButtonTap } from '@dcloudio/uni-app'

export function useNavButton() {
    onNavigationBarButtonTap((e: Page.NavigationBarButtonTapOption) => {
        // 执行点击页面方法
    })
}

4️⃣页面调用方法

html 复制代码
<script setup lang="ts">
import { useNavButton} from '@/composables';

useNavButton();
</script>

十一、作者在使用安装时候遇到的问题

1️⃣ 老项目安装提示require() of ES Module

🐛报错内容

txt 复制代码
failed to load config from E:\project\my\uniapp\hy-design-uni\vite.config.ts
error when starting dev server:
Error [ERR_REQUIRE_ESM]: require() of ES Module E:\project\my\uniapp\hy-design-uni\node_modules\.pnpm\unconfig@7.4.2\node_modules\unconfig\dist\index.mjs not supported.
Instead change the require of E:\project\my\uniapp\hy-design-uni\node_modules\.pnpm\unconfig@7.4.2\node_modules\unconfig\dist\index.mjs to a dynamic import() which is available in all CommonJS modules.

⁉️解释原因

Vite 在启动时试图用 CommonJS 的 require() 去加载一个 纯 ESM 包(unconfig),而 Node 不允许这么做,于是抛出了 ERR_REQUIRE_ESM。

💯解决方法:在 package.json 里加一行

ts 复制代码
"type": "module"

2️⃣ 提示Uni is not a function

🐛报错内容

💯解决方法: 使用@uni-helper/plugin-uni插件

下载@uni-helper/plugin-uni

bash 复制代码
pnpm i -D @uni-helper/plugin-uni
ts 复制代码
// 需要把
import uni from '@dcloudio/vite-plugin-uni'
// 改成
import Uni from '@uni-helper/plugin-uni'

⚠️注意:官方插件 @dcloudio/vite-plugin-uni不要卸载,因为这个包是依赖官方插件二次封装的,否则@uni-helper/plugin-uni插件将无法正常工作。

3️⃣ 页面路径被生成两次?

原因:

  • 手写了 pages
  • 同时又开启了自动扫描

建议:

  • 要么全自动
  • 要么集中手写
  • 不要混用

结尾

如果你觉得这篇文章帮你解决了你现在的问题,那就请给我来个 三连支持一下 ♥️

➡️ 点赞 支持一下

➡️ 收藏 以防找不到

➡️ 评论 我会回访你!

➡️ 关注 不会迷路哦!

你的支持是我持续更新的动力,我们下篇更精彩!🚀🔥

参考github项目地址:hy-design-uni

👉 欢迎大家给华玥组件库star。 ✅

相关推荐
卸任4 小时前
Vibe coding工具使用心得
前端·ai编程
wuxianda10304 小时前
2026 苹果审核 4.3 (a) 被拒全解析|Guideline 4.3a spam 马甲包拒审原因 + 避坑方案
flutter·uni-app·苹果上架
brien95 小时前
为什么模型标称 1M,Google Antigravity 聊到 256K 却突然失忆?我们给它做了个原生行内监控圆环
前端
修炼的dance5 小时前
录屏关键帧间隔多少合适?六档实测,2秒到10秒小了75.6%
前端
Lank_M5 小时前
关键帧从1秒拉到10秒,录屏小87.3%,摄像头小10.8%
前端
补码缩写5 小时前
用 ffprobe 拆录屏,八成字节在 29 个关键帧上
前端
百思不得小李5 小时前
一个复杂的动态表单是如何实现的
前端·设计模式
陈随易5 小时前
Cmder 停更 17 个月,2.0 支持 Windows Terminal
前端·后端·程序员
风骏时光牛马5 小时前
前沿视界
前端
kyriewen6 小时前
我扫了 814 个依赖,97 个还敢要 Node 10
前端·javascript·程序员