ZX —— 用 JS 编写命令行脚本

3,528 阅读2分钟

最近各大技术社区都在转发2021年JavaScript明星项目榜:zx、Vite 、Next.js 、React 大受欢迎

3537243597-6201fe0d2d9a5.png

第一名好像突然冒出来的一样,今天我们来一起学习一下:

1. 介绍

这是一款由 Google 推出的全新的工具,可用于以 JS/TS 编写简单的命令行脚本。基本上它可以让你在代码中嵌入任何 bash 表达式(ls, cat, git...等任何命令),并 await 使用 JS 模板字符串的结果。

ZX 库有助于使用 Node.js 高效且愉快地编写 shell 脚本。

官方网站:github.com/google/zx#-… (第一次打 tag 是 2021年05月19日 的 1.7.0,开源短短几天就登上了 Github 热榜)

ZX 提供了封装子进程的创建以及从这些进程处理 stdout 和 stderr 的函数。它引入了由 node-fetch、fs-extra 等流行的软件包提供实用工具。

npm i -g zx

全局安装后,就可以当成系统命令来执行

chmod +x ./script.mjs
./script.mjs

或(下面这种和 node script.js 是不是一样?不一样,请看下面的语法章节)

zx ./script.mjs

2. 语法

#!/usr/bin/env zx

await $`cat package.json | grep name`

let branch = await $`git branch --show-current`
await $`dep deploy --branch=${branch}`

await Promise.all([
  $`sleep 1; echo 1`,
  $`sleep 2; echo 2`,
  $`sleep 3; echo 3`,
])

let name = 'foo bar'
await $`mkdir /tmp/${name}`

上面代码来自 Github readme 首页,我们分析一下源码:

  • 文档格式是 bash 风格,一行一条命令。第一行是 bash 的 Shebang。指定解释器,即这个脚本必须通过什么解释器执行。这一行以 #! 字符开头,这个字符称为 Shebang,所以这一行就叫做 Shebang 行。
  • 文档写法是 js 语言,看到很多熟悉的 js 关键词,比如 await、promise、let 等
  • 内置方法 $cdfetch等,可以直接使用,不需要手动引入
  • 有好几个地方出现了类似这种写法$`mkdir /tmp/${name}` 这个是字符串的标签模版
    • 模板字符串的功能,不仅仅是*${}*类型的变量替换。它可以紧跟在一个函数名后面,该函数将被调用来处理这个模板字符串。这被称为“标签模板”功能(tagged template)。

3. 内置函数

  • $ 函数使用 zx 规定脚本写入扩展名为 .mjs 的文件中,以便能够在顶层使用 await。如果习惯于 .js 扩展名,需要将脚本包装在类似 void async function () {...}() 中。
  • cd:允许更改当前的工作目录
  • question:Node.js 的 readline 模块的包装器,可以直接提示用户输入。
  • chalk:允许为脚本的输出添加颜色。
  • minimist:解析命令行参数的库,将它们暴露在 argv 对象下。
  • fetch/ node-fetch:与浏览器中 fetch 有着相同的 API, 可创建 HTTP 请求。
  • sleep 是 setTimeout 的封装
  • fs/ fs-extra:公开了 Node.js 核心 fs 模块,以及许多其他方法,可以更轻松地使用文件系统。
  • globby 以用户友好模式来匹配给定的文件名。
  • yaml 解析 yaml 文件
  • path 就是系统 path 包
  • os 就是系统 os 包
  • minimist 全局常量 argv
  • require node.js 的模块引入机制

最好只能感叹,还是前端工程师会玩,任何可以用 JavaScript 来写的应用,最终都将用 JavaScript 来写。,这次 Shell 脚本也不放过了。

4. 参考