728x90
반응형
Incredibly fast JavaScript runtime, bundler, test runner, and package manager -- all in one
(믿을 수 없을 정도로 빠른 JavaScript 런타임, Bundler, Test Runner 및 Package Manager - 모두 하나로)
개요
- 최근에 Bun 이라는 도구를 발견했다. 알고보니 이미 2023년 인기 오픈소스로 선정 된 Bun !
- 웹 서버 성능이 매우 우수하다는 평가를 들었고, 번들링과 테스팅 기능도 함께 갖추고 있다고 해서 호기심이 생겨 공식 홈페이지를 찾아보고 동작 방식을 간단히 이해를 기반으로 Bun 포스팅을 작성하고자 한다.
** 오픈 소스 트랜드는 어디서 알 수 있는가!
https://risingstars.js.org/2023/en#section-all
자바스크립트 런타임
- 자바스크립트로 작성된 프로그램을 실행시켜주는 소프트웨어
- 웹 브라우저(크롬, 사파리, 파이어폭스 등)
- Node.js
- Deno
- Bun
- just-js (V8)
- react native (Hermnes)
- 자바스크립트 런타임은 자바스크립트 엔진과 함께 필요한 라이브러리, API 및 다른 구성 요소를 포함한다.
자바스크립트 엔진
- 자바스크립트 런타임의 구성 요소
- Google V8 (Chrome/Brave/Edge/Opera, Node.js, Deno)
- JavaScriptCore (Safari, Bun)
- SpiderMonkey (Firefox) : 최초의 자바스크립트 엔진
- Chakra (Edge/IE)
- 자바스크립트 엔진은 스크립트 명령을 가져와 실행하고 기계어로 변환하는 기능을 한다.
Bun 이란?
- Jarred Sumner가 Node.js를 즉시 대체하기 위한 목적으로 설계되었다.
- 단일 실행 파일로 제공되는현대식 JavaScript 생태계 앱을 위한 올인원 툴킷이다.
- runtime
- Node.js 호환 Package Manager
- Bundler
- Test Runner
- Node.js의 드롭 인 교체로 설계되어, FS, Path, Buffer 등을 포함하여 수백 개의 Node.js 및 웹 API를 기본적으로 구현하고 있다.
- 서버 측 JavaScript를 실행시 성능을 향상시키고 복잡성을 줄이며 개발자 생산성을 높힐 수 있는 도구를 제공하기 위한 목적을 가지고 있다.
Bun 설계 목표
- 속도
- Node.js를 더 빠르고, 더 간결하고, 현대적으로 대체하도록 설계되어, 현재 Node.js보다 4배 빠른 런타임 제공
- 사용하기 쉽고 직관적인 API
- HTTP 서버 시작, fetch, WebSocket 등 같은 일반적인 작업을 수행하기위한 최소 최적화 된 표준 웹 API 세트를 제공
- 사용자 경험을 향상뿐 아니라 브라우저 및 서버 간의 호환성을 높혀준다.
- 일관된 개발 경험
- JavaScript 앱을 구축하는 데 필요한 모든 도구를 포함을 위해 1,000개의 node_modules 대신 내장 도구 제공
- Bun의 내장 도구는 기존 옵션보다 훨씬 빠르며 변경 사항이 거의 또는 전혀 없이 기존 Node.js 프로젝트에서 사용이 가능하다.
Bun Toolkit
runtime |
Package Manager
|
Bundler | Test Runner |
Package Runner
|
API |
|
|
|
Node.js vs. Bun
1. command-line - runtime, Package Manager, Bundler, Test Runner, Package Runner
Bun
bun run start # run the `start` script
bun install <pkg> # install a package
bun build ./index.tsx # bundle a project for browsers
bun test # run tests
bunx cowsay 'Hello, world!' # execute a package
node.js
npm run start
npm install <pkg>
npm install webpack && npx webpack ./index.tsx
npm install Jest && npx Jest
npx cowsay 'Hello, world!'
2. Bundle for the browser - Bun.build
Bun
// build.js
try {
await build({
mode: 'production'
entrypoints: ['./index.tsx'],
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js',
},
minify: true,
plugins: [ /* ... */ ]
});
console.log('Build completed successfully!');
} catch (error) {
console.error('Error during build:', error);
}
bun build ./build.js
node.js
npm install webpack
// webpack.config.js
const path = require('path');
module.exports = {
mode: 'production',
entry: './index.tsx',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js',
},
resolve: {
extensions: ['.tsx', '.ts', '.js'],
},
module: {
rules: [
{
test: /\.tsx?$/,
use: 'ts-loader',
exclude: /node_modules/,
},
],
},
};
npx webpack
3. API - Start an HTTP server
Bun
// index.js
Bun.serve({
port: 3000,
fetch(request) {
return new Response(Readable.from(["Welcome to Bun!]), {
headers: { "Content-Type": "text/plain" },
});
},
});
node.js
// index.js
const http = require('http');
http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Welcome to Bun!');
}).listen(3000);
Node.js vs. Deno vs. Bun 자바스크립트 런타임 비교
Node.js(노드)
|
Deno(데노)
|
Bun(번)
|
|
공통점 |
|
||
|
|||
탄생년도 | 2009 | 2018 | 2022 |
프로그래밍 언어 | C++ | Rust | Zig |
자바스크립트 엔진 | V8 | V8 | JavaScriptCore |
장점 |
|
|
|
단점 |
|
|
|
적합한 상황 |
|
|
|
Bun 속도, 성능이 좋은 이유
1. Zig
- 메모리를 직접 조정할 수 있는 Zig 같은 로우레벨 언어를 사용였다.
- 비동기적으로 여러 작업을 처리할 수 있게 설정하여 작업을 블로킹하지 않는다.
- 메모리 할당 및 해제에 따른 오버헤드를 줄일수 있게 설정 하여 시작 시간과 메모리 사용량을 줄인다.
2. TS , JSX 지원
- 별도 모듈 없이 Bun의 트랜스파일러는 Typescript와 JSX 형식으로 작성된 코드들을 엔진에서 vanilla JavaScript로 변환해준다.
- 번들링이나 변환에 따른 부가 손실을 줄여준다.
3. CommonJS, ESM 호환성
- 자바스크립트가 ES Module 방향으로 진화하지만, Node.js는 CommonJS방식을 사용 중이다.
- Bun은 CommonJS 모듈을 지원하지만 기본적으로 ESM 사용을 권장하고 있다.
- ESM은 더 작은 모듈 단위로 코드를 분할하고 더 효율적으로 로드할 수 있게 해준다.
4. Bun의 내장 도구
- 노드 모듈을 웹 표준 API로 직접 구현하여 경량화 및 효율성을 높혔다.
Bun 커뮤니티
728x90
반응형
'frontend > JavaScript' 카테고리의 다른 글
[JavaScript] 컴파일러와 트랜스파일러의 동작 원리 이해하기 (0) | 2024.04.11 |
---|---|
[Javascript] 생산성 코드 작성 방법 - 코드 줄여쓰기 (0) | 2024.03.04 |
[JavaScript] Jaml: JavaScript를 위한 아름다운 HTML 생성 (0) | 2024.01.12 |
[JavaScript] 웹표준 자바스크립트 ECMAScript(es5, es6) (0) | 2024.01.08 |
[JavaScript] 배열 합집합, 교집합 반환하기 (0) | 2023.12.30 |