全面掌握Node命令選項


 

全面掌握Node命令選項

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

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

節點命令有很多選項,可以用於調試代碼。這些博客全面介紹了Node命令,可以提高大家的工作效率。

查看Node命令選項

使用命令可以獲取Node命令的所有選項:

$ man節點
 
用法:node [options] [ -e script | script.js] [arguments]
節點調試script.js [arguments]
 
選項:
-v,--version 打印 Node.js版本
-e,--eval腳本評估腳本
-p,-- print評估腳本和打印結果
-c, - 檢查語法檢查腳本而不執行
...

有使用信息可知,所有選項都是可選的,且需要放在腳本之前。

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中定義的模塊,例如http 、 fs等都可以直接使用,不需要require。

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

--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:在[“/Users/gergelyke/.node_modules","/Users/gergelyke/.node_libraries",Users”中查找“/Users/gergelyke/Development/risingstack/mastering-nodejs-cli/index.js” /gergelyke/.nvm/versions/node/v6.10.0/lib/node“]
MODULE 7595:為模塊“”加載“/Users/gergelyke/Development/risingstack/mastering-nodejs-cli/index.js”。

NODE_PATH=path

使用NODE_PATH,可以指定Node.js進程搜索模塊的額外目錄。

OPENSSL_CONF=file

使用OPENSSL_CONF,可以指定OpenSSL的配置文件。

訪問官方文檔,可以查看節點命令的所有選項。

 

關於Fundebug:

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


版權聲明:
轉載時請注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/04/26/node-command-option/
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM