分享免费的编程资源和教程

网站首页 > 技术教程 正文

Deno 1.36发布:更灵活的安全性和测试 API!

goqiw 2024-11-10 10:08:27 技术教程 10 ℃ 0 评论

家好,很高兴又见面了,我是"高级前端?进阶?",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力。

前言

Deno 设计目标的核心是灵活且强大的运行时安全性。 在 Deno 1.36 中,通过 --deny-* 标志进一步扩展安全选项。 除了现有的 --allow-* 标志之外,开发者现在还可以配置 Web 通信、文件系统访问和其他潜在敏感 API 的允许和拒绝列表。

除了这些安全功能之外,开发者还将在 1.36 中发现改进的测试和基准测试 API、更强大的 Node.js 和 npm 包支持、语言服务器改进等等。

如果安装了 Deno,则可以在终端中使用以下命令升级到版本 1.36:

curl -fsSL https://deno.land/x/install/install.sh | sh
// 安装
deno upgrade
// 升级

Deno 程序更灵活的安全选项

Deno 运行时默认提供安全性,使开发人员能够选择让代码和依赖项发出 Web 请求、访问文件系统或使用 --allow-* CLI 标志的其他潜在危险 API。

这些选项现在仍然很有用,但在某些情况下有点不灵活。 开发者可以让程序不受限制地访问给定功能,或者必须配置 --allow-_ 选项将启用的特定域或目录。 无法仅排除某些域或文件路径来打开沙箱。 在 Deno 1.36 中,引入了 --deny-_ 系列运行时标志,为 Deno 程序启用更灵活的权限。

例如,如果希望程序能够访问想要的任何 URL,除了一些特定的 IP 地址和域之外,可以使用:

$ deno run --allow-net --deny-net=api.evil.com mod.ts

例如,如果想让程序访问整个文件系统(/etc 目录除外):

$ deno run --allow-read --deny-read=/etc --allow-write --deny-write=/etc mod.ts

以前具有 --allow-_ 选项的每个 CLI 标志现在也将具有相应的 --deny-_ 选项。 拒绝标志的优先级高于允许标志,因此如果在相同的域或文件路径上使用两者,访问仍将被拒绝:

$ deno run --allow-read=foo.txt --deny-read=foo.txt mod.ts
error: PermissionDenied: Requires read access to "foo.txt"...

扩展的测试和基准测试选项

Deno 1.36 引入了对应用程序中的测试和基准测试的改进。 在测试方面,开发者可以使用新的自定义格式化程序输出 deno 测试运行的结果。

JUnit Report

拥有机器可读的测试报告对于测试的自动化 QA 和保持大型代码库的可维护性至关重要。 JUnit XML 格式可以被 GitLab、CircleCI、Jenkins 或 BuildPulse 等许多服务本机使用。

从 Deno 1.36 开始,开发者可以将 --formatter=junit 标志传递给 Deno test 来获取结构化报告数据:

# Print a JUnit report to the terminal so you can process it further…
$ deno test --reporter=junit

# …or write it directly to a file alongside the default human-readable output.
 deno test --junit-path=test_report.xml

Dot reporter

对于喜欢简短测试报告的人,添加了一个点报告器,它提供了简洁的输出,消除了很多噪音。

deno test --reporter=dot

node:test polyfill

如果从最新版本的 Node.js 转向 Deno,那么除了标准库中的 Deno.test 或 describe/it API 之外,开发者还可以使用 Node 20 中的内置测试 API。

可以使用如下所示的简单测试工具在 Deno 中亲自检查一下。

import assert from "node:assert";
import test from "node:test";
test("synchronous passing test", (t) => {
  // This test passes because it does not throw an exception.
  assert.strictEqual(1, 1);
});

test("asynchronous passing test", async (t) => {
  // This test passes because the Promise returned by the async
  // function is not rejected.
  assert.strictEqual(1, 1);
});

deno bench 改进

通过 Deno.bench 中添加的新功能,Deno 基准测试的粒度和精度得到了提高。

在 Deno 的早期版本中,由于一种称为“JIT 偏差”的现象,Deno.bench 函数在第一次基准测试运行时给出了令人惊讶的结果 ,V8 引擎过度优化基准函数,然后放弃对后续函数的优化 ,导致结果不具有代表性。 现在,通过在用户定义的工作台案例之前运行“预热(warmup)”函数,该问题已得到解决。

此外,开发者现在可以使用 Deno.BenchContext.start 和 Deno.BenchContext.end 告诉基准测试工具想要测量的关键部分。 这两次调用之间的部分之外的所有内容都将被排除在测量之外。

import { readAll } from "https://deno.land/std@0.197.0/streams/mod.ts";
Deno.bench("foo", async (b) => {
  // Open a file that we will act upon.
  const file = await Deno.open("a_big_data_file.txt");
  // Tell the benchmarking tool that this is the only section you want
  // to measure.
  b.start();

  // Now let's measure how long it takes to read all of the data from the file.
  await readAll(file);
  // End measurement here.
  b.end();
  // Now we can perform some potentially time-consuming teardown that will not
  // taint out benchmark results.
  file.close();
});

Deno 1.36 还更新了 deno 基准输出,以包含有关每秒迭代次数的信息:

Node.js 兼容性改进

从 npm 运行未配置为二进制文件的脚本

现在,开发者可以从未在 package.json 中的包 bin 属性中配置的 npm 包运行脚本。例子:

deno run -A npm:somepackage@0.0.1/foo/cli.mjs

process.dlopen 可用

开发者现在可以使用 process.dlopen API 加载 Node.js 的本机插件。

AsyncLocalStorage 速度提高 3.5 倍

Deno 1.36 优化了 Node:async_hooks 模块中 AsyncLocalStorage 的实现,基准测试显示,它比 Deno v1.35.3 快 3.5 倍。

node:os 完全 polyfill

Node.js os 模块的 getPriority、setPriority 和 userInfo 函数现已可用,使得 node:os 模块完全被 pollyfilled。

import { getPriority } from "node:os";
console.log(getPriority());

其他改进

deno compile --no-terminal

新的 --no-terminal 标志现在可以与 deno 编译一起使用。 如果编译的二进制文件在 Windows 上运行,此标志将阻止打开终端窗口。

Deno.createHttpClient.allowHost

不稳定的 Deno.createHttpClient 现在支持 allowedHost 选项,从而可以为获取请求指定 Host 标头。

const client = Deno.createHttpClient({
  allowHost: true,
});
const res = await fetch("http://example.com", {
  headers: {
    host: "myhost.com",
  },
  client,
});

允许 WebSocket API 中的 HTTP(S) URL

开发者现在可以在 WebSocket Web API 中使用 http: 和 https: URL,Deno 会自动调整协议以分别使用 ws: 或 wss::

const url = new URL("https://example.com");
const ws = new WebSocket(url);
console.log(ws.url);
// wss://example.com

重试失败的模块下载

Deno 现在在下载依赖项时更具弹,由于远程服务器上的间歇性连接问题或虚假错误,连接到远程主机总是会失败。

在这种情况下,Deno 将等待一小段时间并重试下载,从而使 CI 管道更加可靠并减少重新运行命令的需要。

Deno.Command API 中更多有用的错误

在 1.36 之前,如果开发者尝试为 Deno.Command 中不存在的二进制文件生成子进程,则会显示一条无用的错误消息:

$ deno
> new Deno.Command("this-binary-does-not-exist").spawn();
Uncaught NotFound: No such file or directory (os error 2)
    at spawnChildInner (ext:runtime/40_process.js:162:17)
    at spawnChild (ext:runtime/40_process.js:182:10)
    at Command.spawn (ext:runtime/40_process.js:440:12)
    at <anonymous>:2:48

在 Deno 1.36 中,错误消息将包含未找到的二进制文件的名称:

$ deno
> new Deno.Command("this-binary-does-not-exist").spawn();
Uncaught NotFound: Failed to spawn: this-binary-does-not-exist: No such file or directory (os error 2)
    at spawnChildInner (ext:runtime/40_process.js:162:17)
    at spawnChild (ext:runtime/40_process.js:182:10)
    at Command.spawn (ext:runtime/40_process.js:440:12)
    at <anonymous>:2:48

LSP 改进

Deno 1.36 包含对 LSP 的大量修复和改进。 这应该会让 Deno 与支持 LSP(如 Visual Studio Code)的编辑器一起使用变得更加容易。

  • 当 Deno 命名空间缺失时更好的诊断
  • 自动发现 deno.json 更可靠
  • LSP 读取 deno.json 中的“exclude”设置
  • node: specifiers 说明符得到正确处理
  • 支持符号链接配置文件

参考资料

https://deno.com/blog/v1.36

https://deno.land/manual@v1.36.0/getting_started/installation

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表