服务器冇得了,只能白嫖了,就这样。
基础命令
安装
npm i -g vercel             # npm
yarn global add vercel      # yarn
使用
vercel init     # 选择一个示例项目(初始化)
# 可以根据模板初始化创建,不复杂的话也可以自己弄,功能简单的话几个文件就差不多了
cd <PROJECT>    # 进入目录
vercel dev --debug  # 本地开发测试
vercel          # 部署到云服务
vercel -prod    # 部署到云服务生产环境
支持语言
- 官方支持
Node.js、Go、Python、Ruby。 - 社区支持php。在配置里面做好相应配置即可。例如:
    
{ "functions": { "api/test.php": { "runtime": "vercel-php@0.1.0" } } } 
配置
详情可以参考https://vercel.com/docs/configuration。
在这里以一个简单的配置vercel.json为例,解释一下比较有用的参数。
{
  "version": 2,
  "builds": [   // 这里需要注意,没有罗列到builds的资源是无法访问或使用的
    { "src": "*.html", "use": "@vercel/static" },   // 静态资源
    { "src": "api/*.py", "use": "@vercel/python" }  // 因为是python写的云函数,所以...
  ],
  "routes": [
    { "src": "/", "dest": "/index.html" },          // 这里把主页定位到相应的网页,不然默认会是访问目录
    { "src": "/api/date", "dest": "/api/date.py" }, // 一个官方的基于BaseHTTPRequestHandler简单例子,返回当前时间  
    { "src": "/api/ip/(.*)", "dest": "/api/ip_query.py" }, // 一个更加复杂的例子,获取域名对应的ip
    { "src": "/api/(.*)", "dest": "/api/web.py" },  // 一个基于Flask的简单例子,返回访问的路径和参数
    { "src": "/(.*)", "status": 404, "dest": "/404.html" } // 把其它的访问路径定位到自定义的404页面
  ]
}
简单例子
这里以Python为例,与上一节的配置相对应。
基于BaseHTTPRequestHandler
date.py
from http.server import BaseHTTPRequestHandler
from datetime import datetime
class handler(BaseHTTPRequestHandler):
  def do_GET(self):
    self.send_response(200)
    self.send_header('Content-type', 'text/plain')
    self.end_headers()
    self.wfile.write(str(datetime.now().strftime('%Y-%m-%d %H:%M:%S')).encode())
    return
ip_query.py
from http.server import BaseHTTPRequestHandler, HTTPServer
import socket
class handler(BaseHTTPRequestHandler):
  def do_GET(self):
    path = str(self.path)
    try:
        domain = path[path.rindex("/")+1:]
        print(domain)
        ip = socket.gethostbyname(domain)   
    except:
        text = 'path is: %s, \n Error happens\n'%(path)
    else:
        text = 'domain is: %s \n ip is: %s\n'%(domain, ip)
    self.send_response(200)
    self.send_header('Content-type', 'text/plain')
    self.end_headers()
    self.wfile.write(text.encode())
    return
if __name__ == "__main__":
    http_server = HTTPServer(('', int(8888)), handler)
    http_server.serve_forever() 
基于Flask
这里需要注意,在requirements.txt中加入依赖flask==1.0.2
web.py
from flask import Flask, Response, request
app = Flask(__name__)
@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def catch_all(path):
    print(request.args)
    key = request.args.get('key')
    return Response("<h1>Flask</h1><p>You visited: /%s</p><p>key=%s</p>" % (path,key), mimetype="text/html")
    
if __name__ == "__main__":
    app.run(debug = True)
其它
测试地址
https://test-feql0j31g.vercel.app
https://test-feql0j31g.vercel.app/api/ip/github.com
https://test-feql0j31g.vercel.app/api/test?key=tt123