Awesome
jsvu
jsvu is the <b>J</b>ava<b>S</b>cript (engine) <b>V</b>ersion <b>U</b>pdater.
jsvu makes it easy to install recent versions of various JavaScript engines without having to compile them from source.
Installation
Note: jsvu requires Node.js v18+. (jsvu follows the latest active LTS version of Node.)
Install the jsvu CLI:
npm install jsvu -g
Modify your dotfiles (e.g. ~/.bashrc
) to add ~/.jsvu/bin
to your PATH
:
export PATH="${HOME}/.jsvu/bin:${PATH}"
Then, run jsvu
:
jsvu
On first run, jsvu
prompts you for your operating system and architecture, and the list of JavaScript engines you wish to manage through jsvu
. It then downloads and installs the latest version of each of the engines you selected.
To update the installed JavaScript engines later on, just run jsvu
again.
Supported engines per OS
JavaScript engine | Binary name | mac64 | mac64arm | win32 | win64 | linux32 | linux64 |
---|---|---|---|---|---|---|---|
Chakra | chakra or ch | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ |
GraalJS | graaljs | ✅ | ❌ | ❌ | ✅ | ❌ | ✅ |
Hermes | hermes & hermes-repl | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ |
JavaScriptCore | javascriptcore or jsc | ✅ | ✅ | ❌ | ✅ <sup>*</sup> | ❌ | ✅ |
QuickJS-ng | quickjs | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
SpiderMonkey | spidermonkey or sm | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
V8 | v8 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
V8 debug | v8-debug | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
XS | xs | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ |
<sup>*</sup> JavaScriptCore requires external dependencies to run on Windows:
- On 32-bit Windows, install iTunes.
- On 64-bit Windows, download the latest
WebKitRequirements
and add itsbin64
directory to yourPATH
.
Integration with eshost-cli
eshost-cli
makes it easy to run and compare code in all JavaScript engines that jsvu
installs.
First, install eshost-cli
:
npm install -g eshost-cli
Then, either automatically configure jsvu
-installed hosts:
eshost --configure-jsvu
…or tell eshost-cli
where jsvu
installs each JavaScript engine following the instructions below.
Linux/Mac
eshost --add 'Chakra' ch ~/.jsvu/bin/chakra
eshost --add 'GraalJS' graaljs ~/.jsvu/bin/graaljs
eshost --add 'JavaScriptCore' jsc ~/.jsvu/bin/javascriptcore
eshost --add 'QuickJS' qjs ~/.jsvu/bin/quickjs
eshost --add 'SpiderMonkey' jsshell ~/.jsvu/bin/spidermonkey
eshost --add 'V8 --harmony' d8 ~/.jsvu/bin/v8 --args '--harmony'
eshost --add 'V8' d8 ~/.jsvu/bin/v8
eshost --add 'XS' xs ~/.jsvu/bin/xs
Windows
eshost --add "Chakra" ch "%USERPROFILE%\.jsvu\bin\chakra.cmd"
eshost --add "GraalJS" graaljs "%USERPROFILE%\.jsvu\bin\graaljs.cmd"
eshost --add "JavaScriptCore" jsc "%USERPROFILE%\.jsvu\bin\javascriptcore.cmd"
eshost --add "SpiderMonkey" jsshell "%USERPROFILE%\.jsvu\bin\spidermonkey.cmd"
eshost --add "V8 --harmony" d8 "%USERPROFILE%\.jsvu\bin\v8.cmd" --args "--harmony"
eshost --add "V8" d8 "%USERPROFILE%\.jsvu\bin\v8.cmd"
eshost --add "XS" xs "%USERPROFILE%\.jsvu\bin\xs.cmd"
That’s it! You can now run code snippets in all those engines with a single command:
eshost -e 'new RegExp("\n").toString()' # https://crbug.com/v8/1982
eshost -e '(function maxCallStackSize() { try { return 1 + maxCallStackSize(); } catch (_) { return 1; }}())'
eshost -e 'Date.parse("1 Octopus 2018")'
Integration with non-interactive environments
On your personal devices, the only command you’ll ever need is jsvu
as described above. There are no command-line flags to remember. 👋🏻
However, there are use cases for running jsvu within non-interactive environments (e.g. as part of continuous integration), where it’s desirable to bypass the initial jsvu
prompt asking to confirm your operating system, architecture, and the list of JavaScript engines to install. Here’s how to do that:
jsvu --os=linux64 --engines=all
# Equivalent to:
jsvu --os=linux64 --engines=chakra,graaljs,hermes,javascriptcore,quickjs,spidermonkey,v8,xs
If the operating system and architecture are not known in advance, the --os=default
flag attempts to guess the correct value from the running environment. This might not be right for example if running a 32-bit Node.js process on a 64-bit machine.
Note that --engines=all
does not install the v8-debug
binaries.
Installing specific versions
jsvu also supports installing specific versions alongside the main engine binaries (which it keeps up to date). Here’s an example:
jsvu v8@7.2.502
Binaries installed using this method are named ${BINARY}-${VERSION}
, so that the above example installs a binary named v8-7.2.502
. This way, there’s never any conflict with the main v8
binary, which jsvu can keep up to date.
This feature works for all the supported engines:
jsvu chakra@1.11.6
jsvu graaljs@20.2.0
jsvu hermes@0.6.0
jsvu javascriptcore@242640
jsvu quickjs@2019-08-18
jsvu spidermonkey@66.0b13
jsvu v8@7.2.502
jsvu v8-debug@7.1.302
jsvu xs@8.7.0
If you pass in an invalid version number, or if the JavaScript engine creators don’t provide a precompiled binary for that specific version, jsvu shows an error.
As a shorthand, for v8
and v8-debug
builds, jsvu can even figure out the last known good revision within a milestone. To install the latest available V8 v7.2.x for example, run:
jsvu v8@7.2
# jsvu figures out that this means v7.2.502, and then installs that version.
Security considerations
jsvu avoids the need for sudo
privileges by installing everything in ~/.jsvu/bin
rather than, say, /usr/bin
.
jsvu downloads files over HTTPS, and only uses URLs that are controlled by the creators of the JavaScript engine or, in the case of JavaScriptCore on Linux, the port maintainers.
For maintainers
How to publish new releases
-
On the
main
branch, bump the version number inpackage.json
:npm version patch -m 'Release v%s'
Instead of
patch
, useminor
ormajor
as needed.Note that this produces a Git commit + tag.
-
Push the release commit and tag:
git push && git push --tags
Our CI then automatically publishes the new release to npm.