Glittering's blog Glittering's blog
Home
  • 学习手册

    • 《JavaScript教程》
    • 《TypeScript教程》
    • 《Git》
    • 《Vite》
    • 《Vue3》
    • 《React18》
    • 《CSS》
    • 《Tailwind CSS》
    • 《ES6 教程》
    • 《TypeScript 从零实现 axios》
  • 技术文档
  • 算法
  • 工作总结
  • 实用技巧
  • collect
About
  • Classification
  • Label
GitHub (opens new window)

Glitz Ma

前端开发工程师
Home
  • 学习手册

    • 《JavaScript教程》
    • 《TypeScript教程》
    • 《Git》
    • 《Vite》
    • 《Vue3》
    • 《React18》
    • 《CSS》
    • 《Tailwind CSS》
    • 《ES6 教程》
    • 《TypeScript 从零实现 axios》
  • 技术文档
  • 算法
  • 工作总结
  • 实用技巧
  • collect
About
  • Classification
  • Label
GitHub (opens new window)
  • 技术文档

  • 算法

  • 工作总结

    • 时区校正
    • 上传下载文件方式总结
    • web异常监控和分析
    • 前端优化指南
    • http缓存机制
    • 静态资源灰度发布
    • 浏览器原理及渲染机制
    • Chrome DevTools 渲染分析实战
    • Layout Thrashing(布局抖动)
    • Composite Layer(合成层)
    • 全局设置滚动条样式好吗?
    • 虚拟列表如何避免Layout和Paint
    • 前端安全知识
    • 安全(同源策略 / CSP / CORS)
    • 浏览器安全模型
    • 从chrome v8 讲安全
    • WebAssembly(Wasm)
    • XSS → JIT → 沙箱逃逸
    • 微前端总结
    • websocket聊天
    • axios 与 promise
    • react高级特性
    • react基础知识总结
    • vue2常见原理总结
    • vue2基础知识总结
    • webpack优化实践
    • webpack基础应用知识总结
    • 小程序笔记
    • 小程序工程模板设计
      • 一、工程目标(先定设计原则)
      • 二、推荐目录结构(核心)
      • 三、页面“瘦身”模式(非常重要)
        • ❌ 错误做法
        • ✅ 正确做法:Page + Logic 分离
        • pages/home/index.js
        • pages/home/index.logic.js
      • 四、请求层设计(最关键)
        • 1️⃣ request 封装
        • services/request.js
        • 2️⃣ API 分模块
        • services/user.api.js
      • 五、全局状态管理(轻量)
        • store/index.js
        • 使用
      • 六、setData 性能规范(必须写进团队规范)
        • ❌ 禁止
        • ✅ 推荐
        • 约定
      • 七、组件设计规范
        • 组件结构
        • 组件通信
      • 八、配置 & 环境隔离
        • config/env.js
        • config/api.config.js
      • 九、分包设计(上线前必做)
      • 十、你可以直接复用的 Checklist
    • 地图标绘--射线法来计算点在多边形内
  • 实用技巧

  • 收藏夹

  • 技术
  • 工作总结
mamingjuan
2019-12-26
目录

小程序工程模板设计

# 一、工程目标(先定设计原则)

这套模板的目标是:

  • ✅ 页面薄、逻辑集中
  • ✅ 可测试、可扩展
  • ✅ 避免 setData 性能坑
  • ✅ 符合微信审核 & 规范
  • ✅ 不依赖重型框架(原生 + 轻封装)

适合:原生小程序 / Taro / uni-app 思维都能套


# 二、推荐目录结构(核心)

miniprogram/
├─ app.js
├─ app.json
├─ app.wxss

├─ pages/                    # 页面(只放 Page 壳)
│  ├─ home/
│  │  ├─ index.js
│  │  ├─ index.wxml
│  │  ├─ index.wxss
│  │  └─ index.logic.js      # 页面业务逻辑
│  └─ detail/
│
├─ components/               # 通用组件
│  ├─ Base/
│  │  ├─ Button/
│  │  ├─ Modal/
│  └─ Business/              # 业务组件
│     └─ ProductCard/
│
├─ services/                 # 所有接口层
│  ├─ request.js             # 请求封装
│  ├─ auth.js                # 登录 / token
│  ├─ user.api.js
│  └─ order.api.js
│
├─ store/                    # 全局状态
│  ├─ index.js
│  └─ user.store.js
│
├─ utils/                    # 工具函数
│  ├─ logger.js
│  ├─ debounce.js
│  ├─ validate.js
│  └─ env.js
│
├─ config/                   # 配置
│  ├─ index.js
│  ├─ api.config.js
│  └─ permission.config.js
│
├─ constants/                # 常量
│  ├─ error-code.js
│  └─ storage-key.js
│
├─ styles/                   # 全局样式
│  ├─ variables.wxss
│  └─ mixin.wxss
│
└─ subpackages/              # 分包
   └─ profile/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

# 三、页面“瘦身”模式(非常重要)

# ❌ 错误做法

Page({
  data: {},
  onLoad() {
    wx.request(...)
  },
  onTap() {
    // 一堆业务逻辑
  }
})
1
2
3
4
5
6
7
8
9

# ✅ 正确做法:Page + Logic 分离

# pages/home/index.js
import logic from './index.logic'

Page({
  ...logic
})
1
2
3
4
5
# pages/home/index.logic.js
import { getHomeData } from '../../services/home.api'

export default {
  data: {
    list: []
  },

  async onLoad() {
    const data = await getHomeData()
    this.setData({ list: data })
  },

  onItemTap(e) {
    const id = e.currentTarget.dataset.id
    wx.navigateTo({ url: `/pages/detail/index?id=${id}` })
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

👉 好处:

  • 页面只是「壳」
  • 逻辑可测试
  • 后期可迁移到 Taro / React

# 四、请求层设计(最关键)

# 1️⃣ request 封装

# services/request.js

import { getToken } from './auth'

const BASE_URL = 'https://api.xxx.com'

export function request(options) {
  return new Promise((resolve, reject) => {
    wx.request({
      url: BASE_URL + options.url,
      method: options.method || 'GET',
      data: options.data || {},
      header: {
        Authorization: getToken()
      },
      success(res) {
        if (res.statusCode === 200) {
          resolve(res.data)
        } else {
          reject(res)
        }
      },
      fail(err) {
        reject(err)
      }
    })
  })
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# 2️⃣ API 分模块

# services/user.api.js

import { request } from './request'

export function getUserInfo() {
  return request({
    url: '/user/info'
  })
}
1
2
3
4
5
6
7

👉 禁止在 Page 里写 wx.request


# 五、全局状态管理(轻量)

# store/index.js

const store = {
  user: null,
  setUser(user) {
    this.user = user
  }
}

export default store
1
2
3
4
5
6
7
8

# 使用

import store from '../../store'

store.setUser(res)
1
2
3

👉 小程序不适合 Redux 重方案 👉 “能不用全局就不用”


# 六、setData 性能规范(必须写进团队规范)

# ❌ 禁止

this.setData({ bigList })
this.setData({ count })
1
2

# ✅ 推荐

this.setData({
  'bigList[3].title': 'xxx'
})
1
2
3

# 约定

  • setData ≤ 1 次 / 事件
  • 大对象拆字段
  • 列表分页加载

# 七、组件设计规范

# 组件结构

ProductCard/
├─ index.js
├─ index.wxml
├─ index.wxss
└─ index.json
1
2
3
4
5

# 组件通信

  • 父 → 子:properties
  • 子 → 父:triggerEvent
  • ❌ 不直接操作父 data

# 八、配置 & 环境隔离

# config/env.js

export const ENV = 'prod'
1

# config/api.config.js

export const API_HOST = {
  dev: 'https://dev.api.com',
  prod: 'https://api.com'
}
1
2
3
4

# 九、分包设计(上线前必做)

{
  "subpackages": [
    {
      "root": "subpackages/profile",
      "pages": ["index"]
    }
  ]
}
1
2
3
4
5
6
7
8

👉 主包 ≤ 2MB 👉 非首屏页面全进分包


# 十、你可以直接复用的 Checklist

  • ✅ 页面 + logic 分离
  • ✅ API 层集中
  • ✅ 禁止业务代码进 Page
  • ✅ 分包
  • ✅ setData 规范
  • ✅ 权限延迟申请
#小程序
上次更新: 2026/01/09, 03:42:28
小程序笔记
地图标绘--射线法来计算点在多边形内

← 小程序笔记 地图标绘--射线法来计算点在多边形内→

Copyright © 2015-2026 Glitz Ma
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式