Skip to main content

[JavaScript] Bun là gì ? Tại sao nên dùng Bun cho dự án JavaScript của bạn?

Giới thiệu về Bun

Bun là gì?

Bun là công cụ giúp bạn Phát triển, thử nghiệm, chạy và đóng gói các dự án JavaScript & TypeScript, cũng như quản lý các package như Node.js nhưng với hiệu suất cao hơn

Image
Bun là gì?

Lịch sử của Bun

Trước những thiếu sót của Node.js, nhà sáng lập Zig và tổ chức JavaScriptCore đã xây dựng nên Bun vào năm 2022 và nó đã nhanh chóng trở thành toolkit được yêu thích bới các lập trình viên trong các ứng dụng JavaScript.

Image
Node vs Bun

Ưu điểm của Bun

1 - Tích hợp tất cả trong Bun

Bun sẽ  tích hợp các package cần thiết, thay vì cài đặt quá nhiều các gói package hỗ trợ trong Node.js nay bạn chỉ cần sử dụng Bun là đủ. 

Ví dụ: để đọc file .env thì node.js cần cài đặt thêm dotenv, cross-env nay đã tích hợp vào bun

Image
Bun sẽ tích hợp các package mà node.js thiếu

Bun sẽ hỗ trợ Transpilers với các định dạng khác nhau như: .js, .ts, .cjs, .mjs, .jsx, .tsx. Từ đó bạn không cần phải cài đặt các package như tsc, babel, ts-node ...

Hỗ trợ Bundlers mạnh mẽ thay cho các package esbuild, webpack, parcel ... giúp trình đóng gói ứng dụng JavaScript nhanh hơn

Bun là có đính kèm trình quản lý gói tương thích với npm với các lệnh quen thuộc. Nó có thể đọc package.json của ứng dụng và ghi vào node_modules, giống như các trình quản lý gói khác, vì vậy bạn có thể thay thế: npm, yarn, lerna, pnpm

Bun còn là một trình chạy thử nghiệm tương thích với Jest với sự hỗ trợ cho snapshot testing, mocking và code coverage, do đó bạn không còn cần: jest, ts-jest, vitest 

2 - Cải thiện hiệu suất trong JavaScript runtime

Khả năng tương thích bun với các dự án đang sử dụng Node.js là gần như hoàn thiện. Bun cũng thừa nhận là không thể tương thích hoàn toàn nhưng hầu hết là vẫn tương thích với các Node APIs như module fs, path, net ...

Bạn có thể check khả năng tương thích Node.js ở đây

Tốc độ là một thứ cần thiết cho mọi dự án, Bun giúp cải thiện tốc độ nhanh hơn 4 lần so với dự án Node.js thông thường

Image
Bun có tộc độ nhanh gấp 4 lần

Để có tốc độ nhanh, bun đã sử dụng Webkit của Apple thay cho V8 engine của Google

Bun đã hỗ trợ một trình biên dịch runtime, cho nên bạn có thể chạy các file ts, tsx và jsx ngay lập tức mà không cần hỗ trợ từ module nào

bun index.ts
bun index.jsx
bun index.tsx

Tương thích với ESM & CommonJS module được Bun hỗ trợ mà không cần lo lăng về phần mở rộng của file .js hay .css, m.js... trong package.json. Thậm chí bạn có thể import và require cùng một file

import lodash from "lodash";
const _ = require("underscore");

Bun cũng tích hợp hỗ trợ Web APIs như fetch, Request, Response, WebSocket, ReadableStream... Do đó bạn không cần node-fetch và ws như trong Node.js

const response = await fetch("https://example.com/");
const text = await response.text();

Bun hỗ trợ Hot Reloading giúp lập trình viên nhanh chóng hơn trong thời gian phát triển ứng dụng, khi chỉ cần thêm option --hot

bun --hot server.ts

Không giống như nodemon, Bun có thể tải lại code mới của bạn mà không cần chấm dứt process cũ, nghĩa là kết nối HTTP và WebSocket không bị ngắt.

Xem thêm các ưu điểm khác của Bun

So sánh Bun vs Deno vs Node

Bun vs 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

Bun vs Node

Feature Bun Node
npm compatibility Yes Yes
Node compatibility Yes (beta) 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
Languages Zig, C++ C, C++
License MIT, LGPL2 MIT, BSD

So sánh thêm và xoá packages giữa Bun vs NPM

Tool Add Webpack (10 runs) Remove We pack (10 runs)
npm 1900 ms 4200 ms
Bun 100 ms 200 ms
Image
So sánh thêm và xoá packages giữa Bun vs NPM

 

So sánh run test giữa Bun vs NPM

Command Mean elapsed time (50 runs)
npm run test 1.208 ± 0.011
bun run test 1.046 ± 0.030
Image
So sánh run test giữa Bun vs NPM

Copy lượng lớn file Bun vs Deno vs Node

Tool Mean [s] (20 runs) Min [s] Max [s] Relative
Bun 1.222 ± 0.158 1.027 1.556 1.00
Deno 1.276 ± 0.132 1.102 1.614 1.04 ± 0.17
cp 1.802 ± 0.714 0.451 3.304 1.47 ± 0.61
Node 4.003 ± 0.145 3.860 4.590 3.27 ± 0.44
Image
Copy lượng lớn file Bun vs Deno vs Node

So sánh HTTP server giữa Bun vs Deno vs Node

Runtime RPS Total time (2M requests)
Bun 70966 28.18 seconds
Deno 40404 49.50 seconds
Node 33814 59.14 seconds
Image
So sánh HTTP server giữa Bun vs Deno vs Node

Tốc độ triển khai CI/CD với Bun vs npm

Runtime Average pipeline run (33 runs)
npm 3 minutes 46 seconds
Bun 3 minutes
Image
Tốc độ triển khai CI/CD với Bun vs npm

So sánh ở trên có thể thấy Bun thực sự rất nhanh, nhưng mà Bun thay thế cho Node.js hay Deno là điều không chắc. Vì Deno cũng đã cố gắng làm điều đó nhưng đến nay Node.js vẫn tồn tại

Nhược điểm của Bun

Vì Bun mới nên document hiện tại rất ít sẽ gây khó khăn cho các lập trình viên

Hiện tại đã hỗ trợ trên win nhưng vẫn chưa ổn định như trên macos hay linux

Bun vẫn chưa tương thích 100% với Node, do đó không phải tất cả các dự án Node.js nào cũng chuyển qua dùng Bun được