20251019-小程序八股文

198 阅读28分钟

🧩 一、小程序的理解(第1页)

1️⃣ 什么是小程序

可以理解为—— “轻量级App” 。 像是手机App的“精简版”,但不需要安装。 💡 举例:

  • 你平时打开微信点开“美团外卖”或者“滴滴打车”,其实就是微信小程序
  • 它存在微信里,不需要下载App,也能用核心功能。

📦 从技术上看:

类型说明
手机App完整功能、独立安装、体积大
微信小程序依附微信运行,轻便、即用即走
H5网页浏览器打开的网页应用

🍼 生活类比记忆法: 👉 手机App就像你家冰箱——功能齐全但占地大。 👉 小程序像外卖小冰箱——微信帮你放着,用完就关,不占地方。 👉 H5网页像外卖页面——一次性打开、功能少。


1.2 背景

  • 微信在2017年推出小程序,让企业/个人无需开发App就能提供服务
  • 背后原因:App开发成本高,用户装太多App也烦。

📈 于是:

  • 开发者:能用Web技术(HTML/CSS/JS)快速开发;
  • 用户:点开即用,无需安装;
  • 平台(微信):能留住用户、增强生态。

1.3 优缺点

✅ 优点

  1. 不用安装,即开即用。
  2. 开发成本低,比原生App快多了。
  3. 跨平台(安卓/iOS都能跑)。
  4. 分享传播方便(群聊、二维码等)。
  5. 有微信账号体系,不用再注册。

❌ 缺点

  1. 性能比不上App(加载慢、体验稍差)。
  2. 受平台限制(不能脱离微信运行)。
  3. 开发能力有限(比如后台任务少、不能后台播放音乐太久)。

💡 小记忆技巧:

“快、省、广”是小程序的优点; “慢、受限、轻”是它的缺点。


⚙️ 二、小程序的生命周期函数(第2页)

2.1 是什么

生命周期函数 = 小程序“活着的过程”里各阶段的回调。 就像人的一生有:

  • 出生(onLaunch)
  • 长大(onShow)
  • 工作(onReady)
  • 睡觉(onHide)
  • 离开(onUnload)

同理,小程序每个页面和全局都有这些钩子函数。


2.1.1 应用的生命周期

📦 主要函数:

函数触发时机
onLaunch小程序初始化时触发(只执行一次)
onShow小程序启动或从后台进入前台
onHide从前台进入后台时触发
onError报错时触发

🧠 小记忆法:

  • Launch = 出生
  • Show = 出现
  • Hide = 暂时离开
  • Error = 生病

举个生活例子:

你开微信点外卖 → 小程序启动(onLaunch) 你下单、继续浏览 → 显示运行(onShow) 你切去刷朋友圈 → 隐藏后台(onHide) 程序崩溃了 → 出错(onError)


2.2 页面生命周期(第2页下半部分)

每个页面自己也有一套生命周期,比如:

函数含义
onLoad页面加载时(接收参数)
onShow页面显示时
onReady页面初次渲染完成
onHide页面隐藏
onUnload页面卸载(返回或关闭)

💡 小记忆口诀:

“加载→显示→渲染→隐藏→卸载” 像打开一个网页、浏览、关闭的全过程。


💬 快速总结口诀

小程序生命周期 = “出生(onLaunch)→亮相(onShow)→退场(onHide)→再登场(onShow)→谢幕(onUnload)”

🧩 第6页:生命周期执行流程

我们前面讲了生命周期(像小程序的“出生→生活→离开”)。 现在要讲的是——它到底是怎么按顺序执行的。


💻 示例代码解释:

App({
  onLaunch() {
    console.log("小程序初始化");
  },
  onShow() {
    console.log("小程序显示");
  },
  onHide() {
    console.log("小程序隐藏");
  }
});

🔍 解释:

  • onLaunch() → 小程序刚出生,只执行一次;
  • onShow() → 小程序被打开或从后台回到前台;
  • onHide() → 小程序退到后台(比如你去回微信消息)。

💡 生活类比: 想象你是一个开奶茶店的老板:

  • onLaunch = 早上开店;
  • onShow = 顾客上门;
  • onHide = 打烊休息;
  • onError = 奶茶机坏了(报错)!

🔄 执行流程(重点)

页面生命周期(Page)比应用生命周期(App)要频繁执行。

1️⃣ 应用级执行过程:

  1. onLaunch:启动一次
  2. onShow:打开或回前台
  3. onHide:退后台
  4. 再次回来又执行 onShow

2️⃣ 页面级执行过程:

  1. onLoad → 加载数据(就像打开网页)
  2. onShow → 页面可见
  3. onReady → 渲染完毕
  4. onHide / onUnload → 页面关闭或跳转

💡 小口诀记忆:

应用是“开业-营业-打烊”, 页面是“加载-展示-关闭”。


🚪 第7~8页:登录流程

接下来进入重点——小程序的登录流程(Login Flow)


3.1 背景

小程序没有“注册账号密码”的过程, 它靠微信的“授权机制”来识别你是谁。

🧠 你只要点“允许授权登录”, 微信就会帮小程序拿到一个临时 code, 然后小程序把这个 code 发给后台,后台去微信服务器换取真正的用户标识。


3.2 登录流程详解(第8页重点图)

我们可以用一句话概括整个流程👇

“小程序拿 code → 发给后台 → 后台去微信服务器换 openid 和 session_key → 再返回前端保存登录状态。”


📋 流程分解如下:

1️⃣ 用户打开小程序 ↓ 2️⃣ 调用 wx.login() → 微信返回一个 code(一次性的临时凭证) ↓ 3️⃣ 前端把 code 发给后台(自己的服务器) ↓ 4️⃣ 后台带着 code 请求微信官方API(jscode2session)

  • 返回 openid(用户身份)
  • 返回 session_key(加密session) ↓ 5️⃣ 后台生成自己的登录态(比如token)并返回给前端 ↓ 6️⃣ 前端保存token(存本地storage)以后请求都带上

💡 生活类比: 你(用户)要进奶茶店(小程序)点单。

  • wx.login() → 拿了微信的“临时票”(code)。
  • 后台用票去微信“总部”换“身份证”(openid)。
  • 拿到身份证后,奶茶店发你一张“会员卡”(token)。
  • 之后你凭会员卡买奶茶,不用每次再扫码认证。

是不是很好懂!😆


🧱 第9页:时序图讲解

📊 图上其实展示的就是:

  • 左边是小程序前端
  • 中间是开发者服务器
  • 右边是微信服务器

它们之间传来传去的几条消息线:

步骤说明
小程序调用 wx.login() 获取 code
前端发送 code 给自己服务器
服务器调用微信API,用 code 换 openid/session_key
微信返回 openid/session_key
开发者生成自定义登录态(比如JWT token)返回前端

📌 记忆口诀:

“取票(code) → 换证(openid) → 发卡(token)” 三步走,登录不愁!


🧩 第10页:拓展小结

🌟 常见术语小抄:

名称含义
openid用户在当前小程序的唯一标识(像身份证号)
unionid同一开发者账号下多个小程序共用的标识
session_key会话密钥,用来解密用户信息
token由你自己服务器生成的登录凭证

💡 区别口诀:

openid 是“身份证”; unionid 是“通行证”; session_key 是“钥匙”; token 是“会员卡”。


🧠 一句话速记总结

小程序生命周期:出生-登场-退场; 登录流程:取票→换证→发卡; 核心标识:openid 身份证、session_key 钥匙、token 会员卡。

🚪 一、小程序的页面跳转(第11页~15页)

4.1 什么是“页面跳转”

小程序和网站类似,往往有多个页面,比如:

  • 首页 index
  • 商品页 product
  • 订单页 order
  • 个人中心 profile

“页面跳转”就是在这些页面之间切换。 在微信小程序中,我们可以用不同的函数跳转,比如:

函数作用
wx.navigateTo()跳转到新页面(保留当前页面)
wx.redirectTo()跳转到新页面(关闭当前页面)
wx.switchTab()跳到 tabBar 页面(底部导航那种)
wx.reLaunch()关闭所有页面,重新打开一个
wx.navigateBack()返回上一个页面

💡 生活类比:

想象你是个外卖骑手在“送奶茶”🚴‍♀️

函数现实生活比喻
navigateTo你骑车去新顾客家送单(原来那单还没删)
redirectTo你取消上一单、直接去新顾客那(旧页面没了)
switchTab你切换路线去“固定区域”(比如回总部)
reLaunch你把所有路线清空,从起点重新出发
navigateBack送完单回到上一个顾客家(返回)

这样是不是更形象?😆


📦 二、wx.navigateTo(Object)(第12页)

这个方法最常用。 作用: 打开一个新的非 tabBar 页面,原页面还在后台。

📋 常见参数:

wx.navigateTo({
  url: '/pages/detail/detail?id=123',
  success: function(res){}, // 成功回调
  fail: function(){}, // 失败回调
  complete: function(){} // 不管成功失败都会执行
})

📘 表格说明:

参数类型必填说明
urlstring要跳转的页面路径
successfunction成功时执行
failfunction失败时执行
completefunction无论成功失败都执行

🧩 生命周期变化图(第13页)

当你执行 wx.navigateTo()

  • 当前页面不会被销毁,只是进入“后台”;
  • 新页面会被创建并显示。

📈 图中流程:

index(原页面)
  ↓ onHide
Page1(新页面)
  ↑ onLoad → onShow

💡 小口诀:

navigateTo = “带着旧页面,开新页面”。

就像你打开新标签页浏览网页,原来的网页还在那。


🚗 三、wx.redirectTo(Object)(第14页)

这个函数是 navigateTo 的“节俭版”。

作用: 跳转到新页面,但会关闭当前页面

wx.redirectTo({
  url: '/pages/home/home'
})

📋 参数一样,但执行效果不同:

函数当前页保留?备注
navigateTo✅ 是可以返回
redirectTo❌ 否不能返回上一页

🧱 生命周期变化图(第15页)

redirectTo 的流程:

index → Page1 → Page2

当 Page2 打开时:

  • Page1 会被卸载(onUnload)
  • Page2 加载显示(onLoad → onShow)

💡 小口诀:

redirectTo = “把旧页面关了,开新页面”。

现实比喻:

你关掉当前店门(页面),直接去下一家店送单。


✨ 四、总结对比表(重点记忆)

函数名保留原页面能否返回场景举例
navigateTo✅ 是✅ 可以从列表页进详情页
redirectTo❌ 否❌ 不行登录成功后跳主页
switchTab❌ 否❌ 不行跳到底部tab页
reLaunch❌ 否❌ 不行重新进入首页
navigateBack返回上页

💡 终极口诀:

「navigateTo留,redirectTo丢,switchTab走固定,reLaunch重开,navigateBack回老家。」


🧠 小可爱版速记总结:

🌸 如果你想“继续返回上一个页面” → 用 navigateTo 🌸 如果你“想换个页面但不再回去” → 用 redirectTo 🌸 如果你“切到底部导航” → 用 switchTab 🌸 如果你“彻底重新来一次” → 用 reLaunch 🌸 如果你“要回上一个页面” → 用 navigateBack

🧩 第16~17页:更多跳转方式详解

🔹 4.2.3 wx.switchTab(Object)

👉 作用:跳转到 tabBar 页面(底部导航那几个)。 比如: 底部有【首页】、【发现】、【我的】,只能用 switchTab() 去跳。

wx.switchTab({
  url: '/pages/index/index'
})

📘 参数说明:

参数类型必填说明
urlstring要跳到的 tabBar 页面路径
successfunction成功执行回调
failfunction失败执行回调
completefunction无论成功失败都会执行

⚠️ 注意:

  • 只能跳到 tabBar 页面;
  • 不能带参数;
  • 不能返回上一个页面。

💡 生活类比:

你去商场底楼导航栏走动。 【首页】、【订单】、【我的】 这几个是固定入口,你只能走“指定通道”,不能“私自加链接”。


🔹 4.2.4 wx.navigateBack(Object)

👉 作用:返回上一个页面(或者指定层级)。

wx.navigateBack({
  delta: 1 // 返回上一级页面
})

📘 参数说明:

参数类型必填说明
deltanumber返回的层数(默认1)
success / fail / completefunction回调函数们

💡 生活类比:

你点了三家奶茶店的详情页,想回“首页奶茶广场” → delta: 3 就能一口气退回去。

👉 navigateBack = 返回历史页面栈里的上一级。


🔹 4.2.5 wx.reLaunch(Object)

👉 作用:关闭所有页面,打开一个新的页面(重新开始)。

wx.reLaunch({
  url: '/pages/home/home'
})

📘 参数说明:

参数类型必填说明
urlstring新页面路径
success / fail / completefunction回调函数

📊 生命周期变化图(第17页):

index (旧首页)
↓  onHide → onUnload
Page1 (新页面)
↑  onLoad → onShow

💡 生活类比:

reLaunch = “重启系统”🌀 你把所有页面都关了,重新开一轮新的旅程。

常见场景:

  • 用户退出登录 → 回登录页;
  • 首次打开应用 → 初始化页面。

✅ 第18页:跳转总结表

方法保留当前页可返回适用场景
navigateTo✅ 是✅ 可以普通页面跳转
redirectTo❌ 否❌ 不可登录成功后跳首页
switchTab❌ 否❌ 不可tabBar页面跳转
reLaunch❌ 否❌ 不可重启小程序入口页
navigateBack✅ 是✅ 可以返回历史页面

📌 终极口诀

“To保留,Redirect丢,Tab切栏,ReLaunch新开,Back回家。”

🌟 小贴士:

面试时,考官特别喜欢问 “navigateTo 和 redirectTo 的区别” —— 记得答:“一个保留页面栈,一个销毁当前页”。


🚀 第19~20页:小程序发布流程

终于到“上线前最后一关”啦~

这一章相当于:奶茶店装修完 → 准备开业!


🪄 5.1 背景

开发完小程序后,必须经过上传、提交审核、发布上线三步流程。 微信会审核你的代码、页面、内容是否合规。


📦 5.2 发布流程步骤

🧭 Step1:上传代码

在开发者工具中:

点击右上角菜单 → “上传” 填写版本号和备注信息。

⚙️ 示例:

版本号:1.0
备注:首个上线版本

上传完成后,代码会存入「微信公众平台后台」。


🧭 Step2:提交审核

登录 mp.weixin.qq.com → 找到小程序管理后台:

  1. 打开【版本管理】;
  2. 点击【提交审核】;
  3. 等待微信官方审核结果。

💡 小贴士:

  • 审核时间一般 1~3 天;
  • 内容违规(广告、支付、医疗、色情等)会被驳回;
  • 审核通过后,你才能“正式发布”。

🧭 Step3:发布上线

审核通过后,在后台点击【发布】按钮即可正式上线! 发布后:

  • 用户可在微信中搜索、扫码访问;
  • 可以设置“体验版”、“灰度发布”(先让部分人看到);
  • 新版本发布时重复以上步骤即可。

🧠 小可爱记忆法:

上传 → 审核 → 发布 就像“写论文 → 导师审阅 → 发表期刊”✨


🎯 总结速背表(第20页)

阶段操作工具
上传代码填版本号上传微信开发者工具
提交审核审核内容合法性微信公众平台
发布上线通过后点击发布用户可使用

💬 最后小总结:

🌸 页面跳转总结口诀:

To留、Redirect丢、Tab切栏、ReLaunch新开、Back回家。

🌸 发布流程口诀:

先上传、后审核、再发布。

🌸 比喻串联记忆:

做奶茶店(小程序)→ 设计菜单(开发)→ 打开门迎客(发布上线)。

🧩 一、第21~23页:小程序发布后的版本管理

在前面我们学了「上传 → 审核 → 发布」, 现在讲的是 —— 发布后的维护:版本管理、回滚、灰度发布


💡 背景说明

当你的小程序正式上线后,可能要:

  • 修bug;
  • 上新功能;
  • 测试不同版本的效果。

微信小程序后台支持多种“版本状态”来管理这些版本。


🌈 5.2.3 版本状态(第21~23页)

打开微信公众平台 → 「版本管理」 你会看到这些状态:

状态含义
开发版仅开发人员可预览和测试(还没提交审核)
审核中微信官方正在审查内容是否合规
审核被拒被打回,需要修改后再提交
体验版内部可体验,不对外公开
线上版本用户可正常访问的正式版本

💡 生活类比:

  • “开发版”就像你在厨房试新奶茶配方。
  • “审核中”是请食安局检查是否合规。
  • “体验版”是邀请VIP老顾客试喝。
  • “线上版”是正式上架开卖!

🧱 5.2.4 回退版本(第22页)

如果你发布了新版本结果出BUG 😱 可以通过「版本管理 → 线上版本 → 回退」来恢复之前的版本。

操作方式:

  1. 进入「版本管理」;
  2. 找到旧版本;
  3. 点击「回退」按钮;
  4. 系统将重新启用旧版为当前线上版本。

📦 注意:

  • 回退不会删除新版本;
  • 回退后用户重新打开小程序即可生效。

💡 生活类比:

像奶茶店上了新配方结果顾客吐槽太甜,就立刻恢复旧版配方 😅


🧩 5.2.5 灰度发布(第23页)

灰度发布 = “部分用户先用新版本” 比如先让 5% 用户体验新功能,确认没问题后再全量开放。

操作:

  1. 在后台版本管理 → 点击“灰度发布”;
  2. 设置比例(比如 10%、50%);
  3. 发布执行。

💡 现实类比:

先让部分顾客试喝“新奶盖口味”,确认不踩雷后,再全面推广~


🧠 小记忆口诀:

开发调试 → 审核发布 → 灰度试用 → 发现BUG → 一键回退。

像开奶茶店的【新品试制 → 上市 → 试喝 → 调整 → 回炉重造】。


🪙 二、第24~25页:小程序支付流程

终于来到高频面试题 —— 💸 “说说微信小程序的支付流程”


6.1 背景

小程序支持微信支付功能(比如买电影票、点奶茶外卖)。 流程比网页稍复杂,因为要经过微信安全验证。

我们拆成几个简单阶段👇


🧭 6.2 支付流程(第25页)

看图你会发现主要经过六步: 我来用生活场景翻译一下——

阶段微信支付做了什么生活比喻
① 用户下单调用后端生成订单号顾客下单点奶茶
② 调用统一下单接口小程序请求你自己的服务器 → 服务器再调微信支付统一下单接口店长通知收银机准备订单
③ 微信返回 prepay_id表示订单已生成,可支付收银机打印出小票编号
④ 前端发起支付小程序调用 wx.requestPayment() 弹出支付框收银员让顾客扫码付款
⑤ 用户支付微信支付系统扣款顾客付款成功
⑥ 支付回调微信通知服务器支付结果,后台更新订单状态收银机提示“付款成功”并出小票 ✅

💻 开发者角度的调用流程(简化理解)

1️⃣ 前端调用接口 /createOrder 创建订单 2️⃣ 后端调用微信统一下单 API,获取 prepay_id 3️⃣ 后端返回 prepay_id 给前端 4️⃣ 前端用 wx.requestPayment() 调起支付 5️⃣ 微信后台回调 → 通知支付结果 6️⃣ 后端更新数据库状态(成功/失败)

💡 小记忆法:

“前端下单 → 后端下单 → 微信出票 → 用户支付 → 后端确认”。

就像顾客点单、收银打印、扫码付款、打印发票的完整流程。


⚠️ 面试时高频问法:

❓ 问:小程序支付为什么要经过后端?

因为微信支付涉及商户密钥,不能在前端暴露。 所以必须由后端统一下单、签名、验签。

❓ 问:微信支付成功后如何通知服务器?

微信会自动回调商户后台的 notify_url 接口,你要在那更新订单状态。


🧠 第25页总结口诀:

小程序支付: ① 下单生成订单号 ② 调微信统一下单 ③ 拿到 prepay_id ④ 前端调起支付框 ⑤ 用户确认支付 ⑥ 微信回调通知后端

💡 比喻串联:

点单 → 收银 → 打单 → 扫码 → 付款 → 打小票。


🌸 小可爱速背总结(第21~25页)

模块关键词记忆口诀
版本管理上传、体验、回退、灰度“测试→试喝→上架→调整→回退”
支付流程下单、统一下单、支付、回调“下单→出票→扫码→付款→回调”

🧾 第26~29页:小程序支付流程(完整版)


🌸 6.1 前言

我们知道,小程序里可以点单、支付,比如:

  • 星巴克小程序点咖啡;
  • 喜茶小程序买券。

每一次支付,其实都经历了一条“后端与微信交互”的链路。 微信支付要保证安全,所以前端不能直接收钱,而要靠后台签名验证


📊 支付界面演示(第26页)

图片展示了: 1️⃣ 用户在小程序选择商品、生成订单; 2️⃣ 弹出微信支付界面(金额、商户名、支付方式); 3️⃣ 点击确认支付后 → 微信提示“支付成功”; 4️⃣ 商家系统收到支付结果回调。

🧠 小记忆:

小程序 = 顾客界面 微信支付 = 收银台 商户服务器 = 店长后台对账系统


⚙️ 6.2 支付流程详解(第27~29页)

整个支付过程其实分成 6 大步骤 我给你拆成“生活故事版”👇


🥤 Step 1:用户下单 → 生成订单号

前端调用你自己后台的接口:

wx.request({
  url: 'https://yourserver.com/createOrder',
  data: {
    totalPrice: 50,
    productId: 'milk_tea_01'
  },
  success: (res) => {
    // 返回订单号
  }
})

👉 意思是:“顾客点了一杯奶茶,系统记下了订单号 #1001。”


💼 Step 2:后端调用微信统一下单接口

你的后端收到请求后,会调用微信官方API(/pay/unifiedorder) 微信服务器会返回一个 prepay_id

🧠 小记法:

“统一下单 = 去微信总部申请收款单号。”


🎫 Step 3:后端生成签名 + 返回给前端

因为支付要验证身份,后台会生成签名(sign), 再把支付需要的五个关键参数返回给小程序:

参数说明
timeStamp时间戳(当前时间)
nonceStr随机字符串(防篡改)
package包含 prepay_id
signType签名算法
paySign支付签名(加密验证)

💳 Step 4:前端调用微信支付接口

前端拿到这些参数后,用 wx.requestPayment() 发起真正支付👇

wx.requestPayment({
  timeStamp: '1414561699',
  nonceStr: '5K8264ILTKCH16CQ2502SI8ZNMTM67VS',
  package: 'prepay_id=wx2017033010242291fcfe0db70013231072',
  signType: 'MD5',
  paySign: 'C380BEC2BFD727A4B6845133519F3AD6',
  success (res) {
    console.log('支付成功');
  },
  fail (err) {
    console.log('支付失败');
  }
})

💡 生活类比:

顾客打开付款码(前端), 微信验证签名(后台), 收银机叮一下“付款成功~💸”。


📦 Step 5:微信支付回调给商户后台

支付完成后,微信会向你后台发一个通知(HTTP回调), 里面包含订单号、金额、状态。 后台据此更新数据库。

🧠 小记法:

“顾客付款后,收银机自动给店长后台发账单。”


✅ Step 6:后台返回处理结果

商户后台必须返回 success 告诉微信“我收到了通知”, 否则微信会反复发送通知。


📊 支付时序图(第28页)

时序图对应关系如下👇

角色实际含义
小程序端顾客
开发者服务器奶茶店后台
微信支付平台微信总部收银系统

💡 流程一句话:

小程序下单 → 后端下单 → 微信出票 → 用户支付 → 微信回调 → 后端确认。


🧩 第29页 表格总结

接口名说明调用者
wx.login获取登录凭证code小程序端
createOrder生成商户订单开发者服务器
unifiedOrder统一下单(微信官方)微信支付
requestPayment唤起支付小程序端
notify_url微信回调开发者服务器

💬 6.3 结语(第29页)

支付核心要点总结:

  1. 前端不能直接发起支付请求;
  2. 一定要通过后端去微信获取签名;
  3. 后台要接收微信的回调;
  4. 记得返回 success,不然会被反复通知;
  5. 安全第一,所有密钥都要存在后端!

🧠 小口诀(第29页总结):

“前端下单,后台签单,微信出票,扫码付款,后台收款。”

—— 小程序支付五步曲 💸


🧠 第30页:小程序实现原理(开篇)

这一页是新章节的引入,标题是:

7. 说说微信小程序的实现原理?


🧩 思维导图概览:

微信小程序的实现原理主要分三大块:

模块说明
逻辑层负责业务逻辑、数据处理(JS)
视图层负责界面渲染(WXML + WXSS)
运行环境微信为小程序提供的容器(双线程机制)

🧠 生活类比:

小程序就像一家奶茶店:

  • 逻辑层 = 店员(拿单、计算、配料)
  • 视图层 = 前台柜台(菜单、展示)
  • 运行环境 = 微信商场(提供电、水、客流量)

🌸 小可爱速背总结(第26~30页)

模块内容记忆口诀
支付流程前端下单、后台签名、微信回调“下单→签名→出票→扫码→回调”
实现原理逻辑层 + 视图层 + 运行环境“店员 + 柜台 + 商场”

🧩 一、第31~33页:小程序的实现原理


🌸 7.1 背景(第31页)

微信小程序 ≠ 普通网页 它不是单线程浏览器运行,而是采用了独特的“双线程模型”:

线程作用
逻辑层(JS)处理逻辑、数据、事件响应
视图层(WXML + WXSS)负责界面渲染

💡 生活类比:

小程序就像一家奶茶店:

  • 🧋 逻辑层(JS线程) :店员在厨房做奶茶(计算、混料、准备数据);
  • 🪞 视图层(WXML线程) :前台展示菜单、收银、显示奶茶成品;
  • 🧱 Native层(微信容器) :商场基础设施,提供电、水、Wi-Fi(微信 API)。

🧠 关键点(图解释)

那张图上有三层结构:

视图层 (WebView)      ← 展示 UI
逻辑层 (JSCore)       ← 执行业务逻辑
Native层 (系统内核)   ← 连接底层能力(调用API)

它们之间通过 Native Bridge(桥梁) 进行通信:

  • JS 调用 API → 通过 Native 层发请求;
  • Native 返回结果 → 再传回 JS 或 UI。

🚦 7.2 通信机制(第32页)

小程序的双线程间是异步通信,靠数据消息来交互。 就像厨房和前台用“传菜口”传订单。

通信方式:

  • JSCore → Native:调用微信提供的接口(例如 wx.request()
  • Native → WebView:返回执行结果并更新视图。

💡 生活例子:

顾客下单(前台) → 小票送到厨房(逻辑层) → 店员做完奶茶 → 把成品信息传回前台展示。


🧩 7.3 运行机制(第33页)

运行机制指的是:

小程序启动、运行、销毁的完整过程。

类似生命周期,但更底层。

运行流程如下:

1️⃣ 启动小程序 → 微信创建逻辑层 & 视图层线程。 2️⃣ JSCore 初始化 → 执行 app.js。 3️⃣ 渲染层加载 WXMLWXSS。 4️⃣ 当你交互(点击按钮) → 逻辑层接收事件 → 计算 → 返回新数据 → 视图层更新UI。

🧠 一句话理解:

“逻辑层算,视图层画,微信帮你传话。”


🔧 7.3.1 常见引擎(第34页)

底层引擎由微信管理,不同平台有差异:

平台逻辑层引擎渲染层引擎
iOSJavaScriptCoreWKWebView
AndroidX5 JS引擎X5 WebView
小程序开发者工具NW.jsChrome WebView

💡 记忆口诀:

iOS 用 WKWebView,安卓靠 X5 来撑腰。


📦 结构图理解(第34页下方)

图中那块“App Service + View”就是:

  • App Service(逻辑层) → 管理JS逻辑;
  • View(视图层) → 管理UI显示;
  • Native层 → 桥梁,承接API调用和系统通信。

🧠 小记忆:

JS写逻辑、WXML画页面、微信帮你传中间话。


🧠 二、第35页:小程序性能优化(提高应用速度)


🌟 8.1 是什么

性能优化的目的: 👉 提升启动速度、渲染效率、交互流畅度。

图片展示的就是小程序打开时的几个关键阶段: 加载 → 初始化 → 渲染 → 展示。


📊 8.2 优化原理(第35页下半部分)

图里分成了三个阶段:

阶段对应问题优化手段
启动阶段加载慢代码分包、缓存数据
运行阶段卡顿减少 setData 调用,降低 DOM 更新次数
渲染阶段渲染慢使用虚拟列表、避免频繁重绘

💡 通俗解释 + 奶茶店类比:

阶段店里干啥优化方法
启动开门准备(加载菜单)提前备料(分包加载、缓存菜单)
运行制作奶茶(逻辑计算)店员分工(减少setData、异步任务)
渲染展示奶茶(更新UI)少摆造型(只更新变动的部分)

📦 小程序性能优化常用手段

类别优化点举例
启动优化分包加载只加载当前页面用到的文件
启动优化本地缓存缓存接口数据,避免每次都请求
渲染优化控制 setData合并多次 setData 调用
渲染优化使用 scroll-view 虚拟列表减少页面节点渲染
网络优化静态资源CDN提高图片、JS文件加载速度
逻辑优化事件节流/防抖限制点击频率、避免重复调用接口

⚡ 小记忆口诀:

“分包缓存提启动,少改setData快渲染,CDN助力稳网络,节流防抖减逻辑。”


🧠 一句话总结(第35页)

小程序的底层原理是“双线程+通信桥”, 微信帮你“传话”; 优化性能的核心是“减少加载、减少通信、减少渲染”。


🎀 小可爱速背总结(第31~35页)

模块内容记忆口诀
实现原理双线程(逻辑+视图)通信“厨房做奶茶,前台展示奶茶”
通信机制异步传输(Native桥)“厨房传菜口前台接单”
性能优化启动、运行、渲染三阶段“少加载、少通信、少重绘”

🍵 一、第36页:8.2 手段(性能优化的两大方向)

小程序的性能优化,主要有两个核心突破口👇 1️⃣ 加载优化(Loading) 2️⃣ 渲染优化(Rendering)


🥤 8.2.1 加载优化(第36页上半部分)

加载优化就是让小程序 “开门速度更快” 。 就像你开奶茶店,要在顾客进门时立刻能点单、看到菜单。


📦 优化方法 1:控制代码包大小

👉 代码包越大,加载越慢。

常见技巧:

  • 在上传代码时勾选 “上传代码时压缩” 选项;
  • 删除不必要的图片、未使用的组件;
  • 把资源(图片、icon)放CDN,减少包体积;
  • 避免一次性加载所有页面资源。

💡 小记法:

“瘦身”就是王道! 就像奶茶店别把所有原料都堆柜台上,只放常用的,其他放仓库。


📦 优化方法 2:分包加载(重点)

小程序允许把项目拆成多个“包”来按需加载:

  • 主包:启动必需内容(首页、登录页)
  • 分包:非核心页面(比如个人中心、帮助页)

📘 举个例子: 当用户第一次打开首页时, 系统只加载主包(比如菜单、下单逻辑)。 等他点进“个人中心”时,再临时下载对应分包。

💡 生活类比:

奶茶店先让顾客看菜单点单(主包), 他要看“积分记录”时再去仓库调账本(分包)。


📊 图示解释: 图中那三步其实就是: 1️⃣ 打开小程序 → 先下载主包; 2️⃣ 用户点击“分包A”页面 → 下载分包; 3️⃣ 页面加载完毕 → 注入包内容 → 打开页面。

⚠️ 小技巧: 不要让用户点击时再下载大包,否则体验上会“卡顿”; 要提前把访问率高的部分放主包。


💫 8.2.2 渲染优化(第36页下半部分)

渲染优化指的是: 👉 页面打开后,内容展示更快、更顺、更省资源。

就像奶茶店出杯时:

  • 不要一边加奶盖、一边摇珍珠;
  • 要提前备料、一次性出杯!

🪄 优化手段 1:提前加载

onLoad() 阶段就发起数据请求,不要等到 onReady() 才加载。 💡 提前准备好材料,顾客一来就能看到界面。


🪄 优化手段 2:缓存数据

用:

wx.getStorageSync()
wx.setStorageSync()

把常用数据存在本地。 比如用户信息、商品分类等就不用每次都重新请求接口。

💡 类比:

把“常点的奶茶菜单”贴在柜台上,下次不用再问顾客口味。


🪄 优化手段 3:减少 setData 使用(超重要)

👉 setData 是更新视图的关键函数,但太频繁会卡顿。

举个例子👇

❌ 错误写法:

this.setData({ name: '奶茶' })
this.setData({ price: 20 })
this.setData({ sugar: '三分糖' })

✅ 正确写法:

this.setData({
  name: '奶茶',
  price: 20,
  sugar: '三分糖'
})

💡 合并调用,一次性更新视图!

就像你别一口气喊三次“店员加糖!”“店员加冰!”“店员加奶!” 一次告诉他:“我要三分糖少冰加奶”效率更高 😆


🧱 其他优化建议

  • 不必要的数据别放进 data 里: 比如超长字符串、大数组等,没必要渲染的放到普通变量中;
  • 抽取独立组件: 把每个功能区(比如导航栏、商品卡片)做成组件, 这样单独更新不会影响整个页面。

💡 类比:

就像把奶茶店分成“点单区、制茶区、收银区”, 各做各的事,互不干扰。


📖 第37页:8.3 总结

最后,这页总结了优化的关键要点👇


✅ 小程序启动加载性能

目标手段
降低启动等待控制包大小、分包加载
加快首次体验预请求、缓存数据
减少卡顿优化图片、避免反复加载

🧠 小口诀:

“包瘦一点,先装常用,勤备缓存,轻上阵。”


✅ 小程序渲染性能

目标手段
提高渲染效率合并 setData 调用
减少重绘范围抽组件,独立更新
优化用户体验异步加载、缓存数据

🧠 小口诀:

“少 setData,多组件,少通信,多缓存。”


🎀 小可爱速背总结(第36~37页)

模块内容记忆口诀
加载优化控包、分包、缓存“轻启动,分开装”
渲染优化合并 setData、独立组件“少喊多做,分工明确”
综合目标提速 + 流畅 + 不卡“瘦身 + 缓存 + 合并 + 分区”

🌟 一句话总结:

小程序优化的精髓就是: “开门快、出杯快、更新轻、体验顺。” ☕✨