- Bun 1.2 full-stack JavaScript/TypeScript डेवलपमेंट टूल बनने के लक्ष्य के साथ, Node.js compatibility और runtime, bundler, testing व package manager को साथ में विस्तार देने वाली एक बड़ी रिलीज़ है
- हर बदलाव पर Node.js test suite चलाकर compatibility verification को मजबूत किया गया है, और
node:http2,node:dgram,node:cluster,node:zlib,node:v8support जोड़ा गया है - नई built-in APIs
Bun.s3औरBun.sqlS3-compatible object storage और Postgres access को runtime के अंदर लाती हैं, जिससे external client dependency घटती है - package manager ने default lockfile को binary
bun.lockbसे JSONC-basedbun.lockमें बदला है, और.npmrc,bun publish,bun patch,bun outdated,bun run --filterजोड़े हैं bun runworking directory,Bun.build()failure handling,server.stop()return value,bun -p, और sourcemap defaults बदल गए हैं, इसलिए मौजूदा projects को migration impact जांचना चाहिए
Node.js compatibility मजबूत की गई
- Bun 1.2 ने compatibility सुधारने की प्रक्रिया बदलकर Bun में हर बदलाव पर Node.js test suite चलाने का तरीका अपनाया है
- पहले bug fixes मुख्य रूप से GitHub issues या npm package execution failure reports पर आधारित होते थे, लेकिन यह तरीका बड़े refactoring को मुश्किल बनाने वाले “whack-a-mole” जैसा था
- Node.js repository की हजारों test files को Bun पर port किया गया है, और हर commit पर ये tests चलाकर compatibility verify की जाती है
- Node.js tests में कभी-कभी internal implementation details और exact error messages verify किए जाते हैं, इसलिए Bun ने कुछ tests में internal bindings को अपने stubs से बदला या verification को
nameऔरcodeपर केंद्रित किया- Bun जहां तक संभव हो Node.js के error messages से match करता है, लेकिन अगर
nameऔरcodeसमान हों तो कभी-कभी ज्यादा मददगार message भी देता है
- Bun जहां तक संभव हो Node.js के error messages से match करता है, लेकिन अगर
- नए support किए गए Node.js modules और features
node:http2: HTTP/2 server creation support, gRPC servers के लिए भी जरूरीnode:dgram: UDP socket bind/connect supportnode:cluster: कई Bun instances चलाकर कई CPU cores पर काम distribute किया जा सकता हैnode:zlib: JavaScript implementation को native code में दोबारा लिखा गया है और यह Bun 1.1 से 2 गुना तेज हैnode:v8:getHeapSnapshot,writeHeapSnapshotसे Bun heap को Chrome DevTools में inspect किया जा सकता है
- Bun 1.2 में
node:http2server Node.js से 2 गुना तेज है node:httpcompatibility में सुधार और Bun HTTP server optimization की वजह सेexpressNode.js की तुलना में HTTP requests को अधिकतम 3 गुना तेजी से process करता है- V8 C++ API इस्तेमाल करने वाले C++ add-ons का support भी जोड़ा गया है
- Node.js V8 का उपयोग करता है, जबकि Bun JavaScriptCore का, इसलिए implementation कठिन है
- Bun ने JavaScriptCore के ऊपर V8 की public C++ API implement की है ताकि
cpu-featuresजैसे packages काम कर सकें - V8 C++ API support जटिल है, इसलिए अधिकांश packages में अभी भी कुछ missing features हो सकते हैं, और
node-canvas@v2वnode-sqlite3जैसे packages के लिए support लगातार बेहतर किया जा रहा है
Built-in S3 API Bun.s3
- Bun 1.2 ने S3-compatible object storage को handle करने वाली built-in API
Bun.s3जोड़ी है- इसे Amazon S3, Google Cloud Storage, Cloudflare R2 जैसी S3 API implement करने वाली services के साथ इस्तेमाल किया जा सकता है
- file read, write और delete को Web standard
Blob-compatible API से handle किया जाता है
s3.file()S3 file के लिए lazy reference return करता है, और इसेtext(),json(),arrayBuffer(),stream()जैसी BunFileAPI के समान तरीके से इस्तेमाल किया जा सकता है- Bun का S3 client JavaScript में नहीं, बल्कि native code में लिखा गया है
- Node.js में
@aws-sdk/client-s3इस्तेमाल करने के तरीके की तुलना में S3 bucket file download 5 गुना तेज है
- Node.js में
- write features में
write()औरwriter()मिलते हैंwrite()string,Uint8Array,Blob,Responseआदि upload कर सकता हैwriter()बड़ी files के लिए multipart upload करता है
presign()किसी खास file upload की अनुमति देने वाला presigned URL बनाता है- इससे users को credentials expose किए बिना या bucket पर अनावश्यक access permissions दिए बिना सीधे S3 पर upload कराया जा सकता है
Bun.serve()के साथ इस्तेमाल करने परnew Response(s3.file(...))server द्वारा S3 file download करके फिर भेजने के बजाय presigned URL पर redirect करता है- इससे memory, time, और server द्वारा file download करने की bandwidth cost घटती है
s3://URLs कोBun.file()औरfetch()में भी इस्तेमाल किया जा सकता हैfetch("s3://...")से upload, download और delete किया जा सकता है- default
S3ClientAWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEYजैसे environment variables से configure होता है
Built-in Postgres client Bun.sql
- Bun 1.2 ने Postgres support वाला built-in SQL client
Bun.sqlजोड़ा है- Bun पहले से built-in SQLite client देता था, और इस release में SQL database support का दायरा बढ़ाया गया है
- MySQL support जोड़ने वाला pull request भी मौजूद है
Bun.sqltagged-template literal से SQL execute करता है- JavaScript values को SQL parameters के रूप में pass किया जा सकता है
- string escaping और prepared statement अपने आप इस्तेमाल करके SQL injection को रोका जाता है
- results column names को keys के रूप में रखने वाली objects की array के रूप में return होते हैं
- native code implementation और कई optimizations का उपयोग किया गया है
- automatic prepared statement
- query pipelining
- binary wire protocol
- connection pooling
- structure caching
- लोकप्रिय Postgres clients को Node.js में इस्तेमाल करने की तुलना में row reads अधिकतम 50% तेज हैं
- API
postgres.jsसे inspired है, और इसे इस तरह design किया गया है कि existing code से Bun built-in SQL client पर migrate करना आसान हो
पैकेज मैनेजर में बदलाव
- Bun 1.2 ने default lockfile को binary
bun.lockbसे text-basedbun.lockमें बदल दिया हैbun.lockbनेbun installकोnpmकी तुलना में लगभग 30 गुना तेज़ बनाने में मदद की थी, लेकिन GitHub पर उसकी सामग्री देखना मुश्किल था और pull request review व merge conflict resolve करना कठिन था- Dependabot जैसे tools के लिए भी lockfile पढ़ना मुश्किल था
bun.lockएक JSONC file है- comments और trailing comma को support करता है
- pull request diff देखना आसान हो जाता है, और trailing comma से merge conflict की संभावना कम होती है
- नए project
bun.lockgenerate करेंगे- मौजूदा
bun.lockbproject automatic migration के बिना binary lockfile को support करते रहेंगे bun.lockbको लंबे समय तक support किया जाएगा औरbun add,bun updateभी इसे update करते रहेंगेbun install --save-text-lockfileसे नए text lockfile में migrate किया जा सकता है
- मौजूदा
- text lockfile पर switch करने के बाद भी
bun install, Bun 1.1 से 30% तेज़ हो गया है package.jsonमें comments और trailing comma इस्तेमाल किए जा सकते हैंrequire()औरimport()भी ऐसेpackage.jsonको पढ़ सकते हैं- यह JavaScript ecosystem में हर जगह व्यापक रूप से supported feature नहीं है, इसलिए इसे “at your own risk” इस्तेमाल करने की सलाह दी गई है
.npmrcsupport जोड़ा गया है- project root और home directory की
.npmrcपढ़ता है - registry, scoped package, private registry authentication settings के लिए इस्तेमाल किया जा सकता है
- project root और home directory की
- नए package manager commands और options
bun run --filter: कई workspace में एक ही script को साथ-साथ चलानाbun outdated: outdated dependencies की जांचbun publish:npm publishका विकल्प,.npmrcauthentication, tarball packing, OTP और package.json edge cases handling को support करता हैbun patch: dependencies में किए गए बदलावों कोpatches/के.patchfile में save करता है औरbun installके समय automatic apply करता है--omit=dev|optional|peer: installation से dev, optional, peer dependencies को exclude करना- CA certificates को
bunfig.toml, CLI flags और.npmrcमें configure किया जा सकता है bundleDependenciesऔरbun addमेंpackage.jsonindentation preserve करने का support भी है
टेस्ट रनर सुधार
bun testJUnit XML reporter को support करता हैbun test --reporter=junit --reporter-outfile=junit.xmlसे Jenkins, CircleCI, GitLab CI जैसे CI/CD tools को test results भेजे जा सकते हैंbunfig.tomlमें भी JUnit reporting configure की जा सकती है
- code coverage में LCOV reporter जोड़ा गया है
bun test --coverage --coverage-reporter=lcovसेcoverage/lcov.infogenerate होता है--coverage-dirसे output directory बदली जा सकती है
expect().toMatchInlineSnapshot()से inline snapshot support मिलता हैbun test -uया--update-snapshotsसे test file के अंदर snapshot update किए जाते हैंtoThrowErrorMatchingSnapshot()औरtoThrowErrorMatchingInlineSnapshot()भी इस्तेमाल किए जा सकते हैं
test.only()अब--onlyflag के बिना भी काम करता हैexpect()API में Jest, Vitest,jest-extendedजैसे matchers जोड़े गए हैंtoContainValue(),toContainKey(),toHaveReturned()series- दूसरे argument के रूप में custom error message pass किया जा सकता है
jest.setTimeout()औरsetDefaultTimeout()से current scope या module का default test timeout बदला जा सकता है
बंडलर और बिल्ड फीचर्स
- Bun 1.2 HTML import को support करता है
- HTML file को
Bun.serveकेstaticoption में देने पर, HTML के अंदर मौजूद<script>और<link>को automatically bundle करके static route के रूप में expose करता है
- HTML file को
bun build --compilecross-compilation को support करता है- Linux पर Windows या macOS binary बनाई जा सकती है, और उल्टा भी संभव है
- Windows build में icon setting और console window hide करने के options इस्तेमाल किए जा सकते हैं
bun build --bytecodebytecode cache generate करता हैeslintजैसे applications का startup time 2 गुना तेज़ कर सकता है.jscfile संबंधित.jsfile का bytecode cache रखती है, और execution के लिए दोनों files जरूरी हैं- bytecode cache source code से 8 गुना बड़ा हो सकता है, इसलिए startup time improvement के बदले ज्यादा disk space लेता है
bun build --format=cjsसे CommonJS output format specify किया जा सकता है- पहले केवल ESM support था
- पुराने Node.js versions को target करने वाली libraries या applications बनाना आसान हो गया है
- CommonJS detection बेहतर हुआ है
- जब file ambiguous हो, तो ऊपर मौजूद
"use strict"directive को CommonJS के आखिरी heuristic के रूप में इस्तेमाल करता है require.main === moduleकोimport.meta.mainमें rewrite किया जाता है, ताकि इसे import statements के साथ इस्तेमाल किया जा सके
- जब file ambiguous हो, तो ऊपर मौजूद
- plugin API में
onBeforeParse()hook जोड़ा गया है- इसे JavaScript नहीं, बल्कि N-API addon के रूप में implement करना होगा
- Rust, C/C++, Zig जैसी compiled languages में parsing से ठीक पहले source code को लगभग बिना overhead के handle किया जा सकता है
- यह plugin और framework authors के लिए advanced API है
- build options भी बढ़ाए गए हैं
--env="PUBLIC_*"से environment variables को bundle में inject करना--drop=consoleजैसे तरीके से function calls हटाना- banner/footer जोड़ना
Bun.embeddedFiles()से standalone executable के अंदर शामिल files की list देखना--ignore-dce-annotationsसे गलत dead-code elimination annotations को ignore करना--packages=externalसे package dependencies को bundle में शामिल न करने की setting
CSS बंडलिंग
- Bun 1.2 ने नया CSS parser और bundler implement किया है
- यह LightningCSS के काम से derived है, और Rust से Zig में फिर से लिखा गया है ताकि Bun के JavaScript/TypeScript parser, bundler और runtime के साथ integrate हो सके
bun build ./index.cssसे कई CSS files और@import,url,@font-facereferences को एक CSS file में combine किया जा सकता है- JavaScript और TypeScript code से
.cssfiles import की जा सकती हैं- JavaScript module graph में imported CSS और
@importrules को हर entrypoint के लिए एक CSS file में flatten करता है
- JavaScript module graph में imported CSS और
Bun.build()API से भी CSS और JavaScript को उसी API में bundle किया जा सकता है
Bun रनटाइम API में जोड़
Bun.serve()staticproperty के जरिए static routes को support करता है- path को key के रूप में और
Responseobject को value के रूप में पास किया जाता है - static routes,
fetch()handler में सीधे process करने की तुलना में 40% तक तेज़ हैं - response body, header और status code memory में cache होते हैं, इसलिए JavaScript allocation और garbage collection नहीं होता
server.reload()से static routes को फिर से load किया जा सकता है
- path को key के रूप में और
Bun.udpSocket()Bun API के रूप में UDP socket देता हैnode:dgramभी support है, लेकिनBun.udpSocket()मौजूदाBun.listen()जैसा modern API है- एक ही syscall से कई UDP datagram भेज सकता है और OS backpressure को handle करता है
Bun.file()delete(),unlink(),stat()को support करता हैstat()Node.jsfs.stat()केStatsobject जैसे format में metadata return करता है- S3 files के लिए भी यही API इस्तेमाल किया जा सकता है
Bun.color()color parsing, normalization और conversion देता है- CSS, ANSI color code, RGB, HSL आदि को support करता है
dns.prefetch()DNS records को पहले से fetch करके startup पर DNS cache को warm कर सकता हैdns.getCacheStats()से DNS cache की स्थिति check की जा सकती है
- अन्य utilities
Bun.inspect.table():console.tableकी तरह table-format string return करता हैBun.randomUUIDv7(): sorting और databases के लिए उपयुक्त monotonic UUID v7 बनाता है
SQLite client में सुधार
- Bun का built-in SQLite client
query.as(Class)से query results को class instances में map कर सकता है- getter, setter और method जोड़े जा सकते हैं
- performance कारणों से class constructor, default initializer और private field support नहीं हैं
- यह relationship management या SQL generation नहीं करता, इसलिए ORM नहीं है
query.iterate()rows को एक साथ memory में load किए बिना iterator के रूप में process करता है- query object खुद भी
forloop से iterate किया जा सकता है
- query object खुद भी
strictoption on करने पर query parameters में$,@,:prefix छोड़े जा सकते हैं- parameter missing होने पर error throw करता है
db.run()result में बदली गई rows की संख्या और आखिरी inserted row ID check किया जा सकता हैchangeslastInsertRowid
safeIntegersoption 64-bit integers को truncate हुएnumberकी जगहBigIntके रूप में return करता है- इसे database level या query level पर set किया जा सकता है
- JavaScript
usingsyntax से statement और database को scope खत्म होने पर automatically close किया जा सकता है
JavaScript से C compile और run करना
- Bun 1.2 ने JavaScript से C को compile और run करने के लिए experimental support जोड़ा है
bun:ffiकेcc()API का इस्तेमाल करता है- यह बिना अलग build step के JavaScript से C system library इस्तेमाल करने का तरीका है
- Bun में
tinyccbuilt-in हैgccयाclangके उलट, simple C code को milliseconds में compile कर सकता है- जरूरत पड़ने पर C code compile करके run किया जा सकता है
- N-API इस्तेमाल करने वाला C code भी support करता है
node-gypbuild step के बिना, सिर्फ Bun होने पर काम करता है
musl और Alpine Linux support
- Bun 1.2 ने glibc की जगह musl libc इस्तेमाल करने वाले Linux distributions के लिए Bun builds जोड़े हैं
- Alpine Linux जैसे environments में इस्तेमाल किया जा सकता है
- Linux x64 और aarch64 को support करता है
- Docker में
oven/bun:alpineimage इस्तेमाल की जा सकती है - musl छोटे container images संभव बनाता है, लेकिन Bun के glibc version की तुलना में थोड़ा धीमा रहने की प्रवृत्ति है
- कोई खास वजह न हो तो glibc इस्तेमाल करने की सलाह दी जाती है
JavaScript language features
- import attributes support जोड़ा गया है
import json from "./package.json" with { type: "json" }की तरह JSON, text, TOML आदि को explicitly import किया जा सकता है- dynamic
import()में भी इस्तेमाल किया जा सकता है
usingऔरawait usingsupport करता है- scope से बाहर निकलने पर
[Symbol.dispose]या[Symbol.asyncDispose]call होकर resources को automatically clean up करता है Bun.spawn(),Bun.serve(),Bun.connect(),Bun.listen(),bun:sqliteआदि कई Bun APIs में support है
- scope से बाहर निकलने पर
- Promise से जुड़े नए APIs
Promise.withResolvers():promise,resolve,rejectको एक साथ बनाता हैPromise.try(): synchronous या asynchronous function को promise में wrap करता है
- Error और byte array APIs
Error.isError(): prototype chain में बदलाव याnode:vmcross-realm स्थितियों में भी Error होने की स्थिति को ज्यादा सटीकता से check करता हैUint8Array.toBase64()/Uint8Array.fromBase64()Uint8Array.toHex()/Uint8Array.fromHex()
- iterator helper जोड़े गए हैं
map,flatMap,filter,take,drop,reduce,toArray,forEach,find
Float16Arraysupport करता है- 16-bit floating-point arrays में precision 32-bit की तुलना में कम होती है, लेकिन memory efficiency ज्यादा होती है
Web API में जोड़
TextDecoderStreamऔरTextEncoderStreamको support करता है- ये
TextDecoderऔरTextEncoderके streaming versions हैं - Bun में
TextEncoderStreamNode.js की तुलना में 30 गुना तक तेज़ है
- ये
TextDecoderकेstreamoption को support करता है- chunk पूरा UTF-8 code point न हो तब भी उसे बड़े stream के हिस्से के रूप में process किया जा सकता है
bytes()method जोड़ा गया हैResponse,Blob,Bun.file()आदि में stream data कोUint8Arrayके रूप में return करता है- मौजूदा
arrayBuffer()के बादUint8Arrayबनाने की प्रक्रिया को कम करता है
- streaming
fetch()upload support करता है- बड़े files या ऐसी data streams upload करने में उपयोगी है जिनकी content length पहले से पता नहीं होती
console.group()औरconsole.groupEnd()implement किए गए हैंURL.createObjectURL()को support करता हैBlobसे URL बनाकरfetch(),Worker,import()में इस्तेमाल किया जा सकता है- Worker script भी Bun transpiler से गुजरती है, इसलिए TypeScript syntax इस्तेमाल किया जा सकता है
AbortSignal.any()कईAbortSignalको combine करता है, ताकि किसी एक के abort होने पर parent signal भी abort हो जाए
व्यवहार में बदलाव और migration के ध्यान रखने योग्य बिंदु
bun runकी working directory बदल गई है- पहले shell की मौजूदा working directory का उपयोग होता था
- Bun 1.2 में
package.jsonकी parent directory को script working directory के रूप में उपयोग किया जाता है - यह बदलाव
npm,yarnके व्यवहार से मेल कराने के लिए है
bun testअब tests के बीच होने वाली uncaught error या rejection को failure के रूप में रिपोर्ट करता है- पहले ऐसी errors को test failure के रूप में treat न किया गया हो सकता था
server.stop()अबPromise<void>लौटाता है- इससे in-flight HTTP connection बंद होने तक इंतज़ार किया जा सकता है
Bun.build()failure पर resolved result केlogsमें error डालने के बजाय reject करता है- अगर पुराना व्यवहार चाहिए, तो
throw: falseसेट किया जा सकता है
- अगर पुराना व्यवहार चाहिए, तो
bun -pअब Node.js से मेल खाते हुएbun --printका alias बन गया है- पहले यह
bun --portalias था
- पहले यह
bun build --sourcemapका default inline source map से बदलकर linked source map हो गया है- अगर पुराना व्यवहार चाहिए, तो
--sourcemap=inlineउपयोग करें
- अगर पुराना व्यवहार चाहिए, तो
प्रदर्शन सुधार
- Bun 1.2 में कई execution paths में performance improvements शामिल हैं
node:http2: 2 गुना तेज़node:httpके जरिए S3 upload: 5 गुना तेज़path.resolve(): 30 गुना तेज़fetch()DNS resolution: 2 गुना तेज़bun --hot: memory usage 2 गुना कम- macOS
fs.readdirSync(): छोटे directories पढ़ना 5% तेज़ String.at(): 44% तेज़- बड़े string input के
atob(): अधिकतम 8 गुना तेज़ fetch()gzip data decompression: 30% तेज़- बड़े input के
Buffer.from(string, "base64"): 6 गुना~30 गुना तेज़ - बड़े string input के
JSON.parse(): 2 गुना~4 गुना तेज़, object input 6% तेज़ - कुछ
Bun.serve()applications का throughput: अधिकतम 2 गुना बढ़ा Error.captureStackTrace(): 9 गुना तेज़- छोटी files के
fs.readFile(): अधिकतम 10% तेज़ - string argument वाले
console.log(): 50% तेज़
- Windows में JavaScriptCore का JIT सक्षम किया गया है
- पहले JIT केवल macOS और Linux पर उपलब्ध था
- Windows पर JavaScript कुल मिलाकर अधिक तेज़ी से चलता है
- उदाहरण के तौर पर
Object.entries()20%,Array.map()50% तेज़ हो गया है
installation और upgrade
- नए installation commands
curl -fsSL https://bun.sh/install | bashpowershell -c "irm bun.sh/install.ps1 | iex"npm install -g bunbrew tap oven-sh/bunके बादbrew install bundocker pull oven/bun
- पहले से installed Bun को
bun upgradeसे upgrade करें
1 टिप्पणियां
Hacker News की राय
समझ नहीं आता कि third-party database और external S3 library को core/standard library में क्यों डाला जा रहा है
ऐसी चीज़ों के लिए optional libraries बेहतर नहीं होंगी? ऐसे runtime को standard library में क्या शामिल करना है, यह बहुत सावधानी से चुनना चाहिए
अभी से यह project ऐसा लगने लगा है जिसमें kitchen sink की तरह सब कुछ ठूंस दिया जा रहा हो
batteries included तरीका कई जगह लोकप्रिय है और चुना जाने वाला रास्ता है
TypeScript setup भी मुश्किल है, Webpack, S3, Postgres, Jest वगैरह भी ऐसे ही हैं, इसलिए files और streams तक simplified access भी काफी दिलचस्प है
देखते हैं distributed deployment providers कैसे सामने आते हैं
बेशक मैं गलत भी हो सकता हूं, लेकिन ऐसी dependencies को core/standard library में डालना वाकई ज्यादा समझ में नहीं आता
लगता है उनका मानना है कि core में डालने से इसे third-party libraries की तुलना में ज्यादा optimize किया जा सकता है
व्यक्तिगत रूप से मुझे यह गलत approach लगती है और लगता है Jared की ambition कुछ ज्यादा बढ़ गई है, लेकिन आखिरकार यह उनका passion project ही है
Bun की भाषा में कहें तो “Bun cloud-first JavaScript runtime बनने का लक्ष्य रखता है। यानी cloud में production applications चलाने के लिए जरूरी सभी tools और services को support करता है”, लेकिन यह बात बहुत भरोसा नहीं दिलाती
यह खास design choice Node से भी बदतर दिखती है
VC-backed software की समस्या हमेशा यही रही है कि ऐसी integrated features कोई unique चीज़ देने की कोशिश करती हैं, दूसरे शब्दों में lock-in बनाना चाहती हैं
अब तक Bun इस्तेमाल करने का experience बहुत अच्छा रहा है
नए project में TypeScript/Jest/React/Webpack setup करते समय जगह-जगह breaking changes की वजह से हमेशा झिझक होती थी, लेकिन Bun में यह अपने आप संभल जाता है और मेरे use case में बिना दर्द के बस काम करता है
S3, SQL जैसी third-party library integrations पर कुछ कहना मुश्किल है, लेकिन कम से कम लगता है कि वे सबसे आम और सबसे ज्यादा मांगी जाने वाली चीजों पर focus कर रहे हैं
अच्छा है कि यह Node.js tool ecosystem में वह sanity ला रहा है जिसकी जरूरत थी
लगता है आप इस बात को कम आंक रहे हैं कि बाकी tools भी इस दौरान काफी बेहतर हुए हैं
मेरे लिए यह productivity cheat code जैसा है
ChatGPT को Bun अच्छी तरह नहीं पता, इसलिए productivity में थोड़ा नुकसान होता है, फिर भी मुझे Bun पसंद है
इसमें अच्छी बातें बहुत हैं, लेकिन चिंता है कि कहीं कुछ default behavior बहुत ज्यादा magic की तरह hidden behavior की तरफ तो नहीं जा रहा
new Response(s3.file(...))इस्तेमाल करने पर S3 file को server पर download करके user को भेजने के बजाय, Bun user को S3 file के pre-signed URL पर redirect कर देता हैdefault के तौर पर यह काफी चौंकाने वाला विकल्प है, और अगर आप S3 bucket को सीधे expose नहीं करना चाहते तो इसे बंद कैसे करें, यह भी बिल्कुल साफ नहीं है
शुरुआत में इस project से उम्मीद थी, लेकिन social पर दिखने वाले बिखरे हुए और निजी तौर पर अक्सर खराब लगने वाले design decisions देखकर long-term direction पर भरोसा नहीं होता
अगर इसे v0.x में रखा होता तो ठीक था, लेकिन 1.0 रिलीज कर दिया है तो API surface बढ़ाने का standard कहीं ज्यादा ऊंचा होना चाहिए था
Response(file.stream())व्यक्तिगत रूप से यह side effects वाले मजबूत behavior जैसा लगता है, और पढ़ने में ऐसा दिखता है जैसे URL नहीं बल्कि file content return हो रहा हो
फिर भी यह भी जानना चाहूंगा कि bucket exposure में परेशान करने वाली बात क्या है
यह pre-signed URL है, इसलिए व्यापक access permission भी नहीं देता
बेहतर होता कि
Response((file(...).getPresignedURL()))जैसी explicit API होती, या environment variable या Bun config से इस behavior को on करने का option होताबैटरी शामिल होना बड़ा फर्क पैदा करता है
Fetch API, Service Workers, Web Components, ES6+, WebRTC जैसे web API अब V8 और WebKit runtime दोनों में native हो गए हैं—मुझे यह इसलिए पसंद है
हालांकि इसकी भी एक हद होनी चाहिए
S3 शायद बहुत आगे जाना हो सकता है, लेकिन SQL driver समझ में आते हैं
फिर भी सवाल यह है कि कितना शामिल किया जाए
database बहुत सारे हैं; क्या उनमें से आधे के driver शामिल करने चाहिए?
उस स्तर पर भी अतिरिक्त code काफी बढ़ जाएगा और executable धीमा हो सकता है
और ऐसे sensitive API को Bun में डालने से security भी छूट सकती है
कल्पना कीजिए किसी script या path की समस्या के कारण
evalचल जाता है और Bun पूरी source file को private S3 पर upload कर देता है—उस पल खेल खत्म हैcode runtime पर कैसे load होता है, इस पर निर्भर करते हुए यह लगभग नज़रअंदाज़ करने लायक हो सकता है, ऐसा मैंने देखा है
अगर code loading केवल
importstatement दिखने पर trigger होती है, तो असल में speed overhead नहीं है, है ना?static रूप से link होने पर भी, सिर्फ code मौजूद होने की वजह से executable इतना धीमा क्यों हो कि ध्यान देने लायक हो, यह मुझे ठीक से समझ नहीं आता
memory में load होने वाला executable सचमुच थोड़ा बड़ा हो जाएगा, लेकिन शायद महसूस होने वाली slowdown नहीं होगी
मुख्य बात यह है कि library maintenance की जिम्मेदारी किसकी है, और SQLite बदलने पर उस library को कैसे बदला जाए
अगर SQLite में bug हो तो Bun में उसे कैसे fix करेंगे?
किन versions में fix जाना चाहिए?
runtime का patch उसके ऊपर चलने वाले code के व्यवहार को बदल सकता है; अगर users ने पुराने behavior के हिसाब से workaround बना रखे हों तो उसे कैसे handle करेंगे?
कुछ हद तक ये समस्याएं हल की जा सकती हैं, लेकिन इनके साथ नुकसान भी आते हैं
किसी बिंदु के बाद यह runtime नहीं बल्कि platform बन जाता है, और उसके साथ अलग जिम्मेदारियां और समस्याएं आती हैं
यह असली web standard तो नहीं है, लेकिन बहुत लोग इसे de facto standard की तरह target करते हैं
हाल ही में एक customer production में Bun इस्तेमाल कर रहा था
सुना कि speed और simplicity की वजह से Bun का development experience अविश्वसनीय रूप से अच्छा है
developer experience लंबे समय में बड़ी भूमिका निभाता है
अगर codebase या process बिखरे हुए हों, तो FAANG-स्तर का compensation न देने पर आप अच्छे लोगों को खो देंगे
मैंने अभी Bun इस्तेमाल नहीं किया है, लेकिन feature list इतनी लंबी है कि यह सब robust और bug-free होगा या नहीं, इस पर संदेह है
उम्मीद है मैं गलत साबित होऊं, और किसी भविष्य के project में इसे चलाकर देखने का इरादा है
project management के नजरिए से थोड़ा confusion है कि जब यह अभी Node.js 100% compatible भी नहीं है, तो S3 support पर समय क्यों लगाया जा रहा है
Next.js बहुत बड़ा ecosystem है; अगर Next.js customers को ला सकें तो S3 support से कहीं ज्यादा growth मिल सकती है
रोजमर्रा में पूरी Node.js API surface में से आप सच में कितना इस्तेमाल करते हैं?
उसके अंदर के अजीब edge cases पर आप सच में कितना निर्भर हैं?
काम करने वाले लोग भी robot नहीं हैं
कुछ काम समझने में समय लेते हैं, और उस दौरान दूसरे काम भी किए जा सकते हैं
हर काम एक ही व्यक्ति नहीं करता
कहा जाता है “Next.js customers को लाने से ज्यादा growth होगी”, लेकिन किस चीज़ की growth?
उससे पैसा नहीं बनता
यह VC-backed project है, और लक्ष्य Bun को मुफ्त में देकर दुनिया भर के सभी users हासिल करना नहीं है
Zig में memory safety बहुत कम है
अगर आप किसी ऐसे variable को reference करें जो अब alive नहीं है, तो segmentation fault के बजाय यह किसी arbitrary असंबंधित memory तक पहुंच जाता है
कहा जाता है कि debug और safe mode में भी ऐसा ही है[0]
क्या ऊपर से ऐसा memory liveness system चढ़ाना इतना मुश्किल है जो variable names को dead state में mark करे और dead होने पर access रोके?
आखिर में बात “undefined behavior इस्तेमाल मत करो”[1] पर आ जाती है
इसलिए internet-facing webserver जैसी जगहों पर मैं Zig से बनी कोई चीज़ नहीं रखना चाहूंगा
[0] : https://news.ycombinator.com/item?id=41720995
[1] : https://github.com/ziglang/zig/issues/16467#issuecomment-164...
पिछले साल इस्तेमाल किया था, लगातार crash हो रहा था
bun addनेpackage.jsonके spaces और indentation preserve न करने वाला bug fix किया, और अब कैसी भी अजीब indentation हो, उसे preserve करता है—यह item काफी मजेदार हैपता नहीं किसने ऐसी मांग की, और क्यों लगा कि इस पर code लिखना worth है
HTML imports शानदार और कूल हैं
कहा गया है कि Bun 1.2 में HTML imports support होने से पूरे frontend toolchain को एक single
importstatement से replace किया जा सकता हैशुरू करने के लिए
Bun.serveकेstaticoption में HTML import पास करेंक्या hot module replacement, CSS preprocessing, Vue SFC compiler जैसे framework-specific plugin loading संभव हैं?
static file serving कोई खास नई चीज़ नहीं है, इसलिए लगता है मैं कुछ miss कर रहा हूं
मुझे लगा था कि Node.js के प्रतिस्पर्धी विकल्प जितना तय-शुदा असफल होने वाला कोई प्रोजेक्ट नहीं होगा, लेकिन इसे एक बार आज़माना अच्छा रहा
मुझे text files और SQLite DB updates संभालने वाली कई standalone scripts बनानी थीं, और TypeScript,
bun:sqlite[1],bun $ Shell[2] को बिना config files या local npm dependencies manage किए सीधे इस्तेमाल कर सकाउसके बाद नए JS/TypeScript projects में भी इस्तेमाल किया, जहाँ built-in bundler [3] और test support [4] भी काम आए और dependencies install होना भी तुरंत पूरा हो गया
हर चीज़ का तेज़ी से तुरंत चल जाना सच में quality-of-life improvement है, और अब Bun नए JS project के लिए पहली पसंद बन गया है
[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
मैं भी इसी सोच में था कि “ऐसी चीज़ें तो अगले साल npm में भी आ जाएँगी, फिर इसका क्या मतलब”
आखिरकार Bun इस्तेमाल किया और सचमुच हैरान रह गया
developer experience के छोटे-छोटे हिस्से जुड़कर बड़ा फर्क पैदा करते हैं
मेरे project में Bun वाकई next-gen जैसा लगता है
कुछ समय पहले पहली बार Bun इस्तेमाल किया और अनुभव शानदार रहा
मेरे सभी projects TypeScript इस्तेमाल करने के लिए Webpack या Vite configured रखते हैं, और एक बार setup हो जाए तो लगभग पूरी तरह काम करते हैं, लेकिन setup अपने-आप में झंझट वाला है और छोटी scripts के लिए इसके लायक नहीं
इसके उलट Bun सीधे चल गया
CLI में TS को “सीधे” चलाने के लिए
node-tsया जो भी tool था, उसके साथ 10–30 मिनट तक जूझता रहा; “module नहीं है”, “import/require इस्तेमाल नहीं कर सकते”, “ESM/CJS” जैसे डरावने messages झेलता रहा, और आम fixes जैसेpackage.jsonmodule type बदलना,tsconfigबदलना,import/requireतरीका बदलना—सब आज़मा लियाकरीब 200 lines की script चलाने की कोशिश में आखिरी विकल्प के तौर पर Bun पर switch किया, तो यह बेहतरीन तरीके से चल गया
node --experimental-strip-types index.tsअगर latest Node नहीं है, तो
tsxpackage मेरे लिए ठीक चलाts-nodeसे बेहतर थाहालांकि दोनों options type information को बस हटा देते हैं, और Bun भी यही करता है
दिशा पसंद आ रही है
खासकर S3 और Postgres native support शामिल करना बहुत सही है, क्योंकि यह मौजूदा “खुद framework जोड़-तोड़कर बनाओ” वाली स्थिति का एक विकल्प हो सकता है
Rails और Laravel जैसे सभी web frameworks में यह standard है, और JS ecosystem को भी इससे बड़ा फायदा मिल सकता है
मेरे हिसाब से अगला कदम migrations और schema management, और factory setup अच्छे से कर सकने वाला बेहतर default test experience होना चाहिए