Nếu bạn đã từng nghe Bun.sh: Dấu chấm hết cho Node.js? hay Bun.sh JS Runtime của tương lai, thì đúng rồi đấy, đây là những lời đồn mang tính marketing của Bun.sh. Vậy nó có đúng như vậy không?

Trong bài đăng blog này, chúng ta sẽ khám phá Bun.sh theo chi tiết. Chúng ta sẽ xem xét các tính năng của nó, cách sử dụng nó và cách nó có thể giúp bạn xây dựng ứng dụng JavaScript nhanh hơn và dễ dàng hơn. Và lời đồn có đúng nhưng lời đồn. Bắt..đầu..thôi....!

I. Bun.sh là gì?

Bun.sh là một toolkit JavaScript và TypeScript toàn diện, bao gồm runtime, trình gói, trình chạy thử nghiệm và trình đóng gói. Nó được thiết kế để đơn giản hóa và tăng tốc quá trình phát triển ứng dụng JavaScript. Nếu bạn đang tìm kiếm một cách để đơn giản hóa và tăng tốc quá trình phát triển ứng dụng JavaScript của mình, thì Bun.sh là một lựa chọn tuyệt vời. Nó nhanh chóng, toàn diện và dễ sử dụng.

Bun.sh được phát triển bởi Jarred Sumner, một nhà phát triển phần mềm từ New Zealand. Ông bắt đầu phát triển Bun.sh vào năm 2021 với mục tiêu tạo ra một toolkit JavaScript và TypeScript toàn diện, nhanh chóng, dễ sử dụng và an toàn.

Bun.sh được phát hành lần đầu tiên dưới dạng phiên bản beta vào tháng 8 năm 2022. Kể từ đó, nó đã nhận được sự quan tâm đáng kể từ cộng đồng nhà phát triển JavaScript. Tính đến tháng 12 năm 2023, Bun.sh đã có hơn 66.000 sao trên GitHub.

Một dẫn chứng cụ thể cho sự quan tâm cho Bun.sh chính là ngôi vị quán quân trong cuộc đua các repo được cộng đồng vote start vào năm 2022 trên trang https://risingstars.js.org/2022/en
Trang này đã có câu chúc mừng quán quân như sau:

The champion this year is a delicious bread with a smiling logo, it's good to start the year with a smile!

và quả đúng như thế, chiếc bánh mỳ này thực sự rất thơm ngon cho các developer tìm hiểu. Tình riêng hạng mục JS Runtime nó cũng đang xếp thứ 3 về độ phổ biến,  chỉ xếp sau Nodejs và Deno trong khi chỉ mới phát hành trong vòng 3 năm. Thật là một điều phi thường.

II. JS Runtime là gì?

Bun là một JS Runtime, vậy các bạn đã biết JS Runtime là gì chưa, hãy cùng tìm hiểu nào.

JavaScript runtime là môi trường mà các đoạn code JavaScript chạy trong đó và được thông dịch bởi JavaScript engine. JavaScript runtime cung cấp các dịch vụ cần thiết cho JavaScript engine để thực thi mã JavaScript, chẳng hạn như:

  • Tạo và quản lý bộ nhớ: JavaScript runtime cung cấp bộ nhớ cần thiết cho JavaScript engine để lưu trữ các biến, đối tượng, và các cấu trúc dữ liệu khác.
  • Thực thi các phép toán: JavaScript runtime cung cấp các hàm cần thiết để thực hiện các phép toán số học, logic, và chuỗi.
  • Luồng dữ liệu: JavaScript runtime cung cấp các cơ chế để quản lý luồng dữ liệu, chẳng hạn như luồng đầu vào/đầu ra (I/O), luồng sự kiện, và luồng đệ quy.
  • Quản lý lỗi: JavaScript runtime cung cấp các cơ chế để xử lý lỗi, chẳng hạn như ném ngoại lệ và bắt ngoại lệ.

Có hai loại JavaScript runtime chính:

  • JavaScript runtime trong trình duyệt: JavaScript runtime trong trình duyệt được tích hợp sẵn trong trình duyệt web. Nó được sử dụng để chạy mã JavaScript trong các trang web và ứng dụng web.
  • JavaScript runtime độc lập: JavaScript runtime độc lập là một phần mềm riêng biệt có thể được sử dụng để chạy mã JavaScript. Nó thường được sử dụng để chạy mã JavaScript trong các ứng dụng máy tính để bàn và ứng dụng di động. Và chính Bun.sh cũng thuộc loại này.

Dưới đây là một số ví dụ về JavaScript runtime:

  • V8: V8 là JavaScript runtime được phát triển bởi Google. Nó được sử dụng trong trình duyệt Chrome và các ứng dụng JavaScript khác của Google.
  • Chakra Core: Chakra Core là JavaScript runtime được phát triển bởi Microsoft. Nó được sử dụng trong trình duyệt Edge và các ứng dụng JavaScript khác của Microsoft.
  • Node.js: Node.js là một nền tảng JavaScript độc lập. Nó sử dụng JavaScript runtime V8 để chạy mã JavaScript trong môi trường máy tính để bàn và di động.

JavaScript runtime là một phần quan trọng của ngôn ngữ lập trình JavaScript. Nó cung cấp các dịch vụ cần thiết cho JavaScript engine để thực thi mã JavaScript một cách chính xác và hiệu quả.

III. Điểm nổi bật của Bun.sh

Bun.sh là một toolkit JavaScript và TypeScript toàn diện, cung cấp một số tính năng nổi bật, bao gồm:

  • Tốc độ: Bun.sh là một runtime JavaScript nhanh chóng, được thiết kế để thay thế Node.js. Nó có thể chạy mã JavaScript và TypeScript nhanh hơn nhiều so với Node.js.
  • Tính toàn diện: Bun.sh bao gồm mọi thứ bạn cần để xây dựng ứng dụng JavaScript, bao gồm một trình gói, trình chạy thử nghiệm và trình đóng gói. Điều này giúp bạn tiết kiệm thời gian và công sức khi phát triển ứng dụng.
  • Dễ sử dụng: Bun.sh được thiết kế để dễ sử dụng. Nó có một cú pháp đơn giản và các tài liệu rõ ràng.

Dưới đây là thông số so sánh tốc độ của Bun.sh cùng với Nodejs và Deno được trang chủ Bun.sh công bố. Chỉ riêng số lượng request/sec của Bun.sh đã gấp 5 lần Node.js và gấp khoảng 2 lần so với Deno. Thật ấn tượng phải không.

IV. Kiểm chứng tốc độ

Giờ hãy cùng kiểm chứng tin đồn về tốc độ của Bun.sh, liệu nó có đúng như những gì mà trang chủ của nó đã đưa ra không nhé.

Đầu tiên chúng ta sẽ kiểm chứng về tốc độ load thư viện, ở đây chúng ta sẽ sử dụng Hyperfine:

 hyperfine --warmup 1 --runs 3 'npm install' 'bun install'

Kết quả:

Chúng ta sẽ thấy tốc độc của Bun sẽ nhanh hơn khoảng 25 lần so với npm. Tốc độ thật kinh ngạc phải không.


Chưa hết, giờ chúng ta hay qua kiểm chứng về số lượng request/sec. Chúng ta sẽ sử dụng thư viện Oha theo suggest từ phía Bun.sh.

Chúng ta sẽ kiểm chứng với 3 server, Bun, Nodejs và Deno.
Bun sẽ chạy với cổng 3001, Nodejs với cổng 9080 và Deno sẽ là 8000

Kết quả:

Chúng ta có thể thấy, số lượng request của Bun 49388 req/sec nổi trội hơn hẳn so với Nodejs 18777 req/sec và nhỉnh hơn Deno 48401 req/sec một chút. Dù không đúng với công bố là hơn 5 lần nhưng cũng có thể thấy ở đây đã gấp 2.5 lần. Một kết quả cũng có thể chứng minh rằng khả năng xử lý lượng request của Bun rất đáng nể.


Tiếp theo chúng ta tới với đo BenchMark truy vấn tới Database. Ở đây chúng ta sẽ chạy truy vấn tới bảng dữ liệu mà bên Bun cho sẵn.
Kết quả:

Nhìn vào bảng trên chúng ta cũng có thể thấy được rằng tốc độ truy vấn của Bun cũng đang ở một ngưỡng rất cao so với NodeJs và Deno, cụ thể gấp 2 lần Deno và gấp 3 lần so với Nodejs. Thật đáng để lưu ý.

V. Kết luận:

Sau khi chúng ta đi hết các đặc điểm cũng như chứng thực về khả năng của Bun.sh thì cũng nên có cái nhìn cụ thể và trung thực về nó.

Kết luận cho câu hỏi đầu bài blog, Bun.sh dấu chấm hết cho Nodejs:
Có thể tới hiện tại thì kết luận là không, NodeJs vẫn là một tượng đài khó có thể vượt qua, nhưng Bun.sh cũng rất hứa hẹn trong tương lai nếu giải quyết được các vấn đề còn tồn đọng.

Vậy hiện tại chúng ta sẽ làm gì với Bun.sh:

  • Có thể sử dụng Bun.sh trong môi trường phát triển để trải nghiệm cũng như có cài nhìn chính xác nhất về Bun.sh.
  • Theo dõi các bản phát hành mới của Bun.sh để cập nhật các tính năng mới và sửa lỗi.
  • Kiểm tra xem ứng dụng của bạn có tương thích với Bun.sh hay không trước khi triển khai trong môi trường sản xuất.

Nhìn chung, Bun.sh là một công nghệ đầy hứa hẹn, có thể thay thế Node.js trong tương lai. Tuy nhiên, Bun.sh vẫn còn trong quá trình phát triển, vì vậy cần được sử dụng thận trọng.

Cảm ơn các bạn đã đọc bài blog này của mình, mong rằng những kiến thức mình góp nhặt này sẽ mang tới cho các bạn những kiến thức mới mẻ và bổ ích. Hẹn gặp lại các bạn ở các bài blog tiếp theo.!


Tài liệu tham khảo:
- https://bun.sh/docs
- https://risingstars.js.org/2022/en
- https://viblo.asia/p/bunsh-dau-cham-het-danh-cho-nodejs-7ymJXX7xJkq
- https://www.youtube.com/watch?v=JXu3Ib4vAuI&t=604s