- Bun 1.2 adalah rilis besar yang menargetkan alat pengembangan JavaScript/TypeScript full-stack, dengan memperluas kompatibilitas Node.js bersama runtime, bundler, pengujian, dan package manager
- Validasi kompatibilitas diperkuat dengan menjalankan test suite Node.js pada setiap perubahan, dan dukungan untuk
node:http2,node:dgram,node:cluster,node:zlib, sertanode:v8ditambahkan - API bawaan baru
Bun.s3danBun.sqlmembawa akses ke object storage yang kompatibel dengan S3 dan Postgres ke dalam runtime, sehingga mengurangi ketergantungan pada klien eksternal - Package manager mengganti lockfile default dari biner
bun.lockbkebun.lockberbasis JSONC, serta menambahkan.npmrc,bun publish,bun patch,bun outdated, danbun run --filter - Direktori kerja
bun run, penanganan kegagalanBun.build(), nilai kembalianserver.stop(),bun -p, dan nilai default sourcemap berubah, sehingga proyek yang sudah ada perlu memeriksa dampak migrasi
Penguatan kompatibilitas Node.js
- Bun 1.2 mengubah proses peningkatan kompatibilitas dengan menjalankan test suite Node.js pada setiap perubahan Bun
- Sebelumnya bug diperbaiki terutama berdasarkan issue GitHub atau laporan kegagalan menjalankan paket npm, tetapi pendekatan ini mirip “whack-a-mole” yang menyulitkan refactoring besar
- Ribuan file pengujian dari repositori Node.js telah di-porting ke Bun, dan pengujian ini dijalankan pada setiap commit untuk memeriksa kompatibilitas
- Karena pengujian Node.js kadang memverifikasi detail implementasi internal dan pesan error yang persis, Bun pada sebagian pengujian mengganti binding internal dengan stub buatannya sendiri atau menyesuaikan verifikasi agar berfokus pada
namedancode- Bun sebisa mungkin mencocokkan pesan error Node.js, tetapi jika
namedancodesama, terkadang Bun memberikan pesan yang lebih membantu
- Bun sebisa mungkin mencocokkan pesan error Node.js, tetapi jika
- Modul dan fitur Node.js yang baru didukung
node:http2: mendukung pembuatan server HTTP/2, juga dibutuhkan untuk server gRPCnode:dgram: mendukung bind/connect socket UDPnode:cluster: memungkinkan menjalankan beberapa instance Bun untuk mendistribusikan pekerjaan ke beberapa core CPUnode:zlib: implementasi JavaScript ditulis ulang dalam kode native dan menjadi 2 kali lebih cepat dibanding Bun 1.1node:v8: memungkinkan heap Bun diperiksa di Chrome DevTools dengangetHeapSnapshotdanwriteHeapSnapshot
- Server
node:http2di Bun 1.2 2 kali lebih cepat daripada Node.js - Berkat peningkatan kompatibilitas
node:httpdan optimisasi server HTTP Bun,expressmenangani request HTTP hingga 3 kali lebih cepat daripada Node.js - Dukungan untuk addon C++ yang menggunakan V8 C++ API juga ditambahkan
- Node.js menggunakan V8, sedangkan Bun menggunakan JavaScriptCore, sehingga implementasinya sangat sulit
- Bun mengimplementasikan C++ API publik V8 di atas JavaScriptCore agar paket seperti
cpu-featuresdapat berjalan - Dukungan V8 C++ API itu kompleks, sehingga sebagian besar paket mungkin masih memiliki fitur yang belum tersedia, dan dukungan untuk paket seperti
node-canvas@v2dannode-sqlite3terus ditingkatkan
API S3 bawaan Bun.s3
- Bun 1.2 menambahkan API bawaan
Bun.s3untuk menangani object storage yang kompatibel dengan S3- Dapat digunakan dengan layanan yang mengimplementasikan API S3 seperti Amazon S3, Google Cloud Storage, dan Cloudflare R2
- Membaca, menulis, dan menghapus file ditangani dengan API yang kompatibel dengan standar Web
Blob
s3.file()mengembalikan referensi lazy ke file S3 dan dapat digunakan dengan cara yang sama seperti APIFileBun, sepertitext(),json(),arrayBuffer(), danstream()- Klien S3 Bun ditulis dalam kode native, bukan JavaScript
- Dibandingkan penggunaan
@aws-sdk/client-s3di Node.js, pengunduhan file dari bucket S3 5 kali lebih cepat
- Dibandingkan penggunaan
- Fitur penulisan menyediakan
write()danwriter()write()dapat mengunggah string,Uint8Array,Blob,Response, dan lainnyawriter()melakukan upload multipart untuk file besar
presign()membuat presigned URL yang mengizinkan upload file tertentu- Pengguna dapat mengunggah langsung ke S3 tanpa mengekspos kredensial kepada pengguna atau memberikan hak akses yang tidak perlu ke bucket
- Saat digunakan bersama
Bun.serve(),new Response(s3.file(...))mengalihkan ke presigned URL alih-alih server mengunduh file S3 lalu mengirimkannya kembali- Ini mengurangi biaya memori, waktu, dan bandwidth server untuk mengunduh file
- URL
s3://juga dapat digunakan denganBun.file()danfetch()- Upload, download, dan penghapusan dimungkinkan dengan
fetch("s3://...") S3Clientdefault dikonfigurasi melalui variabel lingkungan sepertiAWS_ACCESS_KEY_IDdanAWS_SECRET_ACCESS_KEY
- Upload, download, dan penghapusan dimungkinkan dengan
Klien Postgres bawaan Bun.sql
- Bun 1.2 menambahkan klien SQL bawaan
Bun.sqlyang mendukung Postgres- Bun sebelumnya sudah menyediakan klien SQLite bawaan, dan dalam rilis ini memperluas cakupan dukungan database SQL
- Ada juga pull request untuk menambahkan dukungan MySQL
Bun.sqlmenjalankan SQL dengan tagged-template literal- Nilai JavaScript dapat diteruskan sebagai parameter SQL
- String escaping dan prepared statement digunakan secara otomatis untuk mencegah SQL injection
- Hasil dikembalikan sebagai array objek dengan nama kolom sebagai key
- Menggunakan implementasi kode native dan berbagai optimisasi
- Prepared statement otomatis
- Pipelining kueri
- Protokol wire biner
- Connection pooling
- Caching struktur
- Pembacaan baris hingga 50% lebih cepat dibandingkan penggunaan klien Postgres populer di Node.js
- API ini terinspirasi dari
postgres.js, dan dirancang agar mudah memindahkan kode yang sudah ada ke klien SQL bawaan Bun
Perubahan package manager
- Bun 1.2 mengubah lockfile default dari biner
bun.lockbmenjadi berbasis teksbun.lockbun.lockbmembantu membuatbun installhampir 30 kali lebih cepat daripadanpm, tetapi isinya sulit dilihat di GitHub serta menyulitkan review pull request dan penyelesaian merge conflict- Tool seperti Dependabot juga mengalami kesulitan membaca lockfile tersebut
bun.lockadalah file JSONC- Mendukung komentar dan trailing comma
- Diff pull request jadi lebih mudah diperiksa, dan trailing comma mengurangi kemungkinan merge conflict
- Proyek baru akan membuat
bun.lock- Proyek yang sudah memakai
bun.lockbtetap mendukung lockfile biner tanpa migrasi otomatis bun.lockbakan didukung dalam jangka panjang, danbun addsertabun updatejuga akan terus memperbaruinya- Migrasi ke lockfile teks baru bisa dilakukan dengan
bun install --save-text-lockfile
- Proyek yang sudah memakai
bun installtetap menjadi 30% lebih cepat daripada Bun 1.1 meski sudah beralih ke lockfile teks- Komentar dan trailing comma dapat digunakan di
package.jsonrequire()danimport()juga dapat membacapackage.jsonseperti ini- Karena fitur ini belum didukung luas di seluruh ekosistem JavaScript, disarankan untuk menggunakannya “at your own risk”
- Dukungan
.npmrcditambahkan- Membaca
.npmrcdi root proyek dan direktori home - Dapat digunakan untuk pengaturan autentikasi registry, scoped package, dan private registry
- Membaca
- Perintah dan opsi package manager baru
bun run --filter: menjalankan skrip yang sama secara bersamaan di beberapa workspacebun outdated: memeriksa dependency yang sudah usangbun publish: penggantinpm publish, mendukung autentikasi.npmrc, tarball packing, OTP, dan penanganan edge casepackage.jsonbun patch: menyimpan perubahan pada dependency sebagai file.patchdipatches/dan menerapkannya otomatis saatbun install--omit=dev|optional|peer: mengecualikan dependency dev, optional, dan peer dari instalasi- Sertifikat CA dapat dikonfigurasi melalui
bunfig.toml, flag CLI, dan.npmrc - Juga mendukung
bundleDependenciesdan mempertahankan indentasipackage.jsonsaatbun add
Peningkatan test runner
bun testmendukung reporter JUnit XML- Dengan
bun test --reporter=junit --reporter-outfile=junit.xml, hasil pengujian dapat dikirim ke tool CI/CD seperti Jenkins, CircleCI, dan GitLab CI - Pelaporan JUnit juga dapat dikonfigurasi di
bunfig.toml
- Dengan
- Reporter LCOV ditambahkan untuk code coverage
bun test --coverage --coverage-reporter=lcovmenghasilkancoverage/lcov.info- Direktori output dapat diubah dengan
--coverage-dir
- Mendukung inline snapshot melalui
expect().toMatchInlineSnapshot()- Snapshot di dalam file test diperbarui dengan
bun test -uatau--update-snapshots toThrowErrorMatchingSnapshot()dantoThrowErrorMatchingInlineSnapshot()juga dapat digunakan
- Snapshot di dalam file test diperbarui dengan
test.only()kini bekerja meski tanpa flag--only- API
expect()menambahkan matcher seperti Jest, Vitest, danjest-extended- Kelompok
toContainValue(),toContainKey(),toHaveReturned() - Pesan error kustom dapat diberikan sebagai argumen kedua
- Kelompok
- Timeout test default untuk scope atau module saat ini dapat diubah dengan
jest.setTimeout()dansetDefaultTimeout()
Fitur bundler dan build
- Bun 1.2 mendukung HTML import
- Jika file HTML diberikan ke opsi
staticpadaBun.serve,<script>dan<link>di dalam HTML otomatis dibundel dan diekspos sebagai route statis
- Jika file HTML diberikan ke opsi
bun build --compilemendukung cross-compilation- Binary Windows atau macOS dapat dibuat dari Linux, dan sebaliknya juga memungkinkan
- Pada build Windows, opsi pengaturan ikon dan menyembunyikan jendela console dapat digunakan
bun build --bytecodemembuat bytecode cache- Dapat membuat waktu start aplikasi seperti
eslint2 kali lebih cepat - File
.jscberisi bytecode cache untuk file.jsterkait, dan kedua file diperlukan untuk eksekusi - Bytecode cache bisa 8 kali lebih besar daripada source code, sehingga memakai lebih banyak ruang disk sebagai gantinya peningkatan waktu start
- Dapat membuat waktu start aplikasi seperti
- Format output CommonJS dapat ditentukan dengan
bun build --format=cjs- Sebelumnya hanya ESM yang didukung
- Ini memudahkan pembuatan library atau aplikasi yang menargetkan versi Node.js lama
- Deteksi CommonJS ditingkatkan
- Ketika file ambigu, direktif
"use strict"di bagian atas digunakan sebagai heuristik terakhir untuk CommonJS require.main === moduleditulis ulang menjadiimport.meta.mainsehingga dapat digunakan bersama statement import
- Ketika file ambigu, direktif
- Hook
onBeforeParse()ditambahkan ke API plugin- Harus diimplementasikan sebagai N-API addon, bukan JavaScript
- Dapat menangani source code tepat sebelum parsing dengan overhead nyaris nol dari bahasa terkompilasi seperti Rust, C/C++, dan Zig
- Ini adalah API lanjutan untuk pembuat plugin dan framework
- Opsi build juga diperluas
- Menyuntikkan environment variable ke bundle dengan
--env="PUBLIC_*" - Menghapus pemanggilan fungsi dengan cara seperti
--drop=console - Menambahkan banner/footer
- Melihat daftar file yang disertakan dalam standalone executable dengan
Bun.embeddedFiles() - Mengabaikan anotasi dead-code elimination yang keliru dengan
--ignore-dce-annotations - Mengatur dependency paket agar tidak dimasukkan ke bundle dengan
--packages=external
- Menyuntikkan environment variable ke bundle dengan
Bundling CSS
- Bun 1.2 mengimplementasikan CSS parser dan bundler baru
- Diturunkan dari pekerjaan LightningCSS, ditulis ulang dari Rust ke Zig, lalu diintegrasikan dengan parser, bundler, dan runtime JavaScript/TypeScript Bun
- Dengan
bun build ./index.css, beberapa file CSS serta referensi@import,url, dan@font-facedapat digabungkan menjadi satu file CSS - File
.cssdapat diimpor dari kode JavaScript dan TypeScript- CSS yang diimpor dari JavaScript module graph dan aturan
@importdiratakan menjadi satu file CSS per entrypoint
- CSS yang diimpor dari JavaScript module graph dan aturan
- CSS dan JavaScript juga dapat dibundel melalui API yang sama menggunakan
Bun.build()
Penambahan API runtime Bun
Bun.serve()mendukung route statis melalui propertistatic- Jalur diberikan sebagai key, dan objek
Responsesebagai value - Route statis hingga 40% lebih cepat dibanding menanganinya langsung di handler
fetch() - Response body, header, dan status code di-cache di memori sehingga tidak ada JavaScript allocation maupun garbage collection
- Route statis dapat dimuat ulang dengan
server.reload()
- Jalur diberikan sebagai key, dan objek
Bun.udpSocket()menyediakan socket UDP dalam bentuk Bun APInode:dgramjuga didukung, tetapiBun.udpSocket()adalah API modern yang mirip denganBun.listen()yang sudah ada- Dapat mengirim beberapa UDP datagram dengan satu syscall dan merespons OS backpressure
Bun.file()mendukungdelete(),unlink(),stat()stat()mengembalikan metadata dalam bentuk yang sama seperti objekStatsdari Node.jsfs.stat()- API yang sama juga dapat digunakan untuk file S3
Bun.color()menyediakan parsing, normalisasi, dan konversi warna- Mendukung CSS, ANSI color code, RGB, HSL, dan lainnya
dns.prefetch()dapat mengambil DNS record lebih dulu untuk menghangatkan DNS cache saat startup- Status DNS cache dapat diperiksa dengan
dns.getCacheStats()
- Status DNS cache dapat diperiksa dengan
- Utilitas lainnya
Bun.inspect.table(): mengembalikan string berbentuk tabel seperticonsole.tableBun.randomUUIDv7(): menghasilkan monotonic UUID v7 yang cocok untuk pengurutan dan database
Peningkatan klien SQLite
- Klien SQLite bawaan Bun dapat memetakan hasil query ke instance class dengan
query.as(Class)- Getter, setter, dan method dapat ditambahkan
- Demi performa, class constructor, default initializer, dan private field tidak didukung
- Bukan ORM karena tidak mengelola relasi atau menghasilkan SQL
query.iterate()memproses baris sebagai iterator tanpa memuat semuanya sekaligus ke memori- Objek query itu sendiri juga dapat diiterasi dengan loop
for
- Objek query itu sendiri juga dapat diiterasi dengan loop
- Jika opsi
strictdiaktifkan, prefix$,@,:pada parameter query dapat dihilangkan- Jika ada parameter yang hilang, error akan dilempar
- Dari hasil
db.run(), jumlah baris yang berubah dan row ID terakhir yang disisipkan dapat diperiksachangeslastInsertRowid
- Opsi
safeIntegersmengembalikan integer 64-bit sebagaiBigInt, bukannumberyang terpotong- Dapat diatur per database atau per query
- Dengan sintaks JavaScript
using, statement dan database dapat otomatis di-close saat keluar dari scope
Mengompilasi dan menjalankan C dari JavaScript
- Bun 1.2 menambahkan dukungan eksperimental untuk mengompilasi dan menjalankan C dari JavaScript
- Menggunakan API
cc()daribun:ffi - Ini adalah cara untuk menggunakan C system library dari JavaScript tanpa build step terpisah
- Menggunakan API
- Bun menyertakan
tinyccbawaan- Berbeda dari
gccatauclang, kode C sederhana dapat dikompilasi dalam hitungan milidetik - Kode C dapat dikompilasi dan dijalankan saat dibutuhkan
- Berbeda dari
- Kode C yang menggunakan N-API juga disediakan
- Dapat berjalan hanya dengan Bun, tanpa tahap build
node-gyp
- Dapat berjalan hanya dengan Bun, tanpa tahap build
Dukungan musl dan Alpine Linux
- Bun 1.2 menambahkan build Bun untuk distribusi Linux yang menggunakan musl libc alih-alih glibc
- Dapat digunakan di lingkungan seperti Alpine Linux
- Mendukung Linux x64 dan aarch64
- Di Docker, image
oven/bun:alpinedapat digunakan - musl memungkinkan image container yang lebih kecil, tetapi cenderung sedikit lebih lambat dibanding versi glibc Bun
- Jika tidak ada alasan khusus, penggunaan glibc direkomendasikan
Fitur bahasa JavaScript
- Dukungan import attributes ditambahkan
- Dapat mengimpor JSON, text, TOML, dan lainnya secara eksplisit seperti
import json from "./package.json" with { type: "json" } - Juga dapat digunakan pada
import()dinamis
- Dapat mengimpor JSON, text, TOML, dan lainnya secara eksplisit seperti
usingdanawait usingdidukung- Saat keluar dari scope,
[Symbol.dispose]atau[Symbol.asyncDispose]dipanggil untuk membersihkan resource secara otomatis - Didukung di berbagai Bun API seperti
Bun.spawn(),Bun.serve(),Bun.connect(),Bun.listen(),bun:sqlite, dan lainnya
- Saat keluar dari scope,
- API baru terkait Promise
Promise.withResolvers(): membuatpromise,resolve, danrejectsekaligusPromise.try(): membungkus fungsi sinkron atau asinkron menjadi promise
- API error dan array byte
Error.isError(): memeriksa apakah sesuatu adalah Error dengan lebih akurat, bahkan dalam situasi manipulasi prototype chain atau cross-realmnode:vmUint8Array.toBase64()/Uint8Array.fromBase64()Uint8Array.toHex()/Uint8Array.fromHex()
- Iterator helper ditambahkan
map,flatMap,filter,take,drop,reduce,toArray,forEach,find
Float16Arraydidukung- Array floating-point 16-bit memiliki presisi lebih rendah daripada 32-bit, tetapi lebih efisien dalam penggunaan memori
Penambahan Web API
TextDecoderStreamdanTextEncoderStreamdidukung- Ini adalah versi streaming dari
TextDecoderdanTextEncoder - Di Bun,
TextEncoderStreamhingga 30 kali lebih cepat daripada Node.js
- Ini adalah versi streaming dari
- Opsi
streampadaTextDecoderdidukung- Dapat diproses sebagai bagian dari stream yang lebih besar meskipun chunk bukan UTF-8 code point yang lengkap
- Method
bytes()ditambahkan- Mengembalikan data stream sebagai
Uint8ArraydariResponse,Blob,Bun.file(), dan lainnya - Mengurangi proses yang sebelumnya perlu memanggil
arrayBuffer()lalu membuatUint8Array
- Mengembalikan data stream sebagai
- Mendukung upload
fetch()streaming- Berguna untuk mengunggah file besar atau stream data yang content length-nya tidak diketahui di awal
console.group()danconsole.groupEnd()diimplementasikanURL.createObjectURL()didukung- Dapat membuat URL dari
Blobdan menggunakannya difetch(),Worker,import() - Script Worker juga melewati Bun transpiler, sehingga sintaks TypeScript dapat digunakan
- Dapat membuat URL dari
AbortSignal.any()menggabungkan beberapaAbortSignalsehingga ketika salah satunya di-abort, parent signal juga ikut di-abort
Perubahan perilaku dan hal yang perlu diperhatikan saat migrasi
- Direktori kerja
bun runberubah- Sebelumnya menggunakan direktori kerja saat ini dari shell
- Di Bun 1.2, direktori induk
package.jsondigunakan sebagai direktori kerja skrip - Perubahan ini untuk menyelaraskan perilakunya dengan
npmdanyarn
bun testmelaporkan uncaught error atau rejection di antara pengujian sebagai kegagalan- Sebelumnya, error seperti ini mungkin tidak diperlakukan sebagai kegagalan pengujian
server.stop()kini mengembalikanPromise<void>- Dapat menunggu hingga koneksi HTTP yang masih in-flight ditutup
Bun.build()kini melakukan reject saat gagal, alih-alih memasukkan error kelogspada hasil yang di-resolve- Jika membutuhkan perilaku lama, Anda dapat mengatur
throw: false
- Jika membutuhkan perilaku lama, Anda dapat mengatur
bun -pkini menjadi alias untukbun --print, selaras dengan Node.js- Sebelumnya merupakan alias untuk
bun --port
- Sebelumnya merupakan alias untuk
- Nilai default
bun build --sourcemapberubah dari inline source map menjadi linked source map- Jika membutuhkan perilaku lama, gunakan
--sourcemap=inline
- Jika membutuhkan perilaku lama, gunakan
Peningkatan performa
- Bun 1.2 mencakup peningkatan performa di berbagai jalur eksekusi
node:http2: 2 kali lebih cepat- Unggah S3 melalui
node:http: 5 kali lebih cepat path.resolve(): 30 kali lebih cepat- Resolusi DNS
fetch(): 2 kali lebih cepat bun --hot: penggunaan memori berkurang 2 kalifs.readdirSync()di macOS: membaca direktori kecil 5% lebih cepatString.at(): 44% lebih cepatatob()dengan input string besar: hingga 8 kali lebih cepat- Dekompresi data gzip
fetch(): 30% lebih cepat Buffer.from(string, "base64")dengan input besar: 6 hingga 30 kali lebih cepatJSON.parse()dengan input string besar: 2 hingga 4 kali lebih cepat, input object 6% lebih cepat- Throughput beberapa aplikasi
Bun.serve(): meningkat hingga 2 kali Error.captureStackTrace(): 9 kali lebih cepatfs.readFile()untuk file kecil: hingga 10% lebih cepatconsole.log()dengan argumen string: 50% lebih cepat
- Di Windows, JIT JavaScriptCore diaktifkan
- Sebelumnya JIT hanya tersedia di macOS dan Linux
- JavaScript secara umum berjalan lebih cepat di Windows
- Sebagai contoh,
Object.entries()lebih cepat 20%, danArray.map()lebih cepat 50%
Instalasi dan peningkatan versi
- Perintah instalasi baru
curl -fsSL https://bun.sh/install | bashpowershell -c "irm bun.sh/install.ps1 | iex"npm install -g bun- Setelah
brew tap oven-sh/bun, jalankanbrew install bun docker pull oven/bun
- Bun yang sudah terinstal dapat ditingkatkan dengan
bun upgrade
1 komentar
Pendapat di Hacker News
Saya tidak paham kenapa database pihak ketiga dan library S3 eksternal dimasukkan ke core/library standar
Rasanya hal seperti ini lebih cocok sebagai library opsional, dan runtime seperti ini harus sangat hati-hati memilih apa saja yang dimasukkan ke library standar
Dari sekarang sudah terasa seperti proyek yang memasukkan segala hal, seperti kitchen sink
Pendekatan batteries included populer di banyak tempat dan sering menjadi pilihan
Konfigurasi TypeScript juga sulit, begitu pula Webpack, S3, Postgres, Jest, dan lainnya, jadi akses file dan stream yang disederhanakan juga cukup menarik
Tinggal kita lihat bagaimana penyedia deployment terdistribusi akan muncul
Tentu bisa saja saya salah, tetapi memasukkan dependensi seperti ini ke core/library standar memang tidak terlalu masuk akal
Sepertinya ia berpikir jika dimasukkan ke core, semuanya bisa dioptimalkan lebih baik daripada library pihak ketiga
Secara pribadi saya pikir ini pendekatan yang keliru dan Jared tampak terlalu ambisius, tetapi pada akhirnya ini memang passion project-nya
Menurut ungkapan pihak Bun, “Bun bertujuan menjadi runtime JavaScript cloud-first. Artinya, Bun mendukung semua tool dan layanan yang diperlukan untuk menjalankan aplikasi produksi di cloud,” tetapi pernyataan itu tidak terlalu meyakinkan
Pilihan desain khusus ini terlihat bahkan lebih buruk daripada Node
Masalah software yang didukung VC selalu ada pada fitur-fitur integrasi seperti ini yang berusaha menawarkan sesuatu yang proprietary; dengan kata lain, menciptakan ketergantungan
Sejauh ini pengalaman memakai Bun sangat baik
Saat menyiapkan TypeScript/Jest/React/Webpack di proyek baru, saya selalu enggan karena banyak breaking change di sana-sini, tetapi di Bun semuanya ditangani sendiri dan untuk kebutuhan saya langsung berjalan tanpa rasa sakit
Sulit berkomentar soal integrasi library pihak ketiga seperti S3 dan SQL, tetapi setidaknya mereka tampaknya berfokus pada hal-hal yang paling umum digunakan dan paling banyak diminta
Saya senang karena Bun membawa kewarasan yang dibutuhkan oleh ekosistem tooling Node.js
Sepertinya Anda meremehkan betapa banyak tool lain juga sudah berkembang selama ini
Bagi saya, ia seperti cheat code produktivitas
Memang ada sedikit kehilangan produktivitas karena ChatGPT belum terlalu memahami Bun, tetapi saya tetap suka Bun
Banyak hal bagus di sini, tetapi saya khawatir sebagian perilaku default-nya terlalu mengarah ke perilaku tersembunyi yang terasa seperti sihir
Jika memakai
new Response(s3.file(...)), alih-alih mengunduh file S3 ke server lalu mengirimkannya ke pengguna, Bun mengalihkan pengguna ke URL presigned untuk file S3 tersebutSebagai default, ini pilihan yang cukup mengejutkan, dan sama sekali tidak jelas bagaimana menonaktifkannya ketika kita tidak ingin mengekspos bucket S3 secara langsung
Awalnya saya menaruh harapan pada proyek ini, tetapi melihat keputusan desain yang sporadis dan, secara pribadi, sering kali kurang baik yang dipublikasikan di media sosial, saya tidak percaya pada arah jangka panjangnya
Kalau tetap di v0.x mungkin tidak masalah, tetapi setelah merilis 1.0, standar untuk memperluas permukaan API seharusnya jauh lebih tinggi
Response(file.stream())Secara pribadi, ini terasa seperti perilaku dengan efek samping yang kuat, dan saat dibaca tampak seperti mengembalikan isi file, bukan URL
Meski begitu, saya juga penasaran apa yang mengganggu dari eksposur bucket
Karena ini URL presigned, ia tidak memberikan hak akses yang luas
API yang eksplisit seperti
Response((file(...).getPresignedURL()))akan lebih baik, atau akan lebih baik jika ada opsi untuk mengaktifkan perilaku ini lewat environment variable atau konfigurasi BunBaterai termasuk membuat perbedaan besar
Itu juga alasan saya suka bahwa Web API seperti Fetch API, Service Workers, Web Components, ES6+, dan WebRTC kini menjadi native di kedua runtime V8 dan WebKit
Namun tetap harus ada batasnya
S3 mungkin sudah terlalu jauh, tetapi driver SQL masuk akal
Meski begitu, persoalannya adalah sejauh mana harus dimasukkan
Ada sangat banyak database, apakah harus memasukkan driver untuk separuhnya?
Pada level itu saja, kode tambahan bisa menjadi banyak dan membuat executable melambat
Selain itu, memasukkan API sensitif seperti ini ke Bun juga bisa membuat keamanan terlewat
Bayangkan jika karena suatu skrip atau masalah path,
evalberjalan lalu Bun mengunggah seluruh file sumber ke S3 pribadi; saat itu juga selesaiSaya pernah melihat bahwa tergantung cara kode dimuat saat runtime, dampaknya bisa nyaris diabaikan
Jika pemuatan kode hanya dipicu saat pernyataan
importterlihat, bukankah secara praktis tidak ada overhead kecepatan?Meski ditautkan secara statis, saya kurang paham mengapa sekadar keberadaan kode akan membuat executable melambat sampai tingkat yang patut diperhitungkan
Memang executable yang harus dimuat ke memori secara harfiah menjadi lebih besar, tetapi sepertinya bukan perlambatan yang terasa
Intinya adalah siapa yang bertanggung jawab memelihara library, dan bagaimana library itu diubah ketika SQLite berubah
Jika ada bug di SQLite, bagaimana Bun akan memperbaikinya?
Versi mana saja yang harus mendapat perbaikan?
Patch pada runtime bisa mengubah perilaku kode yang berjalan di atasnya, lalu bagaimana menangani pengguna yang sudah membuat workaround sesuai perilaku lama?
Sampai batas tertentu ini masalah yang bisa diselesaikan, tetapi ada juga kekurangannya
Pada titik tertentu, ia tidak lagi sekadar runtime, melainkan menjadi platform, dengan tanggung jawab dan masalah lain yang menyertainya
Ini memang bukan standar web sungguhan, tetapi banyak orang menyesuaikan diri dengannya seolah-olah itu standar de facto
Belakangan ini klien saya memakai Bun di produksi
Saya dengar pengalaman pengembangan dengan Bun luar biasa bagus karena kecepatan dan kesederhanaannya
Developer experience berperan besar dalam jangka panjang
Jika codebase atau proses berantakan, Anda akan kehilangan orang-orang bagus kecuali memberi kompensasi setara FAANG
Saya belum mencoba Bun, tetapi daftar fiturnya terlalu panjang sehingga saya skeptis apakah semuanya akan solid dan bebas bug
Semoga saya salah, dan saya berniat mencobanya di proyek nanti
Dari sudut pandang manajemen proyek, agak membingungkan mengapa mereka menghabiskan waktu untuk dukungan S3 padahal bahkan belum 100% kompatibel dengan Node.js
Next.js adalah ekosistem yang sangat besar, jadi jika bisa menarik pelanggan Next.js, pertumbuhannya bisa jauh lebih besar daripada dukungan S3
Dalam keseharian, seberapa banyak dari seluruh permukaan API Node.js yang benar-benar Anda gunakan?
Seberapa besar Anda benar-benar bergantung pada edge case aneh di dalamnya?
Orang-orang yang mengerjakannya juga bukan robot
Sebagian pekerjaan butuh waktu untuk dipahami, dan selama itu mereka bisa mengerjakan hal lain
Bukan satu orang yang mengerjakan semuanya
Katanya “kalau menarik pelanggan Next.js, akan lebih tumbuh”, tetapi tumbuh menuju apa?
Itu tidak menghasilkan uang
Ini proyek yang didukung VC, dan tujuannya bukan menyediakan Bun secara gratis lalu mendapatkan semua pengguna di seluruh dunia
Zig memiliki keamanan memori yang sangat rendah
Jika merujuk variabel yang sudah tidak hidup, alih-alih segmentation fault, ia mengakses memori acak yang tidak terkait
Katanya begitu bahkan dalam mode debug dan safe[0]
Apakah sesulit itu menambahkan sistem lifetime memori di atasnya yang menandai nama variabel sebagai mati dan mencegah akses jika sudah mati?
Ujung-ujungnya menjadi “jangan gunakan undefined behavior”[1]
Karena itu saya tidak ingin menaruh apa pun yang dibuat dengan Zig pada hal seperti web server yang terekspos internet
[0] : https://news.ycombinator.com/item?id=41720995
[1] : https://github.com/ziglang/zig/issues/16467#issuecomment-164...
Saya mencobanya tahun lalu dan terus mengalami crash
bun addyang tidak mempertahankan spasi dan indentasi dipackage.json, dan sekarang mempertahankan indentasi seaneh apa punSaya tidak tahu siapa yang meminta hal seperti ini, dan mengapa mereka menganggap ini layak ditulisi kode
Impor HTML luar biasa dan keren
Dengan dukungan impor HTML di Bun 1.2, katanya seluruh toolchain frontend bisa digantikan dengan satu pernyataan
importAnda bisa memulainya dengan meneruskan impor HTML ke opsi
staticpadaBun.serveApakah bisa melakukan hot module replacement, praproses CSS, dan memuat plugin khusus framework seperti compiler Vue SFC?
Menyajikan file statis bukan hal baru, jadi sepertinya ada sesuatu yang saya lewatkan
Saya dulu mengira tidak ada proyek yang nasibnya lebih pasti gagal selain alternatif pesaing Node.js, tetapi ternyata keputusan untuk mencobanya sangat tepat
Saya perlu membuat banyak skrip mandiri untuk menangani pembaruan file teks dan DB SQLite, dan bisa langsung memakai TypeScript,
bun:sqlite[1], sertabun $ Shell[2] tanpa file konfigurasi atau pengelolaan dependensi npm lokalSetelah itu saya juga mencobanya untuk proyek JS/TypeScript baru, dan bundler bawaan [3] serta dukungan testing [4] juga berguna, sementara pemasangan dependensi selesai seketika
Semuanya berjalan cepat dan langsung berfungsi benar-benar meningkatkan kualitas hidup, dan sekarang Bun menjadi pilihan pertama untuk proyek JS baru
[1] https://bun.sh/docs/runtime/shell
[2] https://bun.sh/docs/api/sqlite
[3] https://bun.sh/docs/bundler
[4] https://bun.sh/docs/cli/test
Dulu saya berpikir, “hal-hal seperti ini toh tahun depan juga akan ada di npm, jadi apa gunanya”
Pada akhirnya saya mencoba Bun dan benar-benar terkejut
Elemen-elemen kecil dalam pengalaman developer kalau terkumpul membuat perbedaan besar
Di proyek saya, Bun benar-benar terasa seperti generasi berikutnya
Belum lama ini saya mencoba Bun untuk pertama kalinya dan pengalamannya luar biasa
Semua proyek saya sudah menyiapkan Webpack atau Vite untuk memakai TypeScript, dan setelah dikonfigurasi memang hampir selalu berjalan sempurna, tetapi konfigurasinya sendiri merepotkan dan tidak sepadan untuk skrip kecil
Sebaliknya, Bun langsung berjalan
Saat mencoba menjalankan TS “secara langsung” dari CLI, saya mengutak-atik entah alat bernama
node-tsatau semacamnya selama 10–30 menit sambil menghadapi pesan mengerikan seperti “bukan modul”, “tidak bisa memakai import/require”, “ESM/CJS”, lalu mencoba semua perbaikan umum seperti mengubah tipe modul dipackage.json, mengubahtsconfig, dan mengubah caraimport/requireKetika mencoba menjalankan skrip sekitar 200 baris, sebagai upaya terakhir saya beralih ke Bun, dan hasilnya berjalan dengan sangat baik
node --experimental-strip-types index.tsKalau bukan Node terbaru, paket
tsxbekerja dengan baik bagi sayaLebih baik daripada
ts-nodeNamun kedua opsi itu sama-sama membuang informasi tipe begitu saja, dan Bun juga demikian
Saya suka arahnya
Terutama dukungan native untuk S3 dan Postgres terasa sangat masuk akal karena bisa menjadi alternatif bagi kondisi saat ini yang mengharuskan kita “merakit framework sendiri”
Di semua web framework seperti Rails dan Laravel, ini sudah menjadi standar, dan ekosistem JS juga bisa mendapat manfaat besar dari sini
Menurut saya langkah berikutnya adalah pengalaman testing bawaan yang lebih baik untuk migrasi dan manajemen skema, serta konfigurasi factory yang baik