基于 Vue 3、TypeScript、Vite 和 uni-app 构建的跨平台应用模板,支持微信小程序、H5 等多平台。
这是一个使用现代前端技术栈构建的 uni-app 项目模板,集成了以下特性:
- Vue 3:使用 Vue 3 组合式 API 开发
- TypeScript:提供类型安全的开发体验
- Vite:快速的开发构建工具
- Pinia:Vue 3 的状态管理方案
- uni-mini-router:小程序路由管理
- Alova:HTTP 请求库
- UnoCSS:原子化 CSS 框架
- Wot Design Uni:UI 组件库
- ESLint:代码规范检查
- Node.js >= 18
- pnpm (推荐的包管理器)
npm install / pnpm install
运行 H5 版本:
npm run dev:h5 / pnpm dev:h5
运行微信小程序版本:(运行方式:等待构建完成后打开 微信开发者工具, 导入 dist\dev\mp-weixin 运行)
npm run dev:wx / pnpm dev:wx
构建 H5 版本:
npm run build:h5 / pnpm build:h5
构建微信小程序版本(发布:等待构建完成后打开 微信开发者工具, 导入 dist\dev\mp-weixin 上传发布):
npm run build:wx / pnpm build:wx
uni-vue3-vite/
├── src/ # 源代码
│ ├── api/ # API 接口定义
│ ├── components/ # 公共组件
│ ├── hooks/ # 自定义 Hooks
│ ├── pages/ # 主包页面
│ ├── pages-sub/ # 分包页面
│ ├── router/ # 路由配置
│ ├── static/ # 静态资源
│ ├── store/ # Pinia 状态管理
│ ├── utils/ # 工具函数
│ ├── App.vue # 应用入口组件
│ ├── config.ts # 应用配置
│ ├── main.ts # 应用入口
│ ├── manifest.json # 应用配置文件
│ ├── pages.json # 页面配置
│ └── uni.scss # 全局样式
├── types/ # TypeScript 类型定义
├── .vscode/ # VS Code 配置
├── manifest.config.ts # manifest 配置
├── pages.config.ts # 页面配置
├── vite.config.ts # Vite 配置
└── ...
项目使用了 @uni-helper/vite-plugin-uni-manifest
插件来管理 manifest 配置。主要配置在 manifest.config.ts
文件中:
// manifest.config.ts
import { defineManifestConfig } from '@uni-helper/vite-plugin-uni-manifest'
import appConfig from './src/config'
export default defineManifestConfig({
'name': appConfig.appName,
'appid': appConfig.appId,
// 其他配置...
})
应用基础信息在 src/config.ts
中定义:
// src/config.ts
export default {
baseURL: 'https://api.alovajs.org',
appId: 'wx4cff20925919bd8a',
appName: 'uniapp-template',
appDescription: 'uniapp-template',
appVersion: '1.0.0',
appVersionCode: '100',
}
在 src/pages
目录下创建 Vue 文件,并添加 route 块:name必须全局唯一
<route lang="json5" type="page">
{
name: 'pageName',
style: {
navigationStyle: 'default',
navigationBarTitleText: '页面标题',
},
}
</route>
<template>
<view class="">
<!-- 页面内容 -->
</view>
</template>
<script setup lang="ts">
// 页面逻辑
</script>
<style lang="scss" scoped>
/* 页面样式 */
</style>
项目使用 Alova 作为 HTTP 请求库,封装在 src/utils/request
目录中。
在 src/api
目录下创建对应的 API 文件:
// src/api/user.ts
import { get, post } from '@/utils/request'
export function getUserInfo() {
return get<UserInfo>('/user/info')
}
export function login(params: LoginParams) {
return post<LoginResponse>('/user/login', params)
}
import { getUserInfo } from '@/api'
// 在组件中使用
const fetchData = async () => {
try {
const data = await getUserInfo()
// 处理数据
} catch (error) {
// 处理错误
}
}
项目使用 Pinia 进行状态管理,并集成了持久化插件。
// src/store/user.ts
export const useUserStore = defineStore('user', () => {
const isLogin = ref(false)
const setLogin = (val: boolean) => {
isLogin.value = val
}
return { isLogin, setLogin }
}, {
persist: true, // 开启持久化
})
// 在组件中使用
const userStore = useUserStore()
// 读取状态
console.log(userStore.isLogin)
// 修改状态
userStore.setLogin(true)
项目使用 uni-mini-router 进行路由管理。
// 页面跳转
const router = useRouter()
// 普通跳转
router.push('/pages/index/index')
// 带参数跳转
router.push({
path: '/pages-sub/demo/index',
query: {
id: '123'
}
})
// 获取路由参数
const route = useRoute()
console.log(route.query)
项目集成了 Wot Design Uni 组件库,可以直接使用:
<template>
<wd-button @click="handleClick">按钮</wd-button>
</template>
使用 Pinia 的 globalStore 进行全局数据共享:
// 设置全局数据
const globalStore = useGlobalStore()
globalStore.setGlobalData('key', value)
// 获取全局数据
const value = globalStore.globalData.key
项目集成了 UnoCSS 原子化 CSS 框架,可以快速构建界面样式。
在模板中直接使用预定义的原子类:
<template>
<view class="px-10 py-20 text-center bg-white rounded-lg shadow-md">
<text class="text-lg font-bold text-primary">标题文本</text>
<view class="mt-4 flex justify-between items-center">
<text class="text-gray-500">左侧内容</text>
<text class="text-sm text-gray-400">右侧内容</text>
</view>
</view>
</template>
- 布局:
flex
,grid
,block
,inline-block
,hidden
- 弹性布局:
flex-row
,flex-col
,justify-center
,items-center
,space-x-2
- 尺寸:
w-full
,h-10
,max-w-md
,min-h-screen
- 间距:
m-4
(margin),p-4
(padding),mt-2
(margin-top),pb-3
(padding-bottom) - 颜色:
text-primary
,bg-white
,border-gray-200
- 字体:
text-sm
,font-bold
,italic
,text-center
- 边框:
border
,border-2
,rounded-lg
,rounded-full
- 阴影:
shadow-sm
,shadow-md
,shadow-lg
<view class="w-full md:w-1/2 lg:w-1/3">
<!-- 在小屏幕上宽度100%,中等屏幕上50%,大屏幕上33.3% -->
</view>
<button class="bg-blue-500 hover:bg-blue-700 active:bg-blue-800">
按钮
</button>
UnoCSS 支持变体组合,可以更简洁地编写复杂样式:
<view class="hover:(bg-gray-100 text-blue-500)">
<!-- 鼠标悬停时同时改变背景色和文字颜色 -->
</view>
项目中已定义了安全区适配的原子类:
<view class="pb-safe">
<!-- 底部安全区域适配 -->
</view>
项目配置了主题色,可以直接使用:
<view class="text-primary bg-primary/10">
<!-- 使用主题色文本和10%透明度的主题色背景 -->
</view>
UnoCSS 支持在样式中使用 @apply
指令:
<style>
.custom-component {
@apply px-4 py-2 bg-white rounded-lg shadow;
}
</style>
项目在 .vscode/
目录下提供了常用的代码片段,例如 univ3
可以快速创建 uni-app Vue 3 页面模板。
- 自动导入:无需手动导入 Vue、Pinia、uni-app API 等
- 原子化 CSS:使用 UnoCSS 快速构建界面
- TypeScript 支持:完整的类型定义和类型检查
- ESLint 集成:代码规范检查
- 自动生成路由:基于文件系统的路由生成
- 中间件支持:可配置全局和局部中间件
- 分包支持:优化小程序包大小
- 持久化存储:Pinia 状态自动持久化