全面掌握Node命令選項

譯者按: 做爲Node.js開發者,有必要全面瞭解一下Node命令的全部選項,這樣在關鍵時刻才能駕輕就熟。javascript

爲了保證可讀性,本文采用意譯而非直譯。html

Node命令有不少選項,能夠用於調試代碼。這篇博客全面介紹了Node命令,能夠提升你們的工做效率。java

查看Node命令選項

使用man命令能夠獲取Node命令的全部選項:node

$ 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信息可知,全部選項都是可選的,且須要放在腳本以前。git

index.js以下:github

console.log(new Buffer(100))  
複製代碼

--zero-fill-buffers選項將全部新建立Buffer初始化爲0:chrome

--zero-fill-buffers
              Automatically zero-fills all newly allocated Buffer and SlowBuffer instances.
複製代碼

使用--zero-fill-buffers選項的命令以下bootstrap

$ 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命令的全部選項。

關於Fundebug

Fundebug專一於JavaScript、微信小程序、微信小遊戲、支付寶小程序、React Native、Node.js和Java實時BUG監控。 自從2016年雙十一正式上線,Fundebug累計處理了6億+錯誤事件,獲得了Google、360、金山軟件等衆多知名用戶的承認。歡迎免費試用!

版權聲明

轉載時請註明做者Fundebug以及本文地址:
blog.fundebug.com/2017/04/26/…

相關文章
相關標籤/搜索