全面掌握Node命令选项

译者按: 做为Node.js开发者,有必要全面了解一下Node命令的全部选项,这样在关键时刻才能驾轻就熟。javascript

<!-- more -->html

为了保证可读性,本文采用意译而非直译。git

Node命令有不少选项,能够用于调试代码。这篇博客全面介绍了Node命令,能够提升你们的工做效率。github

查看Node命令选项

使用man命令能够获取Node命令的全部选项:chrome

$ 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
...

有Usage信息可知,全部选项都是可选的,且须要放在脚本以前。bootstrap

index.js以下:api

console.log(new Buffer(100))

--zero-fill-buffers选项将全部新建立Buffer初始化为0:浏览器

--zero-fill-buffers
              Automatically zero-fills all newly allocated Buffer and SlowBuffer instances.

使用--zero-fill-buffers选项的命令以下

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

这样的话,输出结果所有为0,而不是随机的序列:

<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命令经常使用选项

--version-v

执行 node --version或者 node -v,能够查看Node版本信息。-v--version的缩写,其余选项也有对应的缩写。

$ node -v
v6.10.0

--eval-e

使用--eval 选项,能够直接在终端执行Node.js代码。REPL中定义的模块,例如httpfs等均可以直接使用,不须要require。

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

--print-p

--print选项与--eval选项的功能相似,可是--print选项能够打印表达式的结果。--eval选项使用console.log的话能够达到相同的效果。

$ node -p '3 + 2'
5

--check-c

Node v4.2.0以后才有

使用--check,则会检查代码的语法(并不会执行代码)。

index.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)

使用node --check index.js命令,能够在不执行代码的状况下检查到一样的错误。二者输出结果很是类似,可是使用--check选项时没有执行代码,所以没有错误栈(stack trace):

/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

--inspect[=host:port]

node v6.3.0以后才有

使用node --inspect选项能够在指定的地址(host)和端口(port)开启监控器。若是没有指定地址和端口,则默认为127.0.0.1:9229。Chrome调试工具(Chrome Debugging Protocol)经过该端口绑定Node.js进程。

--inspect-brk[=host:port]

node 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

运行命令以后,使用Chrome浏览器访问输出中提示的URL地址chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9229/86dd44ef-c865-479e-be4d-806d622a4813就能够调试Node.js代码了。

--zero-fill-buffers

node v6.0.0以后才有

使用--zero-fill-buffers选项可使全部新建立的Buffer初始化为0。 这样作能够防止内存中的敏感信息泄露。

注意,仅当须要防止内存敏感信息泄露时才使用该选项,由于它会严重影响代码性能。

另外,下面这些Buffer构造器在node v6.0.0已经弃用了。

Also note, that some Buffer constructors got deprecated in 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]).

关于Node.js的内存安全问题,能够查看博客Exploiting Buffer

--prof-process

使用 --prof-process选项,Node.js进程将输出V8引擎的性能记录信息(profiler)

首先,使用--prof选项执行代码:

node --prof index.js

运行以后,工做目录中将生成一个新文件,前缀为isolate-

而后,使用--prof-process选项执行代码:

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

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命令的全部选项。


V8引擎选项

使用--v8-options选项能够打印全部的V8引擎选项。

目前,V8引擎提供了上百个选项,这篇博客只是介绍了其中几个。这些选项能够大大地改变V8引擎的行为,所以须要慎重使用。

--harmony

使用--harmony选项,则在代码中可使用全部harmony特性(即正在开发的特性,例如在低版本的Node中使用ES6特性)。

--max_old_space_size

使用--max_old_space_size选项,能够调整老生代内存空间(old space,用于储存存活时间较长或常驻内存的对象)的最大值,这个将直接影响Node.js进程可使用的内存大小。在内存较小的状况下,这个选项将很是方便,由于咱们能够限制Node.js进程对内存的使用。

--optimize_for_size

使用--optimize_for_size选项,V8引擎会优化内存空间的使用,这样极可能会下降应用的执行速度。一样,在内存较小的状况下,这个选项将很是方便。

环境变量

NODE_DEBUG=module[,…]

设置NODE_DEBUG环境变量能够打印Node.js核心模块的调试信息。例如,下面的命令能够查看module模块的调试信息(你也能够查看其它模块,例如http, fs等):

$ NODE_DEBUG=module node index.js

输出以下(可知,module模块负责加载代码调用的各个模块):

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_PATH,能够指定Node.js进程搜索模块的额外目录。

OPENSSL_CONF=file

使用OPENSSL_CONF,能够指定OpenSSL的配置文件。

访问官方文档,能够查看Node命令的全部选项。

欢迎加入咱们FundebugNode.js技术交流群: 177654062

图片描述

版权声明:
转载时请注明做者Fundebug以及本文地址:
https://blog.fundebug.com/201...

相关文章
相关标签/搜索