- GraalVM for JDK 23 (Latest)
- GraalVM for JDK 24 (Early Access)
- GraalVM for JDK 21
- GraalVM for JDK 17
- Archives
- Dev Build
- JavaScript and Node.js Reference
- Node.js Runtime
- Java Interoperability
- JavaScript Compatibility
- Using JavaScript Modules and Packages
- Multithreading
- Migration Guide from Nashorn to GraalVM JavaScript
- Migration Guide from Rhino to GraalVM JavaScript
- Differences Between Node.js and Java Embeddings
- Options
- Run GraalVM JavaScript on a Stock JDK
- ScriptEngine Implementation
- FAQ
Node.js Runtime
GraalVM can run unmodified Node.js applications. Applications can freely import and use NPM packages, including native ones.
For the differences between running the node
native launcher and accessing Node.js/npm modules/ECMAScript modules from a Java Context, see NodeJSVSJavaScriptContext.
Installing Node.js Component #
Since GraalVM 21.1, the Node.js support is packaged in a separate GraalVM component. It can be installed with the GraalVM Updater.
$JAVA_HOME/bin/gu install nodejs
This installs the node
and npm
binaries in the $JAVA_HOME/bin
directory.
Polyglot Support in Node.js #
The Node.js component is able to use the polyglot language interoperability (flag: --polyglot
) with other installed polyglot languages.
This feature is available by default in JVM mode (flag: --jvm
).
For polyglot access to the Ruby language, you can e.g. use this command:
$JAVA_HOME/bin/node --jvm --polyglot -e 'var array = Polyglot.eval("ruby", "[1,2,42,4]"); console.log(array[2]);'
To use the polyglot capabilities of node
in the native mode (flag: --native
), the libpolyglot
needs to be rebuilt first.
For this, the native-image
component and the other languages need to be installed first, before the image can be rebuilt:
$JAVA_HOME/bin/gu install native-image
$JAVA_HOME/bin/gu rebuild-images libpolyglot
After a successfull rebuild, the polyglot access is also available in the --native
mode:
$JAVA_HOME/bin/node --native --polyglot -e 'var array = Polyglot.eval("ruby", "[1,2,42,4]"); console.log(array[2]);'
Running Node.js Applications #
To run Node.js-based applications, use the node
launcher in the GraalVM distribution:
$JAVA_HOME/bin/node [options] [filename] [args]
GraalVM’s Node.js runtime is based on a recent version of Node.js, and runs the GraalVM JavaScript engine instead of Google V8. Thus, some internal features (e.g., VM-internal statistics, configuration, profiling, debugging, etc.) are unsupported, or supported with potentially different behavior.
The node
command is largely compatible with Node.js, and features additional GraalVM-specific functionalities (e.g., interoperability with Java and all other GraalVM languages).
A list of available options can be obtained with node --help
.
Installing Packages Using npm
#
To install a Node.js package, you can use the npm
launcher from the GraalVM’s /bin
folder.
The npm
command is equivalent to the default NPM command, and supports most of its options.
An NPM package can be installed with:
$JAVA_HOME/bin/npm install <package>
As the npm
command of GraalVM is largely compatible with NPM, packages will be installed in the node_modules
folder, as expected.
Installing npm
Packages Globally #
Node packages can be installed globally using npm
and the -g
option.
By default, npm
installs global packages (links to their executables) in the path where the node
executable is installed, typically NODE/bin
.
In GraalVM, while there is a node
executable in JAVA_HOME/bin
, this is just a link to the actual executable in the JAVA_HOME/jre/languages/js/bin
folder.
That folder is where global packages are installed.
You might want to add that directory to your $PATH
if you regularly use globally installed packages, especially their command line interfaces.
Another option is to specify the global installation folder of npm
by setting the $PREFIX
environment variable, or by specifying the --prefix
option when running npm install
.
For example, the following command will install global packages in the /foo/bar
folder:
$JAVA_HOME/bin/npm install --prefix /foo/bar -g <package>
More details about prefix
can be found in the official NPM documentation.