uni-app Vue 项目的规范目录结构全解

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站

文章目录

  • [uni-app Vue 项目的规范目录结构全解](#uni-app Vue 项目的规范目录结构全解)
    • 引言
    • [📂 目录结构解析](#📂 目录结构解析)
    • [📌 每个模块的作用 + 示例代码](#📌 每个模块的作用 + 示例代码)
      • [1. `/api` ------ 接口封装](#1. /api —— 接口封装)
      • [2. `/utils` ------ 工具函数](#2. /utils —— 工具函数)
      • [3. `/store` ------ 全局状态(Pinia)](#3. /store —— 全局状态(Pinia))
      • [4. `/components` ------ 公共组件](#4. /components —— 公共组件)
      • [5. `/composables` ------ 自定义 hooks](#5. /composables —— 自定义 hooks)
      • [6. `/pages` ------ 页面目录](#6. /pages —— 页面目录)
      • [7. `/styles` ------ 全局样式](#7. /styles —— 全局样式)
      • [8. `/types` ------ 类型定义](#8. /types —— 类型定义)
      • [9. `main.ts` ------ 入口文件](#9. main.ts —— 入口文件)
      • [10. `App.vue` ------ 根组件](#10. App.vue —— 根组件)
      • [11. `manifest.json`](#11. manifest.json)
      • [12. `pages.json`](#12. pages.json)
      • [13. `uni.scss`](#13. uni.scss)
    • [🔄 串联起来的流程(箭头版)](#🔄 串联起来的流程(箭头版))
    • 总结

uni-app Vue 项目的规范目录结构全解

引言

想象一下,如果你要盖一栋楼:

  • 你需要图纸(架构)
  • 你需要水泥和钢材(工具函数、组件)
  • 你需要电、水、管道系统(接口、路由、状态管理)

如果一切都堆在一起,现场就是个「大工地」,乱七八糟难以维护。

这就是为什么我们需要一个清晰的项目目录结构

首先,你需要去uniapp官方网站去安装一个基本目录:uniapp官方网站。注意:不管你是通过命令或是下载安装包的形式他都是一个最基本的目录(在真实项目中肯定是对其做以下扩展的)。我们接下来提到的文件功能模块更多的是要自己新建的,可以做到更多的模块化,让项目目录更加规范。

下面,我就带你逐个认识 /src 里的每个「部门」,让你理解它们各自的职责。


📂 目录结构解析

文件/文件夹 作用 解决了什么问题
/api 接口封装层 避免每次都手写 uni.request,统一管理请求
/assets 静态资源 存放图片、字体、icon,让资源集中管理
/components 通用组件 封装按钮、导航栏等公共模块,避免重复写代码
/composables 自定义 hooks 抽离逻辑复用,比如登录检测、主题切换
/pages 业务页面 每个页面就是一个独立功能模块
/router 路由配置 管理页面跳转,解耦 pages.json
/store 状态管理(Pinia) 全局数据共享,比如用户信息、token
/utils 工具函数库 封装格式化、加解密、校验等小工具
/styles 全局样式 存放主题色、通用 CSS,让全局风格统一
/types TS 类型定义 定义接口、数据结构,增强代码可维护性
main.ts 项目入口 挂载 App,初始化插件
App.vue 根组件 整个应用的"壳子"
manifest.json App 配置 应用的基本信息(小程序配置、权限等)
pages.json 页面路由表 配置页面路径、导航栏等
uni.scss 全局样式变量 定义全局样式变量,比如颜色、字体大小

📌 每个模块的作用 + 示例代码

1. /api ------ 接口封装

作用:把 uni.request 封装成统一的调用方式,避免重复写请求逻辑。

ts 复制代码
// /src/api/user.ts
import request from "@/utils/request"

// 获取用户信息
export function getUserInfo() {
  return request({
    url: "/user/info",
    method: "GET"
  })
}

// 登录接口
export function login(data: { username: string; password: string }) {
  return request({
    url: "/auth/login",
    method: "POST",
    data
  })
}

2. /utils ------ 工具函数

作用:抽离通用的小功能,比如请求封装、日期格式化。

ts 复制代码
// /src/utils/request.ts
export default function request(options: UniApp.RequestOptions) {
  return new Promise((resolve, reject) => {
    uni.request({
      ...options,
      header: {
        Authorization: uni.getStorageSync("token") || "",
        ...options.header,
      },
      success: (res) => resolve(res.data),
      fail: (err) => reject(err),
    })
  })
}

3. /store ------ 全局状态(Pinia)

作用:存放用户信息、登录状态,任何页面都能访问。

ts 复制代码
// /src/store/user.ts
import { defineStore } from "pinia"

export const useUserStore = defineStore("user", {
  state: () => ({
    token: "",
    userInfo: null as null | { name: string; avatar: string }
  }),
  actions: {
    setToken(token: string) {
      this.token = token
      uni.setStorageSync("token", token)
    },
    setUserInfo(info: any) {
      this.userInfo = info
    }
  }
})

4. /components ------ 公共组件

作用:把常用 UI 提炼出来,方便复用。

vue 复制代码
<!-- /src/components/BaseButton.vue -->
<template>
  <button class="btn" @click="$emit('click')">
    <slot></slot>
  </button>
</template>

<style scoped>
.btn {
  padding: 10px 20px;
  background: var(--primary-color, #42b983);
  color: #fff;
  border-radius: 6px;
}
</style>

5. /composables ------ 自定义 hooks

作用:逻辑复用,例如主题切换。

ts 复制代码
// /src/composables/useTheme.ts
import { ref } from "vue"

const theme = ref<"light" | "dark">("light")

export function useTheme() {
  function toggleTheme() {
    theme.value = theme.value === "light" ? "dark" : "light"
    document.documentElement.className = `${theme.value}-theme`
  }
  return { theme, toggleTheme }
}

6. /pages ------ 页面目录

作用:一个页面一个文件夹,业务逻辑更清晰。

复制代码
/pages
  /home
    index.vue
  /login
    index.vue
<!-- /src/pages/home/index.vue -->
<template>
  <view>
    <BaseButton @click="loadUser">获取用户信息</BaseButton>
    <view v-if="user">{{ user.name }}</view>
  </view>
</template>

<script setup lang="ts">
import { ref } from "vue"
import { getUserInfo } from "@/api/user"
import BaseButton from "@/components/BaseButton.vue"

const user = ref<any>(null)
function loadUser() {
  getUserInfo().then(res => user.value = res)
}
</script>

7. /styles ------ 全局样式

作用:统一主题。

scss 复制代码
/* /src/styles/variables.scss */
$primary-color: #42b983;
$text-color: #333;

8. /types ------ 类型定义

作用:让接口数据结构更清晰。

ts 复制代码
// /src/types/user.ts
export interface User {
  id: number
  name: string
  avatar: string
}

9. main.ts ------ 入口文件

作用:挂载应用、注册插件。

ts 复制代码
// /src/main.ts
import { createSSRApp } from "vue"
import { createPinia } from "pinia"
import App from "./App.vue"

export function createApp() {
  const app = createSSRApp(App)
  app.use(createPinia()) // 挂载全局 store
  return { app }
}

10. App.vue ------ 根组件

作用:定义全局结构。

vue 复制代码
<template>
  <slot />
</template>

<script setup>
// 可以在这里定义全局逻辑,比如主题
</script>

11. manifest.json

作用:小程序/应用的配置,比如名字、appid、权限。


12. pages.json

作用:页面路由表。

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

13. uni.scss

作用:全局样式变量。

scss 复制代码
/* /src/uni.scss */
$uni-primary: #42b983;

🔄 串联起来的流程(箭头版)

复制代码
main.ts (入口挂载)
   ↓
App.vue (根组件)
   ↓
pages.json (页面配置)
   ↓
store (全局状态) ←→ api (接口) ←→ utils (工具)
   ↓
pages (页面使用组件 & hooks)
   ↓
components (通用组件)
   ↓
styles / types (全局样式 & 类型)

总结

这个目录结构就像是一座「现代工厂」:

  • /api 是流水线接口
  • /components 是零件库
  • /composables 是工人的操作手册
  • /pages 是产品车间
  • /store 是仓库
  • /utils 是工具箱
  • /styles 是装修设计
  • /types 是产品说明书

掌握这些模块,你就能快速把一个 uni-app Vue 项目「从工地搭建成高楼大厦」。

相关推荐
少卿3 小时前
React Native Vector Icons 安装指南
前端·react native
国家不保护废物3 小时前
Vue组件通信全攻略:从父子传到事件总线,玩转组件数据流!
前端·vue.js
写不来代码的草莓熊4 小时前
vue前端面试题——记录一次面试当中遇到的题(9)
前端·javascript·vue.js
JinSo4 小时前
pnpm monorepo 联调:告别 --global 参数
前端·github·代码规范
程序员码歌5 小时前
豆包Seedream4.0深度体验:p图美化与文生图创作
android·前端·后端
urhero5 小时前
工作事项管理小工具——HTML版
前端·html·实用工具·工作事项跟踪·任务跟踪小工具·本地小程序
二十雨辰5 小时前
eduAi-智能体创意平台
前端·vue.js
golang学习记5 小时前
从0死磕全栈之Next.js connection() 函数详解:强制动态渲染的正确姿势(附实战案例)
前端
郝学胜-神的一滴5 小时前
Three.js光照技术详解:为3D场景注入灵魂
开发语言·前端·javascript·3d·web3·webgl