抛砖引玉(3): 微信云开发最佳实践
抛砖引玉(3): 微信云开发最佳实践
概览
微信云开发是一个打通了微信生态的BaaS (后端即服务)平台,开发方便,快捷,计费友好,适合个人开发者,以及小团队使用。
它主要由 云数据库,云存储,云函数,用户身份验证还有 云托管 组成,其中 云函数/云托管就是我们的后端服务了。
这篇文章也主要聊一聊它们工程化的最佳实践。
云函数
微信云开发里的云函数,本质上是拥有微信天然鉴权 SCF。它也属于腾讯云 serverless 体系。所以 SCF 的最佳实践,部分也是通用的。
这里可以关注一下笔者的serverless专栏 Serverless之我见 , 里面有许多基于SCF的最佳实践。
wx-server-sdk
使用云函数,基本一定会装这个包,它解锁了BaaS下的那些额外的能力。
从安装后的 npm 包代码来看,它是一个 cloudbase 功能的场景定制版。
比如我们的 WXContext 的获取,就是仰仗 serverless 容器环境中的 WX_CONTEXT_KEYS 环境变量,解析它来获取的。
那么从这点出发,我们就能够自己去 mock 云函数里的微信的上下文机制。
小程序想要跨多个平台的,建议预先对wx-server-sdk里的 cloud.getWXContext() 上下文获取机制进行抽象,不然随着业务迭代,对微信上下文依赖加深,会造成一定的迁移困难。
cloudbase 能力解锁
我们知道 微信开发者工具 开发小程序的体验一直不是很好。所以为了提升开发体验,我们通常会在 vscode 里写代码,然后再把工具当成一个模拟器和调试器来使用。
云开发亦是如此 (笑~),这里我们直接使用 @cloudbase/cli 来运维我们的云函数,有了它,我们就能脱离 微信IDE和配置的限制 , 来帮助我们更好的实现工程化。
具体操作,可以进入微信开发者工具 > 云开发 > 费用管理 > 代金券 > 充值与账单 ,能够打开腾讯云的登录界面。在这个页面,就可以把云开发默认创建的腾讯云账号,和你自己的微信做关联。
关联成功后,我们既可以在 微信IDE 里管理云开发 , 也能够在腾讯云控制台 云开发 Cloudbase 这个功能中进行管理。
这样除了微信自己的用户管理需要在小程序IDE内查看,其他都可以去腾讯云控制台进行操作。
云函数项目的目录结构
这里我给大家一个示例。
目录结构
图中几点提及一下:
cloudbaserc.json 是 cloudbase cli 的配置文件。为什么会有一个 cloudbaserc.js呢 ?这个文件是笔者自定义的脚本,它会扫描 dist 下的函数代码,来生成 cloudbaserc.json。
这么做的原因是因为 json,yml 这类数据格式作为配置文件的表现力,比起代码,还是偏弱的,所以我们需要动态生成的配置文件。
.env,.env.dev,.env.prod 用来声明在不同mode中,生效的变量。
比如 tcb fn deploy --mode dev 这样一条部署命令,它使用的就是**.env**,.env.dev 文件merge后的变量。这个机制与 vue cli 的 mode是类似的。此时我们就能够在 .env.dev,.env.prod 里声明自己的云环境ID ENV_ID=dev-xxxxx ,再在 cloudbaserc.json 声明 “envId”: “{{env.ENV_ID}}”,,这样就能通过切换 mode 的方式去快速管理不同的环境了。
src 与 dist
这个目录结构,前端的朋友们很熟悉了, src 存放着我们的源代码,dist 是打包后实际生效的运行时代码。
2个内部的结构和转化如图所示:
结构
这套机制算是 这三期 抛砖引玉 文章的一个总结。
它的优势在于,让多个云函数处于一种 ‘游离态’, 这种状态既保证多个云函数之间,公共逻辑代码的复用,又保证了每一个云函数,作为一个单独的 Nodejs 应用 的独立性。
比如在图上可知:
单个函数,能够决定自己的openapi 权限 (config.json)。
也能保证,在共用 node_module 的基础上,一个云函数有权决定,哪些npm包是自己特殊私有的 (依靠自己pkg.json声明与node_module 递归向上查找) 。
也有权决定函数中,哪些需要打包,哪些不需要。并在云端把缺失的依赖安装好(依靠独立的external选项)。
打包serverless源码
关于serverless为什么需要打包,和怎么打包这2个问题,这里笔者之前写了一篇文章:
serverless 降低冷启动时间的探索 - 服务端打包 node_modules
阐释了打包 服务端Nodejs的必要性和可行性,以及遇到打包后启动失败的情况应该如何去做。
因为这里的云函数本质上也是SCF, 所以在方案上也是通用的。
注: 大的二进制文件,可通过上传层函数,绑定给云函数来使用
cloudbase cli 取代 微信IDE 部署
在 微信IDE 里,通常我们右键点击上传并部署就成功了。
cli 也是一行命令的事情 tcb fn deploy [options] [name]
同时它也能够解锁更多进阶的功能。
使用 cli 的好处有许多: 相比于在UI界面上操作,cli更有效率,也能够更好的工程化我们的项目。
扩展: 甚至我们能够针对 tcb 这样的命令,做二次封装(有点类似于我们前端里高阶组件的概念),来达到原先 cli 做不到的事情。
debug
说了这么多,我们应该如何进行本地调试呢?
原先我们依赖微信IDE的本地/云端调试功能,现在可以依靠本地仿造的微信上下文,参数,还有本地调试命令 tcb fn run [options] 进行调试。
由于我们预先编译了,所以此时需要打出sourcemap,并给它映射对正确的源代码路径,这样我们只需要在src里的源代码打断点,就能够实时命中了。
云端测试原先就是个比较残次的功能,严重依赖日志,现在也不例外。还是要依托SCF远程单实例调试,或者Web IDE,体验才会稍好一些。
数据迁移
这里我们单独创建了一个 migration 项目,在本地去执行数据迁移的脚本。
Q: 为什么不在云函数里触发进行数据迁移?
A: 因为没有必要, 且调试麻烦。本地我们通过小程序在腾讯云中的 SecretId 和 SecretKey ,能够直接连进微信云开发里的云数据库进行操作。
具体做法还是以 @cloudbase/manager-node 和 @cloudbase/node-sdk 为主,进行集合和索引的管理,还有数据的迁移。
微信云托管
使用容器部署的云托管,相对来说,使用更加的自由,方便,而且上下文的机制,也通过 请求 header,传给我们的应用,这一块不限制语言,最佳实践就有很多了。
云托管就比较适合偏中型的业务场景,毕竟它是常驻运行,没有云函数的冷启动问题。同时也因为它是常驻运行,也代表这它的收费,相比来说会比云函数要贵一些。
附 云托管与云函数的对比
后记
本篇文章,主要探讨的是小程序云开发中的工程化问题,内容上尽可能的减少了代码的实现(笔者已实现),侧重在于大量的概念。
如果您有耐心看完,并存在不理解之处,欢迎告知笔者进行进一步的文章完善。又或者您有更好的方案,也欢迎与笔者进行讨论,一起进步成长。
附录
微信小程序开启云函数配置: project.config.json中 cloudfunctionRoot, 这个方案开发体验一般。
抛砖引玉(1):一种改善微信云开发 , 开发者体验的思路
抛砖引玉(2): Cloudbase Framework 助力改善微信云开发的体验
抛砖引玉(3): 微信云开发最佳实践相关推荐
- 《微信公众平台开发最佳实践》——第3章 基 础 接 口 3.1 接收用户消息
本节书摘来自华章出版社<微信公众平台开发最佳实践>一 书中的第3章,第3.1节,作者:方倍工作室,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 第3章 基 础 ...
- 《微信公众平台开发最佳实践》——2.4 本章小结
本节书摘来自华章出版社<微信公众平台开发最佳实践>一 书中的第2章,第2.4节,作者:方倍工作室,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 2.4 本章小 ...
- 《微信公众平台开发最佳实践》——2.1 新浪SAE应用
本节书摘来自华章出版社<微信公众平台开发最佳实践>一 书中的第2章,第2.1节,作者李骏 边思,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 2.1 新浪SA ...
- 微信公众平台开发最佳实践(第2版)
<微信公众平台开发最佳实践 第2版> 微信公众平台开发经典之作全新改版,精心挑选最经典的商业项目开发,成千上万人次微信公众平台开发者从中受益 前言 出版说明 自从方倍工作室在博客园推出微信 ...
- 《微信公众平台开发最佳实践》—— 1.3 微信公众平台的使用
本节书摘来异步社区<微信公众平台开发最佳实践>一书中的第1章,第1.3节,作者:方倍工作室,更多章节内容可以访问云栖社区"异步社区"公众号查看 1.3 微信公众平台的使 ...
- 微信小程序云开发入门实践
云开发介绍 什么是云开发 2017年微信小程序发布后,一度的开发模式是前端页面使用微信小程序的相关组件,在涉及到后台登录及业务交互的时候,需要使用自建的服务器,后台不管是PHP还是JAVA架构,都需要 ...
- 详解_阿里云FPGA服务器f3实例RTL开发最佳实践脚本代码
背景:https://help.aliyun.com/product/155039.html?spm=5176.10695662.852251.3.543d78dclwQb08 1.FPGA云服务器 ...
- 微信公众平台开发最佳实践
<微信公众平台开发最佳实践>共分10章,案例程序采用广泛流行的PHP.MySQL.XML.CSS.JavaScript.HTML5等程序语言及数据库实现.系统完整地介绍微信公众平台基础接口 ...
- web前端开发最佳实践_学习前端Web开发的最佳方法
web前端开发最佳实践 为什么要进行网站开发? (Why web development?) Web development is a field that is not going anywhere ...
最新文章
- 重磅 | 周志华最新论文:首个基于决策树集成的自动编码器,表现优于DNN
- HDU2675(二分算法)
- 自从学了这套框架,自动化+性能都解决了
- Java OpenCV-4.0.0 图像处理22 图像模板匹配
- 【FFmpeg】FFmpeg 相关术语简介 ( 容器 | 媒体流 | 数据帧 | 数据包 | 编解码器 | 复用 | 解复用 )
- 【unity基础系列】1、unity Texture Type设置为Advanced时纹理的格式列表
- php任意文件删除漏洞,phpshe后台任意文件删除漏洞及getshell | CN-SEC 中文网
- HDU 4622 求解区间字符串中的不同子串的个数
- 《101 Windows Phone 7 Apps》读书笔记-TODO LIST
- Texpad for Mac编辑器使用说明
- 使用 kubeadm快速部署Kubernetes-v1.18
- 【ANSYS命令流】通用后处理技术(三):列表显示结果及输出TXT文本(实例)
- CIS芯片测试到底怎么测?
- 中国裁判文书下载:selenium路线
- oracle 查看进程
- 计算机二级C语言-B程序修改题
- 时序分析(8) -- GARCH(p,q)模型
- Galaxy S4 GT-I9500如何root 安卓5.0.1
- MATLAB 平面线形变换 及验证多个点是否在同一直线
- 七段S型加减速算法--多轴时间同步方案调研
热门文章
- 【Python爬虫】requests库
- Qt的对话框与窗口--Splash与登录窗口
- [转] LTE载波聚合CA的优化 //LTE CA 学习笔记
- 将树莓派2B系统扩展到U盘
- 善用SourceMonitor+Astyle,让代码维护者不再骂娘
- React Native Android入门实战及深入源码分析系列(1)——Hello world
- hoolilaw解读:美国安检机场那些不能告人的秘密
- 使用阿里云ECS构建微信公众号管理系统
- [Sqoop]Sqoop使用
- 云服务+开源,建设活力开源社区,我们一直在路上!