评论

【云开发·云函数】分层(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
  • 持续更新…


参考资料

腾讯云·云函数文档

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

6 个评论

  • Larry
    Larry
    2021-12-09

    非常感谢分享!刚刚试了一下,开发者工具创建的云开发环境可以正常使用层管理

    2021-12-09
    赞同
    回复
  • showms
    showms
    2021-12-08

    小程序云函数跟腾讯云函数是一回事吗?一个是TCF,一个是SCF

    2021-12-08
    赞同
    回复
  • anton
    anton
    2021-07-03

    谢谢分享~ 有个小问题,如何在本地调试引用了层的云函数?

    2021-07-03
    赞同
    回复
  • Kermit
    Kermit
    2020-05-29

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

    请问有办法解决吗?

    2020-05-29
    赞同
    回复 4
    • 🍞
      🍞
      2020-06-04
      兄弟,很遗憾刚才试了下,确实不能继续操作了。我之前是允许操作的。但是我试了下直接发送数据,发现是前端禁止了而已,直接 POST 数据是允许操作的。我的实现方式是先创建一个 腾讯云的云函数,对它发起绑定包的数据。把发送的请求复制出 curl 命令,修改 data 数据尤其是Namespace:命名空间 FunctionName:函数名 LayerName:层名 等参数,直接重放请求是允许操作小程序云开发创建的函数的。这个问题也反应给腾讯云官方了,看官方后续怎么答复吧。
      2020-06-04
      回复
    • 🍞
      🍞
      2020-06-04
      官方答复是这个功能以后入口会集成在小程序云开发里,尽量区别于两个平台,避免弄混。另外可以通过 cli 的方式,直接操作命令进行绑定层。文档:https://docs.cloudbase.net/cli/functions/layer.html#shuo-ming
      2020-06-04
      回复
    • Kermit
      Kermit
      2020-06-04回复🍞
      谢谢兄dei,我试下
      2020-06-04
      回复
    • 游戏客
      游戏客
      2022-06-28回复🍞
      微信和腾讯云没有协调好一件事情,就是一个公司明明有一个腾讯云账号的服务器和数据库之类的内网版图了,现在小程序的云函数如果实在开发工具里面的开通的,他是直接在腾讯云另外开通一个账号,导致云函数如果要连接数据库就变成外网ip了。
      2022-06-28
      回复
  • 李东bbsky
    李东bbsky
    发表于移动端
    2020-04-25
    手动支持
    2020-04-25
    赞同
    回复
  • 程序员的羽毛球梦
    程序员的羽毛球梦
    2020-04-25

    学习了

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