当前位置: 首页 > news >正文

《uni-app跨平台开发完全指南》- 02 - 项目结构与配置文件详解

项目结构与配置文件

掌握uni-app项目结构就像学开车前先熟悉车内布局,看似繁琐却能让你在开发路上游刃有余。本文用大量图表和实战案例,帮你彻底搞懂uni-app项目的"五脏六腑"。

一、初识uni-app项目结构

1.1 项目结构图

当你创建第一个uni-app项目时,看到的目录结构可能是这样的:

my-uni-app/
├── pages/                 # 页面文件目录
│   ├── index/
│   │   ├── index.vue     # 首页
│   │   └── components/   # 页面私有组件
│   └── detail/
│       └── detail.vue    # 详情页
├── static/               # 静态资源目录
│   ├── images/
│   │   ├── logo.png
│   │   └── banners/
│   └── icons/
├── components/           # 全局组件目录
│   ├── base/             # 基础组件
│   └── business/         # 业务组件
├── uni_modules/          # 插件市场模块
├── wxcomponents/         # 微信小程序原生组件
├── App.vue               # 应用配置和全局样式
├── main.js               # 应用入口文件
├── manifest.json         # 应用配置文件
├── pages.json            # 页面路由和样式配置
└── uni.scss              # 全局样式变量

项目结构关系图:

┌─────────────────────────────────────────────────────────────┐
│                    uni-app项目结构关系图                     │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌─────────────┐    ┌─────────────┐    ┌─────────────┐     │
│  │   manifest  │    │   pages.json│    │   App.vue   │     │
│  │    .json    │    │             │    │             │     │
│  └──────┬──────┘    └──────┬──────┘    └──────┬──────┘     │
│         │                  │                  │            │
│  ┌──────┴──────────────────┴──────────────────┴──────┐     │
│  │                 应用配置层 (Configuration)         │     │
│  └──────────────────────────┬─────────────────────────┘     │
│                             │                              │
│  ┌──────────────────────────┼─────────────────────────┐     │
│  │                  框架层 (Framework)                │     │
│  │  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐ │     │
│  │  │   main.js   │  │  uni.scss   │  │   pages/    │ │     │
│  │  └──────┬──────┘  └──────┬──────┘  └──────┬──────┘ │     │
│  └─────────┼────────────────┼────────────────┼────────┘     │
│            │                │                │              │
│  ┌─────────┴────────────────┴────────────────┴────────┐     │
│  │                 业务层 (Business)                   │     │
│  │  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐ │     │
│  │  │ components/ │  │  static/    │  │uni_modules/ │ │     │
│  │  └─────────────┘  └─────────────┘  └─────────────┘ │     │
│  └────────────────────────────────────────────────────┘     │
│                                                             │
└─────────────────────────────────────────────────────────────┘

1.2 目录职责

如果把目录结构比作一家公司,那么每个目录的作用如下:

  • pages/ - 各个部门办公室(每个页面都是独立部门)
  • static/ - 公司仓库(存放不会变动的资产)
  • components/ - 标准化工作台(可复用的工具和模板)
  • uni_modules/ - 外包服务团队(第三方功能模块)
  • App.vue - 总经理办公室(全局决策和管理)
  • main.js - 公司大门(所有人进入公司的入口)
  • manifest.json - 公司营业执照(应用身份证明)
  • pages.json - 公司组织架构图(页面关系和样式规范)

1.3 项目目录结构设计

实战项目中,推荐的目录结构如下:

src/
├── api/                    # API接口层
│   ├── index.js           # 请求拦截器和全局配置
│   ├── user.js            # 用户相关接口
│   ├── product.js         # 商品相关接口
│   └── order.js           # 订单相关接口
├── common/                # 公共资源
│   ├── css/              # 公共样式
│   │   ├── reset.scss    # 样式重置
│   │   ├── variables.scss # 样式变量
│   │   └── mixins.scss   # 样式混合
│   ├── js/               # 工具函数
│   │   ├── utils.js      # 通用工具
│   │   ├── validate.js   # 表单验证
│   │   └── constants.js  # 常量定义
│   └── filters/          # 全局过滤器
├── components/           # 组件库
│   ├── base/            # 基础组件
│   │   ├── button/      # 按钮组件
│   │   ├── input/       # 输入框组件
│   │   └── modal/       # 弹窗组件
│   └── business/        # 业务组件
│       ├── user-card/   # 用户卡片
│       ├── product-list/# 商品列表
│       └── order-item/  # 订单项
├── pages/               # 页面目录
│   ├── home/           # 首页模块
│   │   ├── home.vue    # 首页
│   │   └── components/ # 首页专用组件
│   ├── user/           # 用户模块
│   │   ├── login/      # 登录页
│   │   ├── profile/    # 个人资料
│   │   └── settings/   # 设置页
│   └── product/        # 商品模块
│       ├── list/       # 商品列表
│       ├── detail/     # 商品详情
│       └── search/     # 商品搜索
├── store/              # 状态管理(Vuex)
│   ├── index.js        # store入口文件
│   ├── modules/        # 模块化store
│   │   ├── user.js     # 用户状态
│   │   ├── product.js  # 商品状态
│   │   └── cart.js     # 购物车状态
│   └── types.js        # 类型常量
├── utils/              # 工具函数
│   ├── request.js      # 网络请求封装
│   ├── storage.js      # 缓存管理
│   ├── auth.js         # 权限管理
│   └── router.js       # 路由工具
└── static/             # 静态资源├── images/        │   ├── common/     # 公共图片│   ├── icons/      # 图标│   └── banners/    # 广告图├── fonts/          # 字体文件└── json/           # 静态数据

目录结构设计原则:

┌─────────────────────────────────────────────────────────────┐
│                   目录设计原则                               │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  单一职责原则         高内聚低耦合         易于维护扩展       │
│  ┌────────────┐      ┌────────────┐      ┌────────────┐     │
│  │ 每个目录只  │      │ 相关功能放 │      │ 新功能容易 │     │
│  │ 做一件事    │      │ 在同一目录 │      │ 添加和修改 │     │
│  └────────────┘      └────────────┘      └────────────┘    │
│                                                            │
│  分层清晰明确         按功能模块化         团队协作友好      │
│  ┌────────────┐      ┌────────────┐      ┌────────────┐    │
│  │ API/组件/   │     │ 用户/商品/  │      │ 不同开发者  │    │
│  │ 页面分离    │     │ 订单分模块  │      │ 负责不同模块│    │
│  └────────────┘      └────────────┘      └────────────┘    │
│                                                            │
└─────────────────────────────────────────────────────────────┘

二、pages.json 深度解析

2.1 pages.json 的作用机制

pages.json 是uni-app的路由中枢样式调度中心,它决定了:

  1. 页面路由关系 - 哪个路径对应哪个页面
  2. 全局样式规范 - 导航栏、背景色等统一设置
  3. 页面个性配置 - 每个页面的特殊样式需求
  4. 底部导航管理 - TabBar的配置和交互

pages.json 配置流程图:

pages.json
globalStyle 全局样式
pages 页面路由
tabBar 底部导航
easycom 组件自动引入
条件编译配置
导航栏样式
背景颜色
下拉刷新
页面路径
页面样式
页面参数
Tab项配置
图标设置
样式定制
自动扫描规则
自定义匹配
平台差异化
环境配置

2.2 完整配置实例分析

下面以一个电商应用为例,完整 pages.json 配置如下:

{// ==================== 全局样式配置 ===================="globalStyle": {// 导航栏相关"navigationBarTextStyle": "white",            // 标题文字颜色"navigationBarTitleText": "智能商城",         // 默认标题"navigationBarBackgroundColor": "#FF6B35",   // 导航栏背景色"backgroundColor": "#F8F8F8",                // 窗口背景色// 下拉刷新"enablePullDownRefresh": false,             // 默认关闭下拉刷新"backgroundTextStyle": "dark",              // 下拉loading样式"onReachBottomDistance": 50,                // 上拉触底距离// 页面动画"animationType": "pop-in",                  // 页面切换动画"animationDuration": 300,                   // 动画时长// H5配置"h5": {"titleNView": {                          // H5标题栏"titleText": "智能商城","backgroundColor": "#FF6B35","titleColor": "#FFFFFF"}},// App配置"app-plus": {"background": "#F8F8F8",                 // 应用背景色"bounce": "vertical"                     // 回弹效果}},// ==================== 页面路由配置 ===================="pages": [// 首页必须放在第一个位置!{"path": "pages/index/index","style": {"navigationBarTitleText": "智能商城首页","enablePullDownRefresh": true,         // 首页开启下拉刷新"backgroundTextStyle": "dark","navigationBarBackgroundColor": "#FF6B35",// 首页特殊配置"app-plus": {"bounce": "vertical"                 // iOS回弹效果}}},// 分类页面{"path": "pages/category/category","style": {"navigationBarTitleText": "商品分类","enablePullDownRefresh": false,"navigationBarBackgroundColor": "#4CD964"  // 绿色主题}},// 购物车页面{"path": "pages/cart/cart","style": {"navigationBarTitleText": "购物车","navigationBarBackgroundColor": "#FF9500"  // 橙色主题}},// 个人中心{"path": "pages/user/user", "style": {"navigationBarTitleText": "个人中心","navigationBarBackgroundColor": "#5856D6"  // 紫色主题}},// 商品详情页{"path": "pages/product/detail","style": {"navigationBarTitleText": "商品详情","navigationBarBackgroundColor": "#FF6B35",// 详情页禁用下拉刷新"enablePullDownRefresh": false,// 自定义配置"app-plus": {"bounce": "none"  // 禁用回弹}}}],// ==================== 底部TabBar配置 ===================="tabBar": {// 基础样式"color": "#7F7F7F",                       // 默认颜色"selectedColor": "#FF6B35",               // 选中颜色"backgroundColor": "#FFFFFF",             // 背景色"borderStyle": "black",                   // 边框颜色"blurEffect": "none",                     // 毛玻璃效果(iOS)// 图标和文字样式"iconWidth": "24px",                      // 图标宽度"spacing": "3px",                         // 图标与文字间距"height": "50px",                         // TabBar高度"fontSize": "10px",                       // 文字大小// Tab项列表"list": [{"pagePath": "pages/index/index",      // 页面路径"iconPath": "static/tabbar/home.png", // 默认图标"selectedIconPath": "static/tabbar/home-active.png", // 选中图标"text": "首页",                       // 文字// 角标配置"badge": "12",                        // 角标数字"badgeStyle": "background-color: #FF3B30; color: #FFFFFF;" // 角标样式},{"pagePath": "pages/category/category","iconPath": "static/tabbar/category.png","selectedIconPath": "static/tabbar/category-active.png", "text": "分类","badge": "NEW",                       // 文字角标"badgeStyle": "background-color: #4CD964; color: #FFFFFF;"},{"pagePath": "pages/cart/cart","iconPath": "static/tabbar/cart.png","selectedIconPath": "static/tabbar/cart-active.png","text": "购物车","badge": "3",                         // 购物车商品数量"badgeStyle": "background-color: #FF9500; color: #FFFFFF;"},{"pagePath": "pages/user/user","iconPath": "static/tabbar/user.png","selectedIconPath": "static/tabbar/user-active.png","text": "我的"}],// 中间凸起按钮"midButton": {"width": "50px",                        // 按钮宽度"height": "50px",                       // 按钮高度"text": "发布",                         // 按钮文字"iconPath": "static/tabbar/add.png",    // 按钮图标"iconWidth": "25px",                    // 图标宽度"backgroundImage": ""                   // 背景图片}},// ==================== 组件自动引入配置 ===================="easycom": {"autoscan": true,                         // 开启自动扫描"custom": {// 自定义组件匹配规则"^uni-(.*)": "@/components/uni-$1.vue", // uni-开头组件"^my-(.*)": "@/components/my-$1.vue",   // my-开头组件"^base-(.*)": "@/components/base/$1.vue", // base-开头基础组件"^biz-(.*)": "@/components/business/$1.vue" // biz-开头业务组件}},// ==================== 条件编译配置 ===================="condition": {"current": 0,                            // 当前启动模式"list": [{"name": "商品详情测试",               // 模式名称"path": "pages/product/detail",      // 启动页面"query": "id=1001&type=test"         // 启动参数},{"name": "订单列表测试","path": "pages/order/list","query": "status=1"}]},// ==================== 平台差异化配置 ====================// H5平台配置"h5": {"publicPath": "/",                        // 静态资源路径"router": {"mode": "hash",                         // 路由模式: hash/history"base": "./"                            // 路由基路径},"title": "智能商城H5版",                  // 页面标题"template": "template.h5.html",           // 自定义模板"optimization": {"treeShaking": {"enable": true                        // 开启摇树优化}}},// 微信小程序专属配置"mp-weixin": {"appid": "wx1234567890abcdef",           // 小程序AppID"setting": {"urlCheck": false,                     // 关闭域名校验"es6": true,                           // 启用ES6转ES5"enhance": true,                       // 增强编译"postcss": true,                       // 样式自动补全"minified": true                       // 代码压缩},"usingComponents": true,                 // 使用自定义组件"permission": 
http://www.dtcms.com/a/568525.html

相关文章:

  • 【数据分析】基于R语言的废水微生物抗性分析与负二项回归模型建模
  • 深圳专业网站公司注册查询网站
  • k8s --- resource 资源
  • 神经网络之反射变换
  • k8s——pod详解2
  • 四层神经网络案例(含反向传播)
  • MySQL初阶学习日记(1)--- 数据库的基本操作
  • 【k8s】k8s的网络底层原理
  • 一种创新的集成学习模型:结合双通路神经网络与逻辑回归的糖尿病患病概率预测
  • 神经网络之线性变换
  • Fastlane 结合 开心上架(Appuploader)命令行版本实现跨平台上传发布 iOS App 免 Mac 自动化上架实战全解析
  • 大连网站建设平台宁夏考试教育网站
  • 微信网站对接室内设计师报考官网
  • Ceph常用的三种存储操作
  • 【前端】从零开始搭建现代前端框架:React 19、Vite、Tailwind CSS、ShadCN UI 完整实战教程-第1章:项目概述与技术栈介绍
  • react使用ag-grid及常用api笔记
  • MiniEngine学习笔记 : CommandListManager
  • 人工智能讲师数据治理讲师叶梓《数字化转型与大模型技术应用培训提纲》
  • 1.7.课设实验-数据结构-二叉树-文件夹创建系统
  • 互联网大学生创新创业项目计划书seo网址查询
  • 同时打开两个浏览器页面,关闭 A 页面的时候,要求 B 页面同时关闭,怎么实现?
  • 什么是react?
  • Arbess零基础学习 - 使用Arbess+GitLab实现 React.js 项目自动化构建/主机部署
  • 从事网站开发需要的证书网页设计免费网站推荐
  • 任何数据结构的构造或初始化,都应指定大小,避免数据结构无限增长吃光内存【示例】
  • 【开题答辩实录分享】以《基于java的宿舍楼洗衣机预约管理系统》为例进行答辩实录分享
  • 如何在iPhone 17/16/15上显示电池百分比
  • 网站换主机引擎网站推广法
  • 【普中STM32F1xx开发攻略--标准库版】-- 第 13 章 STM32 位带操作
  • MySQL绿色版完整教程:下载、安装、配置与远程访问