V8 and its feature groups
Node’s build-in JavaScript engine is V8, but others such as Chakra (by Microsoft) can be used. V8 has three feature groups:
- Shipping (stable features, enabled by default)
- Staged (almost stable, needs
--harmonyflag to be enabled) - in Progress (experimental, also needs specific flags to be enabled)
See all options via node --v8-options. You can set those options when starting node or also at runtime using v8 module.
Executing code
Flow of code execution
The execution flow of your code works like this: Your code is interpreted by V8, which accesses Core Modules, C++ Bindings or libuv which provides the event loop and abstracts non-blocking IO operations. Those interact with the underlying operating system. Node itself has dependencies to openssl, zlip, ares, and others. You can get their versions with node -p "process.versions".
Running one-line code
You can run a one line code via node -p "process.arch". You can --require (-r) a module beforehand.
Using the REPL to run code
For a bit more extensive code you can start a REPL (Read-Eval-Print-Loop) by simply entering node on a command line. Now simply start writing and invoking your JS code. This even works when starting a function on line 1 and continue to define it on line 2 and so on.
You exit the REPL with CTRL+D or by entering .exit. You simply clear the REPL with CTRL+L. If you prefer to enter code multi-line (instead of line-by-line) you can enter .editor. If you messed up what you wrote you can .break out of it. More options are displayed with .help. You can save everything you wrote in the REPL to a file with .save my.js and .load my.js any time later on again. You can use the convenient reverse search in the REPL by pressing CTRL+R.
Press Tab twice to get a list of all possible commands. Press Tab once for autocompletion of whatever you already typed in.
The underscore _ stores the return value of the previous expression, for example:

There is also a REPL module that lets you create customized REPL sessions, for example use streams instead of stdin/stdout or add other modules to the global context.
Clearing the console output
process.stdout.write('\u001B[2J\u001B[0;0f');
process.stdout.write('Test');
process.stdout.write('\n\> ');