3、项目结构与基础配置:小程序项目目录结构解析
好,咱们直接进入正题。这一章我带你拆解抖音小程序的骨架——项目结构。说白了,你写小程序就像盖房子,得先知道哪是承重墙、哪是水电管。我刚开始带团队时,发现很多新人上来就写代码,结果项目一复杂,连配置文件在哪都找不到。嗯,咱们别犯这个错。
3.1 项目目录结构全景
你新建一个抖音小程序项目后,默认会看到这样的结构:
my-miniapp/
├── app.json # 全局配置
├── app.js # 全局逻辑
├── app.css # 全局样式
├── project.config.json # 项目配置
├── sitemap.json # 搜索索引配置
├── pages/ # 页面目录
│ ├── index/
│ │ ├── index.js
│ │ ├── index.css
│ │ ├── index.json
│ │ └── index.ttml
│ └── logs/
│ ├── logs.js
│ ├── logs.css
│ ├── logs.json
│ └── logs.ttml
└── components/ # 公共组件目录
└── my-component/
├── my-component.js
├── my-component.css
├── my-component.json
└── my-component.ttml
这个结构其实很直观。每个页面都是一个文件夹,里面放四个文件。组件也是同理。我个人习惯把 components/ 放在根目录,这样所有页面都能引用。曾经有个项目,我把组件散落在各个页面里,后来维护起来简直想哭。
3.2 app.json:全局配置的核心
app.json 是小程序的「总开关」。你想想看,小程序启动时第一个读的就是它。它决定了哪些页面存在、窗口长什么样、底部导航怎么排。
一个典型的 app.json 长这样:
{
"pages": [
"pages/index/index",
"pages/logs/logs",
"pages/user/user"
],
"window": {
"navigationBarTitleText": "我的小程序",
"navigationBarBackgroundColor": "#ffffff",
"navigationBarTextStyle": "black",
"backgroundColor": "#f5f5f5",
"backgroundTextStyle": "dark"
},
"tabBar": {
"color": "#999999",
"selectedColor": "#07c160",
"list": [
{
"pagePath": "pages/index/index",
"text": "首页",
"iconPath": "images/home.png",
"selectedIconPath": "images/home-active.png"
},
{
"pagePath": "pages/user/user",
"text": "我的",
"iconPath": "images/user.png",
"selectedIconPath": "images/user-active.png"
}
]
},
"networkTimeout": {
"request": 10000,
"connectSocket": 5000
}
}
关键点:
pages数组的第一项就是小程序的首页。顺序很重要,别搞反了。tabBar最多支持 5 个 tab,多了会报错。我踩过这个坑。networkTimeout单位是毫秒,默认 60 秒,建议调小一点,用户体验更好。
3.3 页面配置:覆盖全局的局部设置
每个页面都有自己的 .json 文件。它用来覆盖 app.json 中的 window 配置。说白了,就是「局部优先」原则。
举个例子,你首页想用绿色导航栏,但其他页面保持白色:
// pages/index/index.json
{
"navigationBarTitleText": "首页",
"navigationBarBackgroundColor": "#07c160",
"navigationBarTextStyle": "white",
"enablePullDownRefresh": true,
"onReachBottomDistance": 50
}
这里要注意:enablePullDownRefresh 开启后,记得在 .js 里监听 onPullDownRefresh 事件,否则下拉没反应。我曾经有个项目,开了下拉刷新但忘了写监听,用户疯狂下拉,页面纹丝不动……嗯,挺尴尬的。
3.4 sitemap.json:让小程序被搜到
这个文件很多人会忽略。它控制着小程序页面能否被搜索引擎索引。说白了,就是决定你的页面能不能在抖音搜索里被找到。
{
"rules": [
{
"action": "allow",
"page": "pages/index/index",
"params": ["id", "type"],
"matching": "exact"
},
{
"action": "disallow",
"page": "pages/user/user"
}
]
}
我的建议:
- 核心页面(首页、商品详情)设为
allow。 - 个人中心、后台页面设为
disallow,避免隐私泄露。 matching参数有exact、prefix、suffix三种,默认是prefix。我一般用exact,更精确。
3.5 主题与基础样式
抖音小程序支持 CSS 变量,你可以用它来做主题切换。我个人非常喜欢这个特性,比写死颜色值灵活多了。
在 app.css 中定义全局变量:
/* app.css */
page {
--primary-color: #07c160;
--secondary-color: #ff6b6b;
--bg-color: #f5f5f5;
--text-color: #333333;
--font-size-base: 28rpx;
--spacing-base: 20rpx;
}
然后在页面里直接用:
/* pages/index/index.css */
.container {
background-color: var(--bg-color);
padding: var(--spacing-base);
}
.title {
color: var(--primary-color);
font-size: var(--font-size-base);
}
为什么要用 CSS 变量?你想想看,如果有一天产品经理说「把主色从绿色改成蓝色」,你只需要改 app.css 里一个值,所有页面自动更新。我曾经在一个老项目里硬编码了 200 多处颜色值,改到凌晨三点……从那以后,我所有项目都强制用 CSS 变量。
避坑指南:
- 抖音小程序的 CSS 变量兼容性很好,但别用太新的 CSS 特性,比如
:has()选择器,部分低版本抖音不支持。 - 单位尽量用
rpx,它会根据屏幕宽度自适应。我见过有人用px,结果在不同手机上布局全乱了。 - 全局样式别写太多,避免污染页面。我习惯只定义变量和基础重置,具体样式放页面级。
3.6 组件目录的最佳实践
组件放在 components/ 下,每个组件一个文件夹。命名建议用中划线,比如 my-component,而不是 myComponent。为什么?因为抖音小程序的标签名强制用小写中划线,保持一致更省心。
一个组件的 .json 文件要声明 component: true:
// components/my-component/my-component.json
{
"component": true,
"usingComponents": {}
}
然后在页面里引用:
// pages/index/index.json
{
"usingComponents": {
"my-component": "/components/my-component/my-component"
}
}
经验之谈:
- 组件路径用绝对路径(以
/开头),避免相对路径的混乱。 - 组件内部不要依赖全局样式,要自包含。我见过组件因为全局样式被覆盖,显示异常,排查了半天。
- 如果组件需要接收外部样式,用
externalClasses属性,别直接操作 DOM。
3.7 项目配置:project.config.json
这个文件是开发工具用的,不参与小程序运行。但它很重要,决定了你的项目在团队协作时的一致性。
{
"setting": {
"urlCheck": false,
"es6": true,
"postcss": true,
"minified": true
},
"appid": "你的appid",
"projectname": "我的小程序"
}
urlCheck 建议开发时设为 false,否则请求非 HTTPS 接口会报错。上线前记得改回 true。我有个同事忘了改,结果线上版本请求全挂了……嗯,那天他加班到很晚。
3.8 小结
这一章的内容其实不难,但很重要。项目结构就像房子的骨架,配置就是水电图。你把这些搞清楚了,后面写代码才会顺手。下一章我们开始写第一个页面,到时候你会真正感受到「配置驱动」的威力。
记住一句话:好的项目结构,能让你少加一半的班。