【云开发·云函数】分层(layer)实现代码复用,云函数之间共用底层文件
导读
当我们有很多云函数时,其中可能很多 [代码]中间件[代码] 、 [代码]工具[代码] 是共用的。
把这些 [代码]中间件[代码] 、 [代码]工具[代码] 复制到每个云函数下,是一件很麻烦的事情,而且如果发生了更新,还要重新复制。最重要的是,这种方式,不符合科学的设计模式。
云函数里的 层(layer) 就可以很好的解决我们这个问题。它是把我们共通需要的 [代码]中间件[代码] 、 [代码]工具[代码] 等文件放在一个公共的路径下,使用过程中只需要引用进来即可。
注意: 层暂时还没出现在小程序官方文档,但是可以在 [代码]腾讯云 - 云函数[代码]找到文档。
实操
这里我们使用 [代码]Nodejs8.9[代码] 来做示范
1. 先确认小程序已经开通了云开发
2. 登录腾讯云
打开登录界面 选择【其他登录方式 - 微信公众号 - 扫码选择对应的小程序(不是公众号)】.
[图片]
注意:小程序云开发和腾讯云的账户体系其实是有关联的,可以把腾讯云面板看作更高级的云开发面板
3. 编写层代码
编写以下代码,并保存为 [代码]demo.js[代码]
[代码]exports.main = async (event) => {
return "hello,layer."
}
[代码]
把 [代码]demo.js[代码] 打包成 [代码]demo.zip压缩包[代码]
4. 创建分层
打开云函数面板.
点击左侧菜单的『层』
地域选择『上海』
点击『新建按钮』
层名称:demo
提交方法:本地上传zip包
层代码:选择上一步打包的 [代码]demo.zip[代码] 压缩包
运行环境:Nodejs8.9
[图片]
点击提交
注意: 有些压缩软件压缩后,会多一层文件夹,需要注意下,压缩包内打开应该直接就是文件 [代码]demo.js[代码] 没有多一层文件夹。
5. 小程序·云开发面板创建云函数
创建云函数
[图片]
修改 [代码]云函数 demo 下的 index.js[代码] 代码并上传
[代码]var hello = require("demo.js")
exports.main = (event, context, callback) => {
return hello.main()
};
[代码]
6. 云函数绑定层
回到 腾讯云 云函数面板,选择左侧菜单 [代码]函数服务[代码]
注意左上角的 命名空间 选择小程序云开发的命名空间,地域:上海
选择刚创建的 [代码]demo[代码] 云函数
点击 [代码]层管理[代码]
绑定刚创建的 [代码]demo[代码] 层
7. 调试
还是 [代码]demo[代码] 的云函数里,点击 [代码]函数代码[代码] 项
点击测试,返回结果 [代码]"hello,layer."[代码] 既成功
[图片]
Q&A
问:为什么云函数里可以直接[代码]require("demo.js")[代码] 引入 [代码]demo.js[代码] ?
答:绑定层后,会根据顺序把层文件放在系统目录 [代码]/opt[代码] 下,然后该目录在 Node.js 环境下又在环境变量里。当引入 [代码]demo.js[代码] 在当前目录找不到时,会尝试在环境变量内查找。所以云函数可以找到该文件。
再问:如果层的文件名和云函数列表的文件名冲突,岂不是会引入错误?
答:是的,这时候可以使用绝对路径确保引入的是层文件 [代码]require("/opt/demo.js")[代码]
再再问:如果云函数绑定了多个层,每个层里都有 [代码]demo.js[代码] 会怎么样?
答:会根据层的顺序,逐个覆盖文件,最终 [代码]/opt/demo.js[代码] 文件是最后一层的文件。
再再再问:环境变量除了这个路径,还有哪些路径?
答:这里有一份各语言的环境变量路径,可以参考下,具体查看文档
关环境变量
路径
THONPATH
[代码]/var/user:/opt[代码]
ASSPATH
[代码]/var/runtime/java8:/var/runtime/java8/lib/*:/opt[代码]
DE_PATH
[代码]/var/user:/var/user/node_modules:/var/lang/node6/lib/node_modules:/opt:/opt/node_modules[代码]
问:云函数只支持 [代码]Nodejs8.9[代码] 版本吗?
答:在小程序云开发面板里,确实只能创建。但是可以通过服务端 SDK 创建以下语言支持。
Python 3.6
Python 2.7
Nodejs 10.15
Nodejs 8.9
Nodejs 6.10
Php 7.2
Php 5.6
Java 8
Golang 1
持续更新…
参考资料
腾讯云·云函数文档