最近各大技术社区都在转发2021年JavaScript明星项目榜:zx、Vite 、Next.js 、React 大受欢迎
第一名好像突然冒出来的一样,今天我们来一起学习一下:
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 等
- 内置方法
$
,cd
,fetch
等,可以直接使用,不需要手动引入 - 有好几个地方出现了类似这种写法
$`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
全局常量 argvrequire
node.js 的模块引入机制
最好只能感叹,还是前端工程师会玩,任何可以用 JavaScript 来写的应用,最终都将用 JavaScript 来写。,这次 Shell 脚本也不放过了。