Chapter 10

Deno Deploy 与生产部署

全球边缘部署、Docker 自托管、Fresh 框架、从 Node.js 迁移实战指南

Deno Deploy:全球边缘计算平台

Deno Deploy 是 Deno 官方的边缘计算平台,基于 V8 Isolate 技术,在全球 35+ 个数据中心节点运行你的代码:

特性说明
全球节点数35+ 个 PoP(Point of Presence),覆盖美洲、欧洲、亚太
冷启动毫秒级(V8 Isolate,非容器)
免费额度1M req/月,100GB 流量,1MB KV 存储
内置 KV自动持久化,全球同步
自定义域名支持,自动 HTTPS
Edge Function 限制50ms CPU 时间/请求,128MB 内存

Playground:即时部署

Deno Deploy 提供 Playground 功能,在浏览器中直接编写代码并一键部署:

  1. 访问 dash.deno.com,注册账号
  2. 点击 "New Playground"
  3. 在编辑器中编写代码(支持 TypeScript)
  4. 点击 "Deploy" 即可获得 *.deno.dev 域名
// playground 示例:边缘 API
Deno.serve((req) => {
  const url = new URL(req.url);
  const name = url.searchParams.get("name") ?? "World";

  return Response.json({
    message: `Hello, ${name}!`,
    region: Deno.env.get("DENO_REGION"),  // 当前节点区域
    time: new Date().toISOString(),
  });
});

GitHub Actions CI/CD 自动部署

# .github/workflows/deploy.yml
name: Deploy to Deno Deploy

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    permissions:
      id-token: write  # OIDC 认证
      contents: read

    steps:
      - uses: actions/checkout@v4

      - uses: denoland/setup-deno@v2
        with:
          deno-version: v2.x

      - name: 类型检查
        run: deno check main.ts

      - name: 运行测试
        run: deno test --allow-net

      - name: 部署到 Deno Deploy
        uses: denoland/deployctl@v1
        with:
          project: "your-project-name"
          entrypoint: "main.ts"

Edge Function 使用限制与最佳实践

Edge Function 限制:Deno Deploy 的每个请求最多使用 50ms CPU 时间和 128MB 内存。长时间运行的任务(如图像处理、复杂计算)不适合在边缘运行。数据库查询应使用就近节点或 Deno KV,避免跨洲数据库连接增加延迟。

自托管:Docker 容器化

# Dockerfile — 多阶段构建
FROM denoland/deno:2-alpine AS base
WORKDIR /app

# 复制依赖配置
COPY deno.json deno.lock ./

# 预缓存依赖(利用 Docker 层缓存)
RUN deno cache --frozen main.ts

# 复制应用代码
COPY . .

# 类型检查(可选)
RUN deno check main.ts

EXPOSE 8000

# 最小权限运行
CMD ["deno", "run", \
  "--allow-net=0.0.0.0:8000", \
  "--allow-env=DATABASE_URL,PORT,JWT_SECRET", \
  "--allow-read=/app/static", \
  "main.ts"]
# docker-compose.yml
version: "3.9"
services:
  app:
    build: .
    ports:
      - "8000:8000"
    environment:
      - DATABASE_URL=postgres://user:pass@db:5432/mydb
      - PORT=8000
      - JWT_SECRET=your-secret
    depends_on:
      - db

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: mydb
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:

Fresh 框架简介

Fresh 是 Deno 团队开发的全栈 Web 框架,专为 Deno Deploy 设计,采用"岛屿架构"(Islands Architecture):

# 创建 Fresh 项目
deno run -A -r https://fresh.deno.dev my-app

# 项目结构
my-app/
├── routes/
│   ├── index.tsx        # 首页
│   └── api/
│       └── data.ts      # API 路由
├── islands/
│   └── Counter.tsx      # 客户端交互组件
├── static/              # 静态资源
└── deno.json
// routes/index.tsx — 服务端渲染页面
import Counter from "../islands/Counter.tsx";

export default function Home() {
  return (
    <div>
      <h1>Fresh App</h1>
      <Counter initialCount={0} />  {/* 岛屿:有客户端 JS */}
    </div>
  );
}

从 Node.js 迁移实战指南

将现有 Node.js 项目迁移到 Deno 2 的步骤:

第一步:识别兼容性问题

# 用 Deno 直接尝试运行,观察报错
deno run --allow-all your-app.js

第二步:替换模块导入

// 旧 Node.js 写法
const fs = require('fs');
const path = require('path');
const express = require('express');

// Deno 写法(Deno 2 也支持 node: 协议兼容)
import * as fs from "node:fs";      // Node 兼容层
import * as path from "node:path";
import express from "npm:express@4";  // npm 包

// 或直接用 Deno 原生 API 替代
// fs.readFile → Deno.readFile
// http.createServer → Deno.serve
// process.env → Deno.env

第三步:添加权限标志

# 从宽松开始,逐步收紧
deno run -A app.ts                           # 开发阶段
deno run --allow-net --allow-env app.ts      # 生产阶段精确控制

常见替换对照表

Node.js APIDeno 等价
process.env.KEYDeno.env.get("KEY")
fs.readFileSync(path, 'utf8')Deno.readTextFileSync(path)
fs.writeFileSync(path, data)Deno.writeTextFileSync(path, data)
process.exit(1)Deno.exit(1)
__dirnamenew URL('.', import.meta.url).pathname
require('module')import from "npm:module"
http.createServer()Deno.serve()
setTimeout/setInterval相同(Web 标准)
fetch相同(Web 标准,无需导入)

本章小结:Deno Deploy 是 Deno 生态最强的部署选项——全球边缘、零配置、自动 KV 持久化、免费额度够个人项目使用。对于需要完整服务器控制的场景,Docker + Deno 镜像是最佳自托管方案。Fresh 框架是 Deno 的全栈选择,岛屿架构让性能出色。Node.js 迁移到 Deno 2 因为完整的 npm 兼容性比以往任何时候都更容易。

🦕

恭喜完成 Deno 2 全部 10 章!你现在掌握了:权限沙盒安全模型、原生 TypeScript、Web API 标准、Deno KV 数据库、JSR 包注册表、完整工具链(fmt/lint/test/compile)以及 Deno Deploy 全球边缘部署。Deno 2 是当下最值得关注的 JavaScript 运行时——安全、现代、Web 标准优先。