全面掌握Node命令選項

Fundebug發表於2017-05-03

譯者按: 作為Node.js開發者,有必要全面瞭解一下Node命令的所有選項,這樣在關鍵時刻才能得心應手。

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

Node命令有很多選項,可以用於除錯程式碼。這篇部落格全面介紹了Node命令,可以提高大家的工作效率。

檢視Node命令選項

使用man命令可以獲取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資訊可知,所有選項都是可選的,且需要放在指令碼之前。

index.js如下:

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命令的所有選項。

關於Fundebug

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

全面掌握Node命令選項

版權宣告

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

相關文章