微信小程序开发-起步
微信小程序开发
一、小程序简介
1.1 小程序与普通网页开发的区别
| # | 对比维度 | 普通网页 | 微信小程序 | 评论 |
|---|---|---|---|---|
| 1 | 运行环境 | 运行在 浏览器内核(Chrome/Blink、Safari/WebKit 等) | 运行在 微信内置引擎(JSCore + 自家渲染层) | “浏览器是公共澡堂,谁都能泡;小程序是微信包间,只招待持票乘客。” |
| 2 | 可用 API | 可直接访问 DOM/BOM,还能随手 alert('Hello') |
禁用 DOM/BOM!取而代之的是 wx.* 系列原生 API(定位、扫码、支付…) |
“想摸 DOM?抱歉,这里是熊猫馆——能看的只能远观。” |
| 3 | 开发模式 | 浏览器 + 任意编辑器(VS Code、WebStorm…) | 官方“三件套”:① 申请开发者账号② 安装微信开发者工具③ 创建 & 配置项目 | “学前班发铅笔、橡皮和练习本;微信发账号、IDE 还顺便发一堆‘真题’——审核规范。” |
- 运行模式不同
- 网页
直接跑在浏览器,渲染线程 + JS 引擎打配合。 - 小程序
代码在微信的 JSCore 沙箱里执行,UI 由独立的渲染层(WebView-like)负责。渲染与逻辑分居两室,靠桥(setData)通信——优点是更易于性能管控,缺点则是“搬砖”稍显繁琐。
- 网页
有开发者吐槽——“小程序就像远距离恋爱,消息要经过桥接才能见面;传大对象?那是异地恋寄 20kg 的生蚝。”
-
API不同
-
网页党 覆手可得:
1
2document.querySelector('#btn').addEventListener(...)
window.location.href = '...'; -
小程序党 请改练
wx派内功:1
2
3
4
5
6
7
8// 获取地理位置
wx.getLocation({
type: 'gcj02',
success(res) {
const { latitude, longitude } = res;
console.log('我在', latitude, longitude);
}
})禁飞区:
document.*,window.alert,localStorage…(用了直接报“找不到对象”)可飞区:微信提供的 能力型 API ——定位、蓝牙、支付、扫码、人脸识别… 这些都是浏览器里要么做不到、要么需要用户安装插件才能做到的事。
有人把
wx.scanCode()叫做“高配版prompt()”——不仅能让用户输入,还顺便帮你拍张照确认身份。 -
-
开发模式不同
步骤 网页 小程序 “我要开干” 新建 index.html,F5 刷浏览器先申请 小程序 AppID(没公司就用 测试号) 写代码 VS Code / Sublime / vim 任君挑 微信开发者工具 内置预览、真机调试、上传发布 上线 传服务器 / 静态托管 提交 审核 → 微信官方“通关打怪” - 审核:名称、类目、页面内容、支付逻辑…… 都有规范。
- 版本管理:每次上传都会生成 体验版、预览版 与 正式版。
地狱梗:第一次提审被驳回?别急,官方实际在帮你做“需求评审”;只是评审老师换成了微信小助手。
小结:
- 环境:浏览器 vs 微信沙箱——决定了可用能力边界。
- API:DOM/BOM →
wx.*,把“网页思维”先放下,练微信内功。 - 流程:浏览器即发布 vs 官方 IDE + 审核——多一步,但也多一层安全 & 质量保证。
记住一句话:“写网页是路边摆摊,写小程序是进商场开店。”
摆摊自由度高,开店规矩更多,但人流也更多、支付更顺畅——取舍看业务场景。
1.2 小程序体验
可以通过扫描二维码体验到微信官方的小程序开发体验小程序中。
二、第一个小程序
2.1 注册小程序账号
| 步骤 | 关键动作 | 说明 & 小贴士 |
|---|---|---|
| 1. 打开注册页 | 访问 https://mp.weixin.qq.com/ → 右上角 「立即注册」 | 别走错门——这是微信所有形态账号的“大门口”。 |
| 2. 选择“小程序” | 四个方块里选紫色 「小程序」 | 订阅号/服务号是公众号亲戚,不要点错。 |
| 3. 填写邮箱 + 密码 | 输入常用邮箱、设置登录密码、填验证码,点 「注册」 | 每个邮箱只能申请 1 个小程序,职业刷号党请自备一打邮箱。 |
| 4. 去邮箱激活 | 收到激活邮件 → 点进邮件里的链接 | 如果 5 分钟还没收到,先检查垃圾箱,再检查老板有没有把公司邮件网关关了😅。 |
| 5. 点击链接完成激活 | 浏览器自动跳回公众平台,提示激活成功 | 恭喜通关,下一关——主体信息。 |
| 6. 选择主体类型 | 个人 / 企业 / 政府 / 媒体 / 其他组织 | 自学练手 选「个人」最快;企业主体后续才能开支付、直播等高级能力。 |
| 7. 填主体信息 | 身份证姓名、号码、绑定手机号,扫码人脸核验 | 官方叫“实名制”,程序员俗称“上交面子和里子”。 |
| 8. 获取 AppID | 后台左侧 「开发」→「开发设置」 查看 AppID | 后续创建项目、上传代码都靠它,务必复制到小本本。 |
2.1.1 点击注册按钮

2.1.2 选择注册账号类型

2.1.3 填写账号信息

2.1.4 提示邮箱激活

2.1.5 点击链接激活账号

2.1.6 选择主体类型

2.1.7 主体信息登记

2.1.8 获取小程序的AppID

新版微信小程序网页:左边->开发与服务->开发管理
注册小程序就像上高速——先拿通行证(AppID),才能一路飙车(写代码)。别怕流程多,毕竟微信要替 12 亿用户把关。祝注册顺利,下一节我们正式开工写“Hello, 小程序”!
2.2 安装微信开发者工具
2.2.1 工具有什么用?
- 一键创建项目,省掉敲
npm init的仪式感 - 代码查看 / 编辑,内置 ESLint、格式化
- 真机级模拟器,断点调试 / 网络抓包 / 数据面板
- 扫码预览 & 上传发布,告别手动打包
顺口溜:“创建-调试-预览-上传,四步循环、日行一善。”
2.2.2 下载最新版(Stable Build)
- 直接访问官方稳定版链接
https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html - Windows(64/32 位)、macOS 均有安装包
- 别贪 Beta ——日常学习用稳定版更省心

2.2.3 安装流程(比装 QQ 还简单)
| 序号 | 界面提示 | 要做的事 |
|---|---|---|
| ① | 欢迎界面 | 点 下一步 |
| ② | 许可协议 | 勾 我接受 → 下一步 |
| ③ | 选择安装目录 | 默认即可,磁盘别剩 <1 GB |
| ④ | 正在安装 | 倒杯咖啡,进度条很快 |
| ⑤ | 完成界面 | 留勾“运行微信开发者工具” → 完成 |



2.2.4 首次扫码登录
- 工具启动后会出现一个巨大二维码
- 用 同一微信号(与小程序管理员一致更佳)扫码
- 手机点 确认登录 → 电脑端提示“扫描成功”
- 进入主界面,左侧能看到 “+” 号,等待创建首个项目
如果你在工位上一抖手把手机掉地上——别怕,二维码会一直等你,超长待机。


2.2.5 推荐设置(界面 & 网络代理)
- 点击右上 齿轮 → 外观
- 主题:浅色 / 深色随心切
- 字体:Consolas,字号 18,护眼又不眯眼
- 代理 选项 → 勾 “不使用任何代理,勾选后直连网络”
- 仅当公司网络走代理时再改为“使用系统代理”

小结
- 稳定版链接收藏,Beta 留给勇士。
- 安装一路“下一步”即可,和 Windows 经典软件一样。
- 扫码登录后立马能新建项目 —— AppID 没准备好?用「无 AppID」模板先练手!
- 调个暗色主题 + 大字号,码一整天眼不酸。
2.3 创建小程序项目
2.3.1 进入「小程序」标签页
打开微信开发者工具首页,左栏点 小程序
中间区域点击灰色 “+” 卡片,新建项目

2.3.2 填写项目信息
| 字段 | 说明 | 建议 |
|---|---|---|
| 项目名称 | 随意(例:mp_01) | 先用英文+下划线,后期方便版本管理 |
| 目录 | 本地存放代码的位置 | 选一块空余空间大的盘符 |
| AppID | 真 AppID / 测试号 | 没有就点“测试号”,功能受限但足够练手 |
| 开发模式 | 小程序 / 公众号网页等 | 选 小程序 |
| 后端服务 | 云开发 / 不使用 | 初学可先选 不使用云服务 |
| 语言 | JavaScript / TypeScript | 建议新手先 JavaScript,TS 后面再上 |
填完点 「新建」,工具会生成默认目录结构并自动打开。

新版选择JS-基础模版
2.3.3 项目创建完成

2.3.4 编译 & 模拟器预览
- 右上 编译 按钮(或
Ctrl + B) - 左侧 iPhone 模拟器即刻刷新,能看到默认 “Hello World” 页面
小提示:项目目录里
app.js / app.json / app.wxss就对应全局 JS、配置、样式,后续会常改。

2.3.5 在真机上预览项目效果
点击 预览 → 弹出二维码
用同一微信扫码,在手机上查看实际效果
这个二维码 2 小时左右失效,再次预览重新生成即可

2.3.6 认识主界面五大区块
- 菜单栏:文件、编辑、工具等传统选项
- 工具栏:编译 / 预览 / 真机调试 / 上传…
- 模拟器区:手机壳+页面渲染,支持横竖屏切换
- 代码编辑区:左树右编辑,内置高亮和格式化
- 调试区:Console、Network、Storage 等调试面板
第一次在模拟器看到 “Hello World” 时,有人会截图发朋友圈——“妈,我真的在写小程序了!”

获得小程序组件的API文档->帮助->开发者文档->在网页中查看对应组件的文档
三、小程序代码构成
3.1 小程序项目结构
3.1.1 了解项目的基本组成结构

最主要的有pages、app.js、app.json
| 文件 / 目录 | 作用 |
|---|---|
| pages/ | 所有页面 的家,每个页面一个独立文件夹 |
| utils/ | 工具函数、通用模块(如日期格式化) |
| app.js | 小程序 入口脚本,监听生命周期(onLaunch 等) |
| app.json | 小程序 全局配置:路由、窗口样式、网络超时… |
| app.wxss | 全局样式,可理解为“全局 CSS” |
| project.config.json | 微信开发者工具的 工程设置(ESLint、编译选项等) |
| sitemap.json | 控制页面能否被微信索引,用于 SEO |
3.1.2 小程序页面的组成部分

官方建议:一个页面 = 一个文件夹,内含 4 个同名不同后缀文件:
| 后缀 | 角色 | 内容示例 |
|---|---|---|
.js |
脚本 | Page({ data: { msg:'Hi'}, onLoad(){…} }) |
.json |
配置 | 设置页面标题、启用下拉刷新、分享卡片等 |
.wxml |
模板 | 组件、数据绑定 —— 相当于 HTML |
.wxss |
样式 | 页面私有的 CSS,支持尺寸单位 rpx |
思维对照:HTML ➜ WXML、CSS ➜ WXSS、JS ➜ JS,再加一个同名 JSON 配置。
创建新页面的最短路径
- 在
pages下新建文件夹,如about/ - 一键生成四件套(IDE 右键即可)
- 把路径
pages/about/about添加到app.json的pages数组 - 编译 → 模拟器地址栏输入
/pages/about/about进行跳转预览
3.2 JSON配置文件
3.2.1 JSON配置文件的作用
微信小程序的开关面板几乎都写在 .json 里。项目里常见 4 种 JSON,各自负责的层级和用途如下:
| 文件 | 作用范围 | 关键字段(示例) | 使用场景 |
|---|---|---|---|
| app.json | 全局 | pages 路由、window 导航栏样式、tabBar 底部菜单 |
新增/调整页面、统一主题色 |
| project.config.json | 工具层 | setting 编译选项、appID、projectname |
修改 ESLint 规则、关闭 sitemap 提示 |
| sitemap.json | SEO | rules 设定 allow/deny 页面索引 |
允许或屏蔽小程序搜索曝光 |
| 页面同名 .json | 局部页面 | 覆盖 window 中对应项 |
只让某页导航栏变色 |
3.2.2 app.json文件——「总控台」
1 | json |
- pages:数组顺序决定路由,第一项即默认首页
- window:导航栏、背景色、文字色等全局外观
- style:组件默认样式版本
- sitemapLocation:指向 sitemap.json 文件
3.2.3 project.cofig.json文件——开发者工具的偏好设置
1 | { |
- setting 里可关闭/开启特定校验,例如
checkSiteMap - es6 设为
true即可用import/async等语法
3.2.4 sitemap.json文件——让不让微信索引搜索?

1 | { |
allow/disallow可对某些路径做精准控制- 若不想看到 IDE 的索引提示,把 project.config.json →
checkSiteMap设为false即可
3.2.5 页面的json文件小范围“涂色笔”

所有与
app.json → window同名的字段,都能在页面级 .json 里被覆盖。
1 | // pages/index/index.json |
效果:只有 index 页的导航栏变绿,其他页面仍沿用全局白色。
如果页面级别的配置和全局级别的配置发生冲突,那么会以页面级别的为准。
3.2.6 新建小程序页面
-
新建
- 在
pages目录建文件夹list/ - app.json →
pages数组追加"pages/list/list"
IDE 会自动生成四件套list.js/json/wxml/wxss
- 在
-
修改首页
把想要的页面路径拖到pages数组第一位即可:1
2
3
4
5"pages": [
"pages/list/list",
"pages/index/index",
"pages/logs/logs"
]
编译后模拟器默认进入 list 页。
3.2.7 小结
| 想做的事 | 改哪个 JSON |
|---|---|
| 换全局主题色 | app.json → window |
| 只改某页颜色 | 页面同名 .json |
| 关闭搜索索引提示 | project.config.json → setting.checkSiteMap |
| 屏蔽整站搜索 | sitemap.json |
掌握这些配置文件,就能“拧螺丝”般快速调校小程序外观、路由与调试体验。
3.3 WXML模版和WXSS样式
| 名称 | 类比于 Web | 作用 |
|---|---|---|
| WXML (WeiXin Markup Language) | HTML | 负责“骨架”——页面结构、组件层级 |
| WXSS (WeiXin Style Sheets) | CSS | 负责“皮肤”——颜色、尺寸、布局 |
3.3.1 WXML 基础认知
-
标签集合更精简
- HTML:
div span img a… - WXML:
view text image navigator等(都小写,语义直接)
- HTML:
-
属性语义不同
1
2
3
4
5<!-- HTML 超链接 -->
<a href="/home">Home</a>
<!-- WXML 页面跳转 -->
<navigator url="/pages/home/home">Home</navigator> -
内置“Vue 风格”模板语法
功能 关键指令 一眼示例 数据绑定 {{ msg }}<text>{{ msg }}</text>列表渲染 wx:for<view wx:for="{{list}}" wx:key="id">{{item.name}}</view>条件渲染 wx:if / wx:elif / wx:else<view wx:if="{{login}}">Hi~</view>
3.3.2 WXSS 与传统 CSS 的差异
| 特性 | 说明 | 小贴士 |
|---|---|---|
新增尺寸单位 rpx |
会随屏幕宽度自动缩放 | 设计稿 750 px → 1 px ≈ 1 rpx |
| 全局 / 局部样式分离 | app.wxss 全局;页面同名 .wxss 仅当前页 |
想统一字体就写到全局 |
| 选择器子集 | 支持 .class #id 元素、并集、后代;不支持伪元素如 ::after |
写法越简单,渲染越快 |
| CSS 语法基本兼容 | 媒体查询、不透明度等常用属性都 OK | 动画推荐用 API(如 animation)提高流畅度 |
“Hello WXML+WXSS” 迷你示例
index.wxml
1 | <view class="container"> |
index.wxss
1 | .container{ |
index.js(片段)
1 | Page({ |
编译后即可在模拟器看到绿色 “Hello World” 标题和按钮,布局在不同机型上会因 rpx 自适应而保持一致。
3.3.3 小结
- WXML = 结构 + 模板指令,写法清爽、带数据驱动。
- WXSS = CSS Lite + rpx,屏幕适配不操心,全局/局部样式分而治之。
- 掌握二者配合后,再加 JS 逻辑,就能快速搭好小程序页面。下一步可以尝试引入组件(如
image、scroll-view),让页面“活”起来!
3.4 JS逻辑交互
在小程序里,界面展示靠 WXML/WXSS,行为逻辑就交给 JavaScript。
JS 文件按作用域可分 3 类:
| 类别 | 入口函数 | 典型职责 | 代码片段 |
|---|---|---|---|
| 1. app.js (全局) | App() |
启动小程序、监听全局生命周期、存放公共数据 | js App({ onLaunch(){ // 全局初始化 } }) |
| 2. 页面 .js (局部) | Page() |
定义页面数据 data、事件处理、页面生命周期 |
js Page({ data:{ count:0 }, add(){ this.setData({count:this.data.count+1}) } }) |
| 3. 普通 .js (工具模块) | —— | 封装公用函数 / 常量,供 require / import |
js // utils/time.js module.exports=formatTime; |
3.4.1 常见交互流程示例
-
用户操作 → WXML 触发事件
1
<button bindtap="add">+1</button>
-
页面 .js 接收事件,修改
data -
视图自动刷新 —— 数据驱动视图,无需手动 DOM 更新
3.4.2 开发要点速查
| 场景 | 关键 API / 方法 | 备注 |
|---|---|---|
| 修改页面数据 | this.setData({ … }) |
触发视图更新 |
| 跨页面数据共享 | getApp()、全局 globalData |
简单状态、无需状态管理库 |
| 本地缓存 | wx.setStorageSync / wx.getStorageSync |
同步 / 异步版本均有 |
| 调原生能力 | 例如 wx.getLocation()、wx.scanCode() |
Promise 化可用 wx.promisify |
小技巧:把与页面无关的逻辑拆到 utils 里(如日期格式化、网络请求封装),页面文件只关心“拿数据 + 绑定事件”,结构会更清晰,后期维护也轻松。
四、小程序的宿主环境
4.1 宿主环境简介
宿主环境(host environment)= 程序运行所必需的“生存土壤”
- Android 系统、iOS 系统分别是 原生 App 的宿主环境
- 对 微信小程序 而言——手机微信 App 本身 就是唯一宿主

小程序脱离微信无法单独运行,但也正因“寄生”于微信——它天然继承了微信的大量能力(扫码、支付、位置、联系人、蓝牙…)。换个比喻:网页是住“群租房”,原生 App 是买自建房,小程序则是住在微信这座“超大商场”里的档口——水电网 (系统能力) 全包、客流量自带,只要专心卖货即可。

4.1.1 宿主环境的四大构成
| 顺位 | 模块 | 作用简述 |
|---|---|---|
| ① 通信模型 | 逻辑层 (JSCore) ⇆ 渲染层 (WebView) 双线程桥接 | setData() 消息队列、事件回传 |
| ② 运行机制 | 页面栈 + 生命周期;前后台切换由微信托管 | onLaunch, onShow, onHide |
| ③ 基础组件 | 微信团队实现的 UI 组件库;语义精简 | view, scroll-view, swiper, button |
| ④ 能力型 API | 直接调用微信/系统底层功能 | wx.scanCode, wx.getLocation, wx.login, wx.requestPayment |
Tip:当你在 WXML 里写一个
<map>组件、在 JS 里调用wx.openLocation()时,其实就是“喊”微信宿主帮你干活。
4.1.2 为什么要理解宿主环境?
- 性能边界感
不同于浏览器,渲染与逻辑分离——频繁setData会阻塞桥接;理解后才能写出高帧率页面。 - 权限与合规
微信提供的能力必须走官方授权弹窗,比如地理定位、相册;否则审核直接驳回。 - 跨端一致性
同一段小程序代码在 Android / iOS 中,UI 基本一致;但系统级 API(如蓝牙)仍存在差异,需要做降级处理。
4.1.3 一口气总结
- 宿主 = 微信,不给微信当“插件”就跑不起来
- 微信把 通信、渲染、原生能力 都封装好了,小程序像乐高积木随取随用
- 开发者最重要的任务:写好逻辑层 JS + 轻量视图层 WXML/WXSS,其余交给宿主
“小程序离开微信就像离开水的鱼——它确实还能发消息(抖两下),但没人敢买单。”
4.2 通信模型
在微信小程序里,所有数据都绕不过一座“转发站”——微信客户端本身。
下面先看参与者,再看两条通信通路。
4.2.1 通信主体

| 层次 | 所在进程 | 负责内容 |
|---|---|---|
| 渲染层 | WebView | 解析 WXML / WXSS,负责页面展示、用户触摸事件上报 |
| 逻辑层 | JSCore | 运行 JS 脚本,处理业务逻辑、网络请求、数据缓存 |
| Native | 微信 App | 把两层“撮合”到一起,并代为调系统能力 |
一句话:渲染层“长得好看”,逻辑层“动脑子”,Native “当保姆”。
4.2.2 两大通信路径
| # | 方向 | 流程 & 关键点 | 开发者可感知的 API |
|---|---|---|---|
| ① 渲染层 ⇆ 逻辑层 | 双向消息(受控队列) | - 逻辑层调用 setData() 推 UI 更新 - 渲染层把点击、滚动等事件打包回传 |
this.setData()、bindtap、bindscroll |
| ② 逻辑层 ⇆ 第三方服务器 | HTTP(S) 请求 | - 由逻辑层发起 wx.request,Native 代劳实际网络通信 - 域名需预先配置在「合法域名」白名单里 |
wx.request()、wx.uploadFile()、wx.downloadFile() |

性能提醒
- 每次
setData会经过桥接层,数据包越大、频率越高 → 卡顿越明显。
养成“只改动需要的字段 + 合并多次写入”的习惯。- 网络请求走 Native,HTTPS 握手仍消耗时间;能用云开发或本地缓存的场景不要硬拉远程接口。
4.2.3 常见问题 & 解法
| 症状 | 原因 | 解决思路 |
|---|---|---|
| 页面频繁掉帧 | setData 高频 + 大对象 |
拆分字段;throttle/debounce 用户输入;长列表用 virtual-list |
| 请求 400 / 404 | 域名未备案或未加入白名单 | 在小程序管理后台 开发→开发设置→服务器域名 添加并验证 |
| iOS 正常,Android 出错 | 不同平台底层 WebView / JSCore 行为差异 | 使用官方组件&API 避免私造 DOM;及时关注基础库版本差异 |
4.2.4 小结
- 两层一桥:渲染层 & 逻辑层通过微信 Native 桥接。
- 两条通路:层间消息 + 网络请求,都走 Native 转发。
- 开发者关注 包大小、调用频率、域名白名单 三件事,就能让通信既快又稳。
4.3 运行机制
微信小程序在微信宿主中“苏醒→展示”大致分两条流水线:小程序启动与页面渲染。理解这两条流水线能帮助我们定位白屏、初始化慢等常见问题。下文结合两张流程 PPT 逐步拆解。
4.3.1 小程序启动(App 级别)
| 顺序 | 阶段 | 关键动作 | 对应生命周期 |
|---|---|---|---|
| ① | 拉取代码包 | 微信客户端从服务器或本地缓存下载/比对代码包(*.wxapkg) |
|
| ② | 解析 app.json |
读取全局配置:路由表 pages[]、窗口 window{}、tabBar… |
|
| ③ | 执行 app.js |
调用 App() 创建全局实例,注入生命周期回调 |
onLaunch |
| ④ | 渲染首页 | 读取路由表首项所指页面(例如 pages/index/index) |
|
| ⑤ | 启动完成 | 首屏可见,进入前台 | onShow |
首屏优化 Tips
- 首页放置最小可运行逻辑,复杂初始化放次级页面或懒加载
- 合理使用分包,避免一次下载 2M+ 资源
4.3.2 页面渲染(Page 级别)
| 顺序 | 动作 | 说明 | 生命周期钩子 |
|---|---|---|---|
① 加载 index.json |
读取页面私有配置,覆盖 app.json → window 同名字段 |
||
② 解析 index.wxml / index.wxss |
渲染层构建 DOM Tree & CSSOM | ||
③ 执行 index.js |
调用 Page() 生成页面实例,注册 data、事件处理 |
onLoad |
|
| ④ 渲染完成 | 首次数据绑定 & 布局绘制 | onReady |
随后页面进入可交互状态,后续的显示/隐藏/卸载遵循:
1 | onShow → 用户可见 |
4.3.3 页面栈(Page Stack)与路由
-
微信维护一个栈结构来保存已打开页面顺序:
[index] -> [list] -> [detail] -
wx.navigateTo()压栈,wx.navigateBack()弹栈;最多 10 层 -
栈顶页面可访问下层页面实例:
1
2const pages = getCurrentPages()
const prevPage = pages[pages.length - 2] // 上一个页面
4.3.4 常见问题速查表
| 现象 | 可能原因 | 排查思路 |
|---|---|---|
| 首屏白屏 ≥3 s | 代码包过大;首页依赖网络数据 | 分包 + 骨架屏;接口并行请求 |
onLoad 不触发 |
页面被缓存,走了 onShow |
确认是否使用 tabBar 页面;看调试面板 |
| 返回上一页数据未刷新 | 仅在 onLoad 拉数据 |
在 onShow 里增补刷新逻辑或使用事件总线 |
4.3.5 思维导图
1 | 小程序启动 |
一句话总结: 小程序启动像开机——先读 BIOS (
app.json) 再跑系统 (app.js);
页面渲染像打开软件——解析配置、加载资源、实例化 Page,然后正式显示。
熟悉这两段流程,你就能精确拿捏生命周期,让首屏更快、页面更顺滑。
4.4 组件
组件由 微信宿主环境 内置提供,开发者无需重复造轮子即可快速拼装页面。官方把全部组件分成 9 大类,如下表所示,本节先聚焦最常用的 视图容器类 和 基础内容类,其余将在下节继续。
| 分类序号 | 组件类别 | 典型成员 |
|---|---|---|
| ① | 视图容器 | view、scroll-view、swiper / swiper-item |
| ② | 基础内容 | text、rich-text |
| ③ | 表单组件 | button、input、picker … |
| ④ | 导航组件 | navigator、scroll-view(滚动监听) |
| ⑤ | 媒体组件 | image、video |
| ⑥ | map 地图组件 | map |
| ⑦ | canvas 画布组件 | canvas、live-player |
| ⑧ | 开放能力 | ad、official-account、open-data |
| ⑨ | 无障碍访问 | aria-*(WAI-ARIA 属性) |
4.4.1 视图容器类组件
| 组件 | 作用 | 常用属性 / 说明 |
|---|---|---|
view |
普通视图区域,相当于 HTML 中的 div。配合 WXSS 可做任何布局。 |
支持 hover-class、hover-start-time 等触摸态效果 |
scroll-view |
可滚动的视图区域。竖向或横向滚动列表、图片瀑布流等首选。 | scroll-y / scroll-x 开启滚动;滚动方向必须给定固定高度/宽度,否则无法滚动 |
swiper + swiper-item |
轮播容器与其子项。常见于首页 Banner、广告位。 | 支持 indicator-dots 页签、autoplay 自动播放、circular 衔接滚动等 |
1) view 示例:Flex 横向布局

1 | <!-- list.wxml --> |
1 | /* list.wxss */ |
效果:三块彩色方块水平均分对齐。
2) scroll-view 示例:纵向滚动列表

1 | <scroll-view class="box" scroll-y> |
1 | .box { width:100px; height:120px; border:1px solid #e00 } /* 高度必须固定 */ |
要点:
- 纵向滚动用
scroll-y;横向用scroll-x- 滚动方向对应的尺寸 必须固定,否则内容无法滚动
3) swiper / swiper-item 示例:基础轮播

1 | <swiper class="swiper" indicator-dots> |
1 | .swiper { height:150px } |
| 常用属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
indicator-dots |
boolean |
false |
是否显示面板指示点 |
indicator-color |
color |
rgba(0,0,0,.3) |
指示点颜色 |
indicator-active-color |
color |
#000000 |
选中指示点颜色 |
autoplay |
boolean |
false |
是否自动切换 |
interval |
number |
5000 |
自动切换间隔(ms) |
circular |
boolean |
false |
是否循环衔接滑动 |
提示:轮播高度由外层
.swiper控制;若放在scroll-view内部,务必关闭scroll-view的同向滚动冲突或改用catchtouchmove。
4.4.2 基础内容类组件
| 组件 | 作用 | 常用属性 | 备注 |
|---|---|---|---|
text |
普通文本 | selectable (是否可长按复制)space (ensp/nbsp) 空格处理 |
类似 HTML 中的 <span> |
rich-text |
富文本渲染 | nodes (字符串 / 数组,描述要渲染的节点)editable (是否可编辑) |
官方默认过滤潜在危险标签 |
1 | <text>微信小程序</text> |
1 | Page({ |
1) text 组件
- 定位:最轻量的文本呈现容器。
- 核心属性
selectable="true"→ 支持长按选中复制space="ensp"/space="nbsp"→ 自动替换空格方便排版
1 | <view> |
2) rich-text 组件
rich-text 用来把 HTML 字符串 或 nodes JSON 渲染为 WXML 结构。常见场景:文章 / 商品详情 / 评论内容。
1 | <rich-text |
安全提示:只有白名单标签(
div、p、img、h1–h6等)会被保留,脚本标签会被自动移除;如需更多格式,建议后端预处理为 nodes 数组。
4 .4 .3 其它常用组件概览
| 组件 | 典型用途 | 精华属性 / 方法 |
|---|---|---|
button |
操作入口、调起微信能力 | type size plain disabled open-type |
image |
图片展示 | src mode lazy-load show-menu-by-longpress |
navigator |
页面跳转 | url open-type (navigate redirect switchTab …) |
下文分别展开 button 与 image 两个最常用组件;navigator 会在后续详述。
4 .4 .5 button 组件
| 属性 | 说明 |
|---|---|
type → default / primary / warn |
系统预设三种主题色 |
size → default / mini |
小尺寸按钮 |
plain |
镂空按钮,常用作次要操作 |
open-type |
调起微信能力,如 contact(客服)、share、getPhoneNumber、feedback 等 |
1 | <!--类型--> |
4 .4 .7 image 组件
- 默认尺寸:300 px × 240 px,如需自适应请配合
mode。 - 懒加载:
lazy-load="true"仅当页面滚动到可视区域再加载。 - 长按菜单:
show-menu-by-longpress="true"支持保存 / 识别二维码。
1 | <!--空图占位--> |
mode 属性速查
| mode 值 | 行为 | 典型场景 |
|---|---|---|
scaleToFill (默认) |
拉伸填满,不保持比例 | 彩色占位图 |
aspectFit |
等比缩放,完整显示长边 | 头像 / 缩略图 |
aspectFill |
等比缩放,完整显示短边,多余裁剪 | Banner / 封面 |
widthFix |
宽度固定,高度自适应 | 等宽瀑布流 |
heightFix |
高度固定,宽度自适应 | 固定高度画廊 |
4 .4 .8 小结
| 模块 | 速记 |
|---|---|
| 文本 | text 轻量、rich-text 富文本 |
| 交互 | button 自带主题 + 微信开放能力 |
| 媒体 | image 默认固定尺寸,mode 决定裁剪 / 缩放 |
| 导航 | 路由跳转交给 navigator(后续详讲) |
掌握以上组件,你已能完成大多数页面的静态 UI 构建。接下来建议动手把示例代码敲一遍,加深对属性、默认行为的直观理解。
4.5 API
小程序的能力 = 宿主环境 + JavaScript 运行时。
组件解决“页面结构/样式”的问题,API 负责“能力调用”——无论是硬件能力(摄像头、定位)、软件能力(网络请求、本地存储)还是微信生态能力(登录、支付、分享)都要通过 API 触达。
4.4.1 API 概述
小程序所有 API 都由 微信客户端(宿主环境)统一暴露。开发者只需使用 wx.* 命名空间即可调用,无需关心底层平台差异。常见场景示例:
| 场景 | 典型 API | 作用 |
|---|---|---|
| 获取用户信息 | wx.getUserInfo() |
调起授权弹窗并获取用户基础信息 |
| 本地数据缓存 | wx.setStorageSync()/wx.getStorageSync() |
读写 10 MB 以内的 KV 数据 |
| 微信支付 | wx.requestPayment() |
拉起微信支付收银台完成支付 |
4.4.2 API 的三大分类
| 分类 | 识别方式 | 特点 | 常用示例 |
|---|---|---|---|
| 事件监听型 (Event Listener APIs) | 以 on 开头 |
只负责 订阅宿主事件,不直接返回结果 | wx.onWindowResize(cb) 监听页面尺寸变化 wx.onNetworkStatusChange(cb) 监听网络状态 |
| 同步型 (Sync APIs) | 以 Sync 结尾 |
堵塞式执行,结果以返回值形式同步拿到;失败会 抛出异常 | wx.setStorageSync(key, value) 本地写入 wx.getSystemInfoSync() 获取系统信息 |
| 异步型 (Async APIs) | 其他大多数 API | 类似 $.ajax:通过 success / fail / complete 或 Promise 接收结果;不阻塞 UI |
wx.request({...}) 网络请求 wx.login({...}) 获取临时登录凭证 |
1. 事件监听型
1 | // 监听页面尺寸变化 |
- 使用场景:对系统级事件做被动响应(旋转、剪切板、网络变化…)。
- 注意:无法取消,需要在离开页面或组件销毁时自行 ignore 回调结果。
2. 同步型
1 | try { |
- 适用场景:体量小、耗时极短且必须立刻拿到结果的操作(读取配置、本地缓存)。
- 风险点:阻塞 JS 线程,频繁或大数据量调用会产生卡顿。
3. 异步型
1 | wx.request({ |
- 适用场景:网络、文件、支付、蓝牙等 耗时或需要用户交互 的能力。
- 最佳实践:统一封装
request工具(超时、BaseURL、全局错误处理),并用 Promise / async-await 提升代码可读性。
4.4.3 小结
- 命名即语义:
on*= 监听、*Sync= 同步,其余默认异步。 - 先判环境:调用前可用
wx.canIUse('API 名称')检测版本兼容。 - 异常兜底:同步 API 用
try…catch,异步 API 永远写fail / catch。 - 抽象封装:将宿主 API 再包装成业务层服务(StorageService、AuthService…),减小“宿主直耦合”。
这样,你就完成了 API 能力层 的知识梳理:
组件塑造「视图层」,API 打通「能力层」,二者在 逻辑层(JS) 里汇合,构成小程序完整的开发模型。
五、协同工作和发布
5.1 协同工作
| 核心问题 | 关键要点 |
|---|---|
| 为什么要做权限管理? | 中⼤型团队往往有多⻆⾊并⾏参与同⼀小程序。为避免「所有⼈都能改所有东西」导致的混乱与风险,需要按岗位/角色做权限边界规划,让协同更安全、更高效。 |
| 团队典型组织结构 | 项目管理者(Owner):统筹进度与风险,控制对外发布时间节奏; 产品组:提出业务需求并在体验阶段收集反馈; 设计组:产出设计方案,参与体验阶段的 UI 调整; 开发组:代码实现,维护主干分支; 测试组:负责测试、回归、灰度放量。 |
| 标准开发流程 | 1. 提出需求 → 产品组 2. 设计 → 设计组 UI/UX 方案 3. 开发 → 开发组编码,推送到 dev 分支 4. 体验 → 产品&设计打开体验版,提出修改意见(小程序后台「体验版本」) 5. 测试 → 测试组在「审核版本」进行功能/兼容/性能测试 6. 发布 → 项目管理者合并 master 并提交审核,通过后灰度或全量发布 |
权限划分示例(可映射到微信小程序后台 → 「成员管理」)
| 角色 | 推荐权限 | 说明 |
|---|---|---|
| 项目管理者 | 管理员 | 创建/删除成员、提交审核、发布上线 |
| 产品经理 | 体验成员 | 体验版访问、数据分析查看 |
| 设计师 | 体验成员 | 无需代码修改,仅验收 UI |
| 开发工程师 | 开发者 | 代码上传、体验版生成 |
| 测试工程师 | 体验成员 | 体验/审核版本测试、提 Bug |
Tips
- 发布节点建议采用 灰度 + 指定比例,确保线上问题可控。
- 在 CI/CD 流程里引入
npm run lint && npm run test等质量闸口,保证进入体验版的代码至少通过静态检查和单元测试。


