- Notifications
You must be signed in to change notification settings - Fork172
saghul/txiki.js
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
txikia (basque): small, tiny.
txiki.js is a small and powerful JavaScript runtime. It targets state-of-the-art ECMAScriptand aims to beWinterCG compliant.
It's built on the shoulders of giants: it usesQuickJS-ng as its JavaScript engine andlibuv as the platform layer.
See it in action here:
First head over tobuilding and build the runtime.
$ ./build/tjseval"console.log('hello world')"hello world$
If you want to run a script you can usetjs run
:
$ ./build/tjs run examples/hello_world.jshello world$
Explore all the options:
$ ./build/tjs --help
For TS support see@txikijs/types.
Support for theES2023 specification (almost complete).
txiki.js aims to beWinterCG compliant, you can track the progresshere.
- alert, confirm, prompt (1)
- Console
- Crypto (2)
- Encoding API
- EventTarget
- fetch
- JSON modules
- Performance
- setTimeout, setInterval
- Storage API
- Streams API
- URL
- URLPattern
- URLSearchParams
- WebAssembly (3)
- WebSocket
- Web Workers API
(1): All of them are async.
(2): No subtle support.
(3): No tables, globals or memory support.
- Standalone executables
- TCP and UDP sockets
- Unix sockets / named pipes
- Signal handling
- File operations
- Child processes
- WASI
- ...
See thefull API documentation.
Other extras:
- Import directly from HTTP(S) URLs
- Import JSON files
- Builtin test runner
The following modules compose the standard library:
- GNU/Linux
- macOS
- Windows (beta)
- Other Unixes (please test!)
CMake is necessary.
NOTE: The txiki.js build depends on a number of git submodules (libffi,libuv andwasm3).If you didn't already clone this repository recursively, make sure you initialize thesesubmodules withgit submodule update --init
before proceeding to the build.
Install dependencies (libcurl
,build-essential
,cmake
,makeinfo
,autoreconf
,libtool
,libltdl-dev
):
# On Debian / Ubuntusudo apt install libcurl4-openssl-dev build-essential cmake autoconf texinfo libtool libltdl-dev
Install dependencies (cmake
,autoconf
):
brew install cmake autoconf automake libtool texinfo
# Get the codegit clone --recursive https://github.com/saghul/txiki.js --shallow-submodules&&cd txiki.js# Compile it!make# Run the REPL./build/tjs
Building has only been tested in 64bit Windows.
First make sure you haveMSYS2 installed. Themingw64
andclang64
environments are currently tested.
Then install the required dependencies:
pacman -S git make pactoyspacboy -S curl-winssl:p toolchain:p cmake:p ninja:p
These commands must be run in a MinGW64 or clang64 shell.
make
This will build the executable just like on Unix. Note that at this point there are a number of dynamically linked libraries, so if you want to use the executable on a different system you'll need to copy those too. Check the list withldd build/tjs.exe
.
Make sure these commands are run from Windows Terminal (mintty, what MSYS2 provides is not supported).
maketest
If you are making a custom build and are modifying any of the JS files that arepart of the runtime, you'll need to regenerate the C code for them, so your changesbecome part of the build.
# First install the JS dependenciesnpm install# Now bundle the code and compile it into C source filesmake js
Creating standalone executables is possible withtjs compile
. The resulting executablewill bundle the given code and the txiki.js runtime. No compiler is needed.
NOTE: The resulting executable will have the same runtime dependencies as thetjs
executable.
Assuming abundle.js
file with some JS code, the following command will createa standalone executable with it:
tjs compile bundle.js
The new executable will be calledbundle
on Unix platforms andbundle.exe
on Windows.The output name can be customized by passing a second option:
tjs compile bundle.js myexe
Thetjs compile
command doesn't do any code bundling. If you need to bundle yourapp into a single JS file for use withtjs compile
,esbuild can be a good option.Here is how to bundle an app into a singlebundle.js
file:
npx esbuild my-app/index.js \ --bundle \ --outfile=bundle.js \ --external:tjs:* \ --minify \ --target=es2023 \ --platform=neutral \ --format=esm \ --main-fields=main,module
txiki.js usescalendar versioning with the form YY.MM.MICRO.
Built with ❤️ by saghul and these awesomecontributors.
About
A tiny JavaScript runtime