Vercel
tip
- Free
- 100 部署/天
- Serverless Functions 12/部署
- Serverless Functions 10s 执行时间
- 没有后台执行概念
- Pro 60s Enterprise 900s
 
- 3 Git Repository/Vercel Project
- 内存 1024 MB
- 50 自定义域名
- 100 GB 带宽每月
 
- Serverless Function
- 单个 < 50MB
- 解压后 < 250MB
- 消息体 5MB
- 并发 1000
 
- EdgeFunction
- Hobby gzip 1 MB
- Pro gzip 2 MB
- https://vercel.com/docs/functions/edge-functions/limitations
 
- 价格/限制
- Fair Use Policy
- JAM 站点和应用
- 前端
- SPA
- Functions that query DBs or APIs
- 博客、电商、营销
 
- 问题
- 注意
- Vercel 可以本地部署静态,但无法部署 nextjs 项目
- 不支持 yarn2
- 不支持 WebSocket
 
- 运行时
- NodeJS
- Go
- Python
- Ruby
 
- CI 环境 - https://vercel.com/docs/concepts/deployments/build-step
- Amazon Linux 2 - docker run --rm -it amazonlinux:2.0.20191217.0 sh
- yum
- 添加额外包 yum install jq -y
- Extras library
 
- Amazon Linux 2 - 
# 全局安装
npm i vercel -g
# 或直接执行
yarn dlx vercel
npx vercel
# 登陆
yarn dlx vercel login
# 部署
# .vercel 目录会记录项目信息 - 默认会加到 .gitignore
yarn dlx vercel
配置
{
  "version": 2,
  "name": "my-app",
  "alias": ["my-domain.com", "my-alias"],
  "scope": "my-team",
  "env": {
    "MY_KEY": "this is the value",
    "SECRET": "@my-secret-name"
  },
  "build": {
    "env": {
      "MY_KEY": "this is the value",
      "SECRET": "@my-secret-name"
    }
  },
  "builds": [
    { "src": "*.html", "use": "@vercel/static" },
    { "src": "*.py", "use": "@vercel/python" },
    { "src": "*.js", "use": "@vercel/node" }
  ],
  "functions": {
    "api/test.js": {
      "memory": 3008,
      "maxDuration": 60
    },
    "api/test.php": {
      "runtime": "[email protected]"
    }
  },
  // 最多 256
  "routes": [
    { "src": "/custom-page", "headers": { "cache-control": "s-maxage=1000" }, "dest": "/index.html" },
    { "src": "/api", "dest": "/my-api.js" },
    { "src": "/users", "methods": ["POST"], "dest": "/users-api.js" },
    { "src": "/users/(?<id>[^/]*)", "dest": "/users-api.js?id=$id" },
    { "src": "/.*", "dest": "https://my-old-site.com" },
    { "src": "/legacy", "status": 404 },
    { "src": "/redirect", "status": 308, "headers": { "Location": "https://example.com/" } }
  ],
  "regions": ["sfo1", "bru"],
  // source view & logs view
  "public": true,
  // /about.html -> /about
  // /api/user.go -> /api/user
  "cleanUrls": true,
  // /about/ <-> /about
  "trailingSlash": false,
  "redirects": [
    { "source": "/me", "destination": "/profile.html" },
    // permanent = 308/307
    { "source": "/user", "destination": "/api/user", "permanent": false },
    { "source": "/view-source", "destination": "https://github.com/vercel/vercel" }
  ],
  // 最多 1024 个记录
  // src,dst 最长 4096
  "rewrites": [
    { "source": "/about", "destination": "/about-our-company.html" },
    { "source": "/resize/:width/:height", "destination": "/api/sharp" },
    { "source": "/user/:id", "destination": "/api/user" },
    { "source": "/proxy/:match*", "destination": "https://example.com/:match*" }
  ],
  // HTTP Header 控制
  "headers": [
    {
      "source": "/service-worker.js",
      "headers": [
        {
          "key": "Cache-Control",
          "value": "public, max-age=0, must-revalidate"
        }
      ]
    },
    {
      "source": "/api/feed",
      "headers": [
        {
          "key": "Content-Type",
          "value": "application/rss+xml"
        },
        {
          "key": "Cache-Control",
          "value": "public, max-age=3600"
        }
      ]
    },
    {
      "source": "/(.*)",
      "headers": [
        {
          "key": "X-Content-Type-Options",
          "value": "nosniff"
        },
        {
          "key": "X-Frame-Options",
          "value": "DENY"
        },
        {
          "key": "X-XSS-Protection",
          "value": "1; mode=block"
        }
      ]
    }
  ],
  "github": {
    "enabled": false,
    "autoAlias": false,
    "silent": true,
    "autoJobCancelation": false
  }
}
// 捕获所有路由
{ "src": "/blog/([^/]+)", "dest": "/blog?post=$1" }
// 等同于
{"rewrites": [{ "source": "/blog/:post", "destination": "/blog" }]}
//
{ "src": "/blog/(.*)", "dest": "/blog?post=$1" }
//
{"rewrites": [{ "source": "/blog/:post*", "destination": "/blog" }]}
Build
- NEXT_PUBLIC_VERCEL_GIT_COMMIT_SHA
Turbo Next.JS
| Field | | --------------- | ---------------------------------------------------- | | Build Command | cd ../.. && npx turbo run build --filter=@wener/demo | | Install Command | npm install --prefix=../.. | | Root Directory | apps/demo |