ZX – 一个用于编写更好脚本的工具
一个由 Google 支持的工具 ZX 旨在让开发者用现代 JavaScript/TypeScript 而不是 Bash 来编写类似 shell 的脚本,承诺提供更好的使用体验、日志和对现有 Node.js 工具链的复用。评论者意见分裂:一些重度使用 JavaScript 的团队认为它对 CI 和项目自动化来说是“天赐之物”,而另一些人则反对为了系统脚本而要求安装 Node、反对 async/await 的冗长,以及反对失去 Bash 的普及性和简洁性。更广泛的争论围绕着复杂脚本应当留在传统 shell 和 Python 中,还是迁移到主应用语言及其生态系统中。
总体反响
- 许多重度使用 JavaScript/TypeScript 的开发者喜欢 zx:它让他们能用熟悉的语言编写“shell 风格”的自动化脚本,并且日志和可调试性都不错。
- 也有人强烈反对把 JavaScript 作为脚本语言,理由包括信任、复杂性和生态问题。
- 几位评论者强调,zx 并不是一个通用的“更好的 shell”,而只是 JS 项目里的便利工具。
使用场景与感知到的好处
- 常见用途:项目工具、CI 脚本、围绕 Node 应用的胶水代码、API 检查,以及能显示每条命令及其输出的开发工具。
- 顶层
await和基于 Promise 的子进程处理,被偏好异步 JS 的用户视为很自然的选择。 - 在应用和脚本之间共享一致的语言与工具链(TS、IDE 支持、自动补全)是一个很大的吸引点。
对 JS/Node 作为脚本语言的批评
- 反对意见包括:为了运行脚本就必须安装 Node;担心它会变成“shell 脚本里的 Electron”。
- 有些人认为脚本应该小巧、同步且简单;以异步为中心的 JS 过于繁琐、噪声太多(
await await await)。 - 还持续有人抱怨 JS 的“陷阱”和历史遗留怪癖,即便现代写法已经避开了很多问题(例如
===与==)。
与其他语言和工具的比较
- 许多人在更大的脚本上更偏好 Python、Ruby、Perl 或 POSIX shell;也有人指出,相比 TypeScript,Python 的打包/环境痛点和类型检查薄弱是缺点。
- 少数人使用 Groovy、C# 脚本,或者带内联依赖管理的 Ruby/Python。
- 提到的替代方案包括:Dax(基于 JS)、Bun Shell(类似 bash,内建命令更快)、xonsh、x-cmd(基于 POSIX shell 的编排器)、Nushell。
可移植性、性能与设计问题
- zx 依赖系统 shell 来执行命令,因此行为并非完全跨平台。Bun Shell 尝试通过内建命令来实现跨平台。
- Node 的启动时间和运行时体积对一些人来说是个问题,尤其是在服务器/容器环境中。
- 需要
.mjs才能使用顶层await,以及把语义绑定到文件扩展名,被批评为对 shebang 风格脚本来说是糟糕的设计。
脚本哲学
- 一派认为 bash 只适合一行命令;更大的东西应该迁移到“真正的”语言中。
- 另一派重视极简、轻量的脚本,并把“复杂脚本”视为代码异味,而不是需要优化的目标。