譯者按: 做爲Node.js開發者,有必要全面瞭解一下Node命令的全部選項,這樣在關鍵時刻才能駕輕就熟。javascript
爲了保證可讀性,本文采用意譯而非直譯。html
Node命令有不少選項,能夠用於調試代碼。這篇博客全面介紹了Node命令,能夠提升你們的工做效率。java
使用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 ... >
複製代碼
--version
或 -v
執行 node --version
或者 node -v
,能夠查看Node版本信息。-v
爲--version
的縮寫,其餘選項也有對應的縮寫。微信小程序
$ node -v
v6.10.0
複製代碼
--eval
或 -e
使用--eval
選項,能夠直接在終端執行Node.js代碼。REPL中定義的模塊,例如http
、 fs
等均可以直接使用,不須要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-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專一於JavaScript、微信小程序、微信小遊戲、支付寶小程序、React Native、Node.js和Java實時BUG監控。 自從2016年雙十一正式上線,Fundebug累計處理了6億+錯誤事件,獲得了Google、360、金山軟件等衆多知名用戶的承認。歡迎免費試用!
轉載時請註明做者Fundebug以及本文地址:
blog.fundebug.com/2017/04/26/…