引言
在上篇帖子中,我们学习了小程序开发的基础流程。本文将进阶实战,开发一个具备用户系统、文章发布、评论互动 的完整博客小程序,重点讲解状态管理、云开发高级用法、组件化设计等进阶技巧,帮助你从"能做"到"做好"。
一、项目架构设计
1.1 技术选型
- 状态管理 :
mobx-miniprogram(替代冗余的globalData) - 云开发:数据库(嵌套文档)、云函数(登录态维护)、云存储(图片上传)
- 组件化:自定义组件(文章卡片、评论列表)
- API设计:RESTful风格的云函数接口
1.2 目录结构优化
`1├── cloudfunctions/ # 云函数目录
2│ ├── login/ # 登录云函数
3│ ├── getArticles/ # 获取文章列表
4│ └── uploadImage/ # 图片上传
5├── components/ # 自定义组件
6│ ├── article-card/ # 文章卡片组件
7│ └── comment-list/ # 评论列表组件
8├── pages/
9│ ├── index/ # 首页(文章列表)
10│ ├── article/ # 文章详情页
11│ ├── user/ # 个人中心
12│ └── editor/ # 文章编辑器
13└── store/ # MobX状态管理
14 ├── userStore.js # 用户状态
15 └── articleStore.js # 文章状态`
二、核心功能实现
2.1 用户系统与登录态维护
(1)云函数实现登录
javascript
`1// cloudfunctions/login/index.js
2exports.main = async (event, context) => {
3 const wxContext = cloud.getWXContext();
4 const { openid } = wxContext;
5
6 // 查询或创建用户
7 const userRes = await cloud.database().collection('users')
8 .where({ openid }).get();
9
10 if (userRes.data.length === 0) {
11 await cloud.database().collection('users').add({
12 data: { openid, avatarUrl: event.avatarUrl, nickname: event.nickname }
13 });
14 }
15
16 return { openid, userInfo: event };
17};`
(2)前端调用与状态存储
javascript
`1// pages/index/index.js
2import { userStore } from '../../store/userStore';
3
4Page({
5 async onLoad() {
6 // 调用云函数登录
7 const res = await wx.cloud.callFunction({ name: 'login' });
8 userStore.setUserInfo(res.result); // MobX存储用户信息
9 }
10});`
2.2 文章数据管理
(1)云数据库设计(嵌套结构)
javascript
`1// 数据库示例
2{
3 _id: "article1",
4 title: "小程序进阶指南",
5 content: "...",
6 author: {
7 openid: "o1xxx",
8 nickname: "开发者"
9 },
10 comments: [
11 {
12 _id: "comment1",
13 content: "写得好!",
14 author: { openid: "o2xxx", nickname: "读者" }
15 }
16 ],
17 createdAt: db.serverDate()
18}`
(2)云函数获取文章列表
javascript
`1// cloudfunctions/getArticles/index.js
2exports.main = async (event, context) => {
3 return await cloud.database()
4 .collection('articles')
5 .orderBy('createdAt', 'desc')
6 .get();
7};`
2.3 富文本编辑器实现
使用第三方组件mp-html(需通过npm构建):
xml
`1<!-- pages/article/article.wxml -->
2<mp-html content="{``{article.content}}" />`
三、状态管理:MobX实战
3.1 创建用户状态仓库
javascript
`1// store/userStore.js
2import { observable, action } from 'mobx-miniprogram';
3
4export const userStore = observable({
5 userInfo: null,
6 setUserInfo: action(function(info) {
7 this.userInfo = info;
8 })
9});`
3.2 在页面中使用状态
javascript
`1// pages/user/user.js
2import { userStore } from '../../store/userStore';
3
4Page({
5 data: {
6 userInfo: userStore.userInfo
7 },
8 onLoad() {
9 // 自动同步状态变化
10 userStore.observe(() => {
11 this.setData({ userInfo: userStore.userInfo });
12 });
13 }
14});`
四、性能优化与避坑
4.1 图片懒加载
xml
`1<!-- 使用原生懒加载 -->
2<image lazy-load src="{``{imageUrl}}" />`
4.2 数据库查询优化
- 避免全表扫描 :为查询字段添加索引(如
createdAt) - 限制返回字段 :使用
.field({ title: true, author: true })减少数据传输
4.3 云函数冷启动解决方案
- 预初始化 :在
app.js中提前调用云函数 - 保持心跳:定期发送请求(需权衡成本)
五、发布与运营
5.1 审核注意事项
- 用户隐私 :需在
app.json中声明数据使用场景 - 内容合规:文章内容需符合《网络信息内容生态治理规定》
5.2 灰度发布
通过开发者工具"体验版"功能,向特定用户开放新版本测试。
结语
进阶开发的核心在于架构设计 和细节把控。本文通过博客系统案例,演示了如何将状态管理、云开发、组件化等技术落地。建议在实际项目中:
- 优先使用云开发减少后端工作量
- 用MobX替代
globalData管理复杂状态 - 注重数据库索引和查询优化