deno.com

管道流

在 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

您找到所需的信息了吗?

隐私政策