Node 二进制文件的命令行标志
在这篇文章中,我们将了解Node二进制文件提供的命令行标志。Node.js平台几乎完全由node二进制可执行文件表示。为了执行一个JavaScript程序,我们使用以下命令:node app.js,其中app.js是我们想要运行的程序。然而,在我们开始运行程序之前,我们需要学习一些Node二进制文件提供的基本命令行标志以及如何使用它们。
打印命令选项: 为了查看任何版本的node的命令行标志,我们可以使用 --help 标志。在终端中写入以下代码:
node --help
除了Node命令行标志之外,还有其他用于修改JavaScript运行时引擎V8的标志。要查看这些标志,请运行以下命令: node –v8-options 在终端中写入以下代码:
node --v8-options
这就是关于命令行的全部内容,现在我们需要知道如何在程序执行时使用它以减少麻烦。你可能知道,程序执行的最基本要求是没有任何语法错误。一些流行的IDE,如VS Code,配备了诸如 Intellisense 这样的工具,以便在有语法错误的情况下通知用户,但如果你不想使用扩展,并且实际上要 使用命令行来检查是否存在任何语法错误。 Node二进制文件也可以帮助实现这一点。
检查语法: 可以在不实际运行JavaScript应用程序的情况下解析它,只需检查语法即可。
要检查语法,我们可以使用:
node --check app.js
node -c app.js
注意: 可以从以上列表中使用任何标志。在成功解析后,会发生以下两种情况之一:
- 没有语法错误,也没有输出生成
- 存在错误,并在终端窗口显示错误消息。
示例1: 这是 案例1 ,没有任何语法错误:
Javascript
const func = () => {
console.log("This block of code is "
+ "the example of good/correct syntax");
}
检查语法的步骤: 在终端中输入以下代码以检查语法:
node --check app.js
输出:
示例2: 这是 案例2 ,其中存在语法错误。
Javascript
const func: () => {
console.log("This block of code is an example of incorrect syntax.");
}
检查语法的步骤: 在终端中写入以下代码来检查语法:
node --check app.js
输出:
通过这种方式,我们可以检查我们的代码是否存在语法错误。
动态评估: Node可以直接在shell中评估代码,这对于快速检查代码片段非常有用。有两个标志可以评估代码,它们如下所示:
- -p或–print: 评估表达式并打印结果。
- -e或–eval: 评估表达式但不打印结果。
以下是 --print 和 --eval 标志的几个示例:
node -p "2+2"
node -e "2+2"
正如您所见, – p 标记评估表达式 2+2 并打印 4 作为输出。
考虑另一个示例,它在命令行中评估 console.log 函数:
node -e "console.log(2)"
-eval 或 -e 标志不生成任何输出,但是在这里,由于 console.log 打印了 2 ,输出被明确生成。
类似地,当使用 --print 标志评估 console.log 时,我们得到以下输出:
node -p "console.log(2)"
2 是生成的输出,因为它是使用 console.log 函数显式打印出来的, undefined 在终端中打印出来是因为 console.log 本身返回 undefined。
另一个示例是我们可以使用 -p 或 --print 标志打印出当前工作目录中扩展名为 .js 的所有文件。
对于下面的示例,这些是我们当前目录中的文件:
我们可以使用 --print 标志如下:
node -p "fs.readdirSync('.').filter(cf=>/.js$/.text(cf))"
预加载CommonJs模块: 命令行标志 -r 或 --require 可用于在任何其他模块加载之前预加载一个CommonJS模块。
假设有两个文件 preload.js 和 app.js ,它们的内容如下:
现在为了在另一个文件之前预加载文件,我们可以使用 –require 标志如下:
node --require ./preload.js app.js
预加载模块在使用需要对进程进行仪器化或配置的消费模块时非常有用。
注意: Node使用两种模块系统,CommonJS和ESM,但这里需要注意的是,-require标志只能预加载CommonJS模块,而不能预加载ESM模块。ESM模块有一个相关的标志,称为-loader,这是一个目前实验性的标志,不应与-require预加载器标志混淆。有关CommonJS和ESM模块的更多信息,请参阅Node文档 这里 。
堆栈跟踪限制: 对于发生的任何错误都会生成堆栈跟踪,因此它们通常是调试失败情景时的第一个调用点。默认情况下,一个堆栈跟踪将包含在跟踪发生的点上的最后十个堆栈框架(函数调用站点)。这通常是可以接受的,因为你感兴趣的堆栈的部分通常是最后3或4个调用框架。然而,有些情况下,在堆栈跟踪中看到更多的调用框架是有意义的,比如检查应用程序通过各种函数的流程是否符合预期。
可以使用 -stack-trace-limit 标志来修改堆栈跟踪限制。这个标志是JavaScript运行时引擎V8的一部分,并且可以在 - -v8-options 标志的输出中找到。
考虑一个名为 will-throw.js 的文件,内容如下:
Javascript
function f(n = 99) {
if (n == 85)
throw Error();
f(n - 1)
}
f()
当我们在命令行中执行以下命令时:
node --stack-trace-limit=10 will-throw.js
错误输出中只会有十个堆栈帧,因为限制已经明确设置为10。
如果我们将限制设置为1000,就像这样:
node --stack-trace-limit=1000 will-throw.js
在这种情况下,我们可以将输出显示到1000个堆栈帧。
我们可以看到,将堆栈跟踪限制设置为比堆栈中的调用帧数量更高的数字可以保证输出整个堆栈(在我们的情况下大于85)。
但是,请等一下,改变堆栈帧的默认限制真的可行吗?
答案是 不 ,因为在生产场景中,保留长堆栈所涉及的开销不仅会导致负担,还会消耗大量内存空间,最终降低应用程序的性能。
极客教程