tinyjs: Electron 없이 6MB로 만드는 JS 데스크톱 앱
출처: GitHub tarwin/tinyjsapp (GeekNews 소개)
원문: https://github.com/tarwin/tinyjsapp
작성자: 팔복소프트-김팔복
한눈에 보기
- tinyjs는 백엔드와 화면을 모두 JavaScript로 짜는 데스크톱 앱 프레임워크이고, 배포 결과물이 약 6MB입니다.
- Electron, Node.js, Chromium을 넣지 않고 경량 런타임 txiki.js와 OS에 이미 깔린 WebView를 조합합니다.
- 화면과 백엔드는 HTTP 서버나 포트 없이 로컬 소켓으로 통신합니다.
- React, Vue, Svelte 등 Vite 기반 템플릿과 TypeScript를 지원하고, 백엔드에는 SQLite가 내장되어 있습니다.
- 빌드, macOS 코드 서명, 공증, 자동 업데이트까지 CLI 하나로 처리합니다.
- 주력 플랫폼은 macOS이고 Windows와 Linux는 아직 베타입니다. MIT 라이선스입니다.
배경: 왜 또 데스크톱 프레임워크인가
JavaScript로 데스크톱 앱을 만든다고 하면 대부분 Electron을 떠올립니다. 개발은 편하지만 앱마다 Chromium과 Node.js를 통째로 싣고 다녀서, 작은 사내 도구도 설치 파일이 무거워집니다. 이 문제를 줄이려고 나온 대표적인 대안이 OS 내장 WebView를 쓰는 Tauri인데, 백엔드를 Rust로 짜야 한다는 진입 장벽이 있습니다. tinyjs는 "WebView는 OS 것을 빌리고, 백엔드는 JS 그대로"라는 조합으로 그 사이를 노립니다.
그림 1. JS 데스크톱 앱을 만드는 세 가지 방식 비교 (팔복소프트 작성)
주요 내용
구조: 실행 파일 두 개와 소켓 하나
tinyjs 앱은 두 프로세스로 돌아갑니다. 백엔드는 txiki.js(작은 JavaScript 런타임) 위에서 사용자의 src/main.js를 실행하고, C++로 만든 런처가 창과 WebView를 띄웁니다. 둘은 임시 폴더에 만든 Unix 도메인 소켓(Windows는 named pipe)으로 한 줄씩 메시지를 주고받습니다. 포트를 열지 않으니 포트 충돌이나 외부 스캔 걱정이 없습니다.
그림 2. tinyjs 앱의 두 프로세스와 통신 구조 (팔복소프트 작성)
6MB 중 런타임(tjs)이 5.6MB, 런처가 플랫폼별 1.2~2.0MB입니다.
그림 3. 배포 크기 구성, 원문 수치 기준 (팔복소프트 작성)
| 플랫폼 | WebView | 통신 방식 | 상태 |
|---|---|---|---|
| macOS | 시스템 WebKit | Unix 소켓 | 정식 |
| Windows | WebView2 | named pipe | 베타 |
| Linux | WebKitGTK 4.1 | Unix 소켓 | 베타 |
개발 방식
백엔드에서 api 객체로 함수를 내보내면 화면에서 바로 호출할 수 있습니다. 화면 쪽에는 tiny 전역 객체가 자동으로 들어갑니다.
// src/main.js — 백엔드
export const api = {
add: ({ a, b }) => a + b,
};
// 화면 쪽 스크립트
const sum = await tiny.api.call('add', { a: 1, b: 2 });
tinyjs dev는 핫 리로드를 지원하고, --template react-ts 같은 Vite 템플릿과 esbuild로 번들되는 TypeScript 백엔드도 쓸 수 있습니다. 백엔드는 파일, 소켓, 프로세스, FFI(네이티브 라이브러리 호출)에 접근하고 SQLite가 내장입니다. 다만 이 SQLite는 완전히 동기식이고, better-sqlite3와 달리 get()이 없어서 .all()[0]으로 꺼내야 합니다.
배포와 업데이트
tinyjs build가 코드 서명된 .app을 만들고, tinyjs publish가 업데이트용 zip과 manifest를 만듭니다. 앱은 sha256과 서명을 검증해 스스로 교체하고, 실패하면 롤백합니다.
그림 4. 프로젝트 생성부터 업데이트 배포까지의 CLI 흐름 (팔복소프트 작성)
알아둘 제약
- 기본 서명은 ad-hoc이라 다른 사람 Mac에서는 Gatekeeper가 막습니다. 일반 배포를 하려면 Apple Developer Program($99/년)으로 Developer ID 인증서와 공증이 필요합니다.
- 빌드된 앱은 macOS 15 이상에서 돌아갑니다. 기본 빌드는 빌드한 Mac의 CPU 아키텍처 전용이라, Intel Mac까지 지원하려면
--arch나--universal옵션을 써야 합니다. - Linux에서는 추가 GStreamer 플러그인 없이는 AAC/M4A가 재생되지 않고, Web Audio로 소리를 내면 끊김이 생긴다고 원문이 직접 경고합니다.
팔복소프트 관점
- 국내에서 가장 걸리는 부분은 Windows 베타입니다. 국내 업무 PC는 Windows 비중이 압도적이라, 사내 배포용 도구를 만든다면 지금 tinyjs를 주력으로 고르기는 이릅니다. 반대로 Mac 중심인 스타트업 개발팀이 자기들끼리 쓰는 내부 도구라면 바로 써볼 만합니다.
- Tauri와 비교하면 차이는 "백엔드 언어"입니다. 둘 다 OS WebView를 써서 가볍지만, Tauri는 Rust를 알아야 하고 tinyjs는 JS만 알면 됩니다. 프런트엔드 개발자만 있는 팀에게는 tinyjs 쪽 진입 장벽이 확실히 낮습니다. 대신 생태계 규모와 검증 기간은 Tauri가 훨씬 앞서 있습니다.
- "OS WebView를 빌린다"는 건 양날의 검입니다. 용량이 작아지는 대신, 같은 코드가 macOS에서는 WebKit, Windows에서는 WebView2로 렌더링됩니다. Electron처럼 "어디서나 같은 Chromium"이 보장되지 않으니, 크로스 플랫폼이라면 브라우저별 차이를 테스트하는 비용을 각오해야 합니다.
- txiki.js는 Node.js가 아닙니다. Node 전용 API에 기대는 npm 패키지는 그대로 동작하지 않을 수 있으니, Electron 앱을 옮길 생각이라면 백엔드 의존성부터 점검하세요.
정리
tinyjs는 Electron의 편의성과 Tauri의 가벼움 사이를 JS만으로 채우려는 시도입니다. 기억할 것은 세 가지입니다. 결과물은 약 6MB로 작고, 백엔드도 JS로 짜며, 현재 제대로 쓸 수 있는 건 macOS뿐이라는 점입니다. Windows 지원이 베타를 벗어나는 시점이 국내 실무에서 본격적으로 검토할 타이밍입니다.
- tinyjs
- Electron 대안
- 데스크톱 앱
- JavaScript
- txiki.js
아직 댓글이 없습니다.