zx, 如何用Javascript优雅的书写脚本命令

3,373 阅读2分钟

背景

你还在这么写代码? 你还在用bash敲命令吗? 那你就out啦!

image.png

玩玩新花样,带来不一样的体验

js完美接入

编写脚本前,我们需要了解今天的主角

🐚zx

zxgoogle 团队出品的一个用Javascript编写脚本命令的三方库。 ---> 嗯. 真香

zx的出现,给前端开发者拥有了极好的体验。因为我们可以使用 Javascript 去编写脚本命令。正如它官方而言

Bash is great, but when it comes to writing scripts, people usually choose a more convenient programming language.

前端开发拿手的不就是 Javascript, 嗯 开整

install

npm i -g zx
// or
yarn add -g zx

要求 Node.js >= 14.13.0

编写脚本

起步

为了更好使用,我们需要将我们的.js后缀改写为.mjs,同时在package.json中添加

"type": "module"

然后我们需要在我们的脚本文件开头(顶部)添加特殊注释标记为 zx 脚本

#!/usr/bin/env zx

运行

准备功能就做好了 然后我们尝试运行程序

image.png

程序完美运行,试试bash命令呢

image.png

欧克,命令也成功运行

命令

了解zx还可以了解他的其他几个属性、方法如何使用。

最常见的的使用莫过于我们编写脚本命令,如何编写呢。

$`command`

使用包中的spawn函数 执行给定的字符串child_process并返回ProcessPromise<ProcessOutput>.

通过的一切${...}都会被自动转义和引用。

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

无需添加额外的引号。

如果需要,您可以传递参数数组:

let  flags  =  [ 
  '--oneline' , 
  '--decorate' , 
  '--color' , 
] 
await  $ `git log ${ flags } `

如果执行的程序返回非零退出代码, ProcessOutput将被抛出。

try {
  await $`exit 1`
} catch (p) {
  console.log(`Exit code: ${p.exitCode}`)
  console.log(`Error: ${p.stderr}`)
}

cd()

更改当前工作目录。

cd('/tmp')
await $`pwd` // outputs /tmp

fetch()

网络请求,fetch实际上是基于node-fetch进行开发

let resp = await fetch('http://wttr.in')
if (resp.ok) {
  console.log(await resp.text())
}

question()

let q1 = await question('我帅吗?')
console.log(q1)
let q2 = await question('你要一键三连吗?', {
  choices: Object.keys(process.env)
})
console.log(q2)

image.png

sleep()

类似一个 setTimeout function.

await sleep(1000)

总结

zx 完美的适应Javascript环境,基于zx的玩法也必定越来越多,也期待社区能后更多有趣的脚本。

zx引进门, 修行在个人,兄弟们,冲

接下来也会给大家分享几个有意思的脚本,敬请期待