The Mojolicious real-time web framework for Node.js. Written in TypeScript. Meticulously designed for hypermedia-driven backend web services using all the latest JavaScript features.
If you want to stay up to date on the latest developments join us on IRC.
Features
- 3x faster than Express.js and 15x faster than Mojolicious.
- A real-time web framework, allowing you to easily grow single file prototypes into well-structured MVC web
- A powerful web development toolkit, that you can use for all kinds of applications, independently of the web
- No frontend framework, mojo.js is for the backend.
- Written in TypeScript, with very clean
classandasync/awaitbased APIs. - Very few dependencies, to avoid supply chain attacks and allow for "Perl-grade" long term support and
- Fresh code based upon decades of experience developing Mojolicious and
Installation
All you need is Node.js 22.18.0 (or newer).
$ npm install @mojojs/core
Maybe take a look at our high quality spin-off projects @mojojs/dom, @mojojs/path, @mojojs/pg and @mojojs/template.
Getting Started
These four lines are a whole web application.
import mojo from '@mojojs/core';
const app = mojo();
app.get('/', ctx => ctx.render({text: 'I ♥ Mojo!'}));
app.start();
Use the built-in command system to start your web server.
$ node index.mjs server
[77264] Web application available at http://127.0.0.1:3000/
Test it with any HTTP client you prefer.
$ curl http://127.0.0.1:3000/
I ♥ Mojo!
Duct Tape for the Web
Use all the latest Node.js and HTML features in convenient single file prototypes like this one, and grow them easily into well-structured Model-View-Controller web applications.
import mojo from '@mojojs/core';
const app = mojo();
app.get('/', async ctx => {
await ctx.render({inline: inlineTemplate});
});
app.websocket('/title', ctx => {
ctx.plain(async ws => {
for await (const url of ws) {
const res = await ctx.ua.get(url);
const html = await res.html();
const title = html.at('title').text();
await ws.send(title);
}
});
});
app.start();
const inlineTemplate =
<script>
const ws = new WebSocket('<%= ctx.urlFor('title') %>');
ws.onmessage = event => { document.body.innerHTML += event.data };
ws.onopen = event => { ws.send('https://mojolicious.org') };
</script>
;
Want to know more?
Take a look at our excellent documentation!