Uni-App(Vue3 + TypeScript)项目结构详解 ------ 以 Lighting-UniApp 为例,提供源代码

Uni-App(Vue3 + TypeScript)项目源代码在最后

在本文中,我们将详细解析一个完整的 Uni-App + Vue3 + TypeScript

工程结构。 以项目 Lighting-UniApp

为示例,带你了解每个文件、目录的用途与作用。


📁 项目结构总览

bash 复制代码
LIGHTING-UNIAPP/
├─ .idea/                  # VSCode / WebStorm 项目配置文件
├─ dist/                   # 打包输出目录(编译后的文件)
├─ node_modules/           # 第三方依赖库(由 npm 自动生成)
├─ src/                    # 核心源代码目录
│  ├─ api/                 # 与后端通信的接口封装
│  ├─ components/          # 自定义 Vue 组件
│  ├─ hooks/               # 封装的组合式函数(Composition API)
│  ├─ pages/               # 应用页面(每个文件夹代表一个页面)
│  ├─ static/              # 静态资源(图片、音频、字体等)
│  ├─ store/               # 全局状态管理(Pinia 或 Vuex)
│  ├─ utils/               # 工具函数模块(时间格式化、节流、防抖等)
│  ├─ App.vue              # 应用根组件
│  ├─ env.d.ts             # 环境类型声明文件(用于全局类型补充)
│  ├─ main.ts              # 应用入口文件(创建 Vue 应用实例)
│  └─ manifest.json        # Uni-App 运行配置文件(App 权限、启动图等)
│
├─ pages.json              # 页面配置文件(页面路径与导航栏)
├─ shime-uni.d.ts          # Uni-App 全局类型声明文件(为 `uni.*` 提供类型提示)
├─ uni.scss                # 全局样式变量文件(颜色、字体、间距)
├─ .gitignore              # Git 忽略文件列表
├─ eslint.config.mjs       # ESLint 代码规范配置
├─ index.html              # Web 平台入口 HTML 文件(H5 编译时使用)
├─ package-lock.json       # npm 依赖锁定文件(自动生成)
├─ package.json            # 项目信息与依赖声明(最核心的配置)
├─ README.md               # 项目说明文档
├─ shims-uni.d.ts          # 兼容不同平台的 Uni 类型声明
├─ tsconfig.json           # TypeScript 编译配置文件
└─ vite.config.ts          # Vite 构建工具配置文件

🧩 各目录与文件详解

1️⃣ .idea/

由 JetBrains(WebStorm、PhpStorm)自动生成,保存 IDE

工程设置,不参与构建。

2️⃣ dist/

项目打包后生成的产物目录。

通常不会手动编辑,发布或部署时使用。

3️⃣ node_modules/

项目依赖安装后生成的模块目录,包含所有 npm 包。

4️⃣ src/ ------ 项目核心代码目录

📁 api/

用于封装与后端通信的接口模块,示例:

ts 复制代码
import request from '@/utils/request'

export const getUserList = () => request.get('/user/list')
📁 components/

放置全局或局部可复用的 Vue 组件,例如:

vue 复制代码
<MyButton />
<UserCard />
📁 hooks/

自定义组合式函数目录,用于抽离通用逻辑:

ts 复制代码
export function useCounter() {
  const count = ref(0)
  const increment = () => count.value++
  return { count, increment }
}
📁 pages/

每个文件夹代表一个独立页面,例如:

复制代码
pages/
├─ index/
│  └─ index.vue
├─ login/
│  └─ login.vue
📁 static/

放置不会被 Webpack/Vite 处理的静态资源(如图片、音频)。

📁 store/

用于状态管理,可采用 Pinia:

ts 复制代码
import { defineStore } from 'pinia'

export const useUserStore = defineStore('user', {
  state: () => ({ name: '张三', token: '' })
})
📁 utils/

封装项目常用工具函数:

ts 复制代码
export function formatTime(date: Date) {
  return date.toLocaleString()
}
🧩 App.vue

应用根组件,是整个项目的启动入口(类似 React 的 App.js)。

🧩 main.ts

项目启动文件,挂载 App 并创建应用实例:

ts 复制代码
import { createSSRApp } from 'vue'
import App from './App.vue'

export function createApp() {
  const app = createSSRApp(App)
  return { app }
}
🧩 manifest.json

App 端运行配置文件,控制应用图标、启动页、权限等。


5️⃣ pages.json

定义页面路径与导航栏外观,是 UniApp 的"路由表"。

json 复制代码
{
  "pages": [
    {
      "path": "pages/index/index",
      "style": { "navigationBarTitleText": "首页" }
    }
  ]
}

6️⃣ uni.scss

全局样式变量文件,例如:

scss 复制代码
$primary-color: #3b82f6;
$text-color: #333;

所有 .vue 页面都可直接使用这些变量。


7️⃣ vite.config.ts

Vite 构建配置文件,定义插件与路径别名:

ts 复制代码
import { defineConfig } from 'vite'
import uni from '@dcloudio/vite-plugin-uni'
import { fileURLToPath, URL } from 'node:url'

export default defineConfig({
  resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)) } },
  plugins: [uni()]
})

8️⃣ tsconfig.json

TypeScript 的核心配置文件,控制类型检查、语法支持和路径解析:

json 复制代码
{
  "compilerOptions": {
    "target": "ESNext",
    "strict": true,
    "baseUrl": ".",
    "paths": { "@/*": ["./src/*"] }
  }
}

9️⃣ .eslintrc.cjs / eslint.config.mjs

代码规范配置文件,控制 ESLint 行为,比如是否允许多余空格、未使用变量等。


🔟 其他文件说明

文件 说明


.gitignore 控制哪些文件不提交到 Git
index.html H5 运行入口
package.json 项目依赖、脚本命令
package-lock.json 锁定依赖版本
README.md 项目说明文档
shims-uni.d.ts / env.d.ts 提供 UniApp、环境变量的类型声明


📘 路由封装(和vue用法一致)

该路由系统基于 Uni-App 与 Vue3 构建,统一封装了页面跳转与参数管理逻辑。

它自动解析 URL 中的参数(支持多层 JSON 与编码),并提供类型安全的路由对象。

开发者通过 useRouter() 即可在任意页面中获取参数、执行跳转、重定向或返回,简化页面通信与导航流程。

分别负责 URL 拼接 → 参数传递 → 参数解析 → 页面 Hook

🧱 基础工具 utils/params.ts 负责把参数对象拼接或解析成 URL

🧭 路由核心类 utils/router.ts 封装 uni.navigateTo / redirectTo 等操作

🔍 参数解析Hook useQuery/index.ts 负责在页面加载时解析 URL 参数并返回响应式对象

🔗 路由Hook useRouter/index.ts 将 Router 与 useQuery 结合,实现页面级路由对象

🧱 1️⃣ params.ts ------ URL 参数工具

复制代码
    功能:拼接或解析 URL 参数。

    提供函数:
    setParams(url, params):把对象转成 ?a=1&b=2。
    getParams(url):从 URL 提取参数对象。
    服务对象:被 router.ts 调用,用来生成跳转链接。

🧭 2️⃣ router.ts ------ 路由核心类

复制代码
    功能:封装 uni.navigateTo、redirectTo、switchTab、back。

    核心点:
    统一参数处理(调用 setParams() 拼接)。
    维护当前 path 与 query。
    提供生命周期回调 ready() / runReady()。
    服务对象:被 useRouter.ts 实例化,用来操作页面跳转。

🔍 3️⃣ useQuery ------ 参数解析 Hook

复制代码
    功能:在页面加载时自动解析 URL 参数。

    特性:
    两次 decodeURIComponent 解码。
    自动识别 JSON 并递归解析。
    支持合并默认值。
    输出:返回响应式对象 query。
    服务对象:被 useRouter.ts 调用,用于读取当前页参数。

🔗 4️⃣ useRouter ------ 页面路由 Hook(整合层)

复制代码
    功能:把 Router + useQuery 结合成页面可直接使用的路由对象。

    逻辑:
    创建 query = useQuery();
    创建响应式 router = new Router();
    在 onLoad 时写入 query 和当前路径;
    页面渲染完成后执行 router.runReady() 回调。
    输出:一个带跳转功能、含当前参数的 router 实例。

🔄 四者协作流程

复制代码
    页面加载
        ↓
        useRouter()
        ├─ 调用 useQuery() → 解析 URL 参数
        ├─ 创建 Router() → 管理跳转与状态
        ├─ 写入 query/path
        └─ nextTick → runReady() 触发回调

✅ 一句话总结:

复制代码
params.ts 负责拼接,router.ts 负责跳转,
useQuery 负责解析,useRouter 负责整合。
页面通过 useRouter() 一步即可完成「参数解析 + 路由操作」。

📘 总结

Lighting-UniApp 是一个基于 Vue3 + TypeScript + Uni-App

的跨平台项目, 通过 vite 构建、tsconfig.json

提供类型支持、pages.json 控制页面结构、manifest.json 管理应用权限。

这一结构清晰、模块划分明确的项目架构,非常适合前端工程化与移动端多端开发。


✨ 作者建议:写项目时,保持 apistoreutils 的独立性;保持
pages.json 的整洁,可以让你的 UniApp 项目结构清晰、易维护。

源代码

https://gitee.com/yinerjie/uniapp_vue3_ts.git

相关推荐
艾醒(AiXing-w)3 小时前
探索大语言模型(LLM):MarkDown格式文档的结构化提取全流程
1024程序员节
府学路18号车神3 小时前
【1024节】一年一年又是一年
1024程序员节
知识分享小能手3 小时前
uni-app 入门学习教程,从入门到精通,uni-app 企业项目实战:鲁嗑瓜子项目开发知识点(9)
前端·javascript·学习·微信小程序·小程序·uni-app·vue
阿金要当大魔王~~3 小时前
uniapp img 动态渲染 的几种用法
java·服务器·前端·1024程序员节
知识分享小能手3 小时前
uni-app 入门学习教程,从入门到精通,uni-app中uCharts组件学习((8)
vue.js·学习·ui·微信小程序·小程序·uni-app·echarts
布兰妮甜3 小时前
彻底清理:Vue项目中移除static文件夹的完整指南
vue.js·前端框架·static·1024程序员节
知行力3 小时前
百度PaddleOCR-VL:基于0.9B超紧凑视觉语言模型,支持109种语言,性能超越GPT-4o等大模型
人工智能·百度·1024程序员节
sorryhc3 小时前
从renderToString到hydrate,从0~1手写一个SSR框架
1024程序员节
机器学习算法与Python实战3 小时前
DeepSeek 最新开源OCR模型,实测,不如百度Paddle
1024程序员节