前言
本章主要讲解小程序云开发以及自己的一些分享
游泳健身了解一下:
github
本期项目并没有上传到github
需要的加
内容总结
- 云开发带来的好处(微信亲儿子带来一些优势)
- 劣势是啥
- 云数据库
- 图片上传 小程序云存储 (云函数(node.js)koa2),云调用)
- 组件外部引入(css)iconfont
- 如何封装一个好用的ajax 的使用
- 浅谈
- 云函数之 外部调用(常用操作) 这先不讲了 需要的加QQ
云开发
小程序云开发是微信提供的一个快速开发(serverless
)函数式开发。我们不需要担心后端的资源(cpu
,内存
等问题),运维
开发等问题,只需要关注自己的业务问题。只需要支付微信爸爸的钱就可以解决。
云开发带来一些优势,
- 微信
sdk
基本兼容云调用
, - 小程序上线域名只能是
https
且必须经过ICP
备案,云开发可以不依托外部云服务器,这样项目就可以快速上线 - 基础版免费使用,个人项目(真香)
- 云调用可以直接获取
OPENID
,APPID
,UNIONID
- 云函数天然优势,不需要
access_token
,直接改变用户登录方式(以及使用方式)
6. 开发效率提升,如果是对小程序进行扩展开发(原来就有项目)不需要修改接口云函数帮你搞定原接口的兼容。
7. 前端可以自己进行一些自己的服务端操作,云还是支持其他一些操作
云开发的劣势
- 云数据库权限比较简单,云数据库获取数据的限制,以及读写的限制,小程序 => 云数据库一次最多20条数据。云函数 => 云数据库一次最多100条数据
- CDN流量少比起外面的CDN要贵很多
- 一般我们开发项目总会有一个后台管理系统,管理系统调用当前云函数,云数据库都是需要算在配置里面的,所以从价格方面考虑,个人项目很香,日活用户非常多,又不想花费用升级云开发的配置,那么小程序云开发并不太适合,如果你的日活用户不是太多,基础版的云函数请求足够用的话,那么你可以使用小程序云开发,来减少一些复杂的流程,搭配外部服务器,效果极佳。个人认为公司项目一个月几百的开销应该还是可以接受
- (以上均属于个人观点)
云数据库
云数据库基本操作可以查看小程序云数据库地址
我们上面说到云数据库最多可以调用100条数据下面讲讲如何进行操作更多的数据。总体就是查询当前总长度然后算出当前需要请求次数,然后进行一个重复请求,然后返回前端,这样达到超过100数据。主要我们必须是一个 async
await
的异步转同步,和koa2
差不多 下面会讲 tcb-router
基本和 koa2-router
差不多。(请求多个Promise.all
很好用)
首先我们先创建一个云函数,初始化云函数,初始化我们的数据库,创建自己的这个表
const cloud = require('wx-server-sdk') // 微信sdk
cloud.init() // 初始化
const db = cloud.database() // 链接我们的云数据库
const playlistCollection = db.collection('playlist') // 链接我们创建的这个表
const MAX_LIMIT = 100 // 默认查找每次100条数据
// 云函数入口函数
exports.main = async (event, context) => {
// 找到当前我们总的条数
const total = await playlistCollection.count().total
// 向上取整 获取我们总的次数
const batchTimes = Math.ceil(total / MAX_LIMIT)
const tasks = []
for (let index = 0; index < batchTimes; index++) {
// skip 当前开始的位置
// limit 要获取多少条
// get 进行获取
let promise = playlistCollection.skip(i*MAX_LIMIT).limit(MAX_LIMIT).get();
tasks.push(promise)
}
let list = []
if(tasks.length>0){
list = await Promise.all(tasks)
}
return {
list
}
}
图片上传
下面我们讲解一个图片上传,先附上流程图
/**
* 上传图片 小程序 => 微信sdk 获取临时图片地址
* @param {dom} event
*/
onChooseImage(event){
wx.chooseImage({
count: 9, // 上传数量
sourceType: ['album', 'camera'],
sizeType: ['original', 'compressed'],
success:(res)=>{
const imageList = this.data.imageList.concat(res.tempFilePaths)
this.setData({
imageList
})
}
})
},
// 小程序 => 云存储
// 小程序对 uploadFile 的封装
// regeneratorRuntime 才可以使用 async await 下面可以使用 Promise.all
import regeneratorRuntime from '../utils/runtime'
const imageUpload = async (imageList)=>{
let fileListId = [];
wx.showLoading({
title: '图片上传中',
mask: true
})
for (let index = 0; index < imageList.length; index++) {
const element = imageList[index];
let suffix = /\.\w+$/.exec(element)[0]
await wx.cloud.uploadFile({
cloudPath: `blog/${Date.now()}-${Math.floor(Math.random()*100000)}${suffix}`,
filePath: element, // 文件路径
}).then(res => {
fileListId.push(res.fileID)
}).catch(error => {
console.log('error',error)
})
}
wx.hideLoading()
return fileListId
}
export {
imageUpload
}
/**
* 上传
* debounce 防重复
* BlogSave 封装好的上传图片 小程序 => 云函数 后面会讲
*/
send: debounce(async function(event){
const imageList = await imageUpload(this.data.imageList)
BlogSave({
data: {
imageList,
}
}).then(res=>{
wx.navigateBack({
delta: 1
})
})
}),
// 云函数 => 云数据库
// 云函数入口文件
const cloud = require('wx-server-sdk')
const TcbRouter = require('tcb-router');
cloud.init()
const db = cloud.database();
const ImageCollection = db.collection('Image')
// 云函数入口函数
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()
const app = new TcbRouter({event})
app.router('save',async (ctx,next)=>{
let {imageList} = event;
// 调用云数据库
ctx.body = await ImageCollection.add({
data: {
imageList,
openid: wxContext.OPENID,
createTime: Date.now()
}
})
})
return app.serve()
}
组件内部引用外部css
Component({
// 方法1
options:{
styleIsolation: "apply-shared",
},
// 方法2
externalClasses: ['tag-class'], // 接收外部传入的样式
// 方法3 在 css 直接引入
@import './iconfont.wxss'
})
小程序 云函数调用 “ajax”
// ajax封装
import regeneratorRuntime from '../utils/runtime'
const wxHttp = async function (options){
if (options.loading){
wx.showLoading(options.loading)
}
return await wx.cloud.callFunction({
name: options.name,
data: {
...options.data
}
}).then(res=>{
if (options.loading){wx.hideLoading()};
if (options.toast){wx.showToast(options.toast)};
// console.log(res)
if(res.errMsg==="cloud.callFunction:ok"){
return res.result
}else{
wx.showToast({
title: '系统错误请等待',
duration: 2000
})
Promise.reject(`${options.data.$url},当前接口请求失败,当前请求数据为(\n ${JSON.stringify(options.data)} \n)`)
}
})
}
export{
wxHttp,
}
// Interface
import regeneratorRuntime from '../utils/runtime'
import {loading,toast} from '../utils/ajaxSetting'
import {wxHttp} from '../ajax/ajax'
// 新增博客
const BlogSave = async ({...options})=>{
return wxHttp({
name: 'blog',
data: {
$url: 'save',
...options.data
},
loading: loading(options.loading),
// loading: options.loading===false? false : loading(true),
// toast: options.toast===false? false :toast(true)
})
}
// ajaxSetting 内置loading 和 toast 使用方式
const loading = (option)=>{
let loading = {
title: '加载中',
mask: true
}
if(typeof option === 'boolean'&&option===true){
return loading
}else if(typeof option === 'string'){
loading.title = option;
return loading
}else if(typeof option === 'object'){
return Object.assign(loading,option)
}
return false
}
const toast = (option)=>{
let toast = {
title: '操作成功',
duration: 2000
}
if(typeof option === 'boolean'&&option===true){
return toast
}else if(typeof option === 'string'){
toast.title = option;
return toast
}else if(typeof option === 'object'){
return Object.assign(toast,option)
}
return false
}
export {
loading,
toast
}
浅谈
组件
我刚用到js组件化的时候用require.js
module.exports
后来es6
的import
export default
,刚开始理解组件化就是可以复用性,就是可以重复使用,随着更加深入的理解,组件化并非一定要复用,或者是相对独立的一个模块,我们也可以抽出为一个组件。组件传入的参数不宜过多,最好都有默认值。组件的显示与隐藏,重绘和回流一些性能的优化,都展示了自己的一些能力。重复循环组件是否需要添加当前key
key
的作用,当组件循环次数过多怎样进行优化(1.减少dom
数量,2.事件劫持,3.dom
层级)这些都需要我们进行一些考虑
小程序潜力
2019 年,小程序的日活用户数到达 3.3 亿,预计 2020 年会达到 4.5 亿。2019 年小程序的交易 GMV 达到了 1.2 万亿,交易 GMV 过百亿的企业数量已有 5 家。未来小程序的使用会更加多。毕竟微信是小程序的载体。
小程序bug汇总
- new Date跨平台兼容性问题
- wx.getUserInfo()接口更改问题
- 无法获取UnionID的问题
- 图片本地资源名称,尽量使用小写命名
- 小程序原生组件textarea,canvas 层级
- ...较多可以掘金搜索一下
最后
能看到最后🙏谢谢大家了,多多点赞在github 上面对❤️是对我最好对鼓励,我会尽量分享一些自己使用得心得以及正确对食用方式
可能现在小伙伴还是不懂。。俗话说;师傅领进门,修行在个人。代码上的备注写的也够多了。还是不懂的可以加群问问小伙伴们,
求靠谱内推(北京地区)可以留言我 +。=