Releases: oven-sh/bun
Bun v0.0.44
To upgrade:
bun upgrade
Next.js 12
Bun works with Next.js 12 now. Before, it only supported 11.1.2. This includes support for React 18 (react@alpha
). React Server Components is not supported yet, but it will be. I promise :)
Other stuff
- (
bun run
) ZSH completions should auto-install correctly now. This will automatically apply when you runbun upgrade
- (
bun dev
) Fixed a mistranspilation when usingrequire
from app code to a bundled module (e.g.require("relay-devtools")
) - (
bun bun
) Fixed an issue with symlinked workspace packages when usingalwaysBundle
that prevented them from being correctly imported if enough levels of indirection were added - Fixed undefined behavior when invalid UTF-8 codepoints were inside source code text printed in an error message
- (
bun-macro-relay
) Worked around a bug that could cause it to not correctly importgraphql
depending on the environment - (
bun create
) bumped the hardcoded Next.js version set to12.0.2
- Bun.js: rename
Bun.sleep
->Bun.sleepSync
Full Changelog: Jarred-Sumner/bun@bun-v0.0.42...bun-v0.0.44
Bun v0.0.42
To upgrade:
bun upgrade
tab completions for bun run
bun run
now has tab completions for zsh and fish that show scripts
from package.json and bins from node_modules/.bin
.
Install:
bun upgrade
bun completions
Going forward, bun upgrade
also updates completions, so you shouldn't have to do that again.
Bun.js
Bun now has a builtin "supports-color"
polyfill, the package used by chalk
to detect ANSI color support.
The TypeScript in this screenshot runs 2x faster in Bun.js than in Node.js:
Other stuff:
node-fetch
&isomorphic-fetch
polyfills work now. When an npm package importsnode-fetch
, Bun.js will automatically replace it with Bun's native implementation.Bun.sleep(ms)
lets you synchronously sleep. No promises- Fixed an edgecase with the CommonJS transform that affected
export default
(thank you @evanwashere for flagging) - Several more encoding issues specific to the JavaScriptCore integration were found & fixed, though there are a couple more I still need to fix.
JavaScript Lexer
- Fixed a regression with
\0
(and added an integration test)
Misc
--version
now prints a newline at the end-v
is now shorthand for--version
- Fixed spacing with the CLI help menu (thanks @KishanBagaria for flagging)
-u
is now shorthand for--origin
. Might rename that to--url
in a future release.
Bun v0.0.41
To upgrade:
bun upgrade
What's new:
bun run
:
bun run ./file.js
now supports running JavaScript, TS, TSX, and JSX files using Bun.js. If you pass bun run
a filepath to a .js
, .jsx
, .tsx
, or .ts
file, it will run it with Bun.js instead of saying "error: Missing script"
. This is very experimental!
Bun.js
Bun.js is Bun's JavaScript runtime environment.
- Top-level await works now
performance.now()
is implemented
Bug fixes
- [.env loader] functions from bash were exported incorrectly due to parsing process environment variables similarly to
.env
files which is unnecessary. Now process environment variables are passed through without extra parsing fetch()
wasn't working due to a silly mistake. That's fixed
Bun v0.0.40
It's been a busy couple weeks.
Important: the bun-cli
npm package is deprecated. It will not receive updates.
Please upgrade Bun by running:
# Remove the npm version of bun
npm uninstall -g bun-cli
# Install the new version
curl https://bun.sh/install | bash
For future upgrades:
bun upgrade
Now the fun part.
bun run
~35x faster package.json "scripts"
runner, powered by Bun. Instead of npm run
, try bun run
.
Like npm run
, bun run
reads "scripts"
in your package.json and runs the script in a shell with the same PATH
changes as npm clients. Unlike npm clients, it's fast.
You can use bun run
in projects that aren't using Bun for transpiling or bundling. It only needs a package.json
file.
When scripts launch a Node.js process, bun run
still beats npm run
by 2x:
Why? Because npm clients launch an extra instance of Node.js. With npm run
, you wait for Node.js to boot twice. With bun run
, you wait once.
For maximum performance, if nested "scripts"
run other npm tasks, bun run
automatically runs the task with Bun instead. This means adding many tasks won't slow you down as much.
bun run
supports lifecycle hooks you expect like pre
and post
and works when the package.json
file is in a parent directory.
Two extra things:
bun run
also adds anynode_modules/.bin
executables to the PATH, so e.g. if you're using Relay, you can dobun run relay-compiler
and it will run the version ofrelay-compiler
for the specific project.bun run
has builtin support for.env
. It reads:.env.local
, then.env.development
||.env.production
(respecting yourNODE_ENV
), and.env
in the current directory or enclosing package.json's directory
Oh and you can drop the run
:
Reliability
Lots of work went into improving the reliability of Bun over the last couple weeks.
Here's what I did:
- Rewrote Bun's filesystem router for determinism and to support catch-all + optional-catch-all routes. This is an oversimplification, but the routes are sorted now
- Improved testing coverage. Bun now has integration tests that check a simple Next.js app bundles & server-side prerenders successfully. If JavaScriptCore's JIT is not enabled while server-side rendering, the tests fail. Another integration test checks that a simple Create React App loads. It uses
bun create
to bootstrap the projects. - Fix all known unicode encoding & decoding bugs. Part of what makes parsing & printing JavaScript complicated is that JavaScript officially uses UTF-16 for strings, but the rest of the files on your computer likely use UTF-8. This gets extra complicated with server-side rendering because JavaScriptCore expects either a UTF-16 string for source code or a UTF-8 string. UTF-16 strings use about twice as much memory as UTF-8 strings. Instead of wasting memory, Bun escapes the strings where necessary (but only for server-side rendering)
- Fixed several edgecases with the
.env
loader..env
values are now parsed as strings instead of something JSON-like
There's still a lot of work ahead, but Bun is getting better.
Sometimes, speed and reliability is a tradeoff. This time, it's not. Bun seems to be about 3% faster overall compared to the last version (v0.0.36). Why? Mostly due to many small changes to the lexer. Inlining iterators is good.
Bun v0.0.36
bun create
bun create
is a new subcommand that lets you quickly create a project from a template.
To create a new React project (based on Create React App)
bun create react ./app
11x faster than yarn create react app
on my Macbook Pro (both installing dependencies via yarn)
To create a new Next.js project (based on Create Next App)
bun create next ./app
To create from a GitHub repository:
bun create jarred-sumner/calculator calc
To see a list of templates:
bun create
Right now, there are only two "official" templates (and they're mostly empty) – but you can add more. bun create
fetches from packages published in the examples
folder of Bun's GitHub repo. PRs are very welcome!
Local templates
Many developers have boilerplate code copied for new projects.
That's why bun create
also searches $HOME/.bun-create
for local templates.
Add a folder with a package.json in $HOME/.bun-create/my-local-template
and then you can run:
bun create my-local-template ./foo
This copies the contents of my-local-template
, initializes a git repository, runs any preinstall steps, installs dependencies (if any exist), runs any postinstall steps and rewrites the name
field in package.json
to foo
.
It uses the fastest system calls available for copying files. bun create
copies files faster than cp
. Here is a stupid microbenchmark
Performance
The slowest part is running your NPM client to install node_modules
. The second slowest part is downloading the tarball from GitHub (or NPM if it's from Bun's examples folder). Third is git.
Other stuff
fetch
now supports gzip- https support in
fetch
was completely rewritten to be more reliable. TLS is now powered by s2n-tls fetch
now supportsTransfer-Encoding: chunked
. It didn't before, which was embarrassing.- Set
self
toglobalThis
in Bun.js. This improves compatibility with some npm packages - There are two new test binaries in
misctools/
,tgz
andfetch
.tgz
is likegunzip
except harder to use andfetch
is sort of likecurl
? These are really just to help me test some things in isolation from the rest of Bun
Bun v0.0.34
Features
Slightly better tsconfig.json
handling:
jsxImportSource
support – if you setjsxImportSource
to"@emotion/react"
, JSX will auto-import from"@emotion/react/jsx-dev-runtime"
instead of"react/jsx-dev-runtime"
jsxFragmentFactory
support – this lets you override what<>
transforms into. By default it's"Fragment"
, since<>
becomesReact.Fragment
normally.jsxFactory
support – if you setjsxFactory
to"h"
, when using the classic JSX runtime, it will runh
instead ofcreateElement
This makes it easier to use @emotion/react
, preact
, and other JSX runtimes with Bun.
Bug fixes
- [fetch] Fix bug with HTTP request bodies for http (not https) requests
- Fix JSX transform edgecase with static children to match Babel's behavior (static ===
children.length > 1
) - Fix node_module resolver edgecase when resolving from the dev server (not
bun bun
) that happened when resolving workspace packages above the project root that expect dependencies from the project. This applied to pnpm
Other:
- Add a small end-to-end test for emotion JSX
- Add a small end-to-end test for React Context.Provider & Context.Consumer
- Add analytics
Bun v0.0.32
Bug fixes
- [Linux] Fix Bun failing to start when the system-installed version of ICU didn't match the dynamically linked version. The fix here is to statically link ICU. This unfortunately doubles the binary size of Bun on Linux
- Fix running
bun bun
on a networked filesystem. This is particularly relevant to WSL. The normal posix C function for moving files doesn't work if the source file is on a different mounted filesystem than the target. This fix detects the error and attempts to use sendfile() so that it copies the file faster than it would by reading the memory manually.
Bun v0.0.29
Bun v0.0.28
Bun on Linux x64
Bun is now available for Linux x64. That includes a filesystem watcher leveraging inotify
, Linux's API for watching files as well as macros and SSR/SSG.
When bundling 20 copies of Three.js on Linux x64, Bun performed:
- 1.6x faster than esbuild
- 13.5x faster than Parcel 2
- 19.5x faster than Webpack (without
babel-loader
)
I have done very little work on optimizing Bun for Linux. I'm not satisfied with these numbers, but it's a start.
Bun uses the GOMAXPROCS
to control concurrency despite not being written in Go because I didn't want to think about what to name the variable
The runs with GOMAXPROCS=1
are single-threaded runs.
Bun single-threaded performed 2.2x faster than esbuild single-threaded. The relative gap between single-threaded and concurrent performance implies there's room for improvement in Bun's concurrency code. This machine has 6 cores (nproc
returns 12
) and 64 GB of memory.
Other
- Bun's installed binary is now about 28% smaller
Bun v0.0.27
Features
Relay GraphQL client
You can now use Facebook's Relay GraphQL framework with Bun via bun-macro-relay
.
bun-macro-relay
implements the Bun equivalent of babel-plugin-relay
.
Input:
const query = graphql`
query Bacon {
}
`;
Output:
import Bacon from '__generated__/Bacon.graphql';
const query = Bacon;
This macro is implemented entirely in TypeScript - not in native code. For install instructions, head over to bun-macro-relay
.
Automatically remap macros
// Instead of having to change every import like this:
import { css } from "@emotion/react";
// To this:
import { css } from "macro:bun-macro-emotion-react";
// Now you don't have to change your code
import { css } from "@emotion/react";
note: @emotion/react is not implemented yet!
To use this, add this to your package.json (and remove the comments):
"bun": {
"macros": {
// "react-relay" is the import path to rewrite
"react-relay": {
// rewrite the "graphql" import to instead point to "bun-macro-relay/bun-macro-relay.tsx"
"graphql": "bun-macro-relay/bun-macro-relay.tsx"
}
}
},
Remapping this way only applies to macros. To rewrite imports otherwise, Bun will read paths
from tsconfig.json
or jsconfig.json
.
Bug fixes
- Fix edgecase with cjs -> esm interop runtime code when the ESM export was marked as not extensible
- Fix potential infinite loop on calling macros
- Fix incorrect jsxDEV transform when
source
feature flag is off and a runtime error occurs in a component being rendered - Fix dead-code elimination edgecase with call expressions
- Fix edgecase with parsing .env containing very short strings
More macro features
<import>
lets you inject an import statement into a module. It acceptsdefault
, which is the default import alias and you can pass anamespace
object where the object maps the import names to their names in the current file<id>
lets you reference an import (and eventually, other symbols too)<inject>
will insert each child element to the module scope. This currently only works with<import>
, but it will work with other statements eventually.
Here's an example:
const importStmt = (
<import default="MyImportName" path="foo/bar" />
);
return (
<>
<inject>{importStmt}</inject>
<id to={importStmt.namespace.MyImportName} />
</>
);