sublime text 4 运行 node.js 脚本需手动配置构建系统:先确认终端中 node -v 可用,再通过 which node(macos/linux)或 where node(windows)获取绝对路径,新建 nodejs.sublime-build 文件,写入 "cmd": ["/your/path/to/node", "$file"]、"working_dir": "$file_path" 和 "encoding": "utf-8",保存至 packages/user/ 目录。

Sublime Text 4 能直接运行 Node.js 脚本,但必须手动配置构建系统,且不能依赖系统 PATH —— 绝大多数“Ctrl+B 报错”问题,根源都是 node 命令路径没被正确传给 Sublime。
确认 node 命令在终端可用是硬前提
如果终端里执行 node -v 报错或无输出,Sublime 的任何配置都无效。这不是 Sublime 的问题,而是你本地 Node.js 没装好或没进环境变量。
- macOS/Linux:在终端运行
which node,应返回类似/opt/homebrew/bin/node或/usr/local/bin/node的路径 - Windows:在命令提示符或 PowerShell 中运行
where node,应返回类似C:\Program Files\nodejs\node.exe的完整路径 - 若无输出,请重装 Node.js(官网下载 LTS 版),Windows 安装时务必勾选 “Add to PATH”,macOS 避免用 Microsoft Store 版本
创建 .sublime-build 文件并写死 node 绝对路径
不要用 "cmd": ["node", "$file"] 这种看似简洁的写法 —— GUI 启动的 Sublime(Dock/Spotlight/开始菜单)根本不会加载你的 shell 配置,node 命令大概率找不到。
- 菜单栏选择 Tools → Build System → New Build System…
- 清空全部内容,粘贴以下 JSON(把
/your/path/to/node替换成上一步查到的真实路径):
{
"cmd": ["/your/path/to/node", "$file"],
"selector": "source.js",
"working_dir": "$file_path",
"encoding": "utf-8"
}
- 保存为
NodeJS.sublime-build,文件必须放在Packages/User/目录下(macOS 路径:~/Library/Application Support/Sublime Text/Packages/User/;Windows:%APPDATA%\Sublime Text\Packages\User\) -
"working_dir": "$file_path"不可省略:否则require('./utils')或fs.readFile('config.json')会因工作目录错误而报MODULE_NOT_FOUND或ENOENT
使用 nvm 或 volta 管理 Node 版本时怎么办
nvm 本质是动态改 shell 的 PATH,但 Sublime 构建进程不执行 nvm use,也不读 ~/.zshrc。所谓“支持 nvm”,其实是绕过它,直取真实二进制。
- 在终端切换到目标版本后,运行
nvm which 18.18.2(把 18.18.2 换成你当前用的版本),得到类似~/.nvm/versions/node/v18.18.2/bin/node的路径 - 把这个路径填进
.sublime-build的"cmd"数组里,而不是写["nvm", "exec", "18.18.2", "node", "$file"]——nvm命令在构建环境里不存在 - 每次用
nvm use切换 Node 版本后,必须手动更新这个路径;嫌麻烦就只固定一个项目用的版本,别强求“自动同步”
运行脚本后输出乱码、卡住或无反应
这通常不是代码问题,而是 Sublime 构建输出机制的限制:
- 中文乱码?确保
"encoding": "utf-8"已写入构建配置,且 JS 文件本身保存为 UTF-8 编码(无 BOM) - 脚本需要交互(比如
readline)?Sublime 的构建面板不支持 stdin 输入,会卡住 —— 此类脚本请回到终端运行 - 输出一闪而过?检查是否用了
process.exit()或异步未等待完成就退出;加个console.log('done')和process.exit(0)显式收尾更稳妥
最易被忽略的一点:$file 是唯一带完整路径的变量,$file_name 或 $file_base_name 会导致 Node 在错误目录下查找模块 —— 这个细节错一次,require 就全崩。











