node -e用于直接执行JS代码字符串,node -p自动打印表达式结果;二者均不支持顶层import,需加--input-type=module;路径基于当前工作目录,中文需确保终端UTF-8编码。

直接在终端里敲 node -e 最省事
不需要建文件、不用保存、不改工作目录——想试个函数或查个值,node -e 就是专干这事的。它把后面引号里的字符串当作 JS 代码直接执行,和浏览器控制台跑单行逻辑一个路子,但用的是真实 Node 环境。
常见错误现象:ReferenceError: require is not defined 或 SyntaxError: Unexpected token 'export',说明你写了模块语法(比如 import)或用了 require,但 -e 模式默认是 CommonJS 上下文,不支持顶层 import,也不自动加载 package.json 的 "type": "module" 配置。
-
node -e "console.log(2 + 2)"—— 输出4 -
node -e "console.log(process.arch)"—— 查当前架构(x64或arm64) -
node -e "console.log(require('./config.json'))"—— 可以用require,路径是相对于当前终端工作目录的 - 想用 ES 模块语法?得加
--input-type=module:node --input-type=module -e "import fs from 'fs'; console.log(fs.existsSync('.'))"
node -p 更适合表达式求值
-p 是 -e 的“自动打印版”:它执行完表达式后,会把结果自动 console.log 出来,不用手写 console.log()。适合快速算数、查对象属性、验证正则等。
使用场景:你不是在写逻辑,只是想看某个 JS 表达式的返回值。比如测 Date.now()、查 Buffer.alloc(4).toString('hex')、或者确认 Array.isArray([]) 是不是 true。
-
node -p "1000 * 60 * 60"→ 输出3600000 -
node -p "process.env.NODE_ENV || 'development'"→ 输出当前环境变量值 -
node -p "[1,2,3].map(x => x * 2)"→ 输出[ 2, 4, 6 ](注意带空格和括号,这是 Node 的默认util.inspect格式) - 不能直接用
require:node -p "require('./utils').foo()"会报错,因为-p要求是纯表达式,而require是语句;得包一层括号或改用-e
别让路径和编码拖慢你的单行操作
单行命令快就快在“不用动文件”,但一旦涉及读文件、调本地模块或含中文,就容易卡住。根本原因不是命令本身,而是当前终端工作目录和编码没对上。
容易踩的坑:node -e "require('./data.json')" 报 Cannot find module,其实文件就在同目录,只是你终端当前不在该目录;或者输出中文变成 ???,那是终端编码没设 UTF-8。
- 先用
pwd(macOS/Linux)或cd(Windows)确认当前路径是你想读文件的位置 - Windows PowerShell 用户如果看到乱码,运行一次:
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 - macOS/Linux 用户检查
locale输出是否含UTF-8,不是的话,在~/.zshrc加export LC_ALL=en_US.UTF-8 - 避免在单行里拼太长路径,用
__dirname不生效(-e没文件上下文),老实用相对路径或process.cwd()
别用 Code Runner 插件跑单行代码
Code Runner 默认把单行代码当完整文件处理,会自动加 #!/usr/bin/env node、尝试保存临时文件、甚至套一层包装函数。结果就是:你敲 node -e "console.log(1)" 很顺,但点右键 Run Code 却报 Unexpected token 或输出一堆无关路径。
它适合一键跑整个 .js 文件,不适合交互式单行验证。尤其当你需要反复改参数、试不同输入时,插件的缓存、临时路径、隐式 require 注入会让你越跑越迷。
- 真要高频用单行,把常用命令做成 shell alias,比如:
alias ne="node -e"、alias np="node -p" - VSCode 快捷键
Ctrl+`呼出终端后,直接敲命令,全程自己掌控输入、路径、编码 - 如果非要用插件,至少关掉它的“Run in Terminal”自动切换功能,否则它可能偷偷切到 PowerShell 再切回 bash,PATH 和编码全乱
单行命令真正的边界不在语法,而在上下文:它没有文件路径概念,没有模块解析缓存,也没有 __filename。你写的每个字符,都直通 V8 引擎,也直面环境配置的裸露真相。


















