跳至主要内容
Deno 2 终于来了 🎉️
了解更多
Deno Deploy 的

更新日志

随时了解我们对 Deno Deploy 做出的所有最新添加和改进。

Deno 提供支持

ES 装饰器在 Deno Deploy 上启用,取代了实验性的 TS 装饰器

TL;DR

如果部署的代码使用装饰器并且编译器选项中未显式设置 experimentalDecorators 标志,则 Deno Deploy 会在构建时抛出错误。要解决此错误,请在 deno.json 文件中指定您喜欢的装饰器风格,如下所示

{
  ...
  "compilerOptions": {
    // true:  enable TypeScript decorators
    // false: enable ECMAScript decorators
    "experimentalDecorators": true
  }
}

背景

正如我们在 Deno 1.39.01.40.0 博客文章中宣布的那样,Deno 现在默认情况下启用了 ECMAScript 装饰器,这是由 TC39 标准化的,它取代了之前默认情况下启用的 实验性的 TypeScript 装饰器。您仍然可以在 deno.json 中的 compilerOptions 中配置要使用的风格。

此更新也已应用于 Deno Deploy,但在过渡过程中遇到了一些挑战。可能需要用户采取行动的最重大变化是,如果现在重新部署代码而没有任何更改,则之前部署并成功执行的代码可能会在构建时或运行时失败。如果满足以下两个条件,则可能会发生此问题

  • 代码使用 TypeScript 装饰器,并且
  • experimentalDecorators 标志未设置为 true

这是因为 Deno Deploy 上的构建过程现在将装饰器转换为 ECMAScript 装饰器,而以前是转换为 TypeScript 装饰器。请注意,通常这两种装饰器彼此不兼容。

为了确保过渡受控,如果部署的代码使用任何类型的装饰器并且 experimentalDecorators 标志未显式设置为任何值,则 Deno Deploy 将在构建时给出错误。这是要求用户显式指定其首选装饰器风格,以避免由于两种装饰器之间的差异而可能发生的任何意外行为。

deployctl 1.9.0:令牌配置、配置文件等等!

随着 deployctl 1.9.0 版本的发布,手动访问令牌处理已成为过去!🎉 从此版本开始,如果未通过参数或环境提供令牌,则将使用 OAuth 授权流程配置新的令牌。

此外,还引入了其他一些改进以简化工具的用户体验:此版本引入了对配置文件的支持,在该文件中可以配置和共享一些设置,例如 projectentrypointincludeexclude。如果尚未存在,此配置文件将在部署结束时创建。它默认为 deno.json(与 deno CLI 的其余配置集成),如下所示

{
  ...
  "deploy": {
    "project": "6067570b-ee11-4e2e-b7df-692d11e049d5",
    "exclude": [],
    "include": [
      "main.ts",
      "deps.ts"
    ],
    "entrypoint": "main.ts"
  }
}

您可以继续使用 --entrypoint--project 标志执行部署(如果项目不存在,这些标志现在将在部署期间自动创建项目)。但是,我们引入了一些启发式方法来尝试使部署更加简单。现在,deployctl 会根据它所在的 Git 存储库(或者如果部署不在存储库中,则根据目录名称)来猜测部署的项目名称。类似地,它会通过查找具有常见入口点名称的文件(main.ts、src/main.ts 等)来猜测入口点,因此,大多数情况下,将代码部署到全球各地就像运行以下命令一样简单

deployctl deploy

Deno Deploy 上的自动部署验证

从今天开始,Deno Deploy 将对新的部署执行自动验证。新的部署将首先被推送到一个短暂的 V8 隔离区进行快速冒烟测试。如果隔离区失败,则部署将不会发布,您可以在部署仪表板中看到验证错误。

验证旨在捕获那些否则只有在运行时才能发现的错误(例如,调用不存在的函数)。

目前,验证以软失败模式执行,这意味着即使验证失败,部署仍将创建。我们计划在接下来的几周内监控这种情况,然后切换到硬失败模式。

Deno Deploy 上的 KV 密钥过期支持

Deno KV 的 密钥过期 功能现在已在 Deno Deploy 上支持。

您可以在 kv.set()kv.atomic().set() 上使用 expireIn 参数来设置密钥的过期时间

// expires in 86400 seconds (1 day)
await kv.set(["sessions", session.id], session, { expireIn: 86400 * 1000 });

GitHub 应用程序权限和新的项目模板

今天,Deno Deploy 团队对 新项目工作流程 进行了更改,以更好地支持您最喜欢的 Web 框架,例如 AstroSvelteKitNuxt 等等。为了有效地做到这一点,我们需要我们的 GitHub 应用程序对您项目的访问工作流程有更多权限。

许多在 Node.js 生态系统中设计的 Web 框架在部署之前需要一个构建步骤。通过访问 GitHub 工作流程,Deno Deploy 可以自动为您配置这些构建步骤。

对于现有的 Deploy 用户,如果您想利用这些新的项目功能,可能会提示您为 Deno 的 GitHub 应用提供更多权限。

如果您有任何问题或反馈,请随时通过 [email protected] 联系我们。

Deno Deploy 上支持 NPM 指定符

现在所有用户都可以在 Deno Deploy 上使用 NPM 指定符。现在,您可以直接从 Deno Deploy 项目中导入 NPM 模块,而无需构建步骤。

以下是在 Deno Deploy 上运行 Express 应用程序的示例

// Import express and instantiate it
import express from "npm:express@4";
const app = express();

// Register a route
app.get("/", (req, res) => {
  res.send("Hello World!");
});

// Run the server!
app.listen(3000);

查看博客文章了解更多详情 →

Deno KV 公开测试版

Deno KV 是将强一致性数据库添加到应用程序的最简单方法,现已进入公开测试阶段。只需注册 Deno Deploy,即可免费使用 Deno KV。

查看博客文章了解更多详情 →

从 Deno Deploy 之外连接到 Deno KV

现在,您可以通过 创建 Deno Deploy 个人访问令牌,并将其设置为环境变量 DENO_KV_ACCESS_TOKEN,然后将您的数据库 URL 传递给 Deno.openKv(),从 AWS Lambda、GCP、Fly.io、本地等使用全局 Deno KV。

const kv = await Deno.openKv(
  "https://api.deno.com/databases/<database-id>/connect",
);

您可以在 Deno Deploy 项目页面上找到您的数据库 ID、URL 和有关如何从您的托管 KV 数据库连接的更多信息。

Grabbing your database information

这使得处理数据导入、迁移等变得更加容易。

详细了解如何连接到您的全局 Deno KV →

更多 Deno KV 读取区域以降低延迟

默认情况下,每个 Deno KV 数据库都带有一个写入区域和一个读取区域。如果您的用户遍布全球,一些用户可能会因单个读取区域而导致延迟增加。

现在,启用更多读取区域以扩展您的数据库,使其遍布全球,从而进一步降低延迟。

Enabling more read regions for lower latency

增加 Deno KV 原子操作

原子操作 允许您在单个事务中执行多个操作。如果任何操作失败,则整个事务将回滚,确保您的数据始终保持一致。

以前,您只能在单个事务中执行最多 10 个变异操作。**此限制已增加到每个原子操作 1,000 个变异或总原子操作大小为 800 KiB**,以先达到的为准。

Deno KV 定价

我们很高兴地宣布透明的 Deno KV 定价,它将根据您的需求进行扩展。Deno KV 按三个维度计费

  • 存储:您每月存储在数据库中的数据量
  • 读取单元:每次从数据库读取数据时,以 4 KiB 单元为单位
  • 写入单元:每次写入数据库时,乘以启用的区域数,以 1 KiB 单元为单位

以下列出完整的定价表,以供详细了解

免费 专业版 自定义版
KV 存储 1 GB 5GB(之后每 GB 0.50 美元) 自定义版
KV 读取单元/天(4kb) 15,000 45,000(之后每百万个 1 美元) 自定义版
KV 写入单元/天(1kb) 10,000 30,000(之后每百万个 2.50 美元) 自定义版
数据库区域数 1 自定义版 自定义版
选择您的写入区域
每月最大使用量 免费 $250 不适用

提醒一下,在没有 Deno Deploy 的情况下在本地使用 Deno KV 将是免费的。

阅读公告博客文章查看我们的定价计划 →

deployctl 1.8.0:查询和过滤日志

使用 deployctl 1.8.0,您可以使用 deployctl logs 从命令行查询和过滤日志。它同时支持实时日志(日志在生成时流式传输到控制台),以及查询持久化日志(它会获取过去生成的日志)。

以下是一些示例

To show the live logs of a project's latest deployment:
  deployctl logs --project=helloworld

To show the live logs of a particular deployment:
  deployctl logs --project=helloworld --deployment=1234567890ab

To show the live error & info level logs of the production deployment generated in particular regions:
  deployctl logs --project=helloworld --prod --levels=error,info --regions=region1,region2

To show the logs generated within the past two hours, up until 30 minutes ago, and containing the word "foo":
  [Linux]
  deployctl logs --project=helloworld --since=$(date -Iseconds --date='2 hours ago') --until=$(date -Iseconds --date='30 minutes ago') --grep=foo
  [macOS]
  deployctl logs --project=helloworld --since=$(date -Iseconds -v-2H) --until=$(date -Iseconds -v-30M) --grep=foo

有关选项的完整列表

    --deployment=<DEPLOYMENT_ID>  The id of the deployment you want to get the logs (defaults to latest deployment)
    --prod                        Select the production deployment
-p, --project=NAME                The project you want to get the logs
    --token=TOKEN                 The API token to use (defaults to DENO_DEPLOY_TOKEN env var)
    --since=<DATETIME>            The start time of the logs you want to get. RFC3339 format (e.g. 2023-07-17T06:10:38+09:00) is supported.
                                  NOTE: Logs generated over 24 hours ago are not available
    --until=<DATETIME>            The end time of the logs you want to get. RFC3339 format (e.g. 2023-07-17T06:10:38+09:00) is supported.
    --grep=<WORD>                 Filter logs by a word
                                  Multiple words can be specified for AND search. For example, "--grep=foo --grep=bar" will match logs containing both "foo" and "bar"
    --levels=<LEVELS>             Filter logs by log levels (defaults to all log levels)
                                  Mutliple levels can be specified, e.g. --levels=info,error
    --regions=<REGIONS>           Filter logs by regions (defaults to all regions)
                                  Multiple regions can be specified, e.g. --regions=region1,region2
    --limit=<LIMIT>               Limit the number of logs to return (defualts to 100)
                                  This flag is effective only when --since and/or --until is specified

持久化日志

可搜索和可过滤的日志对于快速测试、调试和迭代至关重要。

现在,您可以查看过去 24 小时内的应用程序日志,并根据时间、级别和区域进行过滤。

多行环境变量

Deno Deploy 现在支持内容跨越多行的环境变量。

这意味着您现在可以通过项目设置页面添加更多结构化环境变量,例如证书。

自动检测框架

您可能会惊讶地发现,Deno Deploy 不仅仅是在边缘以最小的延迟全局提供 Deno 应用程序。事实上,许多人选择 Deno Deploy 来为其 Remix、Svelte、Astro(等等)应用程序提供接近用户的服务。

我们通过在您连接新的 GitHub 存储库时自动检测它们,使连接和部署这些框架变得更加容易。

Deno Deploy 检测 Remix 应用程序 Deno Deploy 检测 Remix 应用程序并推荐使用构建步骤的部署方法的示例。

这些框架将被自动检测

  • 带有 SSG 的 Next.js
  • Remix
  • Astro
  • Docusaurus
  • Gatsby
  • Svelte
  • Vite
  • React (create-react-app)
  • Nuxt
  • Solid
  • Storybook
  • Angular
  • Qwik

我们正在努力支持更多框架。如果您希望我们检测某个框架,请告诉我们

使用 Deno.serve() 快速轻松地构建全局 Web 服务器

以前,构建 Web 服务器需要导入 std/http 以及几行代码。现在,您可以在一行代码中启动一个性能优异的 Web 服务器,该服务器以不到 100 毫秒的延迟全局部署。

Deno.serve((req) => new Response("Hello world"));

了解更多关于如何轻松使用Deno.serve()的信息,请阅读1.35 博客文章

静态可分析的动态导入

Deno Deploy 现在支持静态可分析的动态导入。这意味着您可以在代码中使用import(),模块将在构建时被获取,并被包含在由 Deno Deploy 生成的eszip(一种用于捆绑部署代码的格式)中。代码将在运行时仅在请求需要时加载和执行。

在下面的示例中,uuid 模块将在构建时被获取,并被包含在 eszip 中,但只有在脚本服务请求时才会在运行时加载和执行。

import { serve } from "https://deno.land/[email protected]/http/server.ts";

serve(async (req: Request) => {
  const { version } = await import("https://deno.land/[email protected]/uuid/mod.ts");
  const ver = version("109156be-c4fb-41ea-b1b4-efe1671c5836");
  return new Response(ver);
});

不能静态分析的动态导入不起作用。例如,下面的代码将在运行时抛出模块未找到的错误,因为模块标识符根据Date.now()的值而改变,所以代码没有包含在 eszip 中。

import { serve } from "https://deno.land/[email protected]/http/server.ts";

serve(async (req: Request) => {
  const mod = `./module_${Date.now()}.ts`;
  const { hello } = await import(mod);
  return new Response(hello);
});

deployctl 1.7.0

deployctl,用于 Deno Deploy 的 CLI 工具,已更新至 1.7.0。

从本版本开始,deployctl deploy 现在能够检测它是否尝试将第一个部署推送到一个新的空项目。在这种情况下,它现在将负责初始化production 环境并将初始部署推送到它。

这只会影响对空项目的第一次推送。后续部署的默认行为没有改变,仍然需要使用--prod 标志才能对production 环境进行进一步更新。

阅读完整的变更日志了解更多信息.

内置 Node 模块支持

Deno Deploy 现在支持使用node: 标识符导入内置 Node 模块,如fspath。这使得将现有的 Node.js 代码移植到 Deno Deploy 上运行变得更加容易。

node:http 模块也受支持,这使得可以将最初为 Node 编写的 Web 服务器在 Deno Deploy 上本地运行。例如,以下是用node:http 编写的简单 HTTP 服务器,它服务于当前时间和服务请求的区域。

import { createServer } from "node:http";
import process from "node:process";

const server = createServer((req, res) => {
  const message = `Hello from ${process.env.DENO_REGION} at ${new Date()}`;
  res.end(message);
});

server.listen(8080);

您可以在此处查看它的实际运行情况:https://dash.deno.com/playground/node-specifiers

受支持的 Node 内置模块的完整列表可在文档中找到。

deployctl 1.6.0

deployctl,用于 Deno Deploy 的 CLI 工具,已更新至 1.6.0。此版本包含一个与deployctl logs 子命令相关的兼容性修复。

对于那些不熟悉deployctl logs 的人来说,它是一个用于从 Deno Deploy 流式传输日志的子命令,它是在 1.5.0 中引入的(感谢@rolitoxdd 的实现)。使用deployctl logs,您无需打开浏览器并转到仪表板 - 所有操作都在终端中完成。

改进

其他改进包括

  • 切换到Deno.Command
  • 更新日志流式传输端点的日志响应类型

阅读完整的变更日志了解更多信息.

自动通配符 SSL 证书配置

使用自定义域配置 SSL 证书可能很麻烦,因此我们添加了对自动通配符 SSL 证书配置的支持。现在,将自定义域添加到 Deno Deploy 项目后,只需单击一下即可配置 SSL 证书。

链接 GitHub 项目时添加环境变量

我们的目标是使部署到 Deno Deploy 尽可能简单,因此您现在可以在链接 GitHub 项目的同一步骤中定义环境变量。

Deno Deploy Beta 4

今天我们发布了 Deno Deploy Beta 4,使该服务更接近正式发布。在此版本中,我们改进了仪表板,添加了计费功能,添加了 3 个新区域,并改进了分析功能。

每天都有越来越多的基础设施构建在 Deno Deploy 之上——例如 Netlify Edge Functions 和 Supabase Edge Functions 都构建在 Deno Deploy Subhosting 之上。我们鼓励您尝试一下,即使它仍在测试阶段!

改进

  • 添加了定价。目前我们提供免费计划和专业计划。
  • 添加了 3 个新区域:米兰、马德里和巴黎。
  • 我们对 Deno Deploy 仪表板进行了重大改进,使其更易于管理应用。

博客文章 中了解更多信息。

Deno Deploy Beta 3

今天我们发布了 Deploy Beta 3。这是在未来几个月内发布的一系列测试版中的第三个。每个版本都将添加功能并完善编程模型。这些版本最终将以我们估计将在 2021 年第四季度发布的正式发布公告告终。

在过去的一年里,我们一直在默默地设计这种托管服务,以补充开源 Deno CLI 的工作流程。Deploy 不运行在 AWS Lambda 上,也不使用 Cloudflare Workers;这是一个具有独特设计的新系统。我们鼓励人们关注粗略的初始 UI,并探索这种新的 JavaScript 运行时。

Deploy 的目标是成为托管现代服务器端 JavaScript 的最佳场所。

改进

  • 添加了以下新的 API。
    • 现在支持出站 TCP 和 TLS 连接。
    • DNS 解析:Deno.resolveDns()
    • 添加了 URLPattern API
  • 添加了游乐场。您可以在浏览器中的在线编辑器中快速测试您的部署。
  • 添加了组织功能。您可以与团队成员一起管理项目。

博客文章 中了解更多信息。

Deno Deploy Beta 2

今天我们发布了 Deploy Beta 2。这是在未来几个月内发布的一系列测试版中的第二个。每个版本都将添加功能并完善编程模型。

在过去的八个月里,我们一直在默默地设计这种托管服务,以补充开源 Deno CLI 的工作流程。Deploy 不运行在 AWS Lambda 上,也不使用 Cloudflare Workers;这是一个具有独特设计的新系统。我们鼓励人们关注粗略的初始 UI,并探索这种新的 JavaScript 运行时。

Deploy 的目标是成为托管现代服务器端 JavaScript 的最佳场所。

改进

  • 可以使用 Deno.readFile 加载静态文件。
  • 添加了 Deno.listenDeno.serveHttp
  • 添加了崩溃报告页面。
  • 仪表板采用了新设计。

博客文章 中了解更多信息。

Deno Deploy Beta 1

今天我们发布了 Deploy Beta 1。这是在未来几个月内发布的一系列测试版中的第一个。每个版本都将添加功能并完善编程模型。

在过去的八个月里,我们一直在默默地设计这种托管服务,以补充开源 Deno CLI 的工作流程。Deploy 不运行在 AWS Lambda 上,也不使用 Cloudflare Workers;这是一个具有独特设计的新系统。我们鼓励人们关注粗略的初始 UI,并探索这种新的 JavaScript 运行时。

Deploy 的目标是成为托管现代服务器端 JavaScript 的最佳场所。

改进

  • 快速部署。
  • 支持 TypeScript、JSX、ES Modules、HTTPS 导入。
  • 支持 BroadcastChannel。
  • 支持自定义证书。
  • Fresh 框架可用。

博客文章 中了解更多信息。