1 poin oleh GN⁺ 2025-01-25 | 1 komentar | Bagikan ke WhatsApp
  • 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, serta node:v8 ditambahkan
  • API bawaan baru Bun.s3 dan Bun.sql membawa 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.lockb ke bun.lock berbasis JSONC, serta menambahkan .npmrc, bun publish, bun patch, bun outdated, dan bun run --filter
  • Direktori kerja bun run, penanganan kegagalan Bun.build(), nilai kembalian server.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 name dan code
    • Bun sebisa mungkin mencocokkan pesan error Node.js, tetapi jika name dan code sama, terkadang Bun memberikan pesan yang lebih membantu
  • Modul dan fitur Node.js yang baru didukung
    • node:http2: mendukung pembuatan server HTTP/2, juga dibutuhkan untuk server gRPC
    • node:dgram: mendukung bind/connect socket UDP
    • node:cluster: memungkinkan menjalankan beberapa instance Bun untuk mendistribusikan pekerjaan ke beberapa core CPU
    • node:zlib: implementasi JavaScript ditulis ulang dalam kode native dan menjadi 2 kali lebih cepat dibanding Bun 1.1
    • node:v8: memungkinkan heap Bun diperiksa di Chrome DevTools dengan getHeapSnapshot dan writeHeapSnapshot
  • Server node:http2 di Bun 1.2 2 kali lebih cepat daripada Node.js
  • Berkat peningkatan kompatibilitas node:http dan optimisasi server HTTP Bun, express menangani 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-features dapat 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@v2 dan node-sqlite3 terus ditingkatkan

API S3 bawaan Bun.s3

  • Bun 1.2 menambahkan API bawaan Bun.s3 untuk 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 API File Bun, seperti text(), json(), arrayBuffer(), dan stream()
  • Klien S3 Bun ditulis dalam kode native, bukan JavaScript
    • Dibandingkan penggunaan @aws-sdk/client-s3 di Node.js, pengunduhan file dari bucket S3 5 kali lebih cepat
  • Fitur penulisan menyediakan write() dan writer()
    • write() dapat mengunggah string, Uint8Array, Blob, Response, dan lainnya
    • writer() 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 dengan Bun.file() dan fetch()
    • Upload, download, dan penghapusan dimungkinkan dengan fetch("s3://...")
    • S3Client default dikonfigurasi melalui variabel lingkungan seperti AWS_ACCESS_KEY_ID dan AWS_SECRET_ACCESS_KEY

Klien Postgres bawaan Bun.sql

  • Bun 1.2 menambahkan klien SQL bawaan Bun.sql yang 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.sql menjalankan 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.lockb menjadi berbasis teks bun.lock
    • bun.lockb membantu membuat bun install hampir 30 kali lebih cepat daripada npm, 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.lock adalah 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.lockb tetap mendukung lockfile biner tanpa migrasi otomatis
    • bun.lockb akan didukung dalam jangka panjang, dan bun add serta bun update juga akan terus memperbaruinya
    • Migrasi ke lockfile teks baru bisa dilakukan dengan bun install --save-text-lockfile
  • bun install tetap menjadi 30% lebih cepat daripada Bun 1.1 meski sudah beralih ke lockfile teks
  • Komentar dan trailing comma dapat digunakan di package.json
    • require() dan import() juga dapat membaca package.json seperti ini
    • Karena fitur ini belum didukung luas di seluruh ekosistem JavaScript, disarankan untuk menggunakannya “at your own risk”
  • Dukungan .npmrc ditambahkan
    • Membaca .npmrc di root proyek dan direktori home
    • Dapat digunakan untuk pengaturan autentikasi registry, scoped package, dan private registry
  • Perintah dan opsi package manager baru
    • bun run --filter: menjalankan skrip yang sama secara bersamaan di beberapa workspace
    • bun outdated: memeriksa dependency yang sudah usang
    • bun publish: pengganti npm publish, mendukung autentikasi .npmrc, tarball packing, OTP, dan penanganan edge case package.json
    • bun patch: menyimpan perubahan pada dependency sebagai file .patch di patches/ dan menerapkannya otomatis saat bun 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 bundleDependencies dan mempertahankan indentasi package.json saat bun add

Peningkatan test runner

  • bun test mendukung 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
  • Reporter LCOV ditambahkan untuk code coverage
    • bun test --coverage --coverage-reporter=lcov menghasilkan coverage/lcov.info
    • Direktori output dapat diubah dengan --coverage-dir
  • Mendukung inline snapshot melalui expect().toMatchInlineSnapshot()
    • Snapshot di dalam file test diperbarui dengan bun test -u atau --update-snapshots
    • toThrowErrorMatchingSnapshot() dan toThrowErrorMatchingInlineSnapshot() juga dapat digunakan
  • test.only() kini bekerja meski tanpa flag --only
  • API expect() menambahkan matcher seperti Jest, Vitest, dan jest-extended
    • Kelompok toContainValue(), toContainKey(), toHaveReturned()
    • Pesan error kustom dapat diberikan sebagai argumen kedua
  • Timeout test default untuk scope atau module saat ini dapat diubah dengan jest.setTimeout() dan setDefaultTimeout()

Fitur bundler dan build

  • Bun 1.2 mendukung HTML import
    • Jika file HTML diberikan ke opsi static pada Bun.serve, <script> dan <link> di dalam HTML otomatis dibundel dan diekspos sebagai route statis
  • bun build --compile mendukung 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 --bytecode membuat bytecode cache
    • Dapat membuat waktu start aplikasi seperti eslint 2 kali lebih cepat
    • File .jsc berisi bytecode cache untuk file .js terkait, 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
  • 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 === module ditulis ulang menjadi import.meta.main sehingga dapat digunakan bersama statement import
  • 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

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-face dapat digabungkan menjadi satu file CSS
  • File .css dapat diimpor dari kode JavaScript dan TypeScript
    • CSS yang diimpor dari JavaScript module graph dan aturan @import diratakan menjadi satu file CSS per entrypoint
  • CSS dan JavaScript juga dapat dibundel melalui API yang sama menggunakan Bun.build()

Penambahan API runtime Bun

  • Bun.serve() mendukung route statis melalui properti static
    • Jalur diberikan sebagai key, dan objek Response sebagai 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()
  • Bun.udpSocket() menyediakan socket UDP dalam bentuk Bun API
    • node:dgram juga didukung, tetapi Bun.udpSocket() adalah API modern yang mirip dengan Bun.listen() yang sudah ada
    • Dapat mengirim beberapa UDP datagram dengan satu syscall dan merespons OS backpressure
  • Bun.file() mendukung delete(), unlink(), stat()
    • stat() mengembalikan metadata dalam bentuk yang sama seperti objek Stats dari Node.js fs.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
  • Utilitas lainnya
    • Bun.inspect.table(): mengembalikan string berbentuk tabel seperti console.table
    • Bun.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
  • Jika opsi strict diaktifkan, 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 diperiksa
    • changes
    • lastInsertRowid
  • Opsi safeIntegers mengembalikan integer 64-bit sebagai BigInt, bukan number yang 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() dari bun:ffi
    • Ini adalah cara untuk menggunakan C system library dari JavaScript tanpa build step terpisah
  • Bun menyertakan tinycc bawaan
    • Berbeda dari gcc atau clang, kode C sederhana dapat dikompilasi dalam hitungan milidetik
    • Kode C dapat dikompilasi dan dijalankan saat dibutuhkan
  • Kode C yang menggunakan N-API juga disediakan
    • Dapat berjalan hanya dengan Bun, tanpa tahap build node-gyp

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:alpine dapat 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
  • using dan await using didukung
    • 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
  • API baru terkait Promise
    • Promise.withResolvers(): membuat promise, resolve, dan reject sekaligus
    • Promise.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-realm node:vm
    • Uint8Array.toBase64() / Uint8Array.fromBase64()
    • Uint8Array.toHex() / Uint8Array.fromHex()
  • Iterator helper ditambahkan
    • map, flatMap, filter, take, drop, reduce, toArray, forEach, find
  • Float16Array didukung
    • Array floating-point 16-bit memiliki presisi lebih rendah daripada 32-bit, tetapi lebih efisien dalam penggunaan memori

Penambahan Web API

  • TextDecoderStream dan TextEncoderStream didukung
    • Ini adalah versi streaming dari TextDecoder dan TextEncoder
    • Di Bun, TextEncoderStream hingga 30 kali lebih cepat daripada Node.js
  • Opsi stream pada TextDecoder didukung
    • 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 Uint8Array dari Response, Blob, Bun.file(), dan lainnya
    • Mengurangi proses yang sebelumnya perlu memanggil arrayBuffer() lalu membuat Uint8Array
  • Mendukung upload fetch() streaming
    • Berguna untuk mengunggah file besar atau stream data yang content length-nya tidak diketahui di awal
  • console.group() dan console.groupEnd() diimplementasikan
  • URL.createObjectURL() didukung
    • Dapat membuat URL dari Blob dan menggunakannya di fetch(), Worker, import()
    • Script Worker juga melewati Bun transpiler, sehingga sintaks TypeScript dapat digunakan
  • AbortSignal.any() menggabungkan beberapa AbortSignal sehingga ketika salah satunya di-abort, parent signal juga ikut di-abort

Perubahan perilaku dan hal yang perlu diperhatikan saat migrasi

  • Direktori kerja bun run berubah
    • Sebelumnya menggunakan direktori kerja saat ini dari shell
    • Di Bun 1.2, direktori induk package.json digunakan sebagai direktori kerja skrip
    • Perubahan ini untuk menyelaraskan perilakunya dengan npm dan yarn
  • bun test melaporkan uncaught error atau rejection di antara pengujian sebagai kegagalan
    • Sebelumnya, error seperti ini mungkin tidak diperlakukan sebagai kegagalan pengujian
  • server.stop() kini mengembalikan Promise<void>
    • Dapat menunggu hingga koneksi HTTP yang masih in-flight ditutup
  • Bun.build() kini melakukan reject saat gagal, alih-alih memasukkan error ke logs pada hasil yang di-resolve
    • Jika membutuhkan perilaku lama, Anda dapat mengatur throw: false
  • bun -p kini menjadi alias untuk bun --print, selaras dengan Node.js
    • Sebelumnya merupakan alias untuk bun --port
  • Nilai default bun build --sourcemap berubah dari inline source map menjadi linked source map
    • Jika membutuhkan perilaku lama, gunakan --sourcemap=inline

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 kali
    • fs.readdirSync() di macOS: membaca direktori kecil 5% lebih cepat
    • String.at(): 44% lebih cepat
    • atob() 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 cepat
    • JSON.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 cepat
    • fs.readFile() untuk file kecil: hingga 10% lebih cepat
    • console.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%, dan Array.map() lebih cepat 50%

Instalasi dan peningkatan versi

  • Perintah instalasi baru
    • curl -fsSL https://bun.sh/install | bash
    • powershell -c "irm bun.sh/install.ps1 | iex"
    • npm install -g bun
    • Setelah brew tap oven-sh/bun, jalankan brew install bun
    • docker pull oven/bun
  • Bun yang sudah terinstal dapat ditingkatkan dengan bun upgrade

1 komentar

 
GN⁺ 2025-01-25
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

    • Menurut saya justru sikap seperti ini adalah salah satu alasan Bun mendapat perhatian
      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
    • Setahu saya Bun mendapat pendanaan VC, jadi suatu saat harus menghasilkan uang, dan karena itu, kalau menebak, mungkin mereka ingin menjadikannya runner all-in-one untuk menciptakan vendor lock-in dengan suatu cara
      Tentu bisa saja saya salah, tetapi memasukkan dependensi seperti ini ke core/library standar memang tidak terlalu masuk akal
    • Banyak orang sudah mengatakan hal yang sama kepada Jared, pembuat Bun, tetapi pandangan Jared tampaknya adalah Bun harus memiliki semua yang dibutuhkan proyek default
      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
    • Saya sepenuhnya setuju bahwa library opsional lebih baik
      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
    • Ini untuk layanan terkelola milik Bun
      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

    • Saya penasaran perbedaan apa yang Bun berikan pada stack teknologi frontend yang disebutkan di atas
    • Proyek React/TypeScript juga selama ini bisa disiapkan dengan baik memakai Vite atau Next.js
      Sepertinya Anda meremehkan betapa banyak tool lain juga sudah berkembang selama ini
    • Bun itu luar biasa
      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 tersebut
    Sebagai default, ini pilihan yang cukup mengejutkan, dan sama sekali tidak jelas bagaimana menonaktifkannya ketika kita tidak ingin mengekspos bucket S3 secara langsung

    • Saya menghormati area yang ingin dirintis Bun, tetapi kalau mengikuti pembuatnya di Twitter, pengambilan keputusannya banyak condong pada hasil jangka pendek dan kemudahan, sementara dampak mendalam dari perilaku magis itu cenderung dianggap ringan
      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
    • Cukup teruskan stream ke respons
      Response(file.stream())
    • Saya mengerti kenapa mereka melakukannya, tetapi saya tidak suka desain ini
      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 Bun
  • Baterai 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, eval berjalan lalu Bun mengunggah seluruh file sumber ke S3 pribadi; saat itu juga selesai

    • Saya penasaran apakah “kalau kode tambahan banyak, executable jadi lebih lambat” benar-benar seperti itu
      Saya pernah melihat bahwa tergantung cara kode dimuat saat runtime, dampaknya bisa nyaris diabaikan
      Jika pemuatan kode hanya dipicu saat pernyataan import terlihat, 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
    • Dulu di HN pernah ada diskusi tentang mengapa browser tidak mendukung SQLite sebagai first-class citizen, dan poin itu bisa berlaku juga untuk Bun
      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
    • Menurut saya alasan pihak yang ingin memasukkan S3 adalah banyaknya layanan object storage yang mengimplementasikan API kompatibel S3
      Ini memang bukan standar web sungguhan, tetapi banyak orang menyesuaikan diri dengannya seolah-olah itu standar de facto
    • Katanya “kalau kode tambahan banyak, executable jadi lebih lambat”, tetapi artikelnya benar-benar memuat benchmark dan menyebut Bun dua kali lebih cepat daripada solusi Node.js tercepat
  • 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

    • Kompatibilitas 100% adalah kemenangan yang bagus untuk pemasaran, tetapi kompatibilitas long tail mungkin tidak banyak berpengaruh bagi pengguna rata-rata
      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?
    • Ungkapan “dari sudut pandang manajemen proyek” mengasumsikan kita tahu apa proyeknya
      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
    • Saya ragu apakah daftar fitur yang panjang itu semuanya solid dan bebas bug, terutama karena ditulis dengan Zig
      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...
    • Tidak terlalu solid, dan juga tidak bebas bug
      Saya mencobanya tahun lalu dan terus mengalami crash
    • Cukup lucu ada item bahwa mereka memperbaiki bug bun add yang tidak mempertahankan spasi dan indentasi di package.json, dan sekarang mempertahankan indentasi seaneh apa pun
      Saya 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 import
    Anda bisa memulainya dengan meneruskan impor HTML ke opsi static pada Bun.serve

    import homepage from "./index.html";
    
    Bun.serve({  
      static: {  
        "/": homepage,  
      },
    
      async fetch(req) {  
        // ... api requests  
      },  
    });  
    
    • Saya penasaran bagaimana ini, misalnya, bisa menggantikan Vite
      Apakah 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], serta bun $ Shell [2] tanpa file konfigurasi atau pengelolaan dependensi npm lokal
    Setelah 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

    • Saya juga sama
      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-ts atau 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 di package.json, mengubah tsconfig, dan mengubah cara import/require
    Ketika mencoba menjalankan skrip sekitar 200 baris, sebagai upaya terakhir saya beralih ke Bun, dan hasilnya berjalan dengan sangat baik

    • Node.js terbaru juga sekarang mendukung “langsung menjalankan TS” untuk kasus seperti ini
      node --experimental-strip-types index.ts
      Kalau bukan Node terbaru, paket tsx bekerja dengan baik bagi saya
      Lebih baik daripada ts-node
      Namun 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