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

Deno 1.22 版本说明

Deno 1.22 已被打标签并发布,包含以下新功能和更改

如果您已安装 Deno,可以通过运行以下命令将其升级到 1.22

deno upgrade

如果您是第一次安装 Deno,可以使用以下方法之一

# Using Shell (macOS and Linux):
curl -fsSL https://deno.land/x/install/install.sh | sh

# Using PowerShell (Windows):
iwr https://deno.land/x/install/install.ps1 -useb | iex

# Using Homebrew (macOS):
brew install deno

# Using Scoop (Windows):
scoop install deno

# Using Chocolatey (Windows):
choco install deno

默认类型检查行为已更新

Deno 目前支持三种类型检查模式

  • 🌐 完整:完整类型检查会检查您的整个项目,包括所有依赖项。如果依赖项包含类型错误,它将被报告给您。
  • 📁 本地:本地类型检查会检查项目中的代码是否存在类型错误,但会跳过对所有依赖项的类型检查。
  • :根本不执行类型检查。

以前,Deno 使用完整作为默认类型检查模式。这意味着您将收到对超出您的直接控制范围(您的依赖项)的代码报告的类型错误。我们发现这是一种不合适的默认设置,因此正在将默认模式更改为本地。这与tsc一致,它也使用本地类型检查模式。

子命令 v1.21 v1.22 v1.23(拟议)
deno bench 🌐 完整 📁 本地 📁 本地
deno bundle 🌐 完整 📁 本地 📁 本地
deno cache 🌐 完整 📁 本地 ❌ 无
deno check 📁 本地 📁 本地 📁 本地
deno compile 🌐 完整 📁 本地 📁 本地
deno eval ❌ 无 ❌ 无 ❌ 无
deno repl ❌ 无 ❌ 无 ❌ 无
deno run 🌐 完整 📁 本地 ❌ 无
deno test 🌐 完整 📁 本地 📁 本地

注意:1.23 版本拟议的更改与我们在deno run中默认禁用类型检查的目标一致。有关更多详细信息和此更改的理由,请参阅1.21 版本说明

如果您想使用完整类型检查模式,它仍然可用。要执行完整类型检查,请运行 deno check --remote main.ts

您可以通过使用以下标志在任何子命令中强制使用特定的类型检查模式

标志 模式
--no-check ❌ 无
--no-check=remote¹ 📁 本地
--check=all 🌐 完整

¹:--no-check=remote 将在即将发布的版本中被 --check 替换。

删除不稳定的 Deno.emit()Deno.formatDiagnostics()Deno.applySourceMap() API

Deno 附带了 Deno.emit() API,该 API 允许以编程方式转译和捆绑源代码。这是一个不稳定的 API,在我们看来,它从未很好地融入 Deno 命名空间。支持此 API 为我们已经很复杂的转译管道增加了许多复杂性,引入了许多微妙的边缘情况,并阻碍了我们一直想做的一些重构。经过多次讨论,我们决定从 Deno 命名空间中删除此 API,而是将其作为用户端模块提供:deno_emit。这使我们能够开发出更适合用户需求的 API。

Deno 命名空间默认在 worker 中可用

自 v1.0 版本以来,Deno 一直支持Worker Web API。但是,默认情况下,Deno 命名空间在 worker 上下文中不可用,除非在选项包中显式启用它

// This worker did NOT have access to the `Deno` namespace.
new Worker(new URL("./worker_without_deno.js", import.meta.url));

// This worker did have access to the `Deno` namespace.
new Worker(new URL("./worker_without_deno.js", import.meta.url), {
  deno: true,
});

在此版本中,我们正在更新 web worker 以默认启用 Deno 命名空间,更符合用户预期。这意味着您现在可以默认情况下在 web worker 中使用 Deno 命名空间 API,前提是设置了必需的权限。

// This worker will now have access to the `Deno` namespace.
new Worker(new URL("./worker_without_deno.js", import.meta.url));

您仍然可以使用 WorkerOptions.deno 选项应用其他设置,例如自定义权限

// Only allows read permissions to this worker.
new Worker(new URL("./worker_without_deno.js", import.meta.url), {
  deno: {
    permissions: {
      read: true,
    },
  },
});

感谢Nayeem Rahman 为此功能做出贡献!

--no-config 标志

从 Deno v1.18 开始,运行时可以自动发现配置文件。虽然此功能在大多数情况下很方便且有用,但有些情况下它并不理想。

例如,您可能正在开发一个使用非标准 TypeScript 类型声明的前端项目,这些声明在配置文件中定义。如果您在项目目录中还有一些独立的第三方工具(例如udd),将相同的配置文件应用于这些工具是不理想的,因为它们可能需要不同的类型声明。

此版本添加了一个 --no-config 标志,它会禁用配置文件的自动发现。使用此标志,所有配置都必须通过 CLI 标志显式传递以进行配置。

此版本将 userAgent 属性添加到全局 navigator 对象中。此属性设置为与在传出的 HTTP 请求上设置的 User-Agent 标头相同的值。

console.log(navigator.userAgent);
// "Deno/1.22.0"

感谢@randomicon00 为此功能做出贡献!

更新 Deno.resolveDns() API

此版本更新了 Deno.resolveDns() API。现在可以解析以下记录类型

  • NS
  • CAA
  • SOA
  • NAPTR

例如

const [ns, caa, soa, naptr] = await Promise.all([
  Deno.resolveDns("example.com", "NS", nameServer),
  Deno.resolveDns("example.com", "CAA", nameServer),
  Deno.resolveDns("example.com", "SOA", nameServer),
  Deno.resolveDns("example.com", "NAPTR", nameServer),
]);

console.log("NS", ns);
// NS ["ns1.ns.com.","ns2.ns.com.","ns3.ns.com."]
console.log("CAA", caa);
// CAA [
//    {"critical":false,"tag":"issue","value":"ca.example.net"},
//    {"critical":false,"tag":"issue","value":"ca2.example.net; account=123456"},
//    {"critical":false,"tag":"issuewild","value":";"},
//    {"critical":false,"tag":"iodef","value":"mailto:[email protected]"},
//    {"critical":true,"tag":"tbs","value":"Unknown"}
// ]
console.log("SOA", soa);
// SOA [
//    {"mname":"net.example.com.","rname":"admin\\.domain.example.com.","serial":20,"refresh":7200,"retry":600,"expire":3600000,"minimum":60}
// ]
console.log("NAPTR", naptr);
// NAPTR [
//    {"order":10,"preference":0,"flags":"s","services":"SIPS+D2T","regexp":"","replacement":"_sips._tcp.example.com."},
//    {"order":10,"preference":0,"flags":"s","services":"RELAY:turn.udp","regexp":"","replacement":"_turn._udp.example.com."}
// ]

感谢Thanapat ChotipunCraig Morten 为此功能做出贡献!

新的 Response.json() 静态方法

此版本在 Response 全局对象中添加了一个新的静态 json() 方法。它允许从 JSON 结构轻松创建 Response 对象。

const json = { hello: "world" };

// Previously:
const body = JSON.stringify(json);
const response = new Response(body, {
  headers: { "content-type": "application/json" },
});

// Now:
const response = Response.json(json);

新方法的第一个参数是要编码的 JSON 结构。第二个参数是可选的选项包,它与 new Response() 构造函数中使用的选项包相同。

Fetch 规范的补充 是专门针对服务器端运行时设计的。Deno 是第一个在稳定版中实现此新 API 的运行时,但其他运行时应该很快就会效仿。Chromium 已经有一个正在审查中的此 API 的实现。

LSP 中默认启用代码风格检查

Deno v1.22 默认情况下在使用 deno lsp 的 IDE/编辑器中启用代码风格检查。此设置仍然可以禁用,但在大多数项目中,这意味着需要更少的 IDE/编辑器配置,因为大多数项目都启用了代码风格检查。

不稳定 Deno.spawn() API 的更新

现在可以在 Deno.spawn()Deno.spawnChild() 的选项包中将 AbortSignal 作为 signal 参数传递。当信号被中止时,子进程将使用 SIGTERM 信号终止。

ProcessStatus 的返回类型也已更新:signal 现在设置为表示导致进程退出的信号的字符串。例如,如果进程使用 SIGTERM 终止,则 signal 属性将设置为 "SIGTERM"。使用字符串而不是数字与 Deno.Child#kill API 一致。

在本版本中,Deno.spawnDeno.spawnChildDeno.spawnSync 仍然是不稳定的 API。我们希望在下一个版本(v1.23.0)中稳定该 API。请尝试使用新的 API,并通过我们的问题跟踪器提供任何反馈。

测试运行器的更新

此版本为测试运行器带来了另外一些更新。我们仍在迭代报告程序输出以使其更易读。

“错误”和“失败”部分的标题现在更清晰可见,失败的测试现在显示 Deno.test() 调用的文件名和行号。

Headers and callsite

如果测试打印输出,则其名称将在输出后的下一行重复,以使找出哪个测试失败/通过更容易。

Repeated test name if output is printed

未捕获的错误现在有更好的表示,并显示了可能出错的原因的提示。

Uncaught errors in tests

感谢 Nayeem Rahman 为此贡献了这些更改!

performance.timeOriginperformance.toJSON

performance 全局变量在本版本中获得了一个新属性:timeOrigin。它被设置为启动工作者的时刻的高分辨率 UNIX 时间戳。它可以与 performance.now() 结合使用以计算当前时间的高分辨率 UNIX 时间戳。

// This is the same as `Date.now()`, except that the precision is much greater
// than the millisecond precision of `Date.now()`.
const timestamp = performance.timeOrigin + performance.now();

此外,performance.toJSON() 方法现在存在,并且行为与浏览器完全相同。

感谢 Geert-Jan Zwiers 为此贡献了此功能!





HN 评论