mpvue
(github 地址请参见 )是一个使用 Vue.js 开发小程序的前端框架。 框架基于 Vue.js
核心,mpvue
修改了 Vue.js
的 runtime 和 compiler 实现, 使其可以运行在小程序环境中,从而为小程序开发引入了整套 Vue.js
开发体验
mp
:mini program 的缩写mpvue
:Vue.js in mini program使用 mpvue
开发小程序,你将在小程序技术体系的基础上获取到这样一些能力:
Vue.js
开发体验Vuex
数据管理方案:方便构建复杂应用webpack
构建机制:自定义构建策略、开发阶段 hotReloadnpm
外部依赖Vue.js
命令行工具 vue-cli
快速初始化项目其它特性正在等着你去探索,详细文档 。
现代前端开发框架和环境都是需要 Node.js 的,如果没有的话,请先下载 nodejs 并安装。
然后打开命令行工具:
# 1. 先检查下 Node.js 是否安装成功
$ node -v
v8.9.0
$ npm -v
5.6.0
# 2. 由于众所周知的原因,可以考虑切换源为 taobao 源
$ npm set registry https://registry.npm.taobao.org/
# 3. 全局安装 vue-cli
# 一般是要 sudo 权限的
$ npm install --global vue-cli@2.9
# 4. 创建一个基于 mpvue-quickstart 模板的新项目
# 新手一路回车选择默认就可以了
$ vue init mpvue/mpvue-quickstart my-project
# 5. 安装依赖,走你
$ cd my-project
$ npm install
$ npm run dev
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
复制
随着运行成功的回显之后,可以看到本地多了个 dist
目录,这个目录里就是生成的小程序相关代码。
<template>
=> 原生小程序的 .wxml<script>
=> 原生小程序的 .js<style>
=> 原生小程序的 .wxss 其中style中加入lang="stylus" rel="stylesheet/stylus"
,需要下载安装stylus:npm install stylus stylus-loader
1
复制
示例:
<template>
<div>
</div>
</template>
<script>
export default {
}
</script>
<style lang="stylus" rel="stylesheet/stylus">
</style>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
复制
import Vue from 'vue'
import App from './App'
// 关闭Vue开发中的一些提示
Vue.prototype.productionTip = false
// 声明当前的组件为整个应用,只需写在注册整个小程序的文件中
App.mpType = 'app'
// 生成当前应用的实例
const app = new Vue(App)
// 挂载当前应用的实例
app.$mount()
1 2 3 4 5 6 7 8 9 10 11 12 13 14
复制
和原生小程序中的json文件一样
beforeCreate
实例初始化之后,数据观测(data observer) 和 event/watcher 事件配置之前被调用。created
实例已经创建完成之后被调用。在这一步,实例已完成以下的配置:数据观测(data observer),属性和方法的运算, watch/event 事件回调。然而,挂载阶段还没开始,$el 属性目前不可见。beforeMount
在挂载开始之前被调用:相关的 render 函数首次被调用。mounted
el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。beforeUpdate
数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前。 你可以在这个钩子中进一步地更改状态,这不会触发附加的重渲染过程。updated
由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。beforeDestroy
实例销毁之前调用。在这一步,实例仍然完全可用。destroyed
Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。 该钩子在服务器端渲染期间不被调用。onLaunch
: 小程序应用初始化onShow
: 小程序启动获取后台进入前台onHide
: 小程序应用从前台进入后台onLoad
: 监听页面加载onShow
: 页面显示onReady
: 监听页面初始化渲染完成onHide
: 监听页面隐藏,注意当前页面实例依然存活onUnload
: 监听页面卸载onPullDownRefresh
: 监听用户下载动作onReachBottom
: 监听用户上拉触底操作onShareAppMessage
: 用户点击右上角分享功能onPageScroll
: 页面滚动onTabItemTap
: 当前是 tab 页时,点击 tab 时触发除了 Vue 本身的生命周期外,mpvue 还兼容了小程序生命周期,这部分生命周期钩子的来源于微信小程序的 Page, 除特殊情况外,不建议使用小程序的生命周期钩子。
封装:
//config.js:
//export default {
// host: 'http://localhost:3000'
//}
import config from './config'
// 携带token的方式:
// 1. cookie(不推荐)
// 2. 作为参数放在url中(常用)
// 3. 放在请求头(最常用)
let token = wx.getStorageSync('token');//后面验证用户使用
export default function (url, data={}, method='GET') {
return new Promise((resolve, reject) =>{
wx.request({
url: config.host + url,
data,
method,
header:{
authorization: token
},
success: (res) => {
resolve(res.data)
},
fail: (error) => {
reject(error)
}
})
})
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
复制
调用示例:
async function(){
let result = await request('/url', data)
}
1 2 3
复制
小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。
登录流程时序:
说明:
code
,并回传到开发者服务器。之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。
注意:
session_key
是对用户数据进行 加密签名 的密钥。 为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥。App.vue:
async mounted(){
wx.login({
success: async (res) => {
// 1. 获取用户登录的临时凭证,和用户是否授权没有直接关系,有效时长:5分钟
let code = res.code
// 2. 发送code给服务器端
let token = await request('/getOpenId', {code})
// 3. 将自定义登录状态缓存到storage中
wx.setStorageSync('token', token)
}
})
// 测试地址token
let result = await request('/test')
console.log('验证结果:', result)
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
复制
server.js:
// 获取用户openId的接口
router.get('/getOpenId', async (ctx, next) => {
// 1.获取请求的参数
let code = ctx.query.code;
let appId = 'your appId';
let appSecret = 'your appSecret';
// 2.根据请求的地址和参数处理数据
let url = `https://api.weixin.qq.com/sns/jscode2session?appid=${appId}&secret=${appSecret}&js_code=${code}&grant_type=authorization_code`;
// 发送请求给微信接口,获取openId
let result = await fly.get(url);
let userInfo = JSON.parse(result.data);
// 将用户的openId存入数据库,openId:{userName: 'xx', money: 'yyy'}
// 自定义登录状态,就是根据用户的openId和sessionKey进行加密生成token,返回给前端
// 对openId和sessionKey进行加密,自定义登录状态
let token = jwt.sign(userInfo, 'swzj');
// console.log(token);
// 3.响应数据
ctx.body = token;
});
// 测试验证身份token的接口
router.get('/test', (ctx, next) => {
// 获取token的值
// console.log(ctx.request.header.authorization);
let token = ctx.request.header.authorization;
//iat:加密时的时间
let result;
try {
result = jwt.verify(token, 'swzj');
ctx.body = '验证成功'
}catch (e) {
ctx.body = '验证失败'
}
});
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
复制
其中服务器使用的是koa
基本配置server.js:
// 搭建服务器的核心文件
let Koa = require('koa');
let KoaRouter = require('koa-router');
let Fly = require("flyio/src/node");//异步请求
let jwt = require('jsonwebtoken');//跨域认证
let fly = new Fly;
// 1.生成应用及路由器实例
const app = new Koa();
const router = new KoaRouter();
// 核心代码
router.get('/', (ctx, next) => {
// 1.获取请求的参数
// 2.根据请求的地址和参数处理数据
// 3.响应数据
ctx.body = '服务器返回的数据';
});
// 2.使用路由器及路由
app
.use(router.routes()) // 声明使用路由
.use(router.allowedMethods()) // 允许使用路由的方法
// 3.监听端口
app.listen('3000', () => {
console.log('服务器启动成功');
console.log('服务器地址: http://localhost:3000');
})
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
复制
其中使用到了 JSON Web Token(JWT) 来验证用户信息