Deno 1.22 版本说明
Deno 1.22 已被打标签并发布,包含以下新功能和更改
- 默认类型检查行为已更新
- 删除不稳定的
Deno.emit()
、Deno.formatDiagnostics()
和Deno.applySourceMap()
API Deno
命名空间默认在 worker 中可用--no-config
标志Navigator.userAgent
- 更新
Deno.resolveDns()
API - 新的
Response.json()
静态方法 - LSP 中默认启用代码风格检查
- 更新不稳定的
Deno.spawn()
API - 更新测试运行器
performance.timeOrigin
和performance.toJSON
如果您已安装 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 标志显式传递以进行配置。
Navigator.userAgent
此版本将 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 Chotipun 和Craig 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.spawn
、Deno.spawnChild
和 Deno.spawnSync
仍然是不稳定的 API。我们希望在下一个版本(v1.23.0)中稳定该 API。请尝试使用新的 API,并通过我们的问题跟踪器提供任何反馈。
测试运行器的更新
此版本为测试运行器带来了另外一些更新。我们仍在迭代报告程序输出以使其更易读。
“错误”和“失败”部分的标题现在更清晰可见,失败的测试现在显示 Deno.test()
调用的文件名和行号。
如果测试打印输出,则其名称将在输出后的下一行重复,以使找出哪个测试失败/通过更容易。
未捕获的错误现在有更好的表示,并显示了可能出错的原因的提示。
感谢 Nayeem Rahman 为此贡献了这些更改!
performance.timeOrigin
和 performance.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 为此贡献了此功能!