从微信·云开发迁移到独立 Cloudbase
一句话定义:把微信小程序里用
wx.cloud调用的内置云开发,逐步替换为@cloudbase/js-sdk@2.27.3+ 独立 Cloudbase 环境,让同一个后端同时服务小程序、Web、UniApp 等多端。预计耗时:30-60 分钟(取决于现有 wx.cloud 调用数量) | 难度:进阶
适用场景
- 适用:小程序正在用
wx.cloud.init()的内置云开发,想切换到独立 Cloudbase 环境 - 适用:想让同一个 Cloudbase 后端同时被小程序、Web、H5、UniApp 访问(wx.cloud 只能在小程序里用)
- 适用:想自主控制环境配置、计费、权限,不再绑定在微信的云开发控制台
- 不适用:从 Firebase / Supabase 等境外服务迁入
环境要求
| 依赖 | 版本 |
|---|---|
@cloudbase/js-sdk | 2.27.3 |
@cloudbase/adapter-wx_mp | 1.3.1 |
@cloudbase/node-sdk | 3.18.1 |
@cloudbase/cli | 3.0.4 |
| 微信开发者 工具 | ≥ 1.06.x |
| Node.js | ≥ 16.13 |
另外需要一个独立的 Cloudbase 环境(在 tcb.cloud.tencent.com/dev 创建),并启用自定义登录。
迁移前后的 API 对照
wx.cloud 和 @cloudbase/js-sdk 的核心数据库 CRUD 方法(get/add/update/remove)调用方式兼容,迁移时只需要换入口对象。但两套 SDK 在初始化、认证机制、文件上传参数上有明确差异。
| 能力 | wx.cloud 写法 | @cloudbase/js-sdk 写法 | 差异 |
|---|---|---|---|
| 初始化 | wx.cloud.init({ env: 'xxx' }) | cloudbase.useAdapters(adapter); const app = cloudbase.init({ env: 'xxx' }) | 需要注册小程序适配器 |
| 认证 | 自动(小程序登录态天然绑定) | 需要自定义登录(signInWithCustomTicket),参考 Recipe 01 | 最大差异 |
| 数据库 CRUD | wx.cloud.database().collection('x').get() | app.database().collection('x').get() | 方法签名兼容,换入口对象即可 |
| 云函数调用 | wx.cloud.callFunction({ name, data }) | app.callFunction({ name, data }) | 参数结构兼容 |
| 文件上传(客户端) | wx.cloud.uploadFile({ cloudPath, filePath }) | app.uploadFile({ cloudPath, filePath }) | 客户端 API 兼容 |
| 文件上传(Node 服务端) | cloud.uploadFile({ cloudPath, fileContent }) | app.uploadFile({ cloudPath, fileContent }) | 兼容,参数都是 fileContent(ReadStream) |
| 安全规则上下文 | auth.openid 自动可用 | 需要用户先完成自定义登录才有身份上下文 | 规则逻辑可能需要调整 |
核心结论:数据库和云函数的业务代码几乎不用改。改动集中在初始化和认证这两块。
第一步:在独立 Cloudbase 环境开通自定义登录
wx.cloud 的认证是静默的——小程序登录态自动绑定,开发者不需要管。但独立 Cloudbase 需要显式登录,否则所有数据库/云函数调用会报 UNAUTHORIZED。
在微信小程序场景下,推荐使用自定义登录方式。流程是:小程序端调 wx.login 拿 code → 云函数用 code 换 openid → 用 openid 签发 Cloudbase ticket → 小程序端用 ticket 登录。
完整的自定义登录搭建步骤见 add-auth-wechat-miniprogram,这里不重复。搭建完成后你会有:
- 一个能签发 ticket 的云函数
getLoginTicket(已开 HTTP 访问服务) - 小程序端的
libs/cloudbase.js和libs/login.js