我正在用 node 构建一个 CLI 工具,并想使用fs.promiseAPI。但是,当应用程序启动时,总是有一个ExperimentalWarning,这非常烦人,并且会干扰交互提示。如何禁用此警告/所有警告?
我正在 Windows 10 上使用最新的 node v10 lts 版本对此进行测试。
要全局使用 CLI 工具,我已将其添加到我的package.json文件中:
{
//...
"preferGlobal": true,
"bin": { "myapp" : "./index.js" }
//...
}
Run Code Online (Sandbox Code Playgroud)
并运行npm link链接./index.js脚本。然后我就可以简单地使用myapp.
经过一些研究,我注意到通常有两种方法可以禁用警告:
NODE_NO_WARNINGS=1node --no-warnings ./index.js尽管我能够使用上述 2 种方法禁用警告,但在直接运行myapp命令时似乎无法做到这一点。
我放在入口脚本中的shebang./index.js是:
#!/usr/bin/env node
// my code...
Run Code Online (Sandbox Code Playgroud)
我还阅读了关于修改 shebang 的其他讨论,但还没有找到一种通用/跨平台的方法来做到这一点 - 要么将参数传递给节点本身,要么设置 env 变量。
如果我发布这个 npm 包,如果有办法确保提前禁用这个单个包的警告,而不是让每个用户自己调整他们的环境,那就太好了。是否有任何隐藏的 npmpackage.json配置允许这样做?
任何帮助将不胜感激!
Gil*_*oot 26
我这样配置我的测试脚本:
"scripts": {
"test": "tsc && cross-env NODE_OPTIONS=--experimental-vm-modules NODE_NO_WARNINGS=1 jest"
},
Run Code Online (Sandbox Code Playgroud)
注意这个NODE_NO_WARNINGS=1部分。它禁用了我从设置中收到的警告NODE_OPTIONS=--experimental-vm-modules
更新
考虑使用vitest,下一代测试框架。我发现配置起来容易多了。它也兼容 Jest
Bla*_*ast 11
我现在使用启动器脚本来生成一个child_process来解决这个限制。丑陋,但它适用于npm link全局安装等等。
#!/usr/bin/env node
const { spawnSync } = require("child_process");
const { resolve } = require("path");
// Say our original entrance script is `app.js`
const cmd = "node --no-warnings " + resolve(__dirname, "app.js");
spawnSync(cmd, { stdio: "inherit", shell: true });
Run Code Online (Sandbox Code Playgroud)
由于它有点像 hack,我下次不会使用这种方法,而是将手动将原始 API 包装在 Promise 中,坚持使用util.promisify,或使用 API 的阻塞/同步版本。
Fli*_*ion 11
新答案:您还可以捕获脚本中发出的警告,并选择阻止记录哪些警告
const originalEmit = process.emit;
process.emit = function (name, data, ...args) {
if (
name === `warning` &&
typeof data === `object` &&
data.name === `ExperimentalWarning`
//if you want to only stop certain messages, test for the message here:
//&& data.message.includes(`Fetch API`)
) {
return false;
}
return originalEmit.apply(process, arguments);
};
Run Code Online (Sandbox Code Playgroud)
受到这个纱线补丁的启发
这是我用来使用命令行标志运行节点的方法:
#!/bin/sh
_=0// "exec" "/usr/bin/env" "node" "--experimental-repl-await" "$0" "$@"
// Your normal Javascript here
Run Code Online (Sandbox Code Playgroud)
第一行告诉 shell 使用 /bin/sh 来运行脚本。第二行有点神奇。对于 shell 来说,它是一个变量赋值,_=0//后跟"exec" ....
Node 将其视为变量赋值,后跟注释 - 所以除了将 0 赋值给 _ 的副作用之外,它几乎是一个 nop。
结果是,当 shell 到达第 2 行时,它将使用您需要的任何命令行选项执行节点(通过 env)。
我需要抑制:
实验警告:导入 JSON 模块是一项实验性功能,可能随时更改
这对我在 Windows、Node.js 18.x 上有效:
#!/usr/bin/env node --no-warnings
Run Code Online (Sandbox Code Playgroud)
安装后--no-warnings添加到nodebin 脚本内的调用中.cmd,
.ps
我想这对 Linux 不起作用。我没能找到通用的解决方案
相关讨论:
| 归档时间: |
|
| 查看次数: |
12963 次 |
| 最近记录: |