如何在 zx 中将 fetch 下载流直接管道到命令?

发布时间:2026/9/10 23:20:21
如何在 zx 中将 fetch 下载流直接管道到命令? 如何在 zx 中将 fetch 下载流直接管道到命令【免费下载链接】zxA tool for writing better scripts项目地址: https://gitcode.com/GitHub_Trending/zx/zx用 zxA tool for writing better scripts写下载类脚本时有一个常见的坑先fetch再用res.text()或res.json()处理会把整个响应体加载成字符串API 文档 明确指出当输出极大时可能超过字符串大小限制。为此 zx 给脚本内的fetch附加了pipe扩展让下载流直接接进命令的 stdin不必先把整个文件缓冲进内存。本文以「下载一个远端 package.json 并管道给命令处理」为例给出可运行的脚本和结果验证方式。环境与安装按 docs/setup.md运行 zx 脚本需要Linux、macOS 或 WindowsJavaScript 运行时Node.js 12.17.0另支持 Bun 1.0.0、Deno 1.x/2.x、GraalVM Node.jsbash 或 PowerShell。安装方式二选一npm install zx # add -g to install globally不想把 zx 装进项目依赖时可以直接运行npx zx script.js脚本文件约定见 docs/getting-started.md使用.mjs扩展名以启用顶层await文件开头加 shebang#!/usr/bin/env zx$、cd、fetch、echo等内置函数在脚本里开箱即用无需 import需要编辑器补全时可显式import zx/globals。保存后运行zx ./script.mjsfetch(...).pipe 的两种等价写法zx 脚本里的fetch是对 node-fetch-native 包的封装返回值除了是PromiseResponse还挂了一个pipe方法实现见 src/goods.ts。docs/api.md 给出的两种写法const p1 fetch(https://example.com).pipe($cat) const p2 fetch(https://example.com).pipecat两者的行为边界传入$模板字面量时返回ProcessPromiseawait后得到ProcessOutput可读stdout/stderr/exitCode模板字面量形式内部会以$({ halt: true, signal })创建目标进程因此整条管道可以作为单个单元等待且与.pipe($cat)产生相同的 stdout见 test/core.test.js 的测试断言目的地不是命令例如可写流时下载流会直接 pipe 进该流并返回目的地本身请求级signal会透传给被 pipe 的进程请求失败时目标进程会被 abort见 src/goods.ts。完整示例把下载的 package.json 管道给 cat下面的脚本沿用了项目测试中的 URL 与校验方式test/core.test.js下载 zx 主分支的package.json把下载流管道给cat再打印命令的 stdout#!/usr/bin/env zx const url https://raw.githubusercontent.com/google/zx/refs/heads/main/package.json const p fetch(url).pipe($cat) const { stdout } await p echo(stdout)保存为fetch-pipe.mjs后运行zx ./fetch-pipe.mjs模板字面量形式与上面的函数调用形式完全等价可以简写为const { stdout } await fetch(url).pipecat验证结果验证方式参照项目自身的测试断言test/core.test.js、test/goods.test.ts命令的 stdout 应包含name: zx——测试用assert.match(stdout, /name: zx/)校验说明下载流确实被完整送到了命令fetch(url)本身仍是可 await 的 Promise可单独检查 HTTP 状态例如测试中(await req).status为 200。stdout 包含预期内容即说明流管道工作正常。边界与注意事项大文件不要用text()/json()输出极大时可能超过字符串大小限制这正是pipe的适用场景docs/api.md目标命令非零退出与其他$进程一致目标命令返回非零退出码时await会抛出ProcessOutput需要自行处理退出码时目的地改用$({ nothrow: true })见 docs/api.md超时可给fetch传signal: AbortSignal.timeout(5000)docs/api.md 中的示例超时信号会沿 pipe 传给目标进程响应较小且只需要 JSON 时await res.json()更直接pipe面向的是大响应体或必须把流交给命令处理的场景。延伸下载接口不稳定时可用retry()包裹重试docs/api.md一个完整组合了fetch、超时与错误处理的脚本可参考 examples/fetch-weather.mjs。【免费下载链接】zxA tool for writing better scripts项目地址: https://gitcode.com/GitHub_Trending/zx/zx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询