vscode中zx脚本无智能提示是因为默认不识别.mjs或无后缀脚本为ts/js上下文,需安装@types/zx、添加三斜杠引用、设语言模式为typescript,并确保文件扩展名为.mjs或.ts。

为什么zx脚本在VSCode里没智能提示?
不是zx有问题,而是VSCode默认不识别.mjs或无后缀的Node脚本为TypeScript/JS上下文——它压根不知道$、cd()、question()这些是合法函数。常见现象:输入$后没自动补全,悬停看不到类型,Ctrl+Click跳不到定义。
根本原因在于缺少类型声明支持。zx本身是JavaScript库,但提供了官方@types/zx,必须显式引入才能激活IDE能力:
- 确保项目已安装
zx和@types/zx:npm install zx @types/zx --save-dev - 脚本头部加
/// <reference types="zx"></reference>(注意是三斜杠,不是双斜杠) - 文件扩展名必须是
.mjs或.ts;用.js需手动启用ESM支持("type": "module"inpackage.json) - VSCode需启用TS语言服务:打开脚本后右下角确认语言模式是
TypeScript而非JavaScript(可按Ctrl+K Ctrl+M切换)
launch.json调试zx脚本总失败?
VSCode的Node调试器默认不理解zx的顶层await和命令模板语法,直接选“Node.js”环境会报SyntaxError: await is only valid in async function。这不是配置错,是调试器没加载zx的运行时。
正确做法是绕过“断点调试”,改用Node原生命令行调试模式:
- 在
.vscode/launch.json中新增配置,program指向node,args传入--loader ts-node/esm(如果用TS)或直接-r zx(JS场景) - 更稳妥的方案:不用launch.json,终端里跑
node -r zx ./script.mjs,配合console.log()或debugger语句 + VSCode的“附加到Node进程”功能 - 如果坚持图形化断点,必须用
zxv1.23+,并在package.json中设"type": "module",否则import会失败
调试时$`cmd`输出看不见?
zx的$函数默认把stdout和stderr重定向到Node进程的对应流,但VSCode调试控制台不自动捕获子进程输出——你看到的是空返回值,不是命令没执行。
微软正式发布 Visual Studio Code 1.118 版本 。本次更新重点强化了 AI 开发体验与企业管理能力,其中最引人注目的是新增 Copilot CLI 远程控制功能,允许开发者通过手机或网页远程监控和接管 AI 会话 。同时,为了提高 AI 的运行性价比,新版本优化了令牌缓存策略以降低成本 。此外,1.118 版还引入了 Chronicle 本地历史追踪、TypeScript 7.0 支持以及更严格的企业级访问管控 。
两个即时可用的解法:
- 临时开启verbose:
$.verbose = true,所有命令执行时会打印完整命令和输出(适合快速验证) - 显式读取结果:
const result = await $`ls`; console.log(result.stdout),然后在调试变量面板里展开result对象 - 避免陷阱:别在
await $`...`外层套try/catch后直接console.log(err)——zx抛出的是Error实例,err.stdout才是原始输出,不是err.message
为什么cd()在调试里不生效?
cd()是zx提供的同步工作目录切换函数,但它只影响后续$命令的执行路径,不影响Node进程自身的process.cwd()。调试时若依赖process.cwd()判断路径(比如读取相对配置文件),就会出错。
真实行为差异:
-
cd('/tmp')→ 下一个$`pwd`返回/tmp,但process.cwd()仍是启动时的路径 - 想让整个脚本感知新路径,必须显式调用
process.chdir('/tmp') - 混合使用风险:
cd()后用fs.readFileSync('file.txt')会读取旧路径下的文件,不是cd()目标路径
最易被忽略的是:zx的cd()没有返回值,也不抛异常——即使路径不存在,它也静默失败,不会提醒你检查路径拼写或权限。










