+2

Bun js là gì? Liệu nó có thay thế được nodejs không?

Giới thiệu

Bun js là một phần bổ sung cho những nhà phát triển javascript. Một cách ngắn gọn để có thể mô tả Bun là All In One. Đúng vậy, Bun là một javascript runtime (hoạt động tương tự như NodeJs) Bun rất nhanh đến mức một số người nghĩ rằng nó có thể là kẻ huỷ diệt nodejs. Ngoài ra Bun còn là một bộ toolkit giúp developer có thể bundle, runner, test. Bun giống như Deno, hỗ trợ Typescript cung cấp những tính năng thân thiện cho các lập trình cao cấp. Nó đã tạo nên làn sóng ngang với làn sóng do Deno tạo ra khi ra mắt vào năm 2018. Tuy nhiên không giống như Deno, Bun js được thiết kế thay thế cho Node, Webpack, Babel tất cả trong package. Bun được phát hành với Giấy phép MIT và LGPL2 (do JavaScriptCore) và tại thời điểm viết bài, nó đã được release version 1.0.1.

So sánh Bun với Deno và Node?

Mặc dù Bun được lấy cảm hứng từ Node và Deno nhưng rõ ràng nó cũng đang cố gắng cải thiện trải nghiệm phát triển và năng suất bằng cách cung cấp bộ công cụ đi kèm dưới đây.

Bun JavaScript lấy các tính năng từ Deno, như vận chuyển dưới dạng nhị phân duy nhất và có hỗ trợ TypeScript gốc.

Với Deno

Feature Bun Deno
TypeScript/TSX/JSX support Yes Yes
Single executable Yes Yes
Built-in test runner Yes (in development) Yes
Built-in Web APIs (fetch, WebSocket, etc.) Yes Yes
Top-level awaits Yes Yes
npm compatibility Yes No
Node compatibility Yes Partial
tsconfig.json support Yes No
WebAssembly support Yes Yes
Built-in linter & formatter No Yes
Permission system No Yes
Package manifest format package.json N/A
Module support ES Modules, CommonJS ES Modules
License MIT, LGPL2 MIT
JS Engine JavaScriptCore V8
Language Zig, C++ Rust, Tokio

Với Nodejs, Bun phát triển nhiều tính năng hơn nhưng vẫn đảm bảo tính tương thích

Feature Bun Node
npm compatibility Yes Yes
Node compatibility Yes Yes
Single binary Yes No
Built-in bundler & transpiler Yes No
Native TypeScript support Yes No
Package manifest format package.json package.json
Lockfile format Binary JSON
Native live-reload Yes No
Built-in .env, .toml support Yes No
Top-level Awaits Yes Only on ES Modules
JS Engine JavaScriptCore V8
Language Zig, C++ C, C++
License MIT, LGPL2 MIT

Mặc dù vậy Bun vẫn còn một số điểm hạn chế:

  • Không hỗ trợ Windows gốc (mặc dù có thể khắc phục bằng WSL).
  • Bun có thể bị kẹt khi cài đặt các gói, quá trình tìm nạp không đáng tin cậy và mặc dù điều đó chưa bao giờ xảy ra với tôi nhưng theo một số report, đôi khi tình trạng lỗi có thể xảy ra.
  • Bun chưa tương thích hoàn toàn với Node, không phải tất cả npm package đều hoạt động. Cái này thì không phải vấn đề lắm, vì hầu hết các package phổ biến đều được hỗ trợ rồi, theo thời gian các bổ sung sẽ được update.

Bun có thật sự nhanh?

Nếu lấy nodejs là mốc so sánh, thì phải nói Bun nhanh, super nhanh. Bun được sinh ra từ sự thất vọng của Jarred Sumner (Founder/CEO của Bun) với tốc độ và sự thiếu thốn của Javascript: “Tôi rất thất vọng vì mọi thứ trong JavaScript đều chậm đến mức nào. Tôi biết JavaScript có thể nhanh hơn rất nhiều”. Là cựu nhà phát triển giao diện người dùng tại Stripe, Jarred biết chu kỳ lặp lại nhanh là điều cần thiết để tăng năng suất. Kinh nghiệm của nhà phát triển rất quan trọng. Do đó, tốc độ của Bun không bị giới hạn ở việc phục vụ các yêu cầu nhanh hơn các thời gian chạy khác mà còn có nghĩa là tốc độ cài đặt gói, chạy thử nghiệm, đóng gói và dịch mã nhanh hơn.

Benchmarking Bun

Trang chủ của Bun báo cáo hiệu suất được cải thiện gấp 3 và 4 lần khi so sánh với Deno và Node. Đó là những con số ấn tượng thực sự: View benchmark View benchmark Điều này quá ấn tượng khiến mình muốn tự kiểm tra nó.

Managing packages with Bun

Trong thử nghiệm đầu tiên này, chúng ta sẽ so sánh hiệu suất của Bun JavaScript với npm khi tạo dự án mới. Như bạn có thể thấy bên dưới, npm mất 49 giây để tạo Ứng dụng React app

$ time npx create-react-app myapp
Creating a new React app in /code/myapp.
Installing packages. This might take a couple of minutes.Installing react, react-dom, and react-scripts with cra-template...
added 1392 packages in 38s​16.50s user 6.33s system 46% cpu 49.016 total

Bun gửi lệnh bun create có khả năng thực hiện tương tự:

$ time bun create react myapp
[package.json] Detected React - added "react-refresh"

bun install v0.1.4
🔍 Resolving [1/4]
[29.00ms] git
+ react-refresh@0.10.0
+ typescript@4.7.4
+ react@18.2.0
+ react-dom@18.2.0
+ web-vitals@2.1.4

8 packages installed [2.39s]

2.48s user 0.30s system 66% cpu 4.160 total

Bun chỉ mất chưa đầy một giây để hoàn tất quá trình thiết lập. Đó là một sự cải tiến khá lớn. Nhưng đây có phải là một so sánh hợp lệ? Khi kiểm tra kỹ hơn, tôi thấy rằng:

  • npm đã cài đặt 1.392 gói và kích thước node_modules là 250 MB.
  • Bun chỉ cài đặt 8 gói, với tổng dung lượng là 72 MB. Mẫu React ban đầu của Bun thực sự ít hơn nhiều, đó là lý do tại sao nó chỉ mất thời gian rất ít so với npm để khởi tạo. Thật ngạc nhiên là nó vẫn có thể sử dụng để develop. Tôi có thể chạy lệnh bun dev để start dự án ngay lập tức. Bun cũng sẽ tự động reload sau mỗi lần change code. Tuy nhiên, React khởi đầu của Bun không thể tạo bản dựng sản xuất. Để làm được điều đó, chúng ta sẽ cần thêm react-scripts với:
$ bun add react-scripts -d

Phần phụ thuộc mới cài đặt thêm 1.133 gói, đưa node_modules lên tổng cộng 298 MB. Bây giờ chúng ta đang ở vị trí tốt hơn để so sánh. Sau khi tạo ứng dụng mới 10 lần với mỗi công cụ, chúng ta có một số con số để so sánh.

Package Manager Create React App (10 runs)
npm 17.937 ± 28.813
Bun 3.210 ± 5.430

Tất cả các thử nghiệm đều được thực hiện với npm và bun cache, điều này giải thích tại sao npm hoạt động tốt hơn nhiều trong lần thứ hai. Trong thử nghiệm này, Bun JavaScript trông khá tốt: nó nhanh hơn npm ít nhất 6 lần. Tuy nhiên, thỉnh thoảng Bun sẽ bị lock. Ngoài ra, đôi khi npm sẽ chậm lại đáng kể. Tôi không thể xác định nguyên nhân cho việc này.

Còn một số các thử nghiệm benmark khác như:

  • Bun vs. npm as a script runner.
  • Bun vs. npm for CI/CD workflows.
  • Bun vs. Node vs. Deno for copying large files.
  • Bun vs. Node vs. Deno for serving HTTP requests.

Bạn có thể tham khảo thêm tại đây

Rồi bla...bla... thế là đủ rồi. Cùng triển thôi nào:

Rất tiếc là hiện tại Bun chỉ hỗ trợ macOS và Linux. Phiên bản window vẫn còn trong quá trình chưa phát triển, nếu bạn nào dùng window có thể sử dụng wsl để thay thế nhé:

curl -fsSL https://bun.sh/install | bash 
# to install a specific version
curl -fsSL https://bun.sh/install | bash -s "bun-v1.0.0"

Hoặc với npm:

npm install -g bun

Upgrade với:

bun upgrade

Ta...ra...! Giờ thì tạo một file nho nhỏ để chạy thử nhé:

mkdir quickstart
cd quickstart
bun init
bun init helps you get started with a minimal project and tries to
guess sensible defaults. Press ^C anytime to quit.

package name (quickstart):
entry point (index.ts):

Done! A package.json file was saved in the current directory.
 + index.ts
 + .gitignore
 + tsconfig.json (for editor auto-complete)
 + README.md

To get started, run:
  bun run index.ts

Hãy mở file index.ts vừa init và thêm một đoạn code đơn giản sau:

const server = Bun.serve({
  port: 3000,
  fetch(req) {
    return new Response("Bun!");
  },
});

console.log(`Listening on http://localhost:${server.port} ...`);

Trên terminal run:

bun index.ts

Và Bùm! Nhanh như tàu điện ta đã có 1 server được khởi tạo ở http://localhost:3000

Kết luận

  • Bun không chỉ nhanh mà còn có cảm giác nhanh. Cảm giác như bạn có thể làm bất cứ điều gì trong chưa đầy một giây.
  • Bun sẽ thay thế Node? Còn quá sớm để nói. Khi Deno xuất hiện, nó chắc chắn không giết chết Node - nhưng tôi không nghĩ đó là mục đích, vì nó chưa bao giờ có mục đích thay thế Node. Nhưng Bun JavaScript hướng đến sự tương thích nên có cơ hội tốt hơn. Và như chúng ta đã thấy, ngay cả ở giai đoạn đầu này, nó vẫn có thể là một công cụ rất mạnh mẽ.
  • Tóm cái váy lại là còn quá sớm để nhận định về việc Bun có thể thay thế node hay không, nhưng sự ra mắt của phiên v1.0.0 là một thành công rực rỡ của team phát triển và cộng đồng Bun. Bun quả thực là một công cụ khá triển vọng để trải nghiệm.

Nguồn tham khảo


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí