You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在package.json的npm脚本中重定向node运行的控制台输出?

问题原因

npm 嵌套执行 run 命令时,当输出目标不是终端(也就是被重定向到文件的场景),npm 默认会启用块缓冲模式,输出内容会先累积到缓冲区,满了才会写入目标,部分场景下缓冲没正常刷新就会出现文件为空的情况。另外你当前的写法重定向仅捕获了 stdout 输出,如果你的console.log输出因为异常进入了 stderr,也会出现内容没写入文件的问题。

解决方案

方案1:避免嵌套npm run调用(最推荐)

直接将node执行命令写到test-ci中,跳过一层npm调用的缓冲逻辑,和你直接在终端执行的效果一致:

"scripts": {
    "test": "node ./lib/es6_global/test/Main.bs.js",
    "test-ci": "node ./lib/es6_global/test/Main.bs.js > log.log 2>&1"
}

末尾加2>&1是将stderr也合并到stdout中,确保所有输出都能写入日志文件。

方案2:嵌套调用时添加silent参数

如果必须保留嵌套调用的写法,给npm run添加-s(--silent)参数,关闭npm自身的日志输出同时禁用缓冲:

"scripts": {
    "test": "node ./lib/es6_global/test/Main.bs.js",
    "test-ci": "npm run -s test > log.log 2>&1"
}

方案3:强制node禁用输出缓冲

给node执行命令添加--unbuffered参数,强制node进程实时刷新输出,不需要等缓冲区填满:

"scripts": {
    "test": "node --unbuffered ./lib/es6_global/test/Main.bs.js",
    "test-ci": "npm run test > log.log 2>&1"
}

内容的提问来源于stack exchange,提问作者Eleanor Holley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 10:45:06