Authors

Sep 12, 2023

Bun 1.0 Release - Lebih cepat dari Node.js

Cover

Dari ide seorang Frontend Engineer di salah satu platform pembayaran global Stripe bernama Jarred Sumner lahirlah Bun, sebuah runtime Javascript, transpiler bundler, dan juga NPM package manager tergabung menjadi satu aplikasi yaitu Bun, kemudian di awal kemunculannya sudah menarik perhatian banyak developer. Pasalnya Bun mengklaim lebih cepat dari Node/js dari sisi proses data, iterasi, eksekusi dan juga dalam meng-install package-package. Walaupun di awal kemunculannya Bun masih dalam versi beta, beberapa developer termasuk saya telah mencobanya dan memang lebih cepat, dalam beberapa kasus terlihat signifikan dan di beberapa kasus tidak terlalu signifikan perbedaannya. Kemudian Bun diumumkan release pada tanggal 8 September 2023 pukul 00.00 waktu Indonesia bagian barat (WIB), pada acara tersebut dilakukan sesi tanya jawab (Q&A) yang terbuka kepada seluruh pendengarnya.

Bun Release Versi Pertamanya (v1.0)

Pada acara Launching Bun versi pertamanya Bun diperkenalkan bahwa Bun dapat menjadi alat (tool) untuk melakukan building, running, testing, dan debugging, mulai dari script sederhana sampai project full stack server side rendering yang cukup besar. Kemudian Javascript memiliki kompleksitas yang cukup tinggi tetapi Javascript ini sudah populer dan sudah dikenal banyak orang, oleh karena itu Bun menghapus kompleksitas yang tidak diperlukan tanpa membuang bagian yang hebat dari Javascript. Dari banyaknya tool yang dimiliki Bun, yang paling diunggulkan ialah runtime-nya. Runtime Node js dapat digantikan dengan Bun dengan mudahnya, Bun dirancang dan dibuat dengan melihat kompatibilitas dari Node JS, dan jika pada Node JS untuk mengcompile Typescript membutuhkan dependensi, dengan Bun tidak lagi memerlukan dependensi, dan yang paling penting Bun ini lebih cepat. Untuk perbandingannya jika kita memiliki kode sederhana seperti:

console.log("Hello world");

Dengan bun, kode tersebut dapat dieksekusi hanya dengan delapan milidetik (8ms) sedangkan jika dieksekusi dengan Node ini membutuhkan 32 milidetik (32ms). Dapat dilihat perbedaan dari Bun dan Node mencapai 4 kali lebih cepat. dan ketika kode tersebut diubah menjadi typescript seperti berikut:

const message: string = "Hello world";
console.log(message);

Jika menggunakan typescript maka akan melakukan proses transpile terlebih dahulu, karena Bun sudah memiliki transpiler dan tidak membutuhkan dependensi tambahan seperti esbuild, tsx atau tsc layaknya yang dilakukan Node JS. Kecepatan yang dihasilkan dari Bun dan beberapa package dari Node dapat dilihat pada gambar berikut

compile compare


Jika umumnya para developer menggunakan perintah npm run dev untuk menjalankan project kalian di sisi development. Dengan Bun anda dapat menggantinya semua perintah atau command dari npm dengan bun, seperti bun run dev. Kecepatan NPM dalam mengeksekusi script pada sebuah Macbook Pro sekitar 150 milidetik, sedangkan dengan Bun menggunakan perangkat yang sama mampu mengeksekusi script dengan hanya 30 milidetik saja, 5 kali lebih cepat dibandingkan NPM. Jika diperhatikan gambar dibawah, NPM terasa lebih laggy dibandingkan dengan Bun yang terasa instan.

runing compare


Performa

Performa menjadi kunci dalam perancangan Bun. Karena Bun sudah di buat, kenapa tidak untuk ditambahkan fitur fitur yang dapat membantu mempermudah pekerjaan para developer. Sebelumnya sudah disebutkan bahwa Bun sudah mendukung Typescript dan juga JSX secara langsung tanpa perlu dependensi lagi yang diperlukan, dan tak hanya itu Bun juga sudah mendukung CommonJS maupun ES Modules.

Banyak dari kalian mungkin kebingungan sehingga mungkin ada waktu yang terbuang untuk memikirkan ketidak sesuaian antara CommonJS dan ES Module. Tetapi ketika kalian sudah menggunakan Bun maka keduanya dapat bekerja dengan baik dalam satu file yang sama. Sebagai contoh, jika kalian membutuhkan file lain menggunakan ES Modul maka kalian membutuhkan import untuk memanggil file lain, dan ketika menggunakan fungsi require dari CommonJS maka kode tidak akan berjalan, tetapi dengan Bun kalian dapat menjalankan keduanya dalam sebuah file yang sama.

import { createElement } from "react";
const _ = require("lodash");

console.log(_.isFunction(createElement));

Hot Reloading

Hot reloading ialah sebuah fitur yang mampu menampilkan perubahan secara instan. Bun sudah mendukung fitur hot reloading ini, untuk menggunakannya kalian dapat menambahkan flag --hot pada perintah yang ingin anda eksekusi (contohnya bun --hot server.ts). Hal ini memudahkan para developer karena tidak perlu repot-repot untuk merestart porses, karena secara instan ketika terdapat perubahan pada kode anda, Bun langsung memproses data terbaru tanpa ada state yang hilang.

hot reload


Plugin API

Bun memiliki Plugin API yang memungkinkan para developer menggunakan loader sesuai keinginannya. Kalian dapat menggunakan extension yang dimiliki Bun, seperti kalian ingin menambahkan kode YAML yang kalian inginkan agar dapat berjalan di project Javascript atau Typescript. Untuk kodenya akan seperti berikut:

// yamlPlugin.ts

import { plugin } from "bun";

plugin({
  name: "YAML",
  async setup(build) {
    const { load } = await import("js-yaml");
    const { readFileSync } = await import("fs");
    build.onLoad({ filter: /\.(yaml|yml)$/ }, (args) => {
      const text = readFileSync(args.path, "utf8");
      const exports = load(text) as Record<string, any>;
      return { exports, loader: "object" };
    });
  },
});

Setelah membuat plugin diatas, kita dapat dengan mudahnya memanggil file YAML kedalam kode Javascript atau Typescript seperti berikut:

import "./yamlPlugin.ts";
import { name, releaseYear } from "./data.yml";

console.log(name, releaseYear);

Handle File

Bun dimasak menggunakan API, hal itu akan memenuhi kebutuhan dari banyak developer. Disini contohnya adalah jika kalian ingin membaca sebuah file kalian hanya tinggal memanggil method Bun.file(). Hasil dari fungsi tersebut ialah object BunFile, hal yang sama halnya dengan object File pada browser API. Tetapi yang terpenting, bun dapat membaca file secara lazy load ketika hanya ingin digunakan, dan ketika sudah siap untuk membaca file tersebut object BunFile memberikan method-method yang berguna untuk melakukan rendering dalam beberapa format. Jika kalian sering menggunakan File API pada browser, kalian akan familiar dengan ini.

const file = Bun.file("package.json");

await file.text();
await file.arrayBuffer();
await file.stream();
await file.json();

Hal keren lainnya ialah menulis file dengan Bun akan sangat mudah dengan method Bun.write() maka kalian dapat menulis file apa saja (string, File, Buffer) dan menaruhnya di penyimpanan kalian. Bun memiliki kecepatan menulis file tiga kali lebih cepat dibandingkan dengan Node.js, dan untuk kecepatan membaca file Bun sepuluh kali lebih cepat dibandingkan dengan Node.js

await Bun.write("index.html", "<html />");
await Bun.write("index.html", Bun.file("homepage.html"));
await Bun.write("index.html", Buffer.from("<html />"));
await Bun.write("index.html", await fetch("https://example.com/"));

Server dengan Bun

Bun memiliki method Bun.serve() untuk menjalankan sebuah server. Server dari Bun ini dibangun berdasarkan oleh web API seperti request dan response. Server ini mampu menghandle request empat kali lebih cepat tiap detiknya dibandingkan dengan Node.js. Lalu bagaimana dengan websocket? Bun server sudah sangat dioptimasi dalam hal ini, sehingga setiap detikanya Bun mampu menghandle pesan sebanyak 1 juta pesan, jauh dibandingkan dengan websocket oleh Node.js yang hanya mampu menghandle file 5 kali lebih lambat dari Bun yaitu sekitar 179 ribu pesan tiap detiknya.

Bun juga memiliki kemampuan untuk melakukan publish dan subscribe API untuk websocket. Hal ini membantu kalian dalam membuat pesan broadcast tertentu, dengan kecepatan yang sama seperti layaknya kode yang biasa (native)


Bun memiliki built-in untuk melakukan hashing, built-in ini sudah mendukung untuk melakukan hashing pada password, karena didalamnya sudah termasuk bcrypt dan juga argon sehingga sangat aman untuk digunakan termasuk untuk meng-hashing password. Tidak hanya hashing, Bun memiliki banyak built-in/API yang dapat membantu memudahkan para developer untuk melakukan pekerjaannya, diantaranya seperti pada gambar berikut:

bun built-in


Package Manager

Bagi para developer setiap kali ingin menggunakan framework kalian akan diminta untuk meng-install dependensi yang dibutuhkan. Oleh karena itu, Bun tidak hanya sekedar runtime, tetapi juga sebagai package manager yang kompatibel dengan Node.js. Tidak perlu khawatir, karena package manager yang dimiliki Bun dibuat sama dengan package manager yang biasanya kalian gunakan, sehingga kalian akan lebih familiar. Bun mengatakan "Percaya, Anda tidak pernah menemukan package manager secepat ini". Bun dapat mengatakan demikian karena dari hasil yang didapatkan saat menginstall sebuah aplikasi Remix hanya membutuhkan 0.36 detik saja 29 kali lebih cepat dibandingkan NPM, 17 kali lebih cepat dibandingkan PNPM.

Yaa. Bun Package Manager tidak terikat dengan Bun runtime. Bun package manager sama persis seperti package manager lainnya, hanya akan membaca package.json kemudian men-download dependensi yang dibutuhkan dari registry dan menaruhnya ke dalam folder node_modules. Jadi kalian dapat menginstall package dengan Bun dan dapat dijalankan dengan runtime apa saja, dapat bekerja dengan Bun maupun dengan Node.js


Sumber: https://www.youtube.com/watch?v=BsnCpESUEqM&t=268s