抛砖引玉(3): 微信云开发最佳实践

head-bg

抛砖引玉(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.jsoncloudbase cli 的配置文件。为什么会有一个 cloudbaserc.js呢 ?这个文件是笔者自定义的脚本,它会扫描 dist 下的函数代码,来生成 cloudbaserc.json

  • 这么做的原因是因为 json,yml 这类数据格式作为配置文件的表现力,比起代码,还是偏弱的,所以我们需要动态生成的配置文件。

  • .env,.env.dev,.env.prod 用来声明在不同mode中,生效的变量。
    比如 tcb fn deploy --mode dev 这样一条部署命令,它使用的就是.env,.env.dev 文件merge后的变量。这个机制与 vue climode是类似的。

  • 此时我们就能够在 .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: 因为没有必要, 且调试麻烦。本地我们通过小程序在腾讯云中的 SecretIdSecretKey ,能够直接连进微信云开发里的云数据库进行操作。

具体做法还是以 @cloudbase/manager-node@cloudbase/node-sdk 为主,进行集合和索引的管理,还有数据的迁移。

微信云托管

使用容器部署的云托管,相对来说,使用更加的自由,方便,而且上下文的机制,也通过 请求 header,传给我们的应用,这一块不限制语言,最佳实践就有很多了。

云托管就比较适合偏中型的业务场景,毕竟它是常驻运行,没有云函数的冷启动问题。同时也因为它是常驻运行,也代表这它的收费,相比来说会比云函数要贵一些。

云托管与云函数的对比

后记

本篇文章,主要探讨的是小程序云开发中的工程化问题,内容上尽可能的减少了代码的实现(笔者已实现),侧重在于大量的概念。

如果您有耐心看完,并存在不理解之处,欢迎告知笔者进行进一步的文章完善。又或者您有更好的方案,也欢迎与笔者进行讨论,一起进步成长。

附录

微信小程序开启云函数配置: project.config.jsoncloudfunctionRoot, 这个方案开发体验一般。

抛砖引玉(1):一种改善微信云开发 , 开发者体验的思路

抛砖引玉(2): Cloudbase Framework 助力改善微信云开发的体验

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容