对于开发者而言,小程序开发门槛相对较低,难度不及原生APP开发和h5开发,可以知足简单的基础应用,适合生活服务类线下商铺以及非刚需低频应用。javascript
2016年1月11日,微信之父张小龙解读了微信的四大价值观,并提出正在研究新的形态-「微信小程序」;html
_四大价值观:_1.一切以用户价值为依归;1.让创造发挥价值;3.一个好的东西(或者工具)是用完即走的;4.尽量的让商业化存在于无形之中。前端
2016年9月21日,微信小程序正式开启内测,腾讯云正式上线微信小程序解决方案,提供小程序在云端服务器的技术方案;vue
2017年1月9日,历时一年,第一批小程序正式上线;java
2017年12月28日,微信更新的 6.6.1 版本开放了小游戏,微信启动页面还重点推荐了小游戏「跳一跳」,并在首页下拉中可查看本身最近访问的小程序。node
1.官方微信公众平台有涉及开发各阶段的比较健全的文档。是开发者最好的学习途径;
2.微信开发者工具;
3.微信承载着小程序的整个流程。包括 接入 + 开发 + 调试 + 编译 + 测试 + 上传发布 + 推广运行等。
4.小程序并不等同于h5项目;二者有明显的区别;jquery
官网对使用接入流程及使用有详细的介绍。android
根据指引填写信息和提交相应的资料,在微信公众平台注册小程序。快速跳转git
填写小程序基本信息,包括名称、头像、服务范围等。设置
管理员设置、项目成员及权限配置
小程序ID及秘钥
服务器域名配置
腾讯云配置
开发者工具es6
完成小程序开发配置后,开发者可下载开发者工具参考开发文档进行小程序的开发和调试。
完成小程序开发后,提交代码至微信团队审核,审核经过后便可发布。
云真机测试
区别于H5移动端开发时的开发工具+浏览器Device Mode预览的模式,小程序的开发有基于本身的开发者工具。微信官方推出的微信开发者工具,集成了公众号网页调试和小程序调试两种开发模式。
咱们已经习惯于在webstorm等IDE工具上快捷开发,微信开发者工具上编码总感受不是那么流畅。
固然小程序编码彻底能够在这些编辑器上进行,但目前各IDE工具尚未比较全方位的插件来替代快速开发,只有一些不太完整的插件。且就算在其余工具开发代码,仍是离不开微信开发者工具的配合。查看效果、调试页面等目前还需在开发者工具进行。
在webstorm编写代码,首先要识别.wxss和.wxml需配置文件类型:如:
咱们接触使用过好几种前端MVVM框架或者前端模板引擎,能够把小程序理解为相似vue的h5前端框架,不过也存在着明显的差别。
小程序不是HTML5,本质上是HyBrid技术的应用。Hybrid App(混合模式移动应用)是介于Native App(原生)、以 HTML5 为表明的 Web App(基于Web的系统和应用)二者之间的app,它就是Native结合Web混合开发,所以兼具了Native App的大部分优点,也兼具Web App使用H5跨平台开发低成本的特色。
固然微信小程序的总体开发语法偏向H5,但编译运行等则差别明显。
- 在 iOS 上,小程序的 javascript 代码是运行在 JavaScriptCore 中,是由 WKWebView 来渲染的,环境有 iOS八、iOS九、iOS10;
- 在 Android 上,小程序的 javascript 代码是经过 X5 JSCore来解析,是由 X5 基于 Mobile Chrome 53/57 内核来渲染的;
- 在 开发工具 上,小程序的 javascript 代码是运行在 nwjs 中,是由 Chrome Webview 来渲染的;
- 传统HTML5在加载的时候受限于网络环境,须要顺序加载HTML、CSS、JS,而后返回数据,最后渲染页面显 示在浏览器中。用户常常须要等待很长时间,体验会受到影响。
- 相比之下,小程序的两个线程:Appservice Thread和View Thread会同时进行、并行加载,甚至Appservice Thread会更早执行,当视图线程加载完,通知Appservice,Appservice 会把准备好的数据用setData的方法返回给视图线程。
小程序的这种优化策略,能够减小用户的等待时间、加快小程序的响应速度。
参考文档
此外开发的具体区别见下文。
微信小程序开发门槛低,除了基于javaScript的语法入门简单的特色,还归功于官网提供了整个开发流程详尽的参考文档,减小自行摸石头过河的时间;官方开发者社区也提供了开发者互相交流、分享经验、反馈bug,快速解决问题的开放平台(目前帖子很少-.-!)。
快速入口:接入指南、设计规范、开发指南、框架设计、基础组件、微信原生API、开发者工具、运营规范、数据分析; 开发者社区; 微信小游戏开放中...微信小游戏文档连接(临时)
有h5开发、vue框架等开发经验,大概看一下文档,进行微信开发毫无障碍。具体开发
网上有基于小程序的开发框架及UI组件, 同时可借助网上已有开源项目熟悉具体项目开发。 做为参考:微信小程序开源项目库集合、微信小程序资源整理(比较老旧);
具体开发前最好先熟悉一下微信开发者工具!
在小程序默认的项目模板基础上开发。
创建普通快速启动模板选项
能够快速创建一个dome项目结构。
- json 后缀的 JSON 配置文件
- wxml 后缀的 WXML 模板文件
- wxss 后缀的 WXSS 样式文件
- js 后缀的 JS 脚本逻辑文件
- .wxs 后缀的 小程序 脚本文件
其中根目录下的app.json、app.js是必须的,文件名不能修改。(app.json做为入口文件,缺失直接致使项目没法运行;缺失app.js会致使没法预览、没法上传)。
具体每一个页面中四种类型文件名保持一致,小程序加载页面时,会根据页面路径,读取该路径下同名的其余几个文件类型。
在项目的根目录有一个 app.json
和 project.config.json
配置文件
app.json
app.json
文件用来对微信小程序进行全局配置,决定页面文件的路径、窗口表现、设置网络超时时间、设置多 tab 等。
"pages": [ // 当前小程序全部页面路径配置 *小程序中新增/减小页面,都须要对 pages 数组进行修改*
"pages/index/index", // 数组第一项会被指定为程序的首页
"pages/logs/logs"
],
"window": { // 全局样式配置,设置小程序的状态栏、导航条、标题、窗口背景色
"backgroundTextStyle": "light",
"navigationBarBackgroundColor": "#fff",
"navigationBarTitleText": "微信小程序",
"navigationBarTextStyle": "black"
},
"tabBar": { // 底部或顶部的 tab 栏配置,可配置颜色、点击表现等,点击能够切换页面
"color": "#6e6d6b",
"selectedColor": "#e64340",
"borderStyle": "black",
"backgroundColor": "#D2F2A1",
"list": [ // tab栏只能配置最少2个、最多5个,tab 按数组的顺序排序。
{
"pagePath": "pages/index/index",
"iconPath": "images/nav/home-off.png",
"selectedIconPath": "images/nav/home-on.png",
"text": "首页"
},
{
"pagePath": "pages/my/index",
"iconPath": "images/nav/my-off.png",
"selectedIconPath": "images/nav/my-on.png",
"text": "个人"
}
]
},
"networkTimeout": { // 能够设置各类网络请求的超时时间
"request": 10000,
"downloadFile": 10000
},
"debug": true // 是否在开发者工具中开启 debug 模式,方便调试
复制代码
配置项细节能够参考文档 小程序的配置app.json;
project.config.json
工具的一些个性化配置,例如界面颜色、编译配置等。
配置项细节能够参考文档 [开发者工具的配置](mp.weixin.qq.com/debug/wxado… %E7%8A%B6%E6%80%81%E5%B1%95%E7%A4%BA)。
page.json
能够对本页面的窗口表现、属性进行配置,例如具体页面顶部颜色、是否容许下拉刷新等等。页面中配置项会覆盖 app.json 的 window 中相同的配置项。
配置项细节能够参考文档
[官方文档]
在小程序中全部页面的路由所有由框架进行管理。须要在app.json中配置好页面路径信息,多tab栏应用一样设置好页面路径。
快速新建路由及页面的两种方法:
1.开发者工具编辑器中新建目录后新建page;
2.app.json文件中pages下直接增长目录页面路径,保存后自动生成页面目录。
小程序以页面栈的形式维护了当前的全部页面,表现为路由页面切换的规则,当发生路由切换的时候,内部维护出入栈数据。入栈则是至关因而 缓存了页面加载的路径,出栈则至关因而清除了页面加载路径,当清除后,点击返回按钮时,则不会返回,或则就不存在返回按钮。
不一样的路由切换方式,页面栈的表现不一样,以下图:
getCurrentPages()
函数用于获取当前页面栈的实例,以数组形式按栈的顺序给出,第一个元素为首页,最后一个元素为当前页面。 不要尝试修改页面栈,会致使路由以及页面状态错误。
可直接调用查看当前页面栈,看下图,包含的信息比较丰富。
跳转的页面必需要在app.json中注册。
路由触发方式有 API 调用(5种方法)、navigator 组件跳转[文档] 和 Tab 切换三种方式;
对于路由的触发方式以及页面生命周期函数以下:
api接口说明,配合页面栈的表现理解:
wx.navigateTo
,原页面保留,可以使用wx.navigateBack
返回到原页面,只能打开非 tabBar 的页面的路径。wx.redirectTo
页面重定向,关闭当前页面,只能打开非 tabBar 的页面的路径。wx.navigateBack
,关闭当前页面,返回上一页面或多级页面。可经过 getCurrentPages()) 获取当前的页面栈,决定须要返回几层。wx.switchTab
,跳转到 tabBar 页面,并关闭其余全部非 tabBar 页面,只能打开 tabBar 页面。wx.reLaunch
,关闭全部页面,从新打开到应用内的某个页面,重启动,能够打开任意页面。navigator组件内的open-type属性值与api对应,调用效果一致。
小程序启动会有两种状况,一种是「冷启动」,一种是「热启动」。
假如用户已经打开过某小程序,而后在必定时间内再次打开该小程序,此时无需从新启动,只需将后台态的小程序切换到前台,这个过程就是热启动;
冷启动指的是用户首次打开或小程序被微信主动销毁后再次打开的状况,此时小程序须要从新加载启动。
当用户点击左上角关闭,或者按了设备 Home 键离开微信,小程序并无直接销毁,而是进入了后台;当再次进入微信或再次打开小程序,又会从后台进入前台。须要注意的是:只有当小程序进入后台必定时间,或者系统资源占用太高,才会被真正的销毁。
小程序没有重启的概念,当小程序进入后台,客户端会维持一段时间的运行状态,超过必定时间后(目前是5分钟)会被微信主动销毁;
置顶的小程序不会被微信主动销毁;
当收到系统内存告警也会进行小程序的销毁;
小程序冷启动时若是发现有新版本,将会异步下载新版本的代码包,并同时用客户端本地的包进行启动,即新版本的小程序须要等下一次冷启动才会应用上。
小程序中的javaScript脚本支持大部分ES6语法(部分特性受运行内核影响,支持程度不一样);也支持模块化;能够调用微信特有的API。
但没有操做DOM的能力(Js语言自己就是不包括DOM操做的,DOM操做是浏览器环境为JS作的扩展)。
负责与WXHL进行交互,包括用户操做事件、页面组件的配置参数变更。调用微信原生API,实现丰富的手机端操做功能。
小程序app.js中使用 App()
函数用来注册一个小程序。接受一个 object 参数,其指定小程序的生命周期函数等。 (多个app()注册都会执行)
例子:
App({
/**
* 当小程序初始化完成时,会触发 onLaunch(全局只触发一次)
*/
onLaunch: function () {
// 展现本地存储能力
var logs = wx.getStorageSync('logs') || []
logs.unshift(Date.now())
wx.setStorageSync('logs', logs)
// 登陆
wx.login({
success: res => {
// 发送 res.code 到后台换取 openId, sessionKey, unionId
}
})
// 获取用户信息
wx.getSetting({
success: res => {
if (res.authSetting['scope.userInfo']) {
// 已经受权,能够直接调用 getUserInfo 获取头像昵称,不会弹框
wx.getUserInfo({
success: res => {
// 能够将 res 发送给后台解码出 unionId
this.globalData.userInfo = res.userInfo
// 因为 getUserInfo 是网络请求,可能会在 Page.onLoad 以后才返回
// 因此此处加入 callback 以防止这种状况
if (this.userInfoReadyCallback) {
this.userInfoReadyCallback(res)
}
}
})
}
}
})
},
/**
* 当小程序启动,或从后台进入前台显示,会触发 onShow
*/
onShow: function (options) {
},
/**
* 当小程序从前台进入后台,会触发 onHide
*/
onHide: function () {
},
/**
* 当小程序发生脚本错误,或者 api 调用失败时,会触发 onError 并带上错误信息
*/
onError: function (msg) {
},
globalData: { // 全局变量
userInfo: null
}
})
复制代码
约定 在app()
函数的globalData
对象中设置全局变量。其余逻辑层中经过getApp()获取实例后读取全局变量。
[官方文档]
页面事件处理函数、生命周期、setData()函数更新页面数据等查看文档。
Page()
函数用来注册一个页面。
Page函数接受一个 object 参数,用以指定页面的初始数据、生命周期函数、事件处理函数等。
object 参数内容在页面加载时会进行一次深拷贝,需考虑数据大小对页面加载的开销,下图为参数概要:
把data对象称为初始数据,是由于在页面第一次渲染时,data对象会以 JSON 的形式由逻辑层传至渲染层,渲染层经过 WXML 对数据进行绑定。 然后续直接更改data对象值,将没法改变页面的状态,会形成数据不一致(这不一样于Vue、angular的数据双向绑定)。
其数据必须是能够转成 JSON 的格式:字符串,数字,布尔值,对象,数组。
逻辑层更新视图层页面数据,须要调用setData
函数。他是Page原型上添加的方法Page.prototype.setData()
。setData
函数调用时改变对应的 this.data 的值(同步),将数据从逻辑层发送到视图层(异步)。
第二个参数callback(选填) 是一个回调函数,在此次setData对界面渲染完毕后调用。
* 1.5.0基础库后才支持callback;
* 单次设置的数据不能超过1024kB,请尽可能避免一次设置过多的数据。
* 请不要把 data 中任何一项的 value 设为 undefined ,不然这一项将不被设置并可能遗留一些潜在问题。
复制代码
生命周期函数的调用详见页面路由中
onLoad: 页面加载
一个页面只会调用一次,能够在 onLoad 中获取打开当前页面所调用的 query 参数。
复制代码
onShow: 页面显示
每次打开页面都会调用一次
复制代码
onReady: 页面初次渲染完成
一个页面只会调用一次,表明页面已经准备稳当,能够和视图层进行交互。
对界面的设置如wx.setNavigationBarTitle请在onReady以后设置。详见生命周期
复制代码
onHide: 页面隐藏
当navigateTo或底部tab切换时调用。
复制代码
onUnload: 页面卸载
当redirectTo或navigateBack的时候调用。
复制代码
onPullDownRefresh: 下拉刷新
监听用户下拉刷新事件。
须要在app.json的window选项中或页面配置中开启enablePullDownRefresh。
当处理完数据刷新后,wx.stopPullDownRefresh能够中止当前页面的下拉刷新。
复制代码
onReachBottom: 上拉触底
监听用户上拉触底事件。
能够在app.json的window选项中或页面配置中设置触发距离onReachBottomDistance。
在触发距离内滑动期间,本事件只会被触发一次。
复制代码
onPageScroll: 页面滚动
监听用户滑动页面事件。
参数为 Object,包含如下字段:scrollTop(页面在垂直方向已滚动的距离(单位px))
复制代码
onShareAppMessage: 用户转发
只有定义了此事件处理函数,右上角菜单才会显示“转发”按钮。
用户点击转发按钮的时候会调用。
此事件须要 return 一个 Object,用于自定义转发内容。
自定义转发字段Object,包含两个字段title和path:
{
title: '自定义转发标题',
path: '/page/user?id=123'
}
复制代码
除了初始化数据和生命周期函数,Page 中还能够定义自定义一些特殊的函数:事件处理函数。在渲染层能够在组件中加入事件绑定,当达到触发事件时,就会执行 Page 中定义的事件处理函数。
实例代码:
<!--WXML-->
<view bindtap="viewTap"> click me </view>
复制代码
// js
Page({
viewTap: function() {
console.log('view tap')
}
})
复制代码
小程序秉承了JavaScript模块化的机制,采用CommonJS规范,经过module.exports暴露对象,经过require来获取对象。
能够将一些公共的代码抽离成为一个单独的 js 文件,做为一个模块。模块只有经过 module.exports 或者 exports 才能对外暴露接口。
function sayHello(name) {
console.log(`Hello ${name} !`)
}
function sayGoodbye(name) {
console.log(`Goodbye ${name} !`)
}
module.exports.sayHello = sayHello
exports.sayGoodbye = sayGoodbye
复制代码
在须要使用这些模块的文件中,使用 require(path) 将公共代码引入。
Page({
helloMINA: function() {
common.sayHello('MINA')
},
goodbyeMINA: function() {
common.sayGoodbye('MINA')
}
})
复制代码
require 暂时不支持绝对路径;
小程序目前不支持直接引入 node_modules ,使用第三方模块时,没法经过require直接导入模块,须要对第三方模块强制导出后才能正常导入。
复制代码
[官方文档]WXS(WeiXin Script
)是小程序的一套脚本语言,结合 WXML,能够构建出页面的结构。
- wxs 不依赖于运行时的基础库版本,能够在全部版本的小程序中运行。
- wxs 与 javascript 是不一样的语言,有本身的语法,并不和 javascript 一致。
- wxs 的运行环境和其余 javascript 代码是隔离的,wxs 中不能调用其余 javascript 文件中定义的函数,也不能调用小程序提供的API。
- wxs 函数不能做为组件的事件回调。
- 因为运行环境的差别,在 iOS 设备上小程序内的 wxs 会比 javascript 代码快 2 ~ 20 倍。在 android 设备上两者运行效率无差别。
微信为咱们提供了两个使用 WXS 方法:直接插入 WXS 代码,以及引用 WXS 文件。
<!--wxml中直接插入WXS标签的代码-->
<wxs module="m1">
var msg = "hello world";
module.exports.message = msg;
</wxs>
<view> {{m1.message}} </view>
<!--wxml中引用对应路径下的WXS文件-->
<wxs module='hello' src='./test.wxs'>
复制代码
每个 WXS 模块,都须要用 module 标签进行命名。命名模块后,开发者工具才能正常进行编译、在 WXML 中引用模块中的变量与函数。
WXS有本身的语法,并不与JS彻底一致
(与HTML区别)
<view class="container">
<view class="userinfo">
<button wx:if="{{!hasUserInfo && canIUse}}"> 获取头像昵称 </button>
<block wx:else>
<image src="{{userInfo.avatarUrl}}" background-size="cover"></image>
<text class="userinfo-nickname">{{userInfo.nickName}}</text>
</block>
</view>
<view class="usermotto">
<text class="user-motto">{{motto}}</text>
</view>
</view>
复制代码
<!--import-->
<import src="../template/a.wxml"/>
<!--include-->
<include src="../include/footer.wxml"/>
复制代码
文件引入在小程序作模块化拆分的过程当中很是重要。
5.可插入 wxs
标签的小程序脚本语言。
(附WXSS与CSS的区别)
[官方文档-WXSS]
WXSS 具备 CSS 大部分特性。同时为了更适合开发微信小程序,WXSS 对 CSS 进行了扩充以及修改;
.class, #id, element, ele,ele, ::before, ::after
。官方文档上暂并未说明支持后代选择器。即便支持也不要使用,以避免出现没必要要的bug。@import
语句能够导入外联样式表,@import
后跟须要导入的外联样式表的相对路径,用;表示语句结束。6.background-image
只能用网络url或者base64 . 本地图片要用image标签才行。
微信小程序框架自己也是一个UI框架,基础实用的样式在组件里就提供了,大大减小开发者设置样式的时间。
[官方文档]
快速查看效果:[小程序官方demo]
什么是组件?
组件是视图层的基本组成单元,与HTML页面标签同样,一个组件一般包括开始标签
和结束标签
,``属性用来修饰这个组件,内容
在两个标签以内。
框架为开发者提供了一系列基础组件,它们自带一些微信风格的样式。开发者能够经过组合这些基础组件进行快速开发。
基础组件根据使用场景,分为如下七大类:
视图容器、 基础内容、 表单组件、 表单、导航、 多媒体、 地图、 画布、 客服。
自定义组件
[官方文档]
从小程序基础库版本
1.6.3
开始,小程序支持简洁的组件化编程。 开发者能够将页面内的功能模块抽象成自定义组件,以便在不一样的页面中重复使用;也能够将复杂的页面拆分红多个低耦合的模块,有助于代码维护。自定义组件在使用时与基础组件很是类似。
自定义组件的写法与用法有些不一样。一个例子
[官方文档]
快速查看效果:[小程序官方demo]
小程序开发框架提供丰富的微信原生 API,能够方便的调起微信提供的能力,如获取用户信息,本地存储,支付功能等。
说明:
开发要点(草稿):
1.页面路由说明、跳转、与其余路由方式对比、函数api;
2.WXML写法区别,组件、模板、class。交互、数据驱动原理;
3.WXSS写法区别、 动画写法
4.页面js写法、生命周期函数。 全局变量、模块化;setData()同步页面数据
5.微信Api。
6.网络请求,与服务器的先后端交互。
7.es6写法的体现,promise ;
8.小程序与外部应用的交互
9.微信canvas,小游戏;
10.真机测试、上传发布、 腾讯云的应用。
11.经常使用第三方组件;
12.场景值
13.运行原理、底层实现
14.优化
15. 利用第三方框架 开发小程序和h5页面 等多端应用
小程序官方体验,包含各个组件和接口演示下载体验
移动app开发三种技术及优劣势;
微信小程序的编译过程,开发者工具的本质;一个看法切入点
小程序实现原理解析:blog.csdn.net/xiangzhihon…
api工厂