管道流
Deno 实现了 Web 标准流,这带来了许多优势。流最实用的功能之一是它们如何能够在不同的源之间进行管道传输。
流的一个常见用例是在不将整个文件缓冲在内存中的情况下下载文件。首先,我们打开我们要写入的文件
const download = await Deno.open("example.html", { create: true, write: true });
现在让我们向网页发送一个请求
const req = await fetch("https://examples.deno.land");
我们可以将此响应直接管道传输到文件。在更现实的示例中,我们将处理错误请求,但这里我们将只使用空合并运算符。与其打开文件并手动将获取主体管道传输到它,我们也可以只使用 `Deno.writeFile`。
req.body?.pipeTo(download.writable);
管道可以连接很多东西。例如,我们可以将我们刚刚下载的文件管道传输到标准输出。我们还可以将我们的流管道传输到转换器以获得更有趣的结果。在这种情况下,我们将把我们的文件管道传输到一个流,该流将在终端中突出显示所有“<”字符。
首先,我们将从标准库中导入一个实用程序来帮助我们完成此操作。
import { bgBrightYellow } from "jsr:@std/fmt/colors";
然后,我们将创建一个转换流实用程序类
class HighlightTransformStream extends TransformStream {
constructor() {
super({
transform: (chunk, controller) => {
controller.enqueue(chunk.replaceAll("<", bgBrightYellow("<")));
},
});
}
}
让我们打开我们的文件以供读取
const example = await Deno.open("example.html", { read: true });
现在,我们可以将文件的结果管道传输到 TextDecoderStream,然后管道传输到我们的自定义转换类,再管道传输回 TextEncoderStream,最后管道传输到标准输出
await example.readable
.pipeThrough(new TextDecoderStream())
.pipeThrough(new HighlightTransformStream())
.pipeThrough(new TextEncoderStream())
.pipeTo(Deno.stdout.writable);
使用 Deno CLI 在本地运行 此示例
deno run --allow-net --allow-read --allow-write https://docs.deno.org.cn/examples/piping-streams.ts