一直有在关注小程序,也作过一些demo,不过一直没上正式项目,恰好此次公司有小程序的项目就入坑了。项目开发完,记录一下遇到的一些坑吧。vue
框架方面有关注wepy和mpvue,wepy是腾讯内部的框架,发布时间较久,社区也较完善,相对稳定。mpvue是美团刚出的小程序框架,也很不错,能够直接用Vue的写法去进行开发,学习成本较低,缺点是刚推出,虽然美团内部有在使用,不过社区还没起来。项目比较赶,仍是选择较稳定的wepy了。git
下图为美团提供的一张框架对比图,具体对比能够参考下,须要注意的是wepy目前也能够用wepy-redux进行数据管理了。github
wepy的methods与Vue中的methods使用方式不太同样。wepy的methods主要存放响应wxml中所捕获到的事件的函数,若是想在onLoad或者其余函数中调用methods中的方法,使用this.funcname()是没办法调用到的,须要this.methods.funcname()。想把函数挂载在实例下,能够直接在class中定义函数就能够了,与onLoad同级。redux
<template> <button @tap="function1"></button> </template> <script> import wepy from 'wepy'; export default class Page extends wepy.page { methods = { function1() { console.log('function 1'); } }; function2() { console.log('function 2'); } onLoad() { this.methods.function1(); this.function2(); }; } </script>
小程序是以config中的pages数组的第一个元素做为默认页的,若是须要更改默认页则须要更改对应的数组顺序。canvas
{ "pages":[ "pages/index", "pages/page2" ], "window":{ "backgroundTextStyle":"light", "navigationBarBackgroundColor": "#fff", "navigationBarTitleText": "WeChat", "navigationBarTextStyle":"black" } }
当使用网络图片进行wx.drawImage的时候会出现黑色的底图,缘由是wx.drawImage没法直接加载网络图片,须要先使用wx.downloadFile下载文件资源到本地,在回调函数里使用tempFilePath进行wx.drawImage,或者页面初始化时预加载,保存tempFilePath。小程序
const ctx = wx.createCanvasContext('myCanvas') wx.downloadFile({ url: 'https://example.com/audio/123', //仅为示例,并不是真实的资源 success: function(res) { // 只要服务器有响应数据,就会把响应内容写入文件并进入 success 回调,业务须要自行判断是否下载到了想要的内容 ctx.drawImage(res.tempFilePath, 0, 0, 150, 100) ctx.draw() } })
官方bug,已在微信6.6.2修复数组
const ctx = wx.createCanvasContext('myCanvas') ctx.drawImage(img, 0, 999, 800, 950, 0, 0, 400, 475) // 出现黑色底图
缘由是更改canvas尺寸后,canvns还没重绘完成就执行了wx.drawImage,因此会出现图片绘制不全的状况。解决方案是使用一张足够大的画布,在上面进行drawIamge,wx.canvasToTempFilePath的时候输出图片大小传drawImage的宽高。服务器
需求是操做三张图片的imageData进行合成图片,可是结果canvasPutImageData的时候报数据传输长度超出最大长度1M,
可是压缩到1M后图片质量又很模糊(最大只有510*510像素)。
解决方法是将imageData经过JPEG库转成ArrayBuffer,再经过wx.arrayBufferToBase64转成base64,一顿操做以后终于没有1MB的限制了,可是操做数据也不宜过大,否则会致使页面卡死。微信
let arrBuffer = new JPEG().encode(resultImgData, 100, true) let res = `data:image/jpeg;base64,${wx.arrayBufferToBase64(arrBuffer)}`
官方bug,已在微信6.6.3修复网络