Exploring BaoJs - A fast and minimalist web framework for the Bun JavaScript runtime

In the ever-evolving landscape of web development, speed and efficiency are paramount. With the emergence of new JavaScript runtimes like Bun.js, developers are presented with exciting opportunities to optimize performance and streamline their workflows. Among the innovative tools that have surfaced in this ecosystem, Bao.js stands out as a fast, minimalist web framework designed to harness the full potential of the Bun JavaScript runtime. In this comprehensive guide, we'll delve deep into the world of Bao.js, exploring its background, installation, usage, benchmarks, and contribution opportunities.

Introduction

Bao.js is more than just a web framework; it's a testament to the relentless pursuit of speed and efficiency in web application development. Built on top of the Bun JavaScript runtime, Bao.js boasts exceptional performance, offering developers a seamless experience for building robust web applications. With its minimalist syntax and powerful features, Bao.js empowers developers to unleash their creativity and build high-performance applications with ease.

Background

Before we dive into the intricacies of Bao.js, let's explore its origins and the technology stack that powers it. Bun.js, the underlying JavaScript runtime for Bao.js, was introduced as a fast, modern alternative to Node.js, boasting significant improvements in HTTP request throughput. Leveraging Bun's built-in Bun.serve module and radix tree for routing, Bao.js achieves exceptionally low latency response times, setting new standards for web framework performance. Drawing inspiration from popular frameworks like Express.js and Koa.js, Bao.js combines familiar syntax with innovative enhancements to deliver a superior developer experience.

Installation

To unlock the power of Bao.js, you'll need to first install the Bun JavaScript runtime. Once you have Bun installed, adding Bao.js to your project is a breeze. Simply run the following command in your project directory:

bun add baojs

With Bao.js seamlessly integrated into your project, you're ready to harness its full potential and embark on a journey of web development excellence.

Usage

Examples

Getting started with Bao.js is simple, thanks to its intuitive syntax and powerful API. Let's explore some basic examples to demonstrate how easy it is to create routes and handle requests with Bao.js.

Hello World

import Bao from "baojs";

const app = new Bao();

app.get("/", (ctx) => {
  return ctx.sendText("Hello World!");
});

const server = app.listen();

console.log(`Listening on ${server.hostname}:${server.port}`);

Read Request Body

import Bao from "baojs";

const app = new Bao();

app.post("/pretty", async (ctx) => {
  const json = await ctx.req.json();
  return ctx.sendPrettyJson(json);
});

app.listen();

Named Parameters

import Bao from "baojs";

const app = new Bao();

app.get("/user/:user", (ctx) => {
  const user = await getUser(ctx.params.user);
  return ctx.sendJson(user);
});

app.get("/user/:user/:post/data", (ctx) => {
  const post = await getPost(ctx.params.post);
  return ctx.sendJson({ post: post, byUser: user });
});

app.listen();

Wildcards

import Bao from "baojs";

const app = new Bao();

app.get("/posts/*post", (ctx) => {
  return ctx.sendText(ctx.params.post);
});

app.listen();

Custom Error Handler

import Bao from "baojs";

const app = new Bao();

app.get("/", (ctx) => {
  return ctx.sendText("Hello World!");
});

// A perpetually broken POST route
app.post("/broken", (ctx) => {
  throw "An intentional error has occurred in POST /broken";
  return ctx.sendText("I will never run...");
});

// Custom error handler
app.errorHandler = (error: Error) => {
  logErrorToLoggingService(error);
  return new Response("Oh no! An error has occurred...");
};

// Custom 404 not found handler
app.notFoundHandler = (ctx) => {
  return new Response("Route not found...");
};

app.listen();

Middleware

Middleware plays a crucial role in shaping the behavior of your Bao.js application. Bao.js supports both pre-route and post-route middleware, allowing you to customize the request handling process to suit your needs.

import Bao from "baojs";

const app = new Bao();

// Runs before the routes
app.before((ctx) => {
  const user = getUser(ctx.headers.get("Authorization"));
  if (user === null) return ctx.sendEmpty({ status: 403 }).forceSend();
  ctx.extra["auth"] = user;
  return ctx;
});

app.get("/", (ctx) => {
  return ctx.sendText(`Hello ${ctx.extra.user.displayName}!`);
});

// Runs after the routes
app.after((ctx) => {
  ctx.res.headers.append("version", "1.2.3");
  return ctx;
});

app.listen();

Benchmarks

Bao.js sets a new benchmark for web framework performance, outperforming its counterparts with remarkable throughput and reduced latency. Let's compare Bao.js with other popular frameworks using benchmark results:

Bao.js

$ wrk -t12 -c 500 -d10s http://localhost:3000/
Running 10s test @ http://localhost:3000/
  12 threads and 500 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    15.38ms    1.47ms  39.19ms   76.59%
    Req/Sec     2.67k   195.60     2.90k    82.33%
  318588 requests in 10.01s, 24.31MB read
  Socket errors: connect 0, read 667, write 0, timeout 0
Requests/sec:  31821.34
Transfer/sec:      2.43MB

Express.js

$ wrk -t12 -c 500 -d10s http://localhost:5000/
Running 10s test @ http://localhost:5000/
  12 threads and 500 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    56.34ms   13.42ms 246.38ms   90.62%
    Req/Sec   729.26    124.31     0.88k    86.42%
  87160 requests in 10.01s, 18.95MB read
  Socket errors: connect 0, read 928, write 0, timeout 0
Requests/sec:   8705.70


Transfer/sec:      1.89MB

Koa.js

$ wrk -t12 -c 500 -d10s http://localhost:1234/
Running 10s test @ http://localhost:1234/
  12 threads and 500 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    18.12ms    2.47ms  65.03ms   91.12%
    Req/Sec     2.26k   280.16     4.53k    90.46%
  271623 requests in 10.11s, 42.74MB read
  Socket errors: connect 0, read 649, write 0, timeout 0
Requests/sec:  26877.94
Transfer/sec:      4.23MB

Fastify

$ wrk -t12 -c 500 -d10s http://localhost:5000/
Running 10s test @ http://localhost:5000/
  12 threads and 500 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    15.32ms    1.90ms  60.53ms   78.74%
    Req/Sec     2.68k   274.95     3.25k    72.08%
  319946 requests in 10.01s, 50.65MB read
  Socket errors: connect 0, read 681, write 0, timeout 0
Requests/sec:  31974.36
Transfer/sec:      5.06MB

Contribution

Bao.js is a community-driven project, and we welcome contributions from developers of all skill levels. Whether you're fixing bugs, adding features, or improving documentation, your contributions play a vital role in shaping the future of Bao.js. Here are some ways you can contribute:

  • Code Contributions: Dive into the codebase, fix bugs, add features, and contribute to the evolution of Bao.js.
  • Plugin Development: Extend Bao.js's functionality by developing plugins that enhance its capabilities and cater to specific use cases.
  • Issue Triage and Support: Help triage issues, provide support to fellow developers, and contribute to the vibrant community discussions.
  • Documentation and Education: Contribute to refining and expanding the documentation, tutorials, and educational resources to empower developers worldwide.

License

Bao.js is released under the MIT License, granting developers the freedom to use, modify, and distribute the software as they see fit. By contributing to Bao.js, you agree to abide by the terms of the MIT License and uphold the principles of open-source collaboration.


With its blazing speed, minimalist syntax, and powerful features, Bao.js represents the next frontier in web framework technology. Whether you're building a simple CRUD application or a high-performance web service, Bao.js empowers you to unlock the full potential of the Bun JavaScript runtime and take your web development projects to new heights. Join the Bao.js community today and embrace the future of web development!

Next Post Previous Post
No Comment
Add Comment
comment url