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다들 다음에 봐요.
Community Posts
No posts yet. Be the first to write about this video!
Write about this video