Bun 1.4, 의존성 15개를 삭제했습니다

BBetter Stack
Computing/SoftwareInternet Technology

Transcript

00:00:00BUN의 가장 크고 논란이 많은 업데이트인 러스트 재작성 버전, BUN 1.4가 방금 출시되었습니다.
00:00:04이전 재작성 논란에 대해서는 이미 영상을 다룬 적이 있으니, 새로운 기능들에만 집중해 보죠.
00:00:07일부 기능, 특히 표준 라이브러리 관련 기능들은 진심으로 마음에 듭니다.
00:00:11이제 헤드리스 브라우저, 이미지 라이브러리, 의사 터미널(pseudo-terminal), 마크다운이 내장되어 있기 때문이죠.
00:00:15크론잡, 표 기능 등이 추가되어 여러분이 쓰던 15개의 의존성을 대체합니다.
00:00:19지난 몇 년간 자바스크립트의 가장 큰 불만 중 하나는 표준 라이브러리의 부재였습니다.
00:00:23BUN이 이를 해결하고 있으며, 매주 발생하는 공급망 공격의 시대에 아주 훌륭한 행보입니다.
00:00:30먼저 Playwright와 Puppeteer를 제거하고 대신 BUN WebView를 사용할 수 있습니다.
00:00:37여기 이 코드를 사용하면 헤드리스 브라우저를 제어하고, 구독 버튼을 찾아 클릭할 수 있습니다.
00:00:41물론 아직 시청자 여러분의 컴퓨터에서 실행할 수는 없으니, 여러분이 직접 구독을 눌러주셔야 합니다.
00:00:44click, type, press, scroll 같은 모든 입력 메서드는 네이티브 브라우저 이벤트를 발생시키므로,
00:00:48페이지가 사용자를 실제 유저로 인식하게 됩니다. 맥에서는 시스템의 WebKit을 사용하므로,
00:00:52즉 사파리의 엔진을 쓰기 때문에 따로 설치할 것이 없습니다. 하지만 크롬 인스턴스가 필요하다면,
00:00:56backend 옵션을 Chrome으로 설정하여 설치된 크롬이나 크루미움 인스턴스를 사용할 수 있습니다.
00:01:01이는 윈도우나 리눅스를 사용할 때 하는 방식이죠. 헤드리스 크롬 하위 프로세스를 직접 실행하거나,
00:01:04이미 실행 중인 크롬 인스턴스에 연결할 수도 있습니다. 따라서 이 코드를 사용하면,
00:01:09맥에서 열려 있는 크롬 버전을 모두 BUN으로 제어할 수 있습니다. 게다가,
00:01:13Evaluate를 사용하여 페이지에서 자바스크립트를 실행하고 그 결과를 네이티브
00:01:17자바스크립트 값으로 받아올 수 있습니다. 원하는 기능에 대한 API가 아직 없다면
00:01:21로우레벨 CDP 명령어로 내려갈 수도 있습니다. 간단한 브라우저 자동화 작업에는 꽤 좋아 보이지만,
00:01:25Playwright를 완벽히 대체한다고 보기는 아직 어렵습니다. 테스트 러너나 트레이스 뷰어가 없거든요.
00:01:29하지만 스크래핑이나 컴퓨터 제어 스크립트 같은 용도라면 나쁘지 않은 선택입니다.
00:01:32다음으로, Sharp를 제거하고 대신 BUN.image를 사용해 봅시다. 완전한 이미지 라이브러리로서,
00:01:37파일을 가져와 .image를 호출한 뒤, 크기 조절, 회전 같은 연산을 체이닝할 수 있습니다.
00:01:42좌우 반전, 상하 반전, 밝기 및 선명도 조절, 그리고 다양한 이미지 포맷으로의 변환이 가능합니다.
00:01:46또한 픽셀 데이터를 디코딩하지 않고도 너비, 높이, 포맷 같은 메타데이터를 읽을 수 있습니다.
00:01:50제가 정말 마음에 드는 또 다른 멋진 기능은 플레이스홀더 이미지를 생성하는 기능입니다.
00:01:54실제 이미지가 로드되기 전에 HTML에 인라인으로 넣을 수 있는 저화질 버전이죠.
00:01:59BUN.image는 제가 사용하기 가장 기대되는 기능 중 하나입니다. 실제 배포와 빌드 과정에서
00:02:04Sharp와 관련된 문제를 겪은 적이 있기 때문이죠. 이제 BUN을 쓰면
00:02:08그런 고민을 할 필요가 없습니다. Marked에 대해서도 더 이상 신경 쓸 필요가 없습니다.
00:02:12이제 대신 BUN.markdown을 사용하여 마크다운을 파싱할 수 있으니까요. API는 단 세 개입니다.
00:02:16BUN.markdown.html은 마크다운을 HTML 문자열로 렌더링합니다. BUN.markdown.render는
00:02:22각 요소에 대한 커스텀 콜백과 함께 마크다운을 렌더링합니다. 이를 통해 커스텀 클래스가 적용된 HTML을
00:02:27ANSI 터미널 출력이나 기타 문자열 형식으로 렌더링할 수 있는 유연성을 제공합니다. BUN.markdown.react는 React.jsx로 렌더링하며,
00:02:33각 요소에 원하는 컴포넌트를 전달할 수 있어 매우 멋지게 스타일링된 마크다운을 얻을 수 있습니다.
00:02:37원하는 마크다운 기능을 제어하기 위해 토글할 수 있는 다양한 옵션도 제공됩니다.
00:02:41깃허브 형식의 표, 자동 링크, 제목 ID, 위키 링크 같은 기능을 사용할 수 있습니다.
00:02:45다만 한 가지 경고할 점은 HTML 출력이 sanitize(정화)되지 않는다는 것입니다.
00:02:50따라서 순수 HTML, 이벤트 헤더 속성, 자바스크립트 등이 모두 그대로 통과하므로
00:02:54사용자가 작성한 마크다운을 렌더링하는 경우라면 그 보안 문제는 여전히 여러분이 해결해야 합니다.
00:02:59그럼에도 요즘 생성되는 마크다운이 워낙 많기 때문에 꽤 훌륭한 추가 기능으로 보입니다.
00:03:03다음으로, Node.pty를 제거할 수 있습니다. BUN.terminal은 내장 의사 터미널을 제공하여
00:03:08자바스크립트에서 Bash, Vim, HTOP을 구동할 수 있게 해줍니다. 일렉트론 앱 내부에 터미널을 탑재해 본 적이 있다면
00:03:12그 고통을 잘 아실 겁니다. 이는 사실 BUN.spawn에 추가된 기능으로,
00:03:17terminal 옵션을 전달하면 의사 터미널이 연결된 하위 프로세스를 생성합니다. 하위 프로세스는 실제 터미널로 인식하여
00:03:22컬러 출력, 커서 이동, 인터랙티브 프롬프트가 가능해집니다. 터미널이 생기면
00:03:26해당 터미널에 데이터를 쓰고, 크기를 조절하고, 닫는 등의 작업을 할 수 있습니다. 또한
00:03:31나만의 터미널을 만들어 여러 하위 프로세스에 걸쳐 재사용할 수도 있습니다. 이 모든 기능들에서 어떤 패턴이 보이기 시작하는데요,
00:03:35Claude Code가 사용할 법한 기능들로 보입니다. 그러니 저런 기능들이 대규모로 사용되는 모습을 볼 수 있게
00:03:39저쪽도 오픈소스로 공개했으면 좋겠네요. 다음에 제거할 의존성은 Node.cron입니다.
00:03:43이제 BUN.cron을 사용하면 되기 때문이죠. 함수를 전달하면
00:03:47시스템 크론 없이 이벤트 루프 상에서 간단히 실행되며, 스크립트를 전달하면
00:03:51리눅스의 crontab, 맥OS의 launchd, 윈도우의 작업 스케줄러를 실제로 사용하는 OS 수준의 크론잡을 등록합니다.
00:03:56요일 및 daily 같은 헬퍼를 포함한 표준 크론 구문을 사용할 수 있으며,
00:04:01시스템의 로컬 시간대에 맞춰 다음 일치하는 날짜를 반환하는 크론 구문 파싱도 지원합니다.
00:04:05시간대 이야기 김에 말씀드리면, 모든 작업은 기본적으로 로컬 시간으로 실행되지만
00:04:11이를 변경할 수 있는 명시적인 옵션도 제공하므로 언제 실행될지 확실히 알 수 있습니다.
00:04:15다음 일정은 concurrently나 npm-run-all을 제거하라고 말씀드리는 것입니다. BUN에 자체 병렬 실행 옵션이 생겼거든요.
00:04:20이 플래그를 사용하면 여러 package.json 스크립트를 동시에 실행할 수 있으며,
00:04:24출력 결과 앞에 해당 스크립트 이름이 깔끔하게 접두사로 붙습니다. 또한 스크립트 이름에 글로브 매칭을 사용할 수 있고,
00:04:28워크스페이스 내에서 어떤 패키지로 명령어를 실행할지 필터링할 수도 있으며,
00:04:32하나의 스크립트에 오류가 발생하더라도 다른 스크립트들은 계속 실행되도록 두는 옵션도 제공합니다.
00:04:37동시 실행뿐만 아니라 sequential을 사용하여 동일한 접두사 출력과 필터링 기능을 유지한 채
00:04:41스크립트를 하나씩 순차적으로 실행할 수도 있습니다. 이건 제가 가장 많이 쓰게 될 것 같은 기능입니다.
00:04:45다음으로 제거할 것은 tar 아카이브 라이브러리입니다. BUN.archive는 tar와 gzip을 위한 빠르고 네이티브한 구현체입니다.
00:04:50아카이브를 만드는 것은 키가 경로이고 값이 콘텐츠인 객체를 만드는 것만큼 간단하며,
00:04:55콘텐츠는 문자열, 블롭, Uint8Array, 배열 버퍼 등 무엇이든 될 수 있습니다. 압축을 위해
00:05:00compress 옵션을 gzip으로 설정하고 1부터 12까지의 압축 레벨을 지정할 수 있습니다.
00:05:05물론 특정 파일만 추출하기 위한 글로브 패턴 같은 옵션으로 아카이브를 해제할 수도 있으며, 제가 정말 마음에 드는 기능은
00:05:10파일을 추출하지 않고도 아카이브를 읽을 수 있다는 점입니다. 여기 이 코드는
00:05:14npm 레지스트리에서 lodash를 가져와 단 하나의 파일도 추출하지 않고 package.json을 읽을 수 있습니다.
00:05:19지금까지 약 7개의 npm 패키지 필요성을 없앴으며, 아직 더 남았습니다.
00:05:24다만 이 기능들은 비교적 작아서 빠르게 짚고 넘어가겠습니다. 첫째, BUN.serve가 이제 정적 파일을 서빙할 수 있어
00:05:28serve-static 패키지가 필요 없으며, 웹사이트의 public 폴더를 서빙하기에 아주 좋습니다.
00:05:33둘째, BUN이 JSON5와 XML을 지원하게 되어 더 이상 관련 패키지가 필요 없습니다. BUN 안에서 두 포맷 모두
00:05:38import하고, 파싱하고, stringify할 수 있습니다. 마지막 세 개는 터미널을 위한 헬퍼입니다.
00:05:43BUN.sliceAnsi, BUN.wrapAnsi, BUN.stringWidth가 추가되어 터미널 열(column)을 인식하는 자르기, 줄 바꿈, 너비 측정이 가능해지며
00:05:47slice-ansi, cli-truncate, wrap-ansi, string-width 같은 패키지들의 필요성을 없애줍니다.
00:05:52전체적으로 약 15개의 패키지가 사라졌고, 이번 릴리스의 절반 정도만 다룬 셈입니다.
00:05:56이번 블로그 글의 요약은 많은 부분이 빨라졌고, CPU 사용량이 개선되었으며, 시작 속도가 빨라졌다는 것입니다.
00:06:01이러한 모든 기능에도 불구하고 바이너리 크기는 17% 더 작아졌습니다. 아, 그리고 러스트로 작성되었죠.
00:06:06언급할 가치가 있는 보너스 기능 하나는 BUN.install에 글로벌 가상 스토어가 생겼다는 점입니다.
00:06:10isolated linker를 활성화하면, 패키지들이 컴퓨터에 한 번만 추출된 후
00:06:14모든 프로젝트에 개별적으로 복사되는 대신 node_modules에 심볼릭 링크로 연결됩니다.
00:06:19프로젝트가 많을 때 속도가 빨라지고 공간도 절약될 것입니다. 자, 이제 BUN에 대해 어떻게 생각하시나요?
00:06:23사용하고 계시나요? 이러한 기능 중 일부를 사용하실 건가요? 아래 댓글로 알려주세요.
00:06:27잠깐, 구독도 부탁드리며 늘 그렇듯 다음 영상에서 뵙겠습니다.
00:06:36다들 다음에 봐요.

Key Takeaway

BUN 1.4는 러스트 재작성을 통해 헤드리스 브라우저, 이미지 처리, 터미널, 크론 등 내장 표준 라이브러리를 대거 확충하여 15개의 외부 의존성 패키지를 대체한다.

Highlights

  • BUN 1.4는 러스트로 재작성되었으며 바이너리 크기가 이전 버전보다 17퍼센트 감소했다.

  • BUN WebView는 Playwright와 Puppeteer를 대체하며 시스템 WebKit과 크롬 인스턴스를 활용한다.

  • BUN.image는 Sharp 패키지를 대체하며 크기 조절, 회전, 메타데이터 읽기, 플레이스홀더 이미지 생성 기능을 제공한다.

  • BUN.terminal은 Node.pty를 대체하여 자바스크립트 환경에서 Bash, Vim, HTOP을 구동할 수 있다.

  • BUN 1.4의 새로운 내장 표준 라이브러리 기능들로 인해 총 15개의 외부 의존성 패키지를 삭제할 수 있다.

  • BUN.install의 글로벌 가상 스토어와 isolated linker는 패키지를 한 번만 추출한 후 심볼릭 링크로 연결하여 디스크 공간을 절약한다.

Timeline

BUN 1.4 업데이트 개요 및 내장 라이브러리 도입 배경

  • BUN 1.4는 러스트로 재작성된 가장 큰 업데이트로 출시되었다.
  • 헤드리스 브라우저, 이미지 라이브러리, 의사 터미널, 마크다운 등의 표준 기능이 내장되었다.
  • 이러한 내장 기능들은 자바스크립트 생태계에서 15개의 기존 의존성을 대체한다.

자바스크립트 진영의 고질적인 불만이었던 표준 라이브러리 부재 문제를 해결하기 위해 여러 핵심 기능들이 기본 탑재되었다. 공급망 공격이 빈번한 환경에서 외부 패키지 의존도를 낮추는 효과적인 행보를 보여준다.

브라우저 자동화와 이미지 처리를 대체하는 내장 기능

  • BUN WebView는 Playwright나 Puppeteer를 대체하여 브라우저 자동화 작업을 수행한다.
  • 맥 환경에서는 시스템 WebKit을 사용하며 윈도우와 리눅스에서는 크롬 인스턴스에 연결할 수 있다.
  • BUN.image는 Sharp 라이브러리를 대체하며 이미지 변환, 메타데이터 읽기, 저화질 플레이스홀더 생성을 지원한다.

입력 메서드들은 네이티브 브라우저 이벤트를 발생시켜 실제 유저 동작을 모사한다. 이미지 처리 영역에서는 픽셀 데이터를 디코딩하지 않고도 메타데이터를 빠르게 읽을 수 있어 빌드 및 배포 과정의 오류를 줄인다.

마크다운 파싱과 터미널 및 크론잡 기능

  • BUN.markdown은 Marked 패키지를 대체하여 HTML, React JSX 등으로 마크다운을 렌더링한다.
  • BUN.terminal은 Node.pty를 대체하여 자바스크립트 내에서 Bash와 Vim 같은 도구를 구동한다.
  • BUN.cron은 이벤트 루프 기반 실행과 OS 수준의 크론잡 등록을 모두 지원한다.

마크다운 API는 깃허브 형식의 표와 위키 링크 등을 제어하는 옵션을 제공한다. 의사 터미널은 BUN.spawn과 결합하여 인터랙티브 프롬프트와 컬러 출력을 구현하며, 크론잡은 로컬 시간대에 맞춘 구문 파싱을 처리한다.

병렬 스크립트 실행, 아카이브 처리 및 기타 소형 패키지 대체

  • 자체 병렬 및 순차 실행 옵션으로 concurrently나 npm-run-all 패키지를 제거할 수 있다.
  • BUN.archive는 파일을 실제로 추출하지 않고도 tar와 gzip 아카이브 내부를 읽을 수 있다.
  • 정적 파일 서빙, JSON5, XML, 터미널 헬퍼 기능들이 추가되어 총 15개의 패키지 필요성이 사라졌다.

스크립트 실행 시 출력 결과에 접두사가 붙으며 필터링이 가능하다. 또한 글로벌 가상 스토어와 isolated linker를 통해 패키지를 심볼릭 링크로 연결하여 대규모 프로젝트의 실행 속도를 높이고 디스크 공간을 절약한다.

Community Posts

No posts yet. Be the first to write about this video!

Write about this video