如果你是一位 uni-app 开发者,你一定对 uniCloud 的"云对象"赞不绝口。那种在前端直接 import 一个云端对象,然后像调用本地方法一样 await cloudObj.add(1, 2) 的丝滑体验,简直是开发者的福音。
这让许多小程序原生开发的同学羡慕不已,心中不禁会问:
"难道我们原生云开发,就只能在
switch...case的泥潭里挣扎,或者忍受wx.cloud.callFunction的冗长写法吗?我们配拥有'云对象'这种优雅的开发模式吗?"
答案是:配的兄弟,当然配!而且,通过两个轻量级的 NPM 包,你不仅能拥有,甚至能获得一个更纯粹、更无厂商锁定的"云对象"体验。
在揭晓这套方案之前,我们先快速了解一个后端常见术语:RPC (Remote Procedure Call,远程过程调用)。
别让这个名字吓到你。RPC 的核心思想极其简单:"我想调用一个函数,但那个函数远在服务器上,不在我的前端代码里。" RPC 框架的使命,就是施展魔法,让这个"远程调用"的过程,感觉就跟调用一个本地函数一模一样。
好了,魔法要开始了。今天,就向你隆重介绍这套开源组合拳:rpc-server-tcb + rpc-client-tcb。
第一步:在云函数中"创建"你的云对象 (rpc-server-tcb)
rpc-server-tcb 奉行"约定优于配置"。它约定,你 api/ 目录下的每一个 .js 文件,本身就是一个云对象。
假设我们要创建一个名为 rpc 的云函数,并在其中创建一个处理用户逻辑的"云对象" user。
cloudfunctions/rpc/api/user.js
javascript
// 这个文件导出的对象,就是你的 'user' 云对象
module.exports = {
/**
* 根据 ID 获取用户信息
* 这就是云对象的一个方法
* @param {string} userId
*/
async getInfo(userId) {
if (!userId) {
throw new Error('User ID is required.');
}
// ... 你的数据库查询逻辑
return { id: userId, name: '张三', vip: true };
},
/**
* 获取当前调用者的 OpenID
* 另一个方法,还能通过 this 访问上下文
*/
getMyOpenId() {
const { OPENID } = this.context.userInfo;
return OPENID;
}
}
看到了吗?你不需要写 class,也不需要继承任何东西。一个纯粹的、导出的 JavaScript 对象,就是你的云对象。
然后,你的云函数入口 index.js 只需要一行代码来启动这个"云对象"服务:
cloudfunctions/rpc/index.js
javascript
const { createRpcServer } = require('rpc-server-tcb');
// 启动服务,自动加载 api/ 目录下所有"云对象"
exports.main = createRpcServer();
至此,你的云端已经准备就绪。user.js 就是 user 云对象,order.js 就是 order 云对象,干净、纯粹。
第二步:在小程序中"调用"你的云对象 (rpc-client-tcb)
这是见证奇迹的时刻。在小程序端,我们同样只需要进行一次初始化。
utils/rpc.js
javascript
import { createRpcClient } from 'rpc-client-tcb';
// 初始化 RPC 客户端,指向你的云函数入口
const rpc = createRpcClient({
functionName: 'rpc',
});
export default rpc;
现在,假设我们要在页面中调用 user 云对象的 getInfo 方法:
javascript
import rpc from '../../utils/rpc';
Page({
async onGetUserInfo() {
try {
// 直接调用!就像它是一个本地对象一样!
const userInfo = await rpc.user.getInfo('user-123');
console.log(userInfo); // { id: 'user-123', name: '张三', vip: true }
} catch (error) {
// 优雅地捕获所有错误
wx.showToast({ title: error.message, icon: 'none' });
}
},
});
rpc.user.getInfo('user-123') ------ 这行代码所带来的开发体验,与 uniCloud 云对象相比,是不是如出一辙,甚至因为无需 importObject 而显得更加直接?
我们的方案 vs uniCloud 云对象,优势何在?
虽然体验相似,但这套 rpc-tcb 方案为你带来了 uniCloud 所不具备的独特优势:
-
轻量与非侵入: 它不是一个庞大的平台或运行时,仅仅是两个专注于解决 RPC 问题的、总代码量不足百行的轻量级库。你可以随时加入到现有项目中,也可以随时移除,对你的项目没有"污染"。
-
原生云开发,无厂商锁定 : 你编写的每一行代码,都是在微信/腾讯云官方的原生云开发环境中运行。你享受的是腾讯云的生态、稳定性和未来的所有更新,不存在被特定前端框架(uni-app)绑定的风险。
-
极致的灵活性 : 就像我们在另一篇文章中讨论的,如果你的应用是一个包含上百个工具的"工具箱",你可以轻松地将"云对象"拆分到多个云函数中(
rpc-pdf,rpc-image),客户端也只需多创建几个实例即可。这种架构的灵活性是uniCloud单一服务空间模型难以比拟的。 -
纯粹的 JavaScript/Node.js : 你不需要学习任何平台特有的
class继承或特定语法。你写的,就是最纯粹、最通用的 JavaScript 模块。
结论
所以,回到最初的问题:小程序云开发有类似 uniCloud 云对象的方案吗?
不仅有,而且这个方案更轻量、更原生、更灵活。
rpc-server-tcb 和 rpc-client-tcb 为原生小程序开发者架起了一座通往现代化、优雅后端开发的桥梁。它证明了,好的开发体验并非某个平台的专利,通过优秀的设计模式和社区工具,我们同样可以拥有。
别再羡慕隔壁的 uni-app 了,兄弟!现在就动手,给你自己的小程序项目也装上这对翅膀吧。