通过 Cloudflare Tunnel 分享 sandbox 预览
Sandboxes 可以通过 sandbox.tunnels 命名空间将容器内运行的服务暴露到公共预览 URL。SDK 在 sandbox 内部使用 cloudflared,因此你可以在不配置 exposePort() 或自定义域名的情况下共享正在运行的服务。
默认情况下,sandbox.tunnels.get(port) 会在零配置的 *.trycloudflare.com URL 上创建一个快速隧道 ↗——无需 Cloudflare 账户、DNS 记录或自定义域名。这非常适合快速开发以及 .workers.dev 部署。
import { getSandbox } from "@cloudflare/sandbox";
const sandbox = getSandbox(env.Sandbox, "my-sandbox");
await sandbox.startProcess("python -m http.server 8080");
const tunnel = await sandbox.tunnels.get(8080);
console.log(tunnel.url); // → https://random-words-here.trycloudflare.comimport { getSandbox } from "@cloudflare/sandbox";
const sandbox = getSandbox(env.Sandbox, "my-sandbox");
await sandbox.startProcess("python -m http.server 8080");
const tunnel = await sandbox.tunnels.get(8080);
console.log(tunnel.url); // → https://random-words-here.trycloudflare.com如需更多控制,你可以通过 sandbox.tunnels.get(port, { name }) 创建命名隧道。命名隧道绑定一个由 Cloudflare Tunnel 支持的主机名(<name>.<your-zone>),并在你的区域上创建 CNAME 记录,最终生成类似 https://my-app-preview.example.com ↗ 的地址。
与每次都生成新随机 URL 的快速隧道不同,命名隧道生成的持久 URL 在容器重启后仍然有效。这使命名隧道适用于需要对隧道及其源站进行控制的生产用途。
const tunnel = await sandbox.tunnels.get(8080, { name: "my-app-preview" });
console.log(tunnel.url); // → https://my-app-preview.example.comconst tunnel = await sandbox.tunnels.get(8080, { name: "my-app-preview" });
console.log(tunnel.url); // → https://my-app-preview.example.com调用 sandbox.destroy() 会在销毁容器的同时拆除 Cloudflare Tunnel 和关联的 DNS 记录,因此不会留下悬空的隧道或记录。
升级到最新版本:
npm i @cloudflare/sandbox@latestyarn add @cloudflare/sandbox@latestpnpm add @cloudflare/sandbox@latestbun add @cloudflare/sandbox@latest有关完整的 API 详情,请参阅 Sandbox 隧道参考。