印前

掌握Node.js的命令行界面和操作 | @RisingStack

印前 · 2017-05-05翻译 · 1058阅读 原文链接

Node.js提供了许多CLI选项操作方便运行时调试,并修改V8(JavaScript引擎)工作方式

本文,我们聚焦介绍了最重要的CLI命令以帮助你变得更高效。

了解Node.js命令行操作

在你当前的Node.js版本查看所有可用的Node.js命令行操作,可以用以下命令访问手册:

$ man node

Usage: node [options] [ -e script | script.js ] [arguments]  
       node debug script.js [arguments] 

Options:  
  -v, --version         print Node.js version
  -e, --eval script     evaluate script
  -p, --print           evaluate script and print result
  -c, --check           syntax check script without executing
...

正如你所见的第一部分,你需要在想要运行的脚本前提供可选的选项。

拿下面的文件来说:

`console.log(new Buffer(100))`

为利用--zero-fill-buffers选项操作,你需要使用如下命令运行程序:

`$ node --zero-fill-buffers index.js`

使用这样的方法应用程序会产出正确地输出,而不是输出随机存储垃圾

`<Buffer 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... >`

命令行选项

现在正如我们所见使用命令行操作如何来引导Node.js运行,让我们看看其他选项操作!

--version或者-v

使用node --version或者简写node -v,你可以输出你当前使用的Node.js版本。

$ node -v
v6.10.0

--eval 或者 -e

使用--eval选项,你可以在命令行中正确执行JavaScript代码。这些模块在REPL是预定义的,不用引用它们就能使用,如httpfs模块。

$ node -e 'console.log(3 + 2)'
5

--print 或者 -p

--print命令选项与--eval的作用一样,但是它打印表达式的结果.为了更前一个例子保持同样的输出,很简单,将console.log去除:

$ node -p '3 + 2'
5

--check或者 -c

从v4.2.0版本开始支持

--check命令选项指示Node.js检查文件的语法。

再次使用下面这个例子:

`console.log(new Buffer(100)`

正如你所见,该语法缺少).一旦你用node index.js运行这个文件,它会有如下输出:

/Users/gergelyke/Development/risingstack/mastering-nodejs-cli/index.js:1
(function (exports, require, module, __filename, __dirname) { console.log(new Buffer(100)
                                                                                        ^
SyntaxError: missing ) after argument list  
    at Object.exports.runInThisContext (vm.js:76:16)
    at Module._compile (module.js:542:28)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)
    at Module.runMain (module.js:604:10)
    at run (bootstrap_node.js:394:7)

使用--check 命令选项也能检查出同样的问题,还不用执行脚本,使用node --check index.js.输出也相似,除了你不会看到堆栈跟踪,因为脚本根本没运行

/Users/gergelyke/Development/risingstack/mastering-nodejs-cli/index.js:1
(function (exports, require, module, __filename, __dirname) { console.log(new Buffer(100)
                                                                                        ^
SyntaxError: missing ) after argument list  
    at startup (bootstrap_node.js:144:11)
    at bootstrap_node.js:509:3

当你不用执行脚本就想知道语法是否正确,--check 命令选项可以派上用场

最需要时专家来帮助

RisingStack支持的商业Node.js

了解更多

--inspect[=host:port]

从v6.3.0开始支持

使用node --inspect将激活提供的主机和端口上的检查器。如果它们没有被提供,默认的是127.0.0.1:9229。附加到Node.js的调试工具通过使用Chrome调试协议的tcp端口进行通信。

--inspect-brk[=host:port]

从v7.6.0版本开始支持

--inspect-brk命令选项与--inspect 有相同的功能,然而它将在用户脚本的第一行停止执行。

$ node --inspect-brk index.js 
Debugger listening on port 9229\.  
Warning: This is an experimental feature and could change at any time.  
To start debugging, open the following URL in Chrome:  
    chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9229/86dd44ef-c865-479e-be4d-806d622a4813

一旦你已经运行了这个命令,只需复制粘贴URL来调试Node.js进程。

--zero-fill-buffers

从v6.0.0版本开始支持

可以使用--zero-fill-buffers命令行选项启动Node.js,以强制所有新分配的Buffer实例在创建时自动为零填充。

当需要强制新创建的 Buffer实例不包含敏感数据时,应该使用它,因为它对性能有重大影响 > 同样注意,一些Buffer构造函数在v6.0.0中已弃用: > > new Buffer(array) >
>
>
> >
new Buffer(arrayBuffer[, byteOffset [, length]]) >
>
>
> > new Buffer(buffer) >
>
>
> >
new Buffer(size) >
>
>
> > * new Buffer(string[, encoding]) >
>
>
>

> 相反,你应该使用 Buffer.alloc(size[, fill[, encoding]]), Buffer.from(array), Buffer.from(buffer), Buffer.from(arrayBuffer[, byteOffset[, length]])Buffer.from(string[, encoding]).

你可以在Buffer模块的安全启示上Synk blog阅读更多.

--prof-process

使用--prof-process,Node.js进程将输出v8剖析器的输出内容。

要使用它,首先你要用如下命令运行应用程序:

`node --prof index.js`

一旦你运行它,一个新的带有isolate-前缀的文件将出现在你目录中。

然后,你再用--prof-process命令选项运行Node.js进程。

`node --prof-process isolate-0x102001600-v8.log > output.txt`

该文件将包含V8剖析器的指标,如我们在C++层耗时时长,或是在JavaScript部分,函数调用耗时时长。如下所示:

[C++]:
   ticks  total  nonlib   name
     16   18.4%   18.4%  node::ContextifyScript::New(v8::FunctionCallbackInfo<v8::Value> const&)
      4    4.6%    4.6%  ___mkdir_extended
      2    2.3%    2.3%  void v8::internal::String::WriteToFlat<unsigned short>(v8::internal::String*, unsigned short*, int, int)
      2    2.3%    2.3%  void v8::internal::ScavengingVisitor<(v8::internal::MarksHandling)1, (v8::internal::LoggingAndProfiling)0>::ObjectEvacuationStrategy<(v8::internal::ScavengingVisitor<(v8::internal::MarksHandling)1, (v8::internal::LoggingAndProfiling)0>::ObjectContents)1>::VisitSpecialized<24>(v8::internal::Map*, v8::internal::HeapObject**, v8::internal::HeapObject*)

[Summary]:
   ticks  total  nonlib   name
      1    1.1%    1.1%  JavaScript
     70   80.5%   80.5%  C++
      5    5.7%    5.7%  GC
      0    0.0%          Shared libraries
     16   18.4%          Unaccounted

_戳官方文档获取Node.js所有命令行选项_


V8 选项

你可以使用--v8-options 命令行选项操作打印所有可用的V8选项。

>当前V8暴露了超过100种命令行选项 - 本文将挑选几个展示一些他们提供的功能. 一些命令选项会彻底改变V8表现行为,慎用!

--harmony

通过该选项命令,可以启用所有完成的harmony功能.

--max_old_space_size

你可以用它来设置堆上的旧空间的最大尺寸,这会直接影响分配给你的进程存储大小。

当你在低内存环境中运行时这个设置将派上用场

--optimize_for_size

使用该选项,你可以让V8为尺寸优化存储空间-即使当应用程序变慢时。 正如之前的选项,它在低内存环境中非常有用


环境变量

NODE_DEBUG=module[,…]

设置这个环境变量使核心模块打印调试信息。你可以像这样运行上个例子来获取在module核心组件的调试信息(除了module,也可以是http, fs等等)

`$ NODE_DEBUG=module node index.js`

输出如下相似内容:

MODULE 7595: looking for "/Users/gergelyke/Development/risingstack/mastering-nodejs-cli/index.js" in ["/Users/gergelyke/.node_modules","/Users/gergelyke/.node_libraries","/Users/gergelyke/.nvm/versions/node/v6.10.0/lib/node"]  
MODULE 7595: load "/Users/gergelyke/Development/risingstack/mastering-nodejs-cli/index.js" for module "."

NODE_PATH=path

使用该选项,你可以为Node.js进程增加额外路径来搜寻模块来添加。

OPENSSL_CONF=file

使用该环境变量,你可以在启动时加载一份OpenSSL配置。

_戳 [Node.js官方文档]了解环境变量支持清单(https://nodejs.org/dist/latest-v7.x/docs/api/cli.html#cli_environment_variables)._

让我们一起参与Node相关CLI核心问题!

正如你所见,CLI是一个对每个Node版本都非常有用的工具。 如果你想要参与一起进步, 你可以通过检查在 https://github.com/nodejs/node/labels/cli 上最近的公开问题来参与。 Node.js Command Line Interface CLI Issues

Gergely Nemeth的图片

Gergely Nemeth

Node.js和微服务,组织者@Oneshotbudapest @nodebp @jsconfbp Trace - Node.js and microservice monitoring

node.js 教程 CLI CLI命令行操作

关于我们更多内容:

了解我们以前更多文章

启用JavaScript请查看 Disqus写的评论 Disqus写的评论

相关文章