当前位置: 首页 > Web前端 > JavaScript

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

时间:2023-03-27 14:14:34 JavaScript

抛砖引玉(三):微信云开发最佳实践概述微信云开发是一个打通了微信生态的BaaS(BackendasaService)平台,开发方便快捷。计费友好,适合个人开发者和小团队。主要由云数据库、云存储、云函数、用户认证和云托管组成,其中云函数/云托管是我们的后端服务。这篇文章也主要讲一下他们工程的bestpractices。云函数微信云开发中的云函数本质上有微信自然认证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中管理云开发,还可以在腾讯云控制台云开发云库的功能中管理云开发。这样除了微信自带的用户管理需要在小程序IDE中查看外,其他都可以在腾讯云控制台上操作。云函数项目的目录结构这里我给大家举个例子。目录结构图中提到的几点:cloudbaserc.json是cloudbasecli的配置文件。为什么会有一个cloudbaserc.js?这个文件是作者自定义的脚本,会扫描dist下的函数代码,生成cloudbaserc.json。这样做的原因是json、yml等数据格式作为配置文件的表现力不如代码,所以我们需要动态生成的配置文件。.env,.env.dev,.env.prod用于声明在不同模式下生效的变量。例如,诸如tcbfndeploy--modedev之类的部署命令使用.env和.env.dev文件合并后的变量。这种机制类似于vuecli的模式。此时,我们可以在.env.dev,.env.prod中声明自己的云环境IDENV\_ID=dev-xxxxx,然后在cloudbaserc中声明"envId":"{{env.ENV\_ID}}。json”,让你可以通过切换模式快速管理不同的环境。前端的小伙伴们都熟悉src和dist的目录结构。src存放的是我们的源码,dist是打包后真正生效的运行时代码。两个内部结构和转换如图所示:这种结构机制是对“抛砖引玉”三期文章的总结。它的优点是让多个云函数保持“自由状态”,既保证了多个云函数之间公共逻辑代码的复用,又保证了每个云函数都可以作为一个独立的Nodejs应用独立使用。比如从图中可以看出,单个函数可以确定自己的openapi权限(config.json)。也可以保证,在共享node\_module的基础上,一个云函数有权决定哪些npm包是自己的特殊私有(取决于自己的pkg.json语句和node\_module递归向上查找)。它还有权决定哪些功能需要打包,哪些不需要。并在云端安装缺少的依赖项(取决于独立的外部选项)。打包serverless源码关于为什么要打包serverless,如何打包,笔者之前写过一篇文章:探索serverless减少冷启动时间——服务端打包node\_modules讲解打包服务端的必要性和重要性Nodejs可行性,打包后启动失败怎么办。因为这里的云函数本质上也是SCF,所以在解决方案上也是通用的。注意:大型二进制文件可以通过上传层函数绑定到云函数,使用cloudbasecli代替微信IDE部署到微信IDE中。一般情况下,我们右击上传部署成功。cli也是一行命令tcbfndeploy[options][name]也可以解锁更多高级功能。使用cli有很多好处:相比在UI界面上操作,cli效率更高,可以更好的工程化我们的项目。扩展:我们甚至可以对tcb这样的命令进行二次包装(有点类似于我们前端中高阶组件的概念),实现原来的cli做不到的事情。Debug说了这么多,我们应该如何进行本地调试呢?以前我们依赖微信IDE的本地/云端调试功能,现在可以依赖本地仿冒的微信上下文、参数和本地调试命令tcbfnrun[options]进行调试。由于我们是预编译的,所以这时候就需要把sourcemap打出来,映射到正确的源码路径上,这样我们只需要在src中打断源码就可以实时命中了。云测试本来就是一个比较低级的功能,非常依赖日志,现在也不例外。还是靠SCF远程单机调试,或者WebIDE比较好。数据迁移这里我们单独创建了一个迁移工程,用于在本地执行数据迁移脚本。Q:为什么不在云功能中触发数据迁移?A:因为没必要,调试起来也麻烦。在本地,我们可以通过腾讯云小程序的SecretId和SecretKey直接连接到微信云开发中的云端数据库进行操作。具体方法还是基于@cloudbase/manager-node和@cloudbase/node-sdk,管理集合和索引,以及数据迁移。微信云托管采用容器部署的云托管。相对来说使用起来更自由方便,上下文机制也通过请求头传递给我们的应用。这部分不限制语言,有很多最佳实践。.云主机更适合中型业务场景。毕竟是永久运行的,不存在云函数的冷启动问题。同时,因为它是永久运行的,也意味着它的收费会比云功能贵。附后记云主机与云函数的对比本文主要讨论云端小程序开发中的工程问题。内容方面,尽量减少代码的实现(作者已经实现),重点放在大量的概念上。如果您有耐心看完,还有不明白的地方,还请作者告知,以便进一步完善文章。或者你有更好的方案,欢迎与作者共同探讨,共同进步。附微信小程序开启云功能配置:project.config.json中的cloudfunctionRoot,该方案开发体验一般。抛砖引玉(一):提升微信云开发和开发者体验的思路抛砖引玉(二):CloudbaseFramework帮助提升微信云开发体验