- 原文地址:Deno 1.8 Release Notes
- 原文做者:Bartek Iwańczuk, Luca Casonato, Ryan Dahl
- 译者:@hylerrix
- 原文发布时间/翻译时间:20210302/20210305
- 本文属于《Deno 钻研之术》系列,原文翻译内容会同步更新到 Deno 中文网 上(TL;DR。若是以为本文精读笔记太长,能够在这里只读原文翻译 deno-cn.vercel.app/posts)。
今天咱们发布了 Deno v1.8.0。此版本涵盖了大量的新功能和标准化工做:html
Intl
API 开箱即用。lcov
报告。若是你已经安装了 Deno,能够经过 deno upgrade
命令来更新到 1.8 版本。若是你是第一次体验 Deno,你能够尝试使用以下命令之一:前端
# 使用 Shell (macOS and Linux)
$ curl -fsSL https://deno.land/x/install/install.sh | sh
# 使用 PowerShell (Windows):
$ iwr https://deno.land/x/install/install.ps1 -useb | iex
# 使用 Homebrew (macOS):
$ brew install deno
# 使用 Scoop (Windows):
$ scoop install deno
# 使用 Chocolatey (Windows):
$ choco install deno
复制代码
精读笔记git
WebGPU API 给开发者提供一个底层、高性能和跨平台的方式来经过 JavaScript 在 GPU 硬件上编码。这个 API 是 WebGL 在网络上的有力继承者。相关规范虽未正式肯定,但目前 Firefox、Chromium 和 Safari 已逐步开始支持,Deno 也同样在跟进。github
该 API 可让开发者从 Deno 内部进行 GPU 渲染和通用 GPU 计算。一旦该 API 标准化结束并在 Deno 中被取消 unstable 标记,这将正式为开发者提供一种从 Web、服务器和开发机器上访问 GPU 资源的便捷方法。web
GPU 能够容许开发者使某些数值算法高度并行。这在渲染图形和游戏外也颇有用。在机器学习中高效使用 GPU 开启了复杂的神经网络体系——常被称为“深度学习”。计算机视觉、翻译、图像生成和强化学习等领域的飞速发展都源于有效利用了 GPU 硬件。正则表达式
现在,大多数神经网络都是在 Python 中定义的,而计算交由 GPU 负责。咱们相信若是存在适当基础架构的状况下, JavaScript(而不是 Python),也能够成为表达数学思想的理想语言。在 Deno 中提供开箱即用的 WebGPU 支持是朝向这个方向的一步。咱们的目标是经过支持 GPU 加速,以在 Deno 上运行 Tensorflow.js。咱们指望这将在将来几周或几个月内落实。算法
这是一个演示如何访问链接的 GPU 设备并读取名称和其所支持的功能的基本示例:typescript
// 执行 `deno run --unstable https://deno.land/posts/v1.8/webgpu_discover.ts`
// 尝试从用户代理来获取一个 adapter 适配器
const adapter = await navigator.gpu.requestAdapter();
if (adapter) {
// 打印出这个适配器的一些基本详情
console.log(`Found adapter: ${adapter.name}`);
const features = [...adapter.features.values()];
console.log(`Supported features: ${features.join(", ")}`);
} else {
console.error("No adapter found");
}
复制代码
这是一个小示例,演示 GPU 如何使用渲染着色器在绿色背景上渲染一个简单的红色三角形:数据库
$ deno run --unstable --allow-write=output.png https://raw.githubusercontent.com/crowlKats/webgpu-examples/f3b979f57fd471b11a28c5b0c91d0447221ba77b/hello-triangle/mod.ts
复制代码
注意这里使用 WebAssembly 来编写的 PNG。更多示例能够查看:github.com/crowlKats/w…编程
最终的 PR 足足占用了 15.5 万行代码,而且在跟进后花了整整 5个月的时间来合并。这很是感谢 crowlKats 领导了将 WebGPU 集成到 Deno 的工做。咱们也很是感谢为 Deno 中的 WebGPU 支持奠基基础的 wgpu 和 gfx-rs 项目的全部贡献者。也特别感谢 WebGPU 规范的编辑 kvark 以及 webgpu 和 gfx-rs 的首席开发者们,他们均为实现 WebGPU API 提供了出色的指导。
精读笔记:
支持 ICU 已成为 Deno 下第二受关注的功特性。咱们很高兴地宣布 Deno v.1.8 现已随附了完整的 ICU 支持。
全部基于 ICU 的 JavaScript API 如今均可以与浏览器 API 相兼容。
在 REPL 中能够进行以下尝试:
$ deno
Deno 1.8.0
exit using ctrl+d or close()
> const d = new Date(Date.UTC(2020, 5, 26, 7, 0, 0));
undefined
> d.toLocaleString("de-DE", {
weekday: "long",
year: "numeric",
month: "long",
day: "numeric",
});
"Freitag, 26. Juni 2020"
复制代码
精读笔记:
deno coverage
此版本经过扩大咱们测试覆盖范围的基础架构,增长了一些强大的新功能。主要的变化是测试覆盖率如今分为覆盖率集合和覆盖率报告两个部分。
此前,覆盖范围的收集和报告都在单个子命令中进行,只须要在执行 deno test
时指定 --coverage
标志便可。如今,用于 deno test
的 --coverage
标志将接收一个参数——用来存储收集的配置文件的目录路径。这就是覆盖率集合。接下来第二步能够调用 deno coverage 并制定存储覆盖率配置文件的目录路径。该子命令能够再控制台上输出格式化友好的文本报告,也能够输出 lcov 文件(--lcov
标志)以供 genhtml
、coveralls.io 或 codecov.io 之类的工具使用。
几天来,咱们一直在 deno_std
上对该功能进行测试。咱们将每次提交的覆盖率报告同步上传到 codecov.io 上。你能够在这里查看相关内容:codecov.io/gh/denoland… Github Actions 工做流上仅进行了以下 10 行的更改:
- name: Run tests
- run: deno test --unstable --allow-all
+ run: deno test --coverage=./cov --unstable --allow-all
+
+ - name: Generate lcov
+ run: deno coverage --unstable --lcov ./cov > cov.lcov
+
+ - name: Upload coverage
+ uses: codecov/codecov-action@v1
+ with:
+ name: ${{ matrix.os }}-${{ matrix.deno }}
+ files: cov.lcov
复制代码
有关与 coverals.io 集成的相关示例,能够参考这个仓库:github.com/lucacasonat…
精读笔记:
标准化的 Import maps 已在 Chrome 89 中支持 ,随后咱们也进项了相应的更新以匹配该规范的最新版本,如今也被认为很稳定。这意味着接下来使用 --import-map
时再也不须要 --unstable
标志。
$ deno run --import-map=./import_map.json ./mod.ts
复制代码
此外,--import-map
标志如今不只接受本地路径,并且接受 URL 路径,从而可使开发者从远程服务器加载 import maps。
$ deno run --import-map=https://example.com/import_map.json ./mod.ts
复制代码
Import maps 容许用户使用所谓的“裸”说明符来表示依赖关系,而不是相对或绝对文件地址/HTTP URL:
// Deno 默认状况下不支持此类说明符
// 但经过 import maps 用户能够将裸说明符从新映射到指定的 URL
import * as http from "std/http";
复制代码
{ "imports": { "std/http": "https://deno.land/std@0.85.0/http/mod.ts" }}
复制代码
用户应该记住,import maps 不可组合的:这意味着你只能为 deno run
/ deno test
提供单个的 import maps。所以,库做者仍应使用常规非“裸”的说明符(相对或绝对的文件路径 / http URLs);不然库用户将须要手动将你的库(和你的库依赖项)额裸说明符添加到用户本身的 import maps 中。
Import maps 一个更有用的功能是可以将常规说明符从新映射为一个彻底不一样的说明符。例如,若是你的模块图中深嵌套了一些破碎(broken)的依赖关系,你能够在将其上游修复前将其自主修复到指定版本。或者若是你使用将哈希值注入到模块文件名的构建过程,则能够直接在源码中引入该文件(无需 hash 值)并仅在运行时使用 import maps 从新映射说明符。
有关更多的示例和详细说明,请参考 import maps 规范。
精读笔记 - import maps:
import moment from "moment"
)。<script type="importmap">
和 <link rel="modulepreload" href="import:lodash">
支持。不是全部的代码都是在互联网上公开的。此前 Deno 没法从须要身份验证的服务器上下载代码。在这次版本中咱们增长了用户首次获取模块时可使用身份验证令牌的功能。
为了达到这个目的,Deno CLI 将尝试查找一个名为 DENO_AUTH_TOKENS
的环境变量,以肯定在请求远程模块时英考虑使用的身份验证令牌。环境变量的值采用以分号(;)分隔的 n 个令牌的格式,其中每一个令牌的格式为 {token}@{hostname[:port]}
。
例如,单个 token 令牌看起来像这样:
DENO_AUTH_TOKENS=a1b2c3d4e5f6@deno.land
复制代码
多个 token 令牌可能像这样:
DENO_AUTH_TOKENS=a1b2c3d4e5f6@deno.land;f1e2d3c4b5a6@example.com:8080
复制代码
当 Deno 将要获取一个远程模块时,若是远程模块的 hostname 主机名匹配到了环境变量中的 hostname 主机名:Deno 将会在请求头中设置一个 Authorization
header 字段,其值格式为 Bearer { token }
。这将支持远程服务器识别出该请求头是已通过身份验证的用户的受权请求,并在服务器上提供适当资源和模块的访问。
有关从私有 Github 存储库中提取信息的更详细的使用指南和配置环境说明,能够参考相关的手册条目。
精读笔记:
Deno.test
支持 Exit 清理器Deno.test
API 已经有两个清理器能够帮助开发者确保代码不会“泄露”操做或资源——即在测试用例结束以前,全部打开的文件/网络句柄都已关闭,而且没有其余挂起的系统调用。
Deno 1.8 添加了一个新的清理器能够确保通过测试的代码不会调用 Deno.exit()
。异常 exit 语句可能会提供假正的测试结果,而且常常被滥用或忘记删除。
默认状况下,全部测试都会启用这个清理器,但能够再测试定义中将 sanitizeExit
布尔值设置为 false 来禁用此功能。
Deno.test({ name: "false success", fn() { Deno.exit(0); }, sanitizeExit: false,});// 此条测试语句永不会执行Deno.test({ name: "failing test", fn() { throw new Error("this test fails"); },});
复制代码
你能够本身运行此脚本: deno test https://deno.land/posts/v1.8/exit_sanitizer.ts
。
Deno.permissions
API 现已稳定Deno 的安全模型基于权限机制。当前,只有在启动应用程序时才能授予这些权限。这在大多数状况下都适用。但在某些状况下,在运行时请求/撤销权限会带来更好的用户体验。
在 Deno 1.8 中,如今有一个稳定的 API 能够 query
查询、request
请求和 revoke
撤销权限。这些 API 包含在 Deno.premissions
对象中。这是一个如何工做的示例:
function homedir() { try { console.log(`Your home dir is: ${Deno.env.get("HOME")}`); } catch (err) { console.log(`Failed to get the home directory: ${err}`); }}// 尝试获取 home 目录(这里会失败,由于没有 env 权限)homedir();const { granted } = await Deno.permissions.request({ name: "env" });if (granted) { console.log(`You have granted the "env" permission.`);} else { console.log(`You have not granted the "env" permission.`);}// 尝试获取 home 目录(这里会在用户赞成受权后成功)homedir();await Deno.permissions.revoke({ name: "env" });// 尝试获取 home 目录(这里会失败,由于用户取消了受权)homedir();
复制代码
你能够本身运行此脚本:deno run https://deno.land/posts/v1.8/permission_api.ts
。
精读笔记:
--allow-all
、--alow-env
、--alow-hrtime
、--alow-net
、--alow-plugin
、--alow-read
、--alow-run
、--alow-write
。Deno.link
和 Deno.symlink
API 现已稳定此版本带来了与符号连接相关的四个稳定的 API:
Deno.link
Deno.linkSync
Deno.symlink
Deno.symlinkSync
在稳定以前,须要对这些 API 进行安全检查,而且须要适当的权限才能使用它们。
Deno.link
和 Deno.linkSync
须要对源路径和目标路径都具备读写权限。
Deno.symlink
和 Deno.symlinkSync
须要对目标路径具备写权限。
精读笔记:
Deno.link
和 Deno.linkSync
:建立新路径做为到旧路径的硬连接。前者是异步,后者是同步。Deno.symlink
和 Deno.symlinkSync
:建立新路径做为到旧路径的连接。options.type 参数能够设置为 file 或 dir。Deno.metrics
随着 Deno 变得更加稳定,对于开发者来讲,使用更简便的方法来检测它们的应用程序变得愈来愈重要。这须要从最底层(运行时自己)开始支持。在 Deno 中,JS 的全部特权操做(转到 Rust 的操做)都是经过 JS 和 Rust 之间的单个中心接口来实现的。咱们称经过该接口的请求为“ops”。例如,调用 Deno.open
将调用特权端的 op_open_async
,这将返回打开文件的资源 ID(或返回一个错误)。
早在两年多前的 2018 年 10 月 11 日,咱们添加了一种可让开发者来查看全部 Rust 和 JS 之间 ops 指标的新方法:Deno.metrics
。该 API 如今公开开始、完成的同步/异步操做的数量,以及经过操做接口发送的数据量。以前仅限于全部不一样操做的组合数据。没有办法肯定哪一个 ops 被调用了多少次,一般只有一个整体结果。
与 --unstable
一块儿运行时,此版本向 Deno.metrics
添加了一个名为 ops
的新字段。此字段包含每一个操做的信息,这些信息涉及 API 的调用频率以及经过 API 传输的数据量。这容许对运行时进行更精细的检测。
下面是如何使用的示例:
$ deno --unstableDeno 1.8.0exit using ctrl+d or close()> Deno.metrics().ops["op_open_async"]undefined> await Deno.open("./README.md")File {}> Deno.metrics().ops["op_open_async"]{ opsDispatched: 1, opsDispatchedSync: 0, opsDispatchedAsync: 1, opsDispatchedAsyncUnref: 0, opsCompleted: 1, opsCompletedSync: 0, opsCompletedAsync: 1, opsCompletedAsyncUnref: 0, bytesSentControl: 54, bytesSentData: 0, bytesReceived: 22}
复制代码
在即将发布的将来版本中,Deno.test
中的异步操做清理工具将使用此新信息,以在测试完成以前未完成异步操做时提供更多可操做性的错误。咱们已经看到此功能用于检测应用程序并将数据经过管道传输到监视软件中。
deno fmt
中支持 JSON 格式deno fmt
现已支持格式化为 .json
和 .jsonc
文件。就像 JS/TS 同样,格式化工具还能够在 Markdown 文件中格式化 json 和 jsonc 代码块。
精读笔记:
Deno.emit
中支持 IIFE 包内置的打包器能够打包出当即调用函数表达式(IIFE)格式的包。
默认状况下,输出格式仍为 esm
,但用户能够将 EmitOptions.bundle
选项设置为 iife
来更改此格式:
const { files } = await Deno.emit("/a.ts", { bundle: "iife", sources: { "/a.ts": `import { b } from "./b.ts"; console.log(b);`, "/b.ts": `export const b = "b";`, },});console.log(files["deno:///bundle.js"]);
复制代码
输出结果为:
(function() { const b = "b"; console.log(b); return { };})();
复制代码
你能够本身运行此脚本:deno run --unstable https://deno.land/posts/v1.8/emit_iife.ts
。
为不支持 ESM 的较旧浏览器建立打包时,这个特性特别有用。
精读笔记:
()
。deno lsp
现已稳定在过去的几个月中,咱们一直在努力替换旧的 VS Code 编辑器集成下的 Deno 扩展。旧的扩展仅适用于 VS Code,且解析出的类型并不老是与 Deno CLI 中对应的类型相匹配。
在 Deno 1.6 的 canary 版本中,咱们发布了内置的语言服务器 deno lsp
。LSP 容许咱们仅经过同一份代码向支持 LSP 协议的全部编辑器提供编辑器集成功能。内置的语言服务器与 Deno CLI 的其他部分基于相同的架构——所以,它提供的 TypeScript 诊断与 CLI 的其他部分相同。
两周前,在 Deno 1.7.5 中咱们稳定了 deno lsp 并将官方 VS Code 拓展切换到最新。到目前为止,咱们已收到了很好的反馈,并将努力解决全部用户建议的问题。若是你在拓展程序中遇到问题,请在咱们的问题跟踪器中报告该问题。由于咱们没法解决咱们并不知道的问题。
除了官方的 VS Code 集成外,还建立了不少基于 deno lsp
构建的社区集成。
精读笔记:
Deno 1.8 同步支持了最新的 TypeScript 稳定版本。
你能够在 Announcing TypeScript 4.2 文章中获取更多关于 TypeScript 4.2 的新特性信息。
精读笔记 - TypeScript 4.2 新特性包括但不止于:
--explainFiles
选项。使用此选项时,TypeScript 编译器将给出一些很是冗长的输出,理清文件如何最终访问到全部相关文件。--strictNullChecks
选项支持 &&
和 ||
表达式来优化逻辑表达式中的未调用函数检查。全文译完,并在每一个章节作了简单的精读笔记。本次翻译是“精读”系列的第二篇,上一篇是《精读《Deno 2020 官方回顾及 2021 展望》》。
《Deno 钻研之术》的精读系列将重点围绕官方博客展开,同时每翻译完一篇文章,也会争取 PR 合并到目前的 Deno 中文网上。欢迎对 @hylerrix/deno-tutorial 仓库进行 star 或关注公众号 (@ningowood) 来及时接收消息,携手助力 Deno 在 2021 变得更好!
© github.com/hylerrix/de… 2020~2021