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

news/2025/11/20 23:05:24/文章来源:https://www.cnblogs.com/gccbuaa/p/19249833

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

在本文中,我们将详细解析一个完整的 Uni-App + Vue3 + TypeScript
工程结构。 以项目 Lighting-UniApp
为示例,带你了解每个文件、目录的用途与作用。


项目结构总览

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/

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

import request from '@/utils/request'
export const getUserList = () => request.get('/user/list')
components/

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


hooks/

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

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:

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

封装项目常用工具函数:

export function formatTime(date: Date) {
return date.toLocaleString()
}
App.vue

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

main.ts

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

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 的"路由表"。

{
"pages": [
{
"path": "pages/index/index",
"style": { "navigationBarTitleText": "首页" }
}
]
}

6️⃣ uni.scss

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

$primary-color: #3b82f6;
$text-color: #333;

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


7️⃣ vite.config.ts

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

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 的核心配置文件,控制类型检查、语法支持和路径解析:

{
"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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/971507.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第31天(简单题中等题 二分查找)

打卡第三十一天 1道简单题+2道中等题题目:思路:二分代码: class Solution { public:int singleNonDuplicate(vector<int>& nums) {int left = -1, right = nums.size() / 2;// left从-1开始,right从数组…

XHORSE XZBT40EN 4-Button Honda Civic 2016-2019 Special PCBs (5pcs/lot) for Reliable Key Fob Repairs

Problem: Struggling to Find Reliable Key Fob PCBs for Honda Civic 2016-2019? For automotive repair shops and Honda Civic owners, sourcing compatible, high-quality key fob PCBs can be a frustrating cha…

Java 和 Apache POI 处理 Excel 文件

一、引言 在企业应用中,Excel 是一种常见的数据存储和交换格式。Java 通过 Apache POI 库可以高效地读取、修改和写入 Excel 文件。本文介绍如何使用 Java 处理 Excel 文件,包括读取、写入和修改数据。 二、环境准备…

rust第二篇:语法学习

rust第二篇:语法学习rust用关键字fn定义函数,形参后面紧跟一个冒号,之后才是变量类型,返回值类型前有一个->,函数实现中最后可以省略return关键字。 rust用let声明变量,变量类型可以省略,编辑器会自动推导。…

啊队队队第二次团队作业--原型设计+概要设计

第二次团队作业作业所属课程 班级的链接作业要求 https://edu.cnblogs.com/campus/fzu/202501SoftwareEngineering/homework/14580作业目标 提交原型设计,系统设计,数据库设计以及相关需求分析的文档团队名称 啊对对…

IO 2024 Round 3(团体赛)Unofficial Mirror

IO 2024 Round 3(团体赛)Unofficial Mirror 停课集训周三休息没啥事干继续打团战。 队员: yangjinhua Hexiuqi 无名之雾 赛前写了个随机数选择使用 Hexiuqi 的号。 很早吃完饭从食堂往回走,期间 hxq 疯狂想要站在我…

有志青年

我从他的身上看到了青年人应有的奋进昂扬的姿态,和我颇为相似的他,让我在竞赛时被压制抛弃的价值观得到认可,让我重拾自信,我不再相信我要去迎合他人的想法,去刻意合群,我也不再对自己曾经信奉的价值观评头品足。…

python舆情分析可视化平台 情感分析 微博 爬虫 scrapy爬虫手艺 朴素贝叶斯分类算法大数据 计算机✅

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

90%的OKR都写成了KPI?其实你缺的不是表格,而是教练

本文针对OKR流于形式变成KPI的痛点,介绍了一套专业的AI指令,能扮演"OKR教练"角色。通过产品经理的实战案例对比,展示了如何用AI将模糊的任务清单转化为具备挑战性和价值导向的OKR体系,帮助团队实现真正的…

Python thread lambda run multiple functions

import datetime import uuid import time import numpy as np import threadingdef get_uuid_time():return f"{uuid.uuid4().hex}_{datetime.datetime.now().strftime("%Y%m%d%H%M%S%f")}"def …

数据分析核心术语略解 - 指南

数据分析核心术语略解 - 指南2025-11-20 22:53 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important…

我为什么要学MCP?

以下内容完全紧扣官方文档,目的在于提取主要内容方便小白理解。 由于是了解 MCP 理论的文章,这里暂时不做 MCP server/client 代码的实战讲解。一、概念 MCP 是一个为大型语言模型(LLM)与“外部世界”(文件、数据…

storybook 和 vitepress选哪个作为组件文档站点更合适

选择 Storybook 还是 VitePress 作为 Vue 3 组件库的文档站点,取决于你的核心目标:如果你侧重 交互式组件开发、调试、测试和设计系统管理 → 选 Storybook。 如果你侧重 轻量、快速、内容导向的技术文档(含示例) …

csp-s 2025 随笔

csp-s2025 T2 考场的时候把 $k<=10$ 看成 $k<=1e4$ 了,当时想了半天我说 CCF 怎么这次出的那么难呢,拿了个特殊性质 A 就跑了,你的这就算了吧,更可恶的是开二维数组 a[maxn][maxn](maxn=1e4+5)直接 MLE 了…

消费电子的可创作内容已经不属于可持续性竭泽而渔

我差不多就是标题这个意思,我写这个的另一个原因是我对这些东西已经逐渐失去兴趣了,而今天我们看见了一个人也陷入了这个陷阱,那我就随便写点啥,其次二手玫瑰乐队的主唱梁龙曾说过“创新也会挨骂,守旧也会挨骂”,…

内网穿透配置和使用 - Rainbow

@目录内网穿透配置和使用NatApp和Ngrok的使用NatApp的使用Ngrok的使用最后: 内网穿透配置和使用 NatApp和Ngrok的使用 NatApp的使用 NatAPP 官网:https://natapp.cn/article/natapp_newbie购买隧道:配置消息:启动:…

Swift 快速上手

https://docs.swift.org/swift-book/documentation/the-swift-programming-language 这是笔者上手 Swift 时做的笔记。 简单值 常用的基本类型:Int、Double、Bool、String 集合类型:Array、Set、Dict 使用 var 创建变…

[ARC195D] Swap and Erase 分析

题目概述 给定一个数列 $ A = (A_1, \ldots, A_N) $。你可以对 $ A $ 进行以下两种操作,顺序和次数不限:交换操作:设操作前 $ A $ 的长度为 $ K $。选择满足 $ 1 \leq i \leq K - 1 $ 的整数 $ i $,交换 $ A $ 的第…

20251118 正睿

25noip赠送赛day2之不住全季 B \(y\) 没用,将 \(x, y\) 都除以 \(y\) 即可将 \(y\) 变成 \(1\)。 对于两个人 \(i, j\) 来说,只有当 \(x = \frac{b_i - b_j}{a_j - a_i}\) 时他们的顺序才能调换,否则就是确定的。转…