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 功能,在浏览器中直接编写代码并一键部署:
- 访问 dash.deno.com,注册账号
- 点击 "New Playground"
- 在编辑器中编写代码(支持 TypeScript)
- 点击 "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,避免跨洲数据库连接增加延迟。
- 适合场景 API 路由、认证鉴权、A/B 测试、地理位置重定向、静态资源缓存、简单 JSON 数据处理、读取 Deno KV
- 不适合场景 CPU 密集型计算(视频转码/AI 推理)、需要持久连接的 WebSocket(有限支持)、重量级 npm 包(体积限制)、访问私有网络数据库
自托管: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):
- 默认服务端渲染(SSR):所有页面在服务器端渲染,零 JS 发送到客户端
- 岛屿组件:只有标记为 island 的组件才发送 JS 到客户端,实现最小 JS 体积
- 基于文件系统路由:
routes/index.tsx→/,routes/users/[id].tsx→/users/:id - 使用 Preact:轻量 React 兼容库,3KB
# 创建 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 API | Deno 等价 |
|---|---|
process.env.KEY | Deno.env.get("KEY") |
fs.readFileSync(path, 'utf8') | Deno.readTextFileSync(path) |
fs.writeFileSync(path, data) | Deno.writeTextFileSync(path, data) |
process.exit(1) | Deno.exit(1) |
__dirname | new 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 标准优先。