Node.js comes with a lot of CLI options to expose built-in debugging & to modify how V8, the JavaScript engine works.
In this post, we have collected the most important CLI commands to help you become more productive.
To get a full list of all available Node.js CLI options in your current distribution of Node.js, you can access the manual page from the terminal using:
$ 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 ...
As you can see in the first usage section, you have to provide the optional options before the script you want to run.
Take the following file:
console.log(new Buffer(100))
To take advantage of the --zero-fill-buffers
option, you have to run your application using:
$ node --zero-fill-buffers index.js
This way the application will produce the correct output, instead of random memory garbage:
<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 ... >
Now as we saw how you instruct Node.js to use CLI options, let’s see what other options are there!
--version
or -v
Using the node --version
, or short, node -v
, you can print the version of Node.js you are using.
$ node -v v6.10.0
--eval
or -e
Using the --eval
option, you can run JavaScript code right from your terminal. The modules which are predefined in REPL can also be used without requiring them, like the http
or the fs
module.
$ node -e 'console.log(3 + 2)' 5
--print
or -p
The --print
option works the same way as the --eval
, however it prints the result of the expression. To achieve the same output as the previous example, we can simply leave the console.log
:
$ node -p '3 + 2' 5
--check
or -c
Available since v4.2.0
The --check
option instructs Node.js to check the syntax of the provided file, without actually executing it.
Take the following example again:
console.log(new Buffer(100)
As you can see, a closing )
is missing. Once you run this file using node index.js
, it will produce the following output:
/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)
Using the --check
option you can check for the same issue, without executing the script, using node --check index.js
. The output will be similar, except you won't get the stack trace, as the script never ran:
/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
The **--check**
option can come handy, when you want to see if your script is syntactically correct, without executing it.
--inspect[=host:port]
Available since v6.3.0
Using node --inspect
will activate the inspector on the provided host and port. If they are not provided, the default is 127.0.0.1:9229
. The debugging tools attached to Node.js instances communicate via a tcp port using the Chrome Debugging Protocol.
--inspect-brk[=host:port]
Available since v7.6.0
The --inspect-brk
has the same functionality as the --inspect
option, however it pauses the execution at the first line of the user script.
$ 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
Once you have ran this command, just copy and paste the URL you got to start debugging your Node.js process.
--zero-fill-buffers
Available since v6.0.0
Node.js can be started using the --zero-fill-buffers
command line option to force all newly allocated Buffer instances to be automatically zero-filled upon creation. The reason to do so is that newly allocated Buffer
instances can contain sensitive data.
It should be used when it is necessary to enforce that newly created **Buffer**
instances cannot contain sensitive data, as it has significant impact on performance.
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])
Instead, you should use
_Buffer.alloc(size[, fill[, encoding]])_
,_Buffer.from(array)_
,_Buffer.from(buffer)_
,_Buffer.from(arrayBuffer[, byteOffset[, length]])_
and_Buffer.from(string[, encoding])_
.
You can read more on the security implications of the Buffer module on the Synk blog.
--prof-process
Using the --prof-process
, the Node.js process will output the v8 profiler output.
To use it, first you have to run your applications using:
node --prof index.js
Once you ran it, a new file will be placed in your working directory, with the isolate-
prefix.
Then, you have to run the Node.js process with the --prof-process
option:
node --prof-process isolate-0x102001600-v8.log > output.txt
This file will contain metrics from the V8 profiler, like how much time was spent in the C++ layer, or in the JavaScript part, and which function calls took how much time. Something like this:
To get a full list of Node.js CLI options, check out the official documentation here.
You can print all the available V8 options using the --v8-options
command line option.
Currently V8 exposes more than a 100 command line options — here we just picked a few to showcase some of the functionality they can provide. Some of these options can drastically change how V8 behaves, use them with caution!
--harmony
With the harmony flag, you can enable all completed harmony features.
--max_old_space_size
With this option, you can set the maximum size of the old space on the heap, which directly affects how much memory your process can allocate.
This setting can come handy when you run in low memory environments.
--optimize_for_size
With this option, you can instruct V8 to optimize the memory space for size — even if the application gets slower.
Just as the previous option, it can be useful in low memory environments.
NODE_DEBUG=module[,…]
Setting this environment variable enables the core modules to print debug information. You can run the previous example like this to get debug information on the module
core component (instead of module, you can go for _http_
, _fs_
, etc...):
$ NODE_DEBUG=module node index.js
The output will be something like this:
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
Using this setting, you can add extra paths for the Node.js process to search modules in.
OPENSSL_CONF=file
Using this environment variable, you can load an OpenSSL configuration file on startup.
For a full list of supported environment variables, check out the official Node.js docs.
As you can see, the CLI is a really useful tool which becomes better with each Node version!
If you’d like to contribute to its advancement, you can help by checking out the currently open issues at https://github.com/nodejs/node/labels/cli !
Originally published at blog.risingstack.com on April 11, 2017.