《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": 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QuantumLeap丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值