πŸŒ€ Exploring Bunjs: A Fast All In One Javascript Runtime

November 10, 2023

 views

Header Image

πŸŒ€ Exploring BunJs: A Fast All-in-One JavaScript Runtime

The world of JavaScript is ever-evolving, and new frameworks and libraries pop up regularly in the vast JavaScript ecosystem. 🌐 In this dynamic landscape, Bun emerges as a distinctive player. But what sets Bun apart from the plethora of libraries and frameworks? Let's delve into the realm of BunJs and uncover its unique characteristics. πŸš€

πŸ€” What is BunJs?

Bun, coined as a "fast all-in-one JavaScript runtime," shares similarities with the well-known Node and Deno. πŸƒβ€β™‚οΈ Initially conceived as a JavaScript web server by its creator, Jarred Sumner, Bun underwent a transformative journey, evolving into a comprehensive rewrite of the entire JavaScript ecosystem.

At its core lies the Bun runtime, a swift JavaScript runtime designed as a seamless replacement for Node.js. πŸš„ Crafted in Zig and powered by JavaScriptCore under the hood, Bun excels at slashing startup times and optimizing memory usage.

Bun's foundations are built on three pivotal pillars:

  • Start fast
  • Provide new levels of performance
  • Be a great and complete tool

Written in the ZIG language and utilizing the JavaScriptCore engine (as opposed to the V8 engine in Node and Deno), Bun positions itself as a drop-in alternative for Node.js.

🌟 Why BunJs?

The 'why' behind BunJs unveils its purpose and significance in the vast JavaScript landscape. πŸ€·β€β™‚οΈ According to the official site,

"The goal of Bun is to run most of the world's server-side JavaScript and provide tools to improve performance, reduce complexity, and multiply developer productivity."

In essence, Bun serves as an all-inclusive package for JavaScript development, distinguishing itself from alternatives like Node and Deno, which often require external tools and packages.

Bun's feature set includes:

  • JavaScript runtime
  • Package manager
  • Test runner
  • Transpiler/Bundler
  • TypeScript & JSX support
  • Environment support
  • SQLite client

⚑ Blazing Fast

A standout attribute of Bun is its unparalleled speed, touted to be four times faster than Node.js. πŸš€ Putting this claim to the test, let's examine a simple script.

const http = require('node:http');

const server = http.createServer((req, res) => {
    res.end('Hello World!');
});

server.listen(3000);

Let's benchmark this using apache bench

ab -k -c 20 -n 250 "http://localhost:3000/"

It produces the following output

Concurrency Level:      20
Time taken for tests:   0.107 seconds
Complete requests:      250
Failed requests:        0
Keep-Alive requests:    0
Total transferred:      21750 bytes
HTML transferred:       3000 bytes
Requests per second:    2330.22 [#/sec] (mean)
Time per request:       8.583 [ms] (mean)
Time per request:       0.429 [ms] (mean, across all concurrent requests)
Transfer rate:          197.98 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   0.5      0       4
Processing:     1    8   3.8      7      19
Waiting:        0    4   2.8      4      14
Total:          2    8   3.7      8      19

Now let's run the same script using Bun. We don't need to make any changes in the script since Bun supports most of the node libraries. We can replace the start command form node server.js to bun server.js and it will just work.

Concurrency Level:      20
Time taken for tests:   0.051 seconds
Complete requests:      250
Failed requests:        0
Keep-Alive requests:    0
Total transferred:      32000 bytes
HTML transferred:       3000 bytes
Requests per second:    4945.01 [#/sec] (mean)
Time per request:       4.044 [ms] (mean)
Time per request:       0.202 [ms] (mean, across all concurrent requests)
Transfer rate:          618.13 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   0.6      1       3
Processing:     0    3   1.9      2       8
Waiting:        0    3   1.8      2       8
Total:          2    4   1.9      3       8

From the benchmark result we can clearly see bun outperfoms nodejs in speed. Bun can handle 2x more requests/sec than node with node's http server.

Now let's benchmark Bun with its own server.

export default {
    port: 3000,
    fetch(req) {
        return new Response('Hello world!');
    }
}

It's pretty simple to create an http server in Bun. The script need to make a default export with an object with a port and fetch function, it will automatically creates an http server listening on the specified port.

Concurrency Level:      20
Time taken for tests:   0.033 seconds
Complete requests:      250
Failed requests:        0
Keep-Alive requests:    0
Total transferred:      32000 bytes
HTML transferred:       3000 bytes
Requests per second:    7585.18 [#/sec] (mean)
Time per request:       2.637 [ms] (mean)
Time per request:       0.132 [ms] (mean, across all concurrent requests)
Transfer rate:          948.15 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   0.5      1       2
Processing:     0    2   0.8      1       4
Waiting:        0    1   0.8      1       4
Total:          1    2   0.9      2       5

Bun's own server is blazing fast and handles 3x requests/sec more than node's server.

πŸ“¦ Package Manager

Let's take a look at Bun's package manager, which is also nodejs compatible. It can be used as a standalone tool for existing nodejs applications.

To install all dependencies of a project using the bun package manager we can use the following command.

bun install

To install specific packages:

bun add package-name

We can run a benchmark test on Bun's package manager against yarn and npm. The benchmark is run for the following package.json.

{
  "name": "Bun-test",
  "private": true,
  "dependencies": {
    "express": "4.18.2"
  }
}

It have only one dependency express.

Future of Bun

The future of Bun unfolds with great promise, capturing the enthusiasm of the JavaScript community. πŸš€ As the new contender in town, Bun has sparked genuine excitement. The success of any emerging technology hinges on community adoption, and in the realm of JavaScript, adaptability is key. People tend to resist change unless it introduces new levels of comfortβ€”a principle that extends to technology.

However, Bun stands out. Its features, particularly its impressive speed, might prove to be a game-changer in fostering widespread acceptance. 🌐 Even if replacing Node.js entirely seems like a formidable task, Bun can seamlessly integrate into our development toolkit. Whether as a package manager, test runner, transpiler, or more, Bun offers a versatile solution.

The question lingers: Will Bun replace Node.js? The answer remains to be discovered, but signs point in a promising direction! 🌟 Bun is on the right track, and the journey towards its role in the JavaScript landscape is an intriguing one. Only time πŸ•°οΈ will unveil the extent of Bun's impact and integration within the ever-evolving tech ecosystem.