前言
工作中很少有机会写微信小程序,想学习了解一下整个微信小程序的开发流程,有不对的地方欢迎指正。
初识小程序
微信小程序,简称小程序,是一种不需要下载安装即可使用的应用,打开即可使用,不用等待太久,随时随地,触手可及。
优势
- 无需下载安装,无需注册,用完即走,不会过多地占用手机内存
- 小程序可以跨平台(苹果或安卓系统)运行,其开发门槛和成本比APP开发要低
- 打开速度比H5(HTML5)要快,接近于原生App的体验
- 安卓手机可以直接添加小程序至手机桌面,打开方式和App一样方便
劣势
- 小程序目前无法直接分享至朋友圈,只能分享给微信好友或微信群
- 小程序的二维码不支持长按识别,只能通过微信扫一扫才能打开
- 小程序没有push功能,不能给用户推送消息和个人相关的通知消息
- 小程序没有用户体系,用户不需要注册,因此用户用完即走,很难形成用户体系
小程序接入流程
接入流程主要分为4大步骤:注册、信息完善、开发小程序、审核和发布小程序
1. 注册
在微信公众平台注册小程序,完成注册后可以同步进行信息完善和开发。
2. 信息完善
填写小程序基本信息,包括名称、头像、介绍及服务范围等。
3. 开发小程序
完成小程序开发者绑定,开发信息配置后,开发者可下载开发者工具,参考开发文档进行小程序的开发和调试。
4. 审核和发布小程序
完成小程序开发后,提交代码至微信团队审核,审核通过后即可发布(公测期间不能发布)。
小程序开发准备
小程序开发必须要在专门的开发者工具进行开发,开发者工具下载地址
新建小程序
创建小程序,输入项目名称、目录、AppID等,还可以选择微信提供的一些模板,快速生成一个功能相对齐全的小程序。
微信开发者工具
微信开发者工具主界面,从上到下、从左到右分别为:菜单栏、工具栏、模拟器、编辑器、调试器。
小程序调试工具
用来调试小程序,非常类似于网页的调试工具,分为以下几个功能模块:
Wxml
:页面结构和结构对应的 wxss 属性Console
:控制台,输出提示信息Sources
:当前项目的脚本文件Network
:观察和显示request
和socket
的请求情况Perfomance
:性能分析Memory
:内存AppData
:当前小程序的具体数据Storage
:显示当前项目使用wx.setStorage
或者wx.setStorageSync
存储的数据Security
: 安全性Sensor
:模拟地理位置和模拟移动设备表现,用于调试重力感应 APIMock
:模拟接口Audits
:体验评分检测Vulnerability
:发现并修复小程序内的接口安全漏洞,提升小程序安全性
小程序框架
微信团队为小程序提供的框架命名为 『MINA 应用框架』 ,通过封装微信客户端提供的文件系统、网络通信、任务管理、数据安全等基础功能,对上层提供一整套
Javascript API
,让开发者能够方便的使用微信提供的各种功能与能力。
渲染层和逻辑层
小程序的运行环境分成渲染层和逻辑层,其中 WXML
模板和 WXSS
样式工作在渲染层,JS
脚本工作在逻辑层。
由2个线程管理:渲染层的界面使用了WebView
进行渲染;逻辑层采用JsCore
线程运行JS
脚本。一个小程序存在多个界面,所以渲染层存在多个WebView
线程,这两个线程的通信会经由微信客户端做中转,逻辑层发送网络请求也经由Native
进行转发。
MVVM 模式
MINA
框架的核心是MVVM
模式,当修改数据的时候,只需要在逻辑层修改数据,视图层就会做出相应的更新。
MVVM
的核心是ViewModel
层,负责转换Model
层中的数据对象来让数据更容易管理和使用,向上与View
视图层进行双向数据绑定,向下与Model
层通过接口请求进行数据交互,起承上启下的作用。
代码构成
一个小程序主要包含pages
页面、utils
工具类库、app
相关的一些配置、project.config.json
项目配置。
pages
页面(小程序的每一个页面)由4个文件组成:js
: 页面逻辑,相当于控制层,也包括部分数据wxml
:页面结构展示,相当于视图层(view)json
:页面配置,配置一些页面展示的数据,充当部分的模型wxss
:页面样式表
utils
工具类库:常用的可共用的工具类app
配置:必须放在根目录下app.js
:全局的小程序逻辑处理app.wxss
:小程序的公共样式表app.json
:小程序的公共配置,可以配置页面路径、窗口表现、底部 tabBar等,更多可查看官网全局配置项
小程序开发
App 程序
小程序主体相关配置,宿主环境提供了 App()
构造器用来注册一个程序App
,我们可以在app.js
页面进行注册,在其他的 js 脚本中可以通过getApp()
来获取程序实例。
app.js
通过App()
注册小程序,接收Object
类型参数,指定生命周期回调函数,也可指定全局数据,其他页面通过getApp()
来获取数据。
App({
globalData: '全局数据',
// 初始化完成时触发,全局只触发一次
async onLaunch(e) {
},
// 当小程序启动,或从后台进入前台显示,会触发 onShow
onShow() {
},
// 小程序从前台进入后台,触发 onHide
onHide() {
},
// 当小程序发生脚本错误,或者 API 调用失败时,会触发 onError 并带上错误信息
onError() {
},
});
其他页面获取app.js
中定义的全局数据
const app = getApp();
console.log(app.globalData);
app.json
当前小程序的全局配置,包括了所有页面路径、标题栏显示、网络超时时间、底部 tab 等。
{
// 小程序的默认启动路径,如果不指定,则为 pages 里的第一项
"entryPagePath": "pages/catlist/index",
// 页面路径
"pages": [
"pages/catlist/index",
...
],
// 分包路径
"subPackages": [
{
"root": "common",
"name": "common",
"pages": [
"pages/shareappmessage/index",
"pages/scan/index"
]
}
],
// 小程序的状态栏、导航条、标题、窗口背景色
"window": {
"backgroundTextStyle": "dark",
"navigationBarBackgroundColor": "#fff",
"navigationBarTitleText": "宠物乐园",
"navigationBarTextStyle": "black"
},
// 多 tab 应用(客户端窗口的底部或顶部有 tab 栏可以切换页面),可以通过 tabBar 配置项指定 tab 栏的表现,以及 tab 切换时显示的对应页面
"tabBar": {
"color": "#1485EE",
"selectedColor": "#FF514E",
"list": [
{
"pagePath": "pages/catlist/index",
"text": "列表",
"iconPath": "image/02.png",
"selectedIconPath": "image/022.png"
},
{
"pagePath": "pages/mycat/index",
"text": "我的",
"iconPath": "image/04.png",
"selectedIconPath": "image/044.png"
}
]
},
// 启用新版的程序样式
"style": "v2",
// 指定`sitemap.json`的位置,`sitemap.json`文件用于配置小程序及其页面是否允许被微信索引
// https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/sitemap.html
"sitemapLocation": "sitemap.json"
}
app.wxss
全局的公共样式,详见pages
中wxss
模块的介绍
Pages 页面
一个小程序可以有多个页面,页面之间可相互跳转。在app.json
文件中,pages
配置项增加一个页面路径,小程序就会自动在pages
目录下创建对应的文件夹,每一个pages
下都包含wxml
、wxss
、js
、json
文件。
wxml
框架设计的一套标签语言,结合基础组件、事件系统,可以构建出页面的结构。
- 基础组件
view
: 视图容器text
:文本image
:图片input
:输入框button
:按钮textarea
:长文本输入框- ...
- 数据显示
{{xxx}}
:数据绑定wx:if
、wx:elif
、wx:else
:条件渲染wx:for
:列表渲染- ...
- 事件
bindtap
:点击事件bindinput
:输入事件bindtouchstart
:手指触摸动作开始bindtouchmove
:手指触摸后移动- ...
- 事件传递参数
data-xxx
:绑定在组件上,事件时可通过dataset
拿到
<view class="add">
<view class="add_title">
<view class="add_title_size">姓名</view>
<input
bindinput="inputTitle"
class="add_title_inp"
placeholder="请输入宠物宝宝姓名"
value="{{title}}"
type="text"
/>
</view>
<view class="add_title">
<view class="add_title_size">年龄</view>
<slider
value="{{age}}"
min="1"
max="20"
show-value
bindchange="updateAge"
></slider>
</view>
<view class="add_title">
<view class="add_title_size">品种</view>
<picker
header-text="请选择品种"
range="{{kindList}}"
value="{{kindValue}}"
bindchange="selectKind"
>
{{ kindValue === null ? '请选择' : kindList[kindValue]}}
</picker>
</view>
<view class="add_content">
<view class="add_content_title">描述</view>
<view class="add_content_main">
<textarea
class="add_content_main_text"
bindinput="bindinput"
placeholder="{{textarea}}"
value="{{value}}"
/>
</view>
</view>
<view class="add_title">
<view class="add_title_size">是否可见</view>
<view class="add_title_switch">
<switch
color="rgba(24, 144, 255, 100)"
checked="{{visible}}"
bindchange="updateVisible"
/>
</view>
</view>
<view class="add_button" bindtap="createCat">
保存
</view>
</view>
wxss
样式语言,具有css
大部分的特性,wxss
在css
基础上做了一些扩充和修改。
-
尺寸单位
新增尺寸单位
rpx
,可以根据屏幕宽度进行自适应。规定屏幕宽为750rpx。如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则750rpx = 375px = 750物理像素,1rpx = 0.5px = 1物理像素。 -
样式导入
使用@import
语句可以导入外联样式表,@import
后跟需要导入的外联样式表的相对路径,用;
表示语句结束。
@import "common.wxss";
javascript
提供Page()
构造器来注册页面,指定页面的初始数据、生命周期回调、事件处理函数等。
提供以下生命周期回调:
onLoad
:页面创建时执行onShow
:页面出现在前台时执行onReady
:页面首次渲染完毕时执行onHide
: 页面从前台变为后台时执行onUnload
: 页面销毁时执行onPullDownRefresh
: 触发下拉刷新时执行onReachBottom
: 页面触底时执行onShareAppMessage
: 页面被用户分享时执行onPageScroll
: 页面滚动时执行onResize
: 页面尺寸变化时执行onTabItemTap
:tab 点击时执行
Page({
/**
* 页面数据
*/
data: {
id: '',
title: "",
kindValue: null,
age: 1,
value: '',
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
// 设置小程序标题
wx.setNavigationBarTitle({
title: '添加宠物宝宝',
})
if (options) {
const catList = JSON.parse(wx.getStorageSync('catList'));
const item = catList.find(item => item.id === options.id);
this.setData({
id: options.id,
title: item.name,
age: item.age,
kindValue: this.data.kindList.indexOf(item.kind),
value: item.desc,
visible: item.visible
})
}
},
// 对应`wxml`模板中的绑定事件
updateAge(e) {
this.setData({
age: e.detail.value
})
},
bindinput(e) {
this.setData({
value: e.detail.value
})
},
// 通过currentTarget.dataset.id取绑定在 wxml模板上 data-xxx 的值
editCat(item) {
wx.navigateTo({
url: `../addcat/index?id=${item.currentTarget.dataset.id}&edit=true`,
});
},
...生命周期函数
})
注意:修改 data
中的数据需要通过setData
方法进行修改
this.setData({
age: e.detail.value
})
json
可以通过app.json
对全局的标题栏等进行配置,也可以对某一个页面进行配置。
navigationBarBackgroundColor
:导航栏背景颜色navigationBarTextStyle
:导航栏标题颜色,仅支持black
/white
navigationBarTitleText
:导航栏标题文字内容navigationStyle
:导航栏样式enablePullDownRefresh
:是否开启当前页面下拉刷新
小程序发布
开发过程中,我们可以通过微信开发者工具的『预览』和『真机调试』功能进行调试。
没问题后通过微信开发者工具的『上传』按钮进行代码上传。
上传时需要输入版本号和备注
上传成功后会出现上传成功的提示,还会出现如下的代码质量提示
有时还会出现如下上传失败的提示
这时就需要进行分包优化,参考这里,分包优化后重新进行上传。
上传成功后,登录『微信公众平台』查看『版本管理』,就可以看到我们刚才上传的版本代码
开发阶段,可以选为体验版,微信扫码查看即可。
结语
到这里,小程序的一个小小的 demo 就完成了,但也仅仅只是入门,还是要在项目中才能够更深入了解和使用。
部分代码示意如下(代码片段无法实现微信小程序,只能看代码了):
学习的路任重而道远,持续学习 ing!