二维码很有趣,对吗?我们喜欢它们,然后讨厌它们,然后又喜欢它们。总之,它们最近又出现了,这让我想到了它们是如何产生的。外面有无数的二维码生成器,但如果说这是你需要在自己的网站上做的事情。这个软件包可以做到这一点。但它的重量也很重,有180KB,它需要生成所有的东西。你不会想把所有这些东西和你的其他脚本放在一起。
现在,我对云函数的概念比较陌生,但我听说这对像这样的东西来说是最棒的。这样一来,函数就存在于服务器上的某个地方,在需要的时候可以被调用。就像一个小的API来运行这个功能。
一些主机提供了某种云功能的功能。DigitalOcean恰好是其中之一。而且,像Droplets一样,函数的部署也非常容易。
在本地创建一个函数文件夹
DigitalOcean有一个CLI,与一个命令,将为我们提供脚手架的东西,所以cd ,无论你想设置的东西和运行。
doctl serverless init --language js qr-generator
注意语言是明确声明的。DigitalOcean的功能也支持PHP和Python。
我们得到了一个干净的项目,名为qr-generator ,有一个/packages 文件夹,存放着项目的所有函数。那里有一个示例函数,但我们现在可以忽略它,并在它旁边创建一个qr 文件夹。

该文件夹是qrcode 包和我们的qr.js 函数的所在地。因此,让我们把cd 到packages/sample/qr 并安装该包。
npm install --save qrcode
现在我们可以在一个新的qr.js 文件中写下这个函数。
const qrcode = require('qrcode')
exports.main = (args) => {
return qrcode.toDataURL(args.text).then(res => ({
headers: { 'content-type': 'text/html; charset=UTF-8' },
body: args.img == undefined ? res : `<img src="${res}">`
}))
}
if (process.env.TEST) exports.main({text:"hello"}).then(console.log)
所有这一切都需要qrcode 包,并导出一个函数,基本上可以生成一个<img> 标签,并以base64 PNG为源。我们甚至可以在终端测试它。
doctl serverless functions invoke sample/qr -p "text:css-tricks.com"
检查配置文件
这里有一个额外的步骤,我们需要。当项目被架起时,我们得到了这个小的project.yml 文件,它用一些相关信息配置了这个函数。这就是里面默认的内容。
targetNamespace: ''
parameters: {}
packages:
- name: sample
environment: {}
parameters: {}
annotations: {}
actions:
- name: hello
binary: false
main: ''
runtime: 'nodejs:default'
web: true
parameters: {}
environment: {}
annotations: {}
limits: {}
看到这些高亮的行了吗?packages: name 属性是函数在packages 文件夹中的位置,在本例中是一个叫做sample 的文件夹。actions/ name 属性是函数本身的名称,也就是文件的名称。当我们启动项目时,它默认为hello ,但我们把我们的命名为qr.js ,所以我们应该在继续前把这一行从hello 改为qr 。
部署函数
我们可以直接从命令行做这件事!首先,我们连接到DigitalOcean的沙盒环境,这样我们就有一个用于测试的实时URL。
## You will need an DO API key handy
doctl sandbox connect
现在,我们可以部署该函数了。
doctl sandbox deploy qr-generator
一旦部署,我们就可以在一个URL上访问该函数。这个URL是什么?这有一个命令。
doctl sbx fn get sample/qr --url
https://faas-nyc1-2ef2e6cc.doserverless.co/api/v1/web/fn-10a937cb-1f12-427b-aadd-f43d0b08d64a/sample/qr
糟糕的是!再也不需要把整个软件包和其他的脚本一起运送了!我们可以点击那个URL,从那里生成QR码。