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