We're hiring C/C++ and Zig engineers to build the future of JavaScript! Join our team →
As a reminder: Bun is an incredibly fast JavaScript runtime, bundler, transpiler, and package manager — all in one.
We've been releasing a lot of changes to Bun recently, here's a recap in case you missed it:
v0.6.0- Introducingbun build, Bun's new JavaScript bundler.v0.6.2- Performance boosts: 20% fasterJSON.parse, up to 2x fasterProxyandarguments.v0.6.3- Implementednode:vm, lots of fixes tonode:httpandnode:tls.v0.6.4- Implementedrequire.cache,process.env.TZ, and 80% fasterbun test.v0.6.5- Native support for CommonJS modules (previously, Bun did CJS to ESM transpilation),v0.6.6-bun testimprovements, including Github Actions support,test.only(),test.if(),describe.skip(), and 15+ moreexpect()matchers; also streaming file uploads usingfetch().v0.6.7- Node.js compatibility improvements to unblock Discord.js, Prisma, and Puppeteerv0.6.8- IntroducedBun.password, mocking inbun test, andtoMatchObject()v0.6.9- Less memory usage and support for non-ascii filenamesv0.6.10-fs.watch(),bun installbug fixes,bun testfeatures, and improved CommonJS supportv0.6.11- Addressed a release build issue fromv0.6.10.v0.6.12- Sourcemap support inError.stack,Bun.file().exists(), and Node.js bug fixes.v0.6.13- Implemented mockDate, faster base64 encoding, and fixes forWebSocketandnode:tls.
To install Bun:
curl -fsSL https://bun.sh/install | bashnpm install -g bunbrew tap oven-sh/bunbrew install bundocker pull oven/bundocker run --rm --init --ulimit memlock=-1:-1 oven/bunTo upgrade Bun:
bun upgradeBetter support for process
Bun has improved support for the Node.js process object.
Memory usage
You can now use process.memoryUsage() to get the memory usage of Bun's process.
console.log(process.memoryUsage());
// {
// rss: 4935680,
// heapTotal: 1826816,
// heapUsed: 650472,
// external: 49879,
// arrayBuffers: 9386
// }
CPU usage
You can also get the current CPU usage from Bun using process.cpuUsage().
console.log(process.cpuUsage());
// {
// user: 38579,
// system: 6986
// }
Signal events
You can now use process.on() to listen and run code when the process receives a signal event.
process.on("SIGINT", () => {
console.log("Interrupt from keyboard");
});
Exit events
If you don't know which signal to listen for, you can also listen for a generic exit or beforeExit event.
process.on("beforeExit", (code) => {
console.log("Event loop is empty and no work is left to schedule.", code);
});
process.on("exit", (code) => {
console.log("Exiting with code:", code);
});
process.kill
You can now use process.kill(pid, signal), which kills a process by pid.
process.kill(123, "SIGTERM");
getuid, geteuid, getgid, getegid, getgroups
The following methods have been added:
process.getegid()process.geteuid()process.getgid()process.getgroups()process.getuid()
process.assert
process.assert() is a deprecated alternative to require("assert"). Bun adds this deprecated function for compatibility with existing npm packages.
process.assert(false, "PleAsE don't Use THIs It IS dEpReCATED");
process.reallyExit
process.reallyExit() is used by some npm packages to exit without triggering the "exit" event handler. This is an undocumented function which Bun now implements for ecosystem compatibility reasons.
process.reallyExit(); // probably just use process.exit() though
Class constructors in console.log
Previously, when a value was printed to console.log, a class would was mis-categorized as a function. This has now been fixed and shows that the value is a class.
console.log(class A {});
// Previous: [Function: A]
// Now: [class A]
Fixed TypeScript decorator bug
Previously, Bun had a bug where decorators were not evaluated when used on an anonymous default export. This has been fixed.
function decorator(target: unknown, propertyKey: unknown) {
// ...
}
export default class {
@decorator
method() {
// ...
}
}
Fixed fetch in URLs without slash
Previously, Bun would throw an error when a URL used in fetch() did not have a slash. This has been fixed.
await fetch("http://example.com?a=b");
// Previous: <throw>
// Now: Response { ... }
Fixed 2 crashes in Error.captureStackTrace
We've added a small stress test for Error.captureStackTrace and that led to fixing two crashes:
- When the sourceURL of a stack frame was empty and Error.captureStackTrace() was called, incorrectly initialized memory could sometimes be passed to the stack trace sourcemapper. This has been fixed.
- Creating the array of
CallSiteobjects could sometimes cause a crash due to creating an Array using the fast path which prohbits additional GC-owned memory allocations until the Array has been fully initialized. Since theCallSiteobjects are each a GC-owned allocation, this could cause a crash when GC happens while creating these (suhc as when called repeatedly in a loop). This has been fixed.
Implemented throwIfNoEntry
Implemented support for the throwIfNoEntry option for stat and lstat in node:fs. If set to false and the file does not exist, it will return undefined instead of throwing an error.
import { statSync } from "node:fs";
statSync("./does-not-exist.txt"); // <throws>
statSync("./does-not-exist.txt", { throwIfNoEntry: false }); // undefined
Other changes
Implemented
getCurves()innode:cryptoAdded support for obscure HTTP methods.
Fixed a bug that caused
bun buildto non-deterministically rename symbols.Fixed an off-by-one error that could cause stack traces show the wrong preview.
Fixed a bug where the
readableevent was being emitted after a stream was destroyed.Fixed a bug where
digest("binary")was not implemented properly.Fixed bad coercion from large numbers and BigInt in
node:fs.Fixed the
connectionevent from being emitted when it shouldn't.Fixed a bug in
HTMLRewriterwhereelement.attributesused the wrong encoding.Fixed a bug where the JIT from
Buffer.isBuffer()would become invalid.Fixed a regression for React support where the bundle size was larger than in previous releases.
Fixed a bug where
ref()andunref()did not return theTimerobject.Fixed a bug where the metadata bits from
randomUUID()were incorrect.Fixed a crash from invalid utf-8 data in
node:string_decoder.Fixed a bug where
Set-Cookiewas not present inexpress-sessionbecause of a monkey-patch. (Thanks to @Hanaasagi for fixing those last three bugs!)