微信小程序入门指南
什么是小程序?
- 运行在微信里面的html
- 2017-01-09上线
- 大小限制:2M
注册小程序账号
- 建议使用全新的邮箱,没有注册过其他小程序或者公众号的。
- 访问注册⻚⾯,耐⼼完成注册即可。
获取appid & secret
- 由于后期调⽤微信⼩程序的接⼝等功能,需要索取开发者的⼩程序中的 appid 和 secret ,所以在注册成功后, 可登录,然后获取appid 和 secret作为配置文件,保存起来。
开发小程序储备知识
Flex 布局简介
什么是 flex 布局?
移动端相关知识
物理像素
- 屏幕的分辨率
- 设备能控制显示的最小单元,可以把物理像素看成是对应的像素点
设备独立像素 & css 像素
- 设备独立像素(也叫密度无关像素),可以认为是计算机坐标系统中的一个点,这个点代表一个可以由程序使用并控制的虚拟像素(比如:CSS 像素,只是在 android 机中 CSS 像素就不叫”CSS 像素”了而是叫”设备独立像素”),然后由相关系统转换为物理像素。
dpr 比 & DPI & PPI
- dpr: 设备像素比,物理像素/设备独立像素 = dpr, 一般以 Iphon6 的 dpr 为准 dpr = 2
- PPI: 一英寸显示屏上的像素点个数
- DPI:最早指的是打印机在单位面积上打印的墨点数,墨点越多越清晰
移动端适配方案
viewport 适配
rem 适配
- 1 为什么做 rem 适配
- a) 机型太多,不同的机型屏幕大小不一样
- b) 需求: 一套设计稿的内容在不同的机型上呈现的效果一致,根据屏幕大小不 同的变化,页面中的内容也相应变化
- 2 实现:
function remRefresh() { let clientWidth = document.documentElement.clientWidth; // 将屏幕等分 10 份 let rem = clientWidth / 10; document.documentElement.style.fontSize = rem + 'px'; document.body.style.fontSize = '12px'; } window.addEventListener('pageshow', () => { remRefresh() }) // 函数防抖 let timeoutId; window.addEventListener('resize', () => { timeoutId && clearTimeout(timeoutId); timeoutId = setTimeout(() =>{ remRefresh() }, 300) })
第三方库实现
lib-flexible + px2rem-loader
小程序特点
小程序特点概述
- 没有 DOM
- 组件化开发: 具备特定功能效果的代码集合
- 体积小,单个压缩包体积不能大于 2M,否则无法上线
- 小程序的四个重要的文件
- a) *.js
- b) *.wxml —> view 结构 -—> html
- c) *.wxss —> view 样式 –—> css
- d) *. json -—> view 数据 –—> json 文件
小程序适配方案: rpx (responsive pixel 响应式像素单位)
- a) 小程序适配单位: rpx
- b) 规定任何屏幕下宽度为 750rpx
- c) 小程序会根据屏幕的宽度不同自动计算 rpx 值的大小
- d) Iphone6 下: 1rpx = 1 物理像素 = 0.5px
小程序框架接口
App
- 全局 app.js 中执行 App()
- 生成当前应用的实例对象
- getApp()获取全局应用实例
Page
- 页面.js 中执行 Page()
- 生成当前页面的实例
- 通过 getCurrentPages 获取页面实例
wxml 语法
- 数据绑定
- 初始化数据
- 模板结构中使用双大括号 {{message}}
- 注意事项: 小程序中为单项数据流 model —> view
修改数据
this.setData({message: ‘修改之后的数据’}, callback)
- a) 同步修改: this.data 值被同步修改
- b) 异步更新: 异步将 setData 函数用于将数据从逻辑层发送到视图层(异步)
事件绑定
事件分类
绑定事件
向事件对象传参
- 语法: data-key=value
- 获取: event.target.dataset.key || event.currentTarget.dataset.key
- Event.target 和 event.currentTarget 的区别
- - a) Event.target 是触发事件的对象,但不一样是绑定事件的对象,如: 事件委托,冒泡
- - b) currentTarget 触发时间的对象一定是绑定事件的对象, 没有事件委托
列表渲染
语法说明
- wx:for=’{{arr}}’
- wx:key=’{{唯一值}}’
注意事项
- 默认的个体: item
- 默认的下标: index
- 自定义个体变量名称: wx:for-item=’myItem’
- 自定义下标变量名称: wx:for-index=’myIndex’
条件渲染
语法说明
- wx:if=’条件’
- wx:elif=’条件’
- wx:else
wx:if VS hidden
- hidden 用法: <view hidden=’{{true}}’ ></view>
- wx:if 等同于 v-if, 条件为 false 的时候不加载,条件切换的时候决定元素销毁或者重新加载渲染
- hidden 等同于 v-show, 始终加载元素, 条件切换的时候决定元素的显示和隐藏
生命周期
对应阶段说明
小程序 API
API 使用说明
- 小程序提供了很多实用的方法供开发者使用
- 小程序全局对象是: wx
- 所有的 API 都保存在 wx 对象中
常用 API
界面交互
- 显示消息提示框: wx.showToast()
- 显示消息加载框: wx.showLoading()
- 关闭消息提示框: wx.hideToast()
- 关闭消息加载框: wx.hideLoading()
路由跳转
- wx.navigateTo()
- wx.redirectTo()
- wx.switchTab()
网络请求
- wx.request()
本地存储
- wx.setStorage()
- wx.setStorageSync()
- wx.getStorage()
- wx.getStorageSync()
- wx.removeStorage()
- wx.removeStroageSync()
- wx.clearStorage()
- wx.clearStorageSync()
1. 除非用户主动删除或因存储空间原因被系统清理,否则数据都一直可用 2. 单个 key 允许存储的最大数据长度为 1MB 3. 所有数据存储上限为 10MB
媒体
- wx.getBackgroundAudioManager()
- wx.playVoice()
快速查找技巧
- 小程序的初学者可能对于小程序的官网的众多内容一时毫无头绪,无从下手不知道从哪来找想要的内容
- 当在小程序中想要实现某一种布局,查看:组件
- 当在小程序中想要实现某一个功能,查看: API
- 当在小程序中想要进行某一个配置或者某一种页面语法,查看: 框架 + 指南
- 查看小程序官网的时候要细心,最好是将要使用的 API 的相关内容看完整,因为 API 的配置及限制较多
小程序特点
相关配置
- 每个微信小程序需要事先设置通讯域名,小程序只可以跟指定的域名进行网络通信
- 服务器域名请在 「小程序后台-开发-开发设置-服务器域名」 中进行配置
- 默认超时时间和最大超时时间都是 60s
- 超时时间可以在 app.json 中通过 networktimeout 配置
注意事项
- 小程序为了安全起见只支持 Https 请求
- wx.request 最大并发限制 10 个
消息订阅发布
- 使用第三方库: pubsub-js
- 安装: npm install pubsub-js
- 使用:
a) Import PubSub from ‘pubsub-js’ b) 订阅消息: PubSub.subscribe(‘eventName’, callback) c) 发布消息: PubSub.publish(‘eventName’, data) d) 取消订阅: PubSub.unsubscribe(‘eventName’)
小程序获取用户基本信息
首次登陆获取
- Button 组件设置 open-type 属性为 getUserInfo
- <button open-type=’getUserInfo’></button>
- 设置后首次登陆点击 button 可以弹出授权窗口
- 注意: 授权的动作只发生一次,除非清除缓存,点击 butotn 授权一次之后再点击失效,不会弹出授权窗口
- 官网对应地址
- wx.getUserInfo() (PS:授权之后获取)
小程序获取用户唯一标识(openId)
- wx.login()
- 发送 code 给服务器端
- 服务器端发送请求携带参数(code, appSecret, appId)给微信服务器获取 openId
- appSecret,appId 在小程序首页获取
- 服务器获取 openId 后进行加密返回给前端
小程序分包流程
为什么要分包
- 小程序要求压缩包体积不能大于 2M,否则无法发布
- 实际开发中小程序体积如果大于 2M 就需要使用分包机制进行发布上传
- 分包后可解决 2M 限制,并且能分包加载内容,提高性能
- 分包后单个包的体积不能大于 2M
- 分包后所有包的体积不能大于 16M
分包形式
- 常规分包
1. 开发者通过在 app.json subpackages 字段声明项目分包结构
2. 特点:
a) 加载小程序的时候先加载主包,当需要访问分包的页面时候才加载分包内容
b) 分包的页面可以访问主包的文件,数据,图片等资源
c) 主包:
i. 主包来源: 除了分包以外的内容都会被打包到主包中
ii. 通常放置启动页/tabBar 页面
- 独立分包
1. 设置 independent 为 true
2. 特点:
a) 独立分包可单独访问分包的内容,不需要下载主包
b) 独立分包不能依赖主包或者其他包的内容
3. 使用场景
a) 通常某些页面和当前小程序的其他页面关联不大的时候可进行独立分包
b) 如:临时加的广告页 || 活动页
- 分包预下载
1. 配置
a) app.json 中设置 preloadRule 选项
b) key(页面路径): {packages: [预下载的包名 || 预下载的包的根路径])}
2. 特点:
a) 在加载当前包的时候可以设置预下载其他的包
b) 缩短用户等待时间,提高用户体验
小程序转发分享
分享实现
- Button 组件设置 open-type 为 share
- <button open-type=’share’ ></button>
自定义分享内容
- 生命周期回调中 onShareAppMessage 回调中 return 对象设置自定义内容
设置体验权限
- 开发阶段分享给微信好友,默认没有体验权限,无法打开分享小程序,需要在开发
- 最多添加 15 个微信好友
小程序支付流程
支付流程详细说明
1. 用户在小程序客服端下单(包含用户及商品信息)
2. 小程序客户端发送下单支付请求给商家服务器
3. 商家服务器同微信服务器对接获取唯一标识 openID
4. 商家服务器根据 openId 生成商户订单(包含商户信息)
5. 商家服务器发送请求调用统一下单 API 获取预支付订单信息
6. 商家对预支付信息签名加密后返回给小程序客户端
a) 签名方式: MD5
b) 签名字段:小程序 ID, 时间戳, 随机串,数据包,签名方式
7. 用户确认支付(鉴权调起支付)
a) API: wx.requestPayment()
8. 微信服务器返回支付结果给小程序客户端
9. 微信服务器推送支付结果给商家服务器端