[Bun] 초고속 JavaScript 런타임! Bun 에 대해 알아보자

Bun에 대하여...

<자바스크립트 엔진>

자바스크립트 엔진이란 우리가 작성한 자바스크립트 코드를 컴퓨터가 특정 작업을 수행할 수 있는 기계어 코드로 변환하는 프로그램. Node.js는 크롬 브라우저를 구동하는 구글의 V8 엔진을 사용하는 반면, Bun은 애플에서 사파리용으로 개발한 오픈 소스 자바스크립트 엔진인 JavaScriptCore(JSC)를 사용

 

JSC는 실행 시간은 약간 느리지만, 시작시간이 빠르며 메모리 사용량 감소를 우선시한다. V8은 런타임 최적화를 통해 빠른 실행을 우선시 하기 때문에, 메모리 사용량이 늘어날 수 있다.따라서Bun 은 Node.js보다 최대 4배 더 빠르게 시작할 수 있다.

 

<실행>

Bun은 런타임에 자바스크립트 트랜스파일러가 통합되어 있어 .js, .ts, .jsx, .tsx파일을 직접 실행할 수 있다. Bun 에 내장된 트랜스파일러가 이러한 파일을 바닐라 자바스크립트로 원활하게 변환하여 추가 단계 없이 즉시 실행할 수 있도록 도와준다. 즉, node.js 에서 실행했던 별도의 npm install-D typescript ts-node 명령어나 , package.json에서 스크립트 설정 ... 등의 단계가 필요 없다는 뜻이다! 

 

 

<ESM 및 CommonJS 호환성>

자바스크립트에서는 주로 Common.js와 ESModule 모듈 시스템을 사용한다. node.js에서는 ESM을 지원하고 있지만 여전히 Common.js는 널리 사용되고 있으며, 전환 과정이 필요하다는 점에서 default 로 느껴지지는 않는다. 

 

Common.js 모듈 사용 :

require과 module.export 문으로 동기식 모듈 처리가 진행된다.

 

ESM 모듈 사용:  

1. package.json에 "type":"module" 을 포함한다.

2. .mjs확장자를 사용한다. 

 

 

Bun의 뛰어난 기능은 별도의 설정 없이 import 와 require()를 모두 지원한다는 점인데, Node.js에서 기본적으로 이는 불가능한 기능이다.

 

Bun vs Node.js: 패키지 관리자

bun install npm install package.json의 모든 종속성 설치
bun add <package> npm install <package> 프로젝트에 새 패키지 추가
bun add <package> --dev npm install <package> --dev 새 개발 전용 패키지 추가
bun remove <package> npm uninstall <package> 프로젝트에서 패키지 제거
bun update <package> npm update <package> 특정 패키지를 최신 버전으로 업데이트
bun run <script> npm run <script> package.json에서 지정된 스크립트를 실행

 

Bun vs Node.js: 번들러

bun build ./index.ts --outdir ./build

index.ts 파일을 번들링하여 ./build 디렉터리에 결과를 출력

 

 

Bun vs Node.js : 테스트 러너

Node.js에서는 테스트를 위해 Jest에 의존해왔다. 하지만 Bun에는 내장된 테스트러너가 있다. 이는 완벽하게 Jest와 호환되며, npx jest, yarn test 등 대신 Bun test명령어로 사용 가능하다.(Bun이 내부에서 처리해줌 : There's often no need for code changes.)

import {test, expect} from "@jest/globals";
import {test, expect} from "bun:test";

 

import { test, expect } from 'bun:test';

test('2 + 2', () => {
  expect(2 + 2).toBe(4);
});


// Jest또는 Vitest에서 마이그레이션
// index.test.ts
import { test } from '@jest/globals';

describe('test suite', () => {
  test('addition', () => {
    expect(1 + 1).toBe(2);
  });
});

 

 

 

bun 설치

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

 

설치 명령 이후에 바로 bun init 명령어를 하면

zsh: command not found: bun 이렇게 나올 수 있는데, 그때는 exec /bin/zsh로 터미널을 재시작 해주면 된다. 

 

bun 설치 확인

bun --help

 

 

 

bun 으로 빈 프로젝트 생성

Bun을 사용하면 bun init -y 명령으로 빈 프로젝트를 생성할 수 있다.

bun init -y

몇 개의 파일이 생성되었으며, index.ts에 console.log("Hello, Bun!")이 추가된다.

 

bun 실행

bun run 파일

ex) bun run index.ts로 실행하면 Hello,Bun! 이 출력 

 

 

Bun API

Bun.serve()

Bun.serve({
  port: 3000,
  fetch(request) {
    return new Response('Hello from Bun!');
  },
});

Bun (index.ts)

import http from 'http';
const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello from Node.js!');
});
server.listen(3000);

Node.js (index.mjs)

 

내장 명령어 Bun.serve로 간단하게 서버를 실행할 수 있다.

 

 

 


ref :

https://medium.com/@laiso/what-makes-bun-install-faster-than-npm-install-370ec673bf0b

 

What Makes ‘bun install’ Faster Than ‘npm install’?

⚡️ 25x faster — Switch from npm install to bun install in any Node.js project to make your installations up to 25x faster. Official Bun…

medium.com

 

https://ykss.netlify.app/translation/bun_vs_node_js_everything_you_need_to_know/

 

(번역) Bun vs Node.js : 당신이 알아야 할 모든 것들

원문: Bun vs Node.js: Everything you need to know 9월 8일, 자바스크립트 커뮤니티에 새로운 소식이 들려왔습니다. Jarred Sumner가 만든 Bun v1.0이 출시되었기 때문입니다. 하지만 많은 사람들이 궁금해하는 것

ykss.netlify.app

https://bun.sh/guides/test/migrate-from-jest

 

Migrate from Jest to Bun's test runner | Bun Examples

In many cases, Bun's test runner can run Jest test suites with no code changes. Just run bun test instead of npx jest, yarn test, etc. - $ npx jest - $ yarn test + $ bun test There's often no need for code changes. Bun internally re-writes imports from @je

bun.sh