项目中如果有多个云函数,它们经常会用到很多公共的代码模块,比如查询用户信息、鉴权等等。在小程序中,我们可以通过require导入这些公共模块。但云函数之间是互相独立的,每个云函数只能访问自己的代码包,我们需要手动把这些公共的代码模块复制到每个云函数中,容易造成文件混乱。“层”正是为了解决云函数间代码复用的问题。
“层”是什么
小程序开发文档中并没有“层”的介绍,不过我们可以在腾讯云开发文档中找到相关的介绍(传送门)。之前社区里也有大神分享过相关的文章(传送门),可以看到当时开发者工具创建的云开发环境并不能很好地支持“层”功能,这可能也是小程序开发文档没有“层”的相关介绍的原因。幸好,最近实测,开发者工具创建的云开发环境也可以正常使用“层”功能了。
简而言之,“层”就是每个云函数都可能访问的一个公共空间,它会在云函数启动时加载到云函数中。这样就可以保证每个云函数访问的都是同一个代码模块,不需要我们去手动同步代码文件。
“层”的创建和绑定
开发者工具并没有集成“层”功能,我们需要到腾讯云控制台来创建和管理。
第一步:使用小程序账号登录腾讯云控制台
第二步:点击云开发CloudBase,选择环境
第三步:选择云函数>层管理>新建
注意“层”的运行环境要和云函数相同,一般是Nodejs12.16,可以在“云函数管理”中查看云函数的运行环境。
第四步:点击云函数管理,选择要绑定的云函数
第五步:选择层管理>绑定,选择对应的层
“层”的访问
云函数触发时,“层”的代码包会加载到云函数中,这时云函数的目录结构是:
var
user
云函数代码(/var/user/)
opt
层代码(/opt/)
这样我们就可以require导入我们的公共模块了。
举个例子,云函数的目录结构如下:
var
user
index.js
opt
common.js
我们要在index.js中访问common.js文件,可以:
const common = require('../../opt/common.js') // 云函数不支持“/”访问根目录
因为云函数的环境变量包括“层”的路径,所以也可以:
const common = require('common.js') // 直接引用文件名
“层”的调试
很可惜,开发者工具并不支持本地调试“层”,而且本地调试和云端运行的目录结构并不相同。下面是我的调试思路:
把“层”代码包放在云函数的根目录
opt
common.js
index.js
自定义环境变量ENV,根据ENV选择require的路径
// DEV:调试环境,引入云函数代码包里的opt文件夹
// PRO:生产环境,引入真正的“层”
// 注意:本地调试不能获取环境变量
const common = require(process.env.ENV == 'PRO' ? '' : './opt/' + 'common.js')
不知大家还有没有其它思路,欢迎一起讨论。
多翻翻腾讯云的文档,说不定还有惊喜~
一开始我也想用云函数层去实现,但是他只能在5个环境地下使用,所以当小程序多了以后,他的弊端也就显现出来。最后我是把公共的js打包发布npm
确实npm是终极方案哈哈哈