这是我参与8月更文挑战的第17天,活动详情查看:8月更文挑战
接入 uni-cloud-router
准备工作
- 框架 uniapp
- 模版 uni-starter (官方插件库下载)
- ide HBuilderX 3.1.22.20210709
什么是 uni-cloud-router
基于 koa 风格的 uniCloud 云函数路由库,同时支持 uniCloud 客户端及 URL 化访问
为什么使用 uni-cloud-router,可以解决下面问题
- 免费云函数有数量限制 现在为48个,uni-cloud-router可以统一封装到一个云函数中使用
- 因为会造成 云函数访问时快时慢怎么回事?
云函数对应的资源,如果长时间不使用,会被阿里云或腾讯云平台从内存中释放。一旦被释放,启动云函数时会有一个冷启动的过程。
表现为:隔了很久不用,第一次用就会比较慢,然后立即访问第二次,则很快,毫秒级响应。
冷启动的速度一般不会超过1.5秒,如超过1.5秒应该是云函数写的有问题或网络有问题。
资源回收策略方面,阿里云是15分钟内没有第二次访问的云函数,就会被回收。腾讯云是半小时。
两家云厂商仍然在优化这个问题。目前如果开发者在意这个问题,给开发者的建议是:
- 使用
clientDB可以减少遇到冷启动问题的概率 - 非高频访问的云函数,合并到高频云函数中。有的开发者使用纯单页方式编写云函数,即在一个云函数中通过路由处理实现了整个应用的所有后台逻辑。
参考插件 - 非高频访问的云函数,可以通过定时任务持续运行它(注意腾讯云可以使用这个方式完全避开冷启动,而阿里云的定时任务最短周期大于资源回收周期)
- 配置云函数的
单实例多并发
具体过程
-
- 插件直接导入 uniapp.dcloud.io/uniCloud/un… 这个时候你的云函数common目录多出如下目录
-
- 建立一个云函数引用uni-cloud-router 。该云函数名称为hello-uni-colud-router ; 目录结构如下
- 建立一个云函数引用uni-cloud-router 。该云函数名称为hello-uni-colud-router ; 目录结构如下
-
其中 index.js 代码为
'use strict';
const {
Router
} = require('uni-cloud-router')
const router = new Router(require('./config.js'))
exports.main = async (event, context) => {
return router.serve(event, context)
};
- 其中 config.js 代码为
// config.js
module.exports = {
debug: true, // 调试模式时,将返回 stack 错误堆栈
baseDir: __dirname, // 必选,应用根目录
middleware: [], // 自定义中间件
}
其中 /controller/hello.js 代码为
const {
Controller
} = require('uni-cloud-router')
module.exports = class HelloController extends Controller {
async sayHello() {
return this.service.hello.sayHello()
}
}
其中 /service/hello.js 代码为
const {
Service
} = require('uni-cloud-router')
module.exports = class HelloService extends Service {
sayHello() {
return {
data: '12313132'
}
}
}
安装依赖,在hello-uni-cloud 文件夹上面点击右键
到此为止,云函数部分完成
测试
在前端代码/pages/中任意路由中触发如下代码
uniCloud.callFunction({
name: 'hello-uni-cloud-router',
data: {
action:'hello/sayHello'
}
}).then((res)=>{
console.log(res,'res')
})
访问成功结果如下