微信小程序开发(二)目录结构完全指南
- 一、核心概念:两种目录结构
-
- [1.1 扁平结构](#1.1 扁平结构)
- [1.2 包裹结构](#1.2 包裹结构)
- [1.3 快速对比](#1.3 快速对比)
- 二、微信开发者工具创建项目时的选择
-
- 什么时候会生成包裹结构?
-
- [情况1: 选择"云开发模板"](#情况1: 选择"云开发模板")
- [情况2: 选择"TypeScript 模板"](#情况2: 选择"TypeScript 模板")
- [情况3: 不选择模板/选择普通模板](#情况3: 不选择模板/选择普通模板)
- 核心理解
- 三、重要结论
-
- [miniprogram/ 内部结构与扁平结构完全相同!](#miniprogram/ 内部结构与扁平结构完全相同!)
- 四、小程序的文件组织规则
- [五、uni-app 编译机制](#五、uni-app 编译机制)
-
- [5.1 编译转换:1个文件 → 4个文件](#5.1 编译转换:1个文件 → 4个文件)
- [5.2 编译后的代码为什么看不懂?](#5.2 编译后的代码为什么看不懂?)
- [5.3 正确的开发流程](#5.3 正确的开发流程)
- [⚠️ 重要提醒](#⚠️ 重要提醒)
- 六、常见问题
-
- [Q1: 如何判断项目是哪种结构?](#Q1: 如何判断项目是哪种结构?)
- [Q2: miniprogram/ 里面的结构和扁平结构一样吗?](#Q2: miniprogram/ 里面的结构和扁平结构一样吗?)
- [Q3: uni-app 编译后为什么是扁平结构?](#Q3: uni-app 编译后为什么是扁平结构?)
- [Q4: 可以在微信开发者工具里改 uni-app 的代码吗?](#Q4: 可以在微信开发者工具里改 uni-app 的代码吗?)
- 七、核心要点总结
-
- [1. 两种结构](#1. 两种结构)
- [2. 判断标准](#2. 判断标准)
- [3. 结构由创建时决定](#3. 结构由创建时决定)
- [4. uni-app 编译](#4. uni-app 编译)
- [5. 开发建议](#5. 开发建议)
- 八、参考资源
一、核心概念:两种目录结构
微信小程序有两种目录组织方式,区别在于源码的存放位置。
1.1 扁平结构
特点: 源码直接放在项目根目录
项目根目录/
├── app.js # 小程序入口逻辑(必需)
├── app.json # 小程序全局配置(必需)
├── app.wxss # 小程序全局样式(自动生成)
├── pages/ # 页面目录(必需)
│ └── index/ # 首页示例
│ ├── index.js # 页面逻辑(必需)
│ ├── index.wxml # 页面结构(必需)
│ ├── index.json # 页面配置(自动生成)
│ └── index.wxss # 页面样式(自动生成)
├── project.config.json # 项目配置文件(必需)
├── sitemap.json # 小程序搜索配置(自动生成)
├── project.private.config.json # 个人配置文件(自动生成)
├── components/ # 自定义组件目录(可选)
├── utils/ # 工具函数目录(可选)
├── images/ # 图片资源目录(可选)
└── .eslintrc.js # ESLint 配置(某些模板生成)
配置文件:
json
{
"compileType": "miniprogram"
// 没有 miniprogramRoot 配置
}
何时生成: 创建项目时不选择模板,或选择普通 JavaScript 模板
1.2 包裹结构
特点: 源码放在 miniprogram/ 子目录
项目根目录/
├── miniprogram/ # 小程序源码目录(必需)
│ ├── app.js # 小程序入口逻辑(必需)
│ ├── app.json # 小程序全局配置(必需)
│ ├── app.wxss # 小程序全局样式(自动生成)
│ ├── pages/ # 页面目录(必需)
│ │ └── index/ # 首页示例
│ │ ├── index.js # 页面逻辑(必需)
│ │ ├── index.wxml # 页面结构(必需)
│ │ ├── index.json # 页面配置(自动生成)
│ │ └── index.wxss # 页面样式(自动生成)
│ ├── sitemap.json # 小程序搜索配置(自动生成)
│ ├── components/ # 自定义组件目录(可选)
│ ├── utils/ # 工具函数目录(可选)
│ ├── images/ # 图片资源目录(可选)
│ └── envList.js # 云开发环境配置(仅云开发模板)
├── project.config.json # 项目配置文件(必需)
├── project.private.config.json # 个人配置文件(自动生成)
├── cloudfunctions/ # 云函数目录(仅云开发模板)
├── typings/ # TypeScript 类型定义(仅TS模板)
├── tsconfig.json # TypeScript 配置(仅TS模板)
├── package.json # npm 包配置(仅TS模板)
├── README.md # 项目说明文档(仅云开发模板)
└── uploadCloudFunction.sh # 云函数上传脚本(仅云开发模板)
配置文件:
json
{
"miniprogramRoot": "miniprogram/", // ← 关键配置
"cloudfunctionRoot": "cloudfunctions/" // 仅云开发模板有
}
何时生成: 创建项目时选择"云开发模板"或"TypeScript 模板"
1.3 快速对比
| 对比项 | 扁平结构 | 包裹结构 |
|---|---|---|
| 源码位置 | 根目录 | miniprogram/ |
| 配置标识 | 无 miniprogramRoot |
有 miniprogramRoot |
| 创建时选择 | 不选模板/普通模板 | 云开发模板/TS模板 |
二、微信开发者工具创建项目时的选择
什么时候会生成包裹结构?
微信开发者工具在创建项目时,根据你的选择自动决定目录结构:
情况1: 选择"云开发模板"
微信开发者工具会自动生成包裹结构:
根目录/
├── miniprogram/ # 小程序源码(必然生成)
│ ├── app.js # 必需
│ ├── app.json # 必需
│ ├── app.wxss # 自动生成
│ ├── pages/ # 必需
│ ├── sitemap.json # 自动生成
│ ├── envList.js # 云开发环境配置(云开发特有)
│ ├── components/ # 可选
│ └── images/ # 可选
├── cloudfunctions/ # 云函数目录(云开发特有,必然生成)
│ └── quickstartFunctions/ # 示例云函数(可能有)
├── project.config.json # 必需,自动配置 miniprogramRoot
├── project.private.config.json # 自动生成
├── README.md # 云开发说明文档(云开发特有)
└── uploadCloudFunction.sh # 云函数上传脚本(云开发特有)
配置特征:
json
{
"miniprogramRoot": "miniprogram/",
"cloudfunctionRoot": "cloudfunctions/"
}
情况2: 选择"TypeScript 模板"
微信开发者工具会自动生成包裹结构:
根目录/
├── miniprogram/ # TS 源码(必然生成)
│ ├── app.ts # 注意是 .ts 文件(必需)
│ ├── app.json # 必需
│ ├── app.wxss # 自动生成
│ ├── pages/ # 必需
│ │ └── index/
│ │ ├── index.ts # 页面逻辑用 TS(必需)
│ │ ├── index.wxml # 必需
│ │ ├── index.json # 自动生成
│ │ └── index.wxss # 自动生成
│ └── utils/ # 工具函数(可选)
├── typings/ # 类型定义(TS模板特有,必然生成)
│ ├── types/ # 微信 API 类型声明
│ └── index.d.ts # 全局类型定义
├── project.config.json # 必需,自动配置 miniprogramRoot
├── project.private.config.json # 自动生成
├── tsconfig.json # TypeScript 编译配置(TS模板特有,必然生成)
└── package.json # npm 依赖管理(TS模板特有,必然生成)
配置特征:
json
{
"miniprogramRoot": "miniprogram/",
"setting": {
"useCompilerPlugins": ["typescript"]
}
}
情况3: 不选择模板/选择普通模板
微信开发者工具会生成扁平结构:
根目录/
├── app.js # 直接在根目录(必需)
├── app.json # 必需
├── app.wxss # 自动生成
├── pages/ # 必需
│ └── index/ # 首页示例
├── project.config.json # 必需,没有 miniprogramRoot
├── sitemap.json # 自动生成
├── project.private.config.json # 自动生成
├── components/ # 可选(某些模板会生成)
└── .eslintrc.js # 可选(某些模板会生成)
核心理解
包裹结构不是开发者自己创建的,而是微信开发者工具根据你创建项目时的选择自动生成的。
选择云开发或 TypeScript 模板 → 工具自动生成 miniprogram/ 目录
三、重要结论
miniprogram/ 内部结构与扁平结构完全相同!
扁平结构: 包裹结构:
根目录/ 根目录/
├── app.js └── miniprogram/ ← 只是多了这一层
├── pages/ ├── app.js ← 内容完全相同
└── components/ ├── pages/
└── components/
关键理解: miniprogram/ 只是一个容器,不改变内部结构。
四、小程序的文件组织规则
每个页面通常由4个文件组成
pages/index/
├── index.js # 页面逻辑(必需)
├── index.wxml # 页面结构(必需)
├── index.json # 页面配置(可选,但工具会自动生成)
└── index.wxss # 页面样式(可选,但工具会自动生成)
说明:
- 微信官方规定:只有
.js和.wxml是必需的 - 但微信开发者工具创建页面时会自动生成全部4个文件
.json和.wxss可以删除,不影响运行
文件命名规则
必须与目录名一致!
✅ 正确:
pages/index/
├── index.js
├── index.json
├── index.wxml
└── index.wxss
❌ 错误:
pages/index/
├── main.js ← 文件名不一致,会报错!
五、uni-app 编译机制
5.1 编译转换:1个文件 → 4个文件
uni-app 源码(1个文件):
vue
<!-- pages/index/index.vue -->
<template>
<view>{{ title }}</view>
</template>
<script>
export default {
data() {
return { title: 'Hello' }
}
}
</script>
<style>
.content { padding: 20px; }
</style>
编译后(4个文件):
unpackage/dist/dev/mp-weixin/pages/index/
├── index.js ← 从 <script> 编译 + Vue runtime
├── index.wxml ← 从 <template> 编译
├── index.json ← 自动生成页面配置
└── index.wxss ← 从 <style> 编译
5.2 编译后的代码为什么看不懂?
三个原因:
- 编译器转换 - uni-app 编译器将 Vue 语法转换为小程序语法
- Vue runtime 注入 - 注入数据绑定、生命周期等运行时代码
- 代码优化 - 模块打包、代码压缩等优化处理
结论: 这是正常的编译输出,不要修改编译后的代码!
5.3 正确的开发流程
1. 在 HBuilderX 编写 .vue 源码
↓
2. 保存后自动编译到 unpackage/dist/dev/mp-weixin/
↓
3. 微信开发者工具自动刷新预览
↓
4. 预览和调试
↓
5. 修改代码 → 回到步骤1(在 HBuilderX 改)
⚠️ 重要提醒
❌ 不要在微信开发者工具里修改编译后的代码!
- 每次保存 .vue 文件都会重新编译
- 编译会覆盖之前的输出
- 在微信开发者工具里的修改会丢失
- 必须在 HBuilderX 里改
.vue
六、常见问题
Q1: 如何判断项目是哪种结构?
方法1: 看根目录有没有 app.js
- 有 → 扁平结构
- 没有 → 包裹结构
方法2: 看 project.config.json
- 有
miniprogramRoot→ 包裹结构 - 没有 → 扁平结构
Q2: miniprogram/ 里面的结构和扁平结构一样吗?
完全一样! 只是外面多了一层容器。
Q3: uni-app 编译后为什么是扁平结构?
因为:
- uni-app 已完成编译
- 输出的是纯小程序代码
- 不需要再构建
- 直接可用
Q4: 可以在微信开发者工具里改 uni-app 的代码吗?
不可以! 必须在 HBuilderX 里改 .vue 源码。
七、核心要点总结
1. 两种结构
- 扁平结构 - 源码在根目录,创建时不选模板
- 包裹结构 - 源码在
miniprogram/,创建时选云开发或 TS 模板
2. 判断标准
看 project.config.json 中的 miniprogramRoot 配置
3. 结构由创建时决定
微信开发者工具根据你的选择自动生成对应结构,不是开发者后期手动创建
4. uni-app 编译
- 1个
.vue文件 → 4个小程序文件 - 编译后是扁平结构
- 不要修改编译后的代码
- 必须在 HBuilderX 里改源码
5. 开发建议
- 原生开发 - 可以在微信开发者工具里改代码
- uni-app 开发 - 只能在 HBuilderX 里改代码
- 微信开发者工具 - 用于预览和调试,不是编辑器