Deno Deploy Beta 2
Deno Deploy 是一个多租户 JavaScript 引擎,运行在全球 25 个数据中心。该服务将云基础设施与 V8 虚拟机深度集成,允许用户快速编写分布式 HTTPS 服务器脚本。这种新颖的“无服务器”系统是专为现代 JavaScript 编程从头设计的。
今天我们发布了 Deploy Beta 2。这是未来几个月内将发布的一系列测试版中的第二个。每个版本都将添加新功能并完善编程模型。这些版本最终将以通用可用性 (GA) 公告的形式发布,我们估计这将在 2021 年第四季度发生。
在过去的八个月里,我们一直在悄悄设计这项托管服务,以补充开源 Deno CLI 的工作流程。Deploy 不运行在 AWS Lambda 上,也不使用 Cloudflare Workers;这是一个拥有独特设计的新系统。我们鼓励人们忽略粗糙的初始用户界面,探索这个新的 JavaScript 运行时。
Deploy 的目标是成为托管现代服务器端 JavaScript 的最佳平台。
Deno.readFile
加载静态文件
可以使用 自Deploy Beta 1 发布以来,许多用户已使用 Deploy 创建了 API 端点和边缘代理。许多其他用例需要图像、Markdown 和 CSS 等静态资产。之前,我们曾建议用户通过向其 GitHub 仓库发出外部 fetch()
请求并代理内容来加载静态内容。
Beta 2 通过添加 Deno.readFile
API 大大简化了这一过程。此 API 可用于加载部署关联的 GitHub 仓库中存储的静态文件。
const image = await Deno.readFile("./static/logo.png");
addEventListener("fetch", (e) => {
e.respondWith(
new Response(image, {
headers: { "Content-Type": "image/png" },
}),
);
});
您可以在文档中阅读更多关于 Deno.readFile
API 的信息。
由于 Deploy 现在有了文件系统,所有新项目的 import.meta.url
已更新为 file://
URL。现有项目将继续像以前一样工作。要使用新行为,请创建一个新项目。
Deno.listen
和 Deno.serveHttp
我们正在努力使 Deno Deploy 和 Deno CLI 更加紧密地结合,以便一个系统上的代码可以与另一个系统透明地互操作。以前,在 Deploy 中处理传入请求的唯一方法是使用 addEventListener("fetch", cb)
。现在我们增加了使用兼容 CLI 的调用 Deno.listen()
和 Deno.serveHttp()
来处理请求的能力。这使得像 Oak 这样的 Web 框架能够透明地支持 Deploy。
const listener = Deno.listen({ port: 0 });
console.log("listening on port", listener.addr.port);
async function handleConn(conn) {
const httpConn = Deno.serveHttp(conn);
for await (const e of httpConn) {
e.respondWith(handler(e.request, conn));
}
}
function handler(_request, conn) {
return new Response("ok", {
headers: {
"x-localaddr": `${conn.localAddr.hostname}:${conn.localAddr.port}`,
"x-remoteaddr": `${conn.remoteAddr.hostname}:${conn.remoteAddr.port}`,
},
});
}
for await (const conn of listener) {
handleConn(conn);
}
崩溃报告
2023 年 2 月 7 日更新:此功能在 deploy 中已不再可用。
Deploy 已经支持流式日志,允许实时查看来自全球实例的输出。然而,当 Deno Deploy 实例崩溃时,很难在日志中发现,特别是对于流量大的项目。因此,我们添加了持久化的“崩溃报告”,其中包含任何未处理异常发生前的 100 行日志。
新设计
Deploy 控制台网站已经进行了全面的视觉重新设计,具有更好的导航和可访问性。

后续计划
我们将在即将到来的测试版中继续改进 Deploy,最终将在 2021 年第四季度发布正式版 (GA)。预计下一个版本将解决长期请求的缓存功能、CLI 互操作性以及更好的入门流程。