评论

【云开发·云函数】分层(layer)实现代码复用,云函数之间共用底层文件

云开发里,多个云函数都要使用的一样的底层、中间件,为什么要复制那么多份呢。

导读

当我们有很多云函数时,其中可能很多 中间件工具 是共用的。
把这些 中间件工具 复制到每个云函数下,是一件很麻烦的事情,而且如果发生了更新,还要重新复制。最重要的是,这种方式,不符合科学的设计模式。

云函数里的 层(layer) 就可以很好的解决我们这个问题。它是把我们共通需要的 中间件工具 等文件放在一个公共的路径下,使用过程中只需要引用进来即可。

注意: 层暂时还没出现在小程序官方文档,但是可以在 腾讯云 - 云函数找到文档。


实操

这里我们使用 Nodejs8.9 来做示范

1. 先确认小程序已经开通了云开发

2. 登录腾讯云

  • 打开登录界面 选择【其他登录方式 - 微信公众号 - 扫码选择对应的小程序(不是公众号)】.

    注意:小程序云开发和腾讯云的账户体系其实是有关联的,可以把腾讯云面板看作更高级的云开发面板

3. 编写层代码

  1. 编写以下代码,并保存为 demo.js
exports.main = async (event) => {
  return "hello,layer."
}
  1. demo.js 打包成 demo.zip压缩包

4. 创建分层

  1. 打开云函数面板.
  2. 点击左侧菜单的『层』
  3. 地域选择『上海』
  4. 点击『新建按钮』
    • 层名称:demo
    • 提交方法:本地上传zip包
    • 层代码:选择上一步打包的 demo.zip 压缩包
    • 运行环境:Nodejs8.9
  5. 点击提交

注意: 有些压缩软件压缩后,会多一层文件夹,需要注意下,压缩包内打开应该直接就是文件 demo.js 没有多一层文件夹。

5. 小程序·云开发面板创建云函数

  1. 创建云函数
  2. 修改 云函数 demo 下的 index.js 代码并上传
var hello = require("demo.js")
exports.main = (event, context, callback) => {
  return hello.main()
};

6. 云函数绑定层

  1. 回到 腾讯云 云函数面板,选择左侧菜单 函数服务
  2. 注意左上角的 命名空间 选择小程序云开发的命名空间,地域:上海
  3. 选择刚创建的 demo 云函数
  4. 点击 层管理
  5. 绑定刚创建的 demo

7. 调试

  1. 还是 demo 的云函数里,点击 函数代码
  2. 点击测试,返回结果 "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
  • 持续更新…


参考资料

腾讯云·云函数文档

最后一次编辑于  05-26  
点赞 8
收藏
评论

3 个评论

  • Kermit
    Kermit
    05-29

    我在绑定层的时候提示“此命名空间为TCB创建,SCF 控制台暂时不允许操作。

    请问有办法解决吗?

    05-29
    赞同
    回复 3
    • 🍞
      🍞
      06-04
      兄弟,很遗憾刚才试了下,确实不能继续操作了。我之前是允许操作的。但是我试了下直接发送数据,发现是前端禁止了而已,直接 POST 数据是允许操作的。我的实现方式是先创建一个 腾讯云的云函数,对它发起绑定包的数据。把发送的请求复制出 curl 命令,修改 data 数据尤其是Namespace:命名空间 FunctionName:函数名 LayerName:层名 等参数,直接重放请求是允许操作小程序云开发创建的函数的。这个问题也反应给腾讯云官方了,看官方后续怎么答复吧。
      06-04
      回复
    • 🍞
      🍞
      06-04
      官方答复是这个功能以后入口会集成在小程序云开发里,尽量区别于两个平台,避免弄混。另外可以通过 cli 的方式,直接操作命令进行绑定层。文档:https://docs.cloudbase.net/cli/functions/layer.html#shuo-ming
      06-04
      回复
    • Kermit
      Kermit
      06-04回复🍞
      谢谢兄dei,我试下
      06-04
      回复
  • 李东bbsky
    李东bbsky
    04-25
    手动支持
    04-25
    赞同
    回复
  • A德清智羽-网站小程序公众号开发
    A德清智羽-网站小程序公众号开发
    04-25

    学习了

    04-25
    赞同
    回复
登录 后发表内容