Bun 1.0 is here!

dante Yoon·2023년 9월 9일
21

bun

목록 보기
1/1
post-thumbnail

안녕하세요, 단테입니다.

한국 시간으로 9.9 1.0 버전이 출시되었는데요, 오늘은 bun에 대해 알아보겠습니다.

유튜브 영상: https://www.youtube.com/watch?v=1T9RVe8c5DM

런타임이란

bun은 모던 자바스크립트를 위한 런타임 빌드 환경을 제공합니다.

ECMAScript는 구현체가 아닌 자바스크립트 문법에 대한 표준 규약으로
규약을 준수한다면 자바스크립트를 실행시키는 엔진은 그 누구라도 만들 수 있습니다.

브라우저

자바스크립트는 완전한 진공상태에서 돌아가지 않으며 자바스크립트를 이용해 프로그램을 만들기 위해서는 특정 환경에서 제공하는 API를 사용해야 유의미한 기능을 사용자에게 제공할 수 있습니다.

window는 브라우저의 런타임이 제공하는 객체로 웹에서 사용할 수 있는 API를 제공합니다.

Node.js

비슷한 맥락으로 브라우저가 아닌 서버에서 사용되는 런타임으로 Node.js가 있으며 Buffer, process, __dirname와 같은 글로벌 객체를 제공합니다.

런타임 역할

what runtime do

V8, JSC등의 ENGINE 위에서 자바스크립트가 실행될때 실행되는 함수는 STACK에 위치하고 객체 메모리는 힙에 위치합니다. 돔 API, STORAGE, FETCH API 같은 런타임에서 제공하는 API를 사용하여 이벤트를 발생하고 각 API는 콜백으로 등록된 함수를 MICROTASKS나 TASK QUEUE로 변환합니다.

런타임에서는 논 블로킹으로 동작하기 위해 큐 상태를 관찰하는 이벤트 루프를 사용해 CALL STACK이 비어지면 QUEUE에 등록되어있는 작업을 STACK으로 이동시킵니다.

지금 설명한 기능들을 Bun에서는 Zig라는 언어와 JSC라는 엔진으로 구현했습니다.

Bun

Bun은 Node.js를 대체할 수 있는 런타임으로 더 빠른 빌드 속도와 실행속도를 제공하는 것이 특징입니다.

속도

console.log("hi")를 여러 런타임 환경에서 실행해본 벤치마크를 비교해보면
deno 보다 2배 , node 16보다 4.5배 빠른 속도를 보여줍니다.

출처

번에서 사용하는 패키지 매니저도 pnpm 보다 빠릅니다.

Javascript engines

여러 브라우저 에서 사용하는 자바스크립트 엔진은 아래와 같이 분류할 수 있는데, Bun 속도가 node.js 나 deno보다 빠른 이유로 engine start time이 v8보다 더 빠른 JSC(JavaScriptCore)를 사용했기 때문입니다.

출처

browser engine

FrameworkEngine
Chrome/Brave/Edge/OperaV8
SafariJavaScriptCore
FirefoxSpiderMonkey
Edge Legacy/IEChakra

framework engine

FrameworkEngine
node.jsV8
bunJavaScriptCore
denoV8
just-jsV8
react nativeHermnes

Zig

번이 빠른 속도를 제공하는 다른 이유로는 Zig 라는 메모리를 직접 조정할 수 있는 로우레벨 언어를 사용해 메모리 효율을 높인 소프트웨어를 작성했기 때문입니다.

TS , JSX 지원

별도 모듈을 사용하지 않고도 Typescript와 JSX 형식으로 작성된 코드들을 JS로 변환해줍니다.

NODE.JS CommonJS, ESM 호환성 제공

자바스크립트가 ES Module을 사용하는 방향으로 진화하고 있기 때문에 Bun은 기본적으로 ESM 사용을 권장하지만 CommonJS 모듈 또한 지원합니다

MACRO

매크로는 Bun에서 제공하는 기능으로 번들실행할 때 실행하는 함수입니다. Stage 3 TC39 에 등재되어있습니다.

랜덤 넘버를 반환하는 함수를 작성하고

export function random() {
  return Math.random();
}

다음과 같이 매크로를 작성합니다.

import { random } from './random.ts' with { type: 'macro' };

console.log(`Your random number is ${random()}`);

bun build 명령어를 통해 번들하면 아래와 같이 실행됩니다.

bun build ./cli.tsx
console.log(`Your random number is ${0.6805550949689833}`);

설치

curl -fsSL https://bun.sh/install | bash

프레임워크

Express, Fastify와 같은 Node.js에서 실행하는 서버 프레임워크보다 훨씬 빠른 ElysiaJS가 있습니다.

bun create elysia app
import { Elysia, t } from 'elysia'

new Elysia()
    .post('/sign-in', ({ body }) => signIn(body), {
        body: t.Object({
            username: t.String(),
            password: t.String()
        })
    })
    .listen(8080)
import { Elysia, t } from 'elysia'
import { swagger } from '@elysiajs/swagger'

new Elysia()
    .use(swagger())
    .post('/sign-in', ({ body }) => signIn(body), {
        body: t.Object({
            username: t.String(),
            password: t.String()
        })
    })
    .listen(8080)

글을 마치며

오늘은 Bun 1.0에 대해 알아보았습니다.
감사합니다.

profile
성장을 향한 작은 몸부림의 흔적들

0개의 댓글