# Bun v1.0 - fast all-in-one JS runtime ![](https://hackmd.io/_uploads/rJEjx5Lg6.png) ### I. What is Bun > Bun is an all-in-one toolkit for JavaScript and TypeScript apps. It ships as a single executable called bun. > src: https://bun.sh/docs So, basically, it's a JS runtime, but at the same time, it can bundle files, install packages, run tests. People currently focus a lot on the "fast" aspect of Bun, but i just want to take a look on it's features and the experiences of setting up as well as using it for the first time. ### II. Features There are a lot going on with Bun but i find below features draw my attention the most. They're all built-in instead of having to install like on Nodejs. - Install Bun ```javascript curl -fsSL https://bun.sh/install | bash ``` - Create a new repo for your Bun project - Run below command and let bun install neccessary stuffs ```javascript bun init ``` #### ① Typescript Regarding typescript, there's actually nothing we have to do, after the setup, bun-types was installed and you can start using typescripts as normal. ```javascript // you can see that bun-types is added to tsconfig as below { "compilerOptions": { "types": ["bun-types"] } } ``` #### ② Environment variables We no longer need to install dotenv or dotevn-expand, you can just call `process.env.API_TOKEN` or `Bun.env.API_TOKEN`, for example. #### ③ Module import `import { hello } from "./hello"` is ok to use with Bun. CommonJS modules (require()/module.exports) is acceptable, but it's not recommended in order to keep the consistency if you start a new project. #### ④ Watch Forget nodemon, with Bun, you just need to add script to watch the changes like below ```javascript "scripts": { "start": "bun run src/index.ts", "dev": "bun --watch src/index.ts" }, ``` Now everytime you make chages, your app restart. You can also watch the test, so that tests will run when you make changes on test case. Beside `--watch`, you can also use `--hot`, which does not hard-restart the entire process. Instead, it detects code changes and updates its internal module cache with the new code. #### ⑤ Websocket Yes, Bun support Websocket by default. Below is a basic websocket server in Bun. ```javascript Bun.serve({ fetch(req, server) { // upgrade the request to a WebSocket if (server.upgrade(req)) { return; // do not return a Response } return new Response("Upgrade failed :(", { status: 500 }); }, websocket: { message(ws, message) {}, // a message is received open(ws) {}, // a socket is opened close(ws, code, message) {}, // a socket is closed drain(ws) {}, // the socket is ready to receive more data }, }); ``` Beside sending message, you can also: - handle contextual data, which is data that contains more than just a string, you can get userid, for example. - implements a native publish-subscribe API, which is perfect to build your chat app, where many sockets can subscribe to a topic and publish messages to all other subscribers of that topic. #### ⑥ SQLite Bun natively implements a high-performance SQLite3 driver with below supported features: - Transactions - Parameters (named & positional) - Prepared statements - Datatype conversions (BLOB becomes Uint8Array) - The fastest performance of any SQLite driver for JavaScript ```javascript import { Database } from "bun:sqlite"; const db = new Database(":memory:"); const query = db.query("select 'Hello world' as message;"); query.get(); // => { message: "Hello world" } ``` #### ⑦ Test Bun ships with a fast, built-in, Jest-compatible test runner with below supported features: - TypeScript and JSX - Lifecycle hooks - Snapshot testing - UI & DOM testing - Watch mode with `--watch` - Script pre-loading with `--preload` ```javascript import { expect, test } from "bun:test"; test("2 + 2", () => { expect(2 + 2).toBe(4); }); ``` Please be noted that mock() function is not implemented yet, but you can use alternative way to achieve the same thing. ```javascript import { test, expect, jest } from "bun:test"; const random = jest.fn(() => Math.random()); ``` ### III. Conclusion Above are just those that draw my most attention but there are more and you can check out the details on [official website](https://bun.sh/docs). There are also [guides](https://bun.sh/guides) in case you want to try Bun with frameworks or the things you care about. Bun is still young and they still have [plans](https://github.com/oven-sh/bun/issues/159) for it, but the fact that it removes lots of installations everytime I start a be project in javascript, is nice. :woman-bowing: <small> Published date: 2023-10-12 <br/> Also published <a href="https://medium.com/goalist-blog/bun-v1-0-fast-all-in-one-js-runtime-84bb9ebe4d94">here</a>. </small>