根本原因是bin字段未配对或脚手架文件缺少#!/usr/bin/env node声明;需确保package.json中bin值指向真实JS文件且首行正确,npm link后验证,Windows用户还需解除PowerShell执行策略限制。

脚手架命令为何在终端里执行不了
根本原因通常是 bin 字段没配对,或文件缺少可执行声明。VSCode 终端本身不干预命令执行,问题出在 Node 包注册环节。
必须确保 package.json 中的 bin 字段值指向一个真实存在的 JS 文件,且该文件首行是:#!/usr/bin/env node。漏掉这行,Windows 会尝试用记事本打开,macOS/Linux 则直接报 Permission denied 或 command not found。
-
bin的 key 是将来敲的命令名(如my-scaffold),value 是相对于 package.json 的路径(如bin/index.js) - 如果用
npm link本地调试,需先在脚手架项目根目录运行一次npm link,再在任意目录执行命令 - Windows 用户注意:PowerShell 默认禁用未签名脚本,若报
cnpm.ps1 cannot be loaded类错误,不是脚手架问题,而是执行策略限制,需运行set-ExecutionPolicy RemoteSigned -Scope CurrentUser
交互式提问用 inquirer 还是 prompts
inquirer 功能全但体积大、有依赖冲突风险;prompts 更轻量、ESM 友好,适合现代 Node 脚手架。VSCode 中开发时推荐后者——尤其当你已在 package.json 里设了 "type": "module"。
例如初始化模板选择:
import prompts from 'prompts';
const response = await prompts({
type: 'select',
name: 'template',
message: 'Choose a template',
choices: [
{ title: 'Vue 3 + TS', value: 'vue3-ts' },
{ title: 'React + Vite', value: 'react-vite' }
]
});
-
inquirer的prompt()返回 Promise,但默认不支持 ESM 的顶层 await,容易卡住 -
prompts对 TypeScript 支持更干净,无需额外安装类型包 - 避免混用:同一脚手架里不要同时 require
inquirer和 importprompts,Node 模块系统会报ERR_REQUIRE_ESM
模板下载该用 download-git-repo 还是 git clone
用 download-git-repo 更稳妥。它直接拉 zip 包解压,不依赖本地装 Git,也不触发 SSH 配置、凭证弹窗等 VSCode 终端里难处理的交互。
常见坑:
- 仓库地址写错格式:
github:username/repo或gitlab:org/project,不能带.git后缀 - 分支名不加前缀会默认拉
master,要拉main得写成github:foo/bar#main - 下载完成回调里才应执行
git init,否则用户选“不初始化 Git”时,文件夹已建好但空跑了一次git clone流程 - 路径参数必须是绝对路径,
download-git-repo不接受相对路径,建议用path.resolve(process.cwd(), name)
为什么 tsconfig.json 要加 "types": ["node"]
VSCode 里写脚手架用 TypeScript,但默认类型库不含 Node.js 全局对象(如 __dirname、process.argv、fs.promises)。不加这行,编辑器会标红,tsc 编译失败,但 node bin/index.js 却能跑——因为 JS 运行时不校验类型。
这不是 VSCode 特有问题,而是 TypeScript 编译配置缺失。正确做法是在生成的 tsconfig.json 的 compilerOptions 下补上:
"types": ["node"]
- 别只加
@types/node包却不配types,那样 VSCode 仍识别不到 - 如果用了 ESM(
"type": "module"),还要确认@types/node版本 ≥ 18.11.9,老版本不兼容import fs from 'fs' - VSCode 的 TypeScript 服务器有时缓存旧配置,改完
tsconfig.json后可右键编辑器 → “Restart TS server”
bin 路径拼错、#!/usr/bin/env node 忘删 BOM、或者 Windows 上 PowerShell 策略拦住了第一行执行——这些点不试一次根本想不到。


















