Deno Desktop: Deno 프로젝트를 데스크톱 앱으로 패키징

5 hours ago 3
  • 웹 앱과 TypeScript 코드로 만든 Deno 프로젝트를 플랫폼별 재배포 가능한 데스크톱 앱 바이너리로 묶을 수 있음
  • 출력물은 애플리케이션 코드, Deno 런타임, 웹 렌더링 엔진을 함께 포함하며, Deno v2.9.0에 들어갔지만 아직 안정 릴리스는 아님
  • 기본 WebView 백엔드는 운영체제 내장 webview를 사용해 작은 바이너리를 지향하고, 렌더링 일관성이 필요하면 Chromium(CEF) 백엔드를 선택할 수 있음
  • Next.js, Astro, Fresh, Remix, Nuxt, SvelteKit, SolidStart, TanStack Start, Vite SSR 프로젝트를 감지해 릴리스 모드와 --hmr 개발 모드에 맞게 서버를 실행함
  • Deno 코드와 webview 간 통신은 소켓 기반 IPC가 아닌 인프로세스 채널을 쓰며, 교차 컴파일과 bsdiff 기반 자동 업데이트까지 범위에 포함됨

deno desktop의 역할과 현재 상태

  • deno desktop은 Deno 프로젝트를 자체 포함형 데스크톱 애플리케이션으로 변환함
    • 입력은 단일 TypeScript 파일부터 Next.js 앱까지 가능함
    • 출력은 플랫폼별로 재배포 가능한 바이너리임
    • 바이너리에는 애플리케이션 코드, Deno 런타임, 웹 렌더링 엔진이 포함됨
  • 이 기능은 Deno v2.9.0에 포함되어 있지만 아직 안정 릴리스는 아님
    • 지금 시험하려면 deno upgrade canary로 canary 빌드를 설치해야 함
    • 명령어, 설정 키, TypeScript API는 안정화 전까지 바뀔 수 있음

백엔드 선택과 웹 프로젝트 실행

  • 웹 기술을 데스크톱 UI 툴킷으로 쓰면서, 기존 웹 스택 기반 데스크톱 앱 도구의 트레이드오프를 줄이는 방향을 택함
    • Electron, Tauri, Electrobun 같은 도구는 큰 바이너리, 플랫폼 지원 누락, JavaScript 생태계 부재, 내장 업데이트 부재, 프레임워크 통합 부재 같은 트레이드오프가 있을 수 있음
  • 기본 WebView 백엔드는 운영체제의 webview를 사용해 작은 바이너리를 지향함
    • Deno의 Node 호환 계층을 통해 npm 생태계를 사용할 수 있음
    • macOS·Windows·Linux에서 같은 렌더링이 필요하면 번들된 Chromium인 CEF 백엔드를 선택할 수 있음
  • 프레임워크 자동 감지는 기존 웹 프로젝트를 코드 변경 없이 데스크톱으로 실행하는 방식임
    • 대상은 Next.js, Astro, Fresh, Remix, Nuxt, SvelteKit, SolidStart, TanStack Start, Vite SSR 등임
    • 릴리스 모드에서는 프로덕션 서버를 실행함
    • --hmr에서는 핫 리로드가 있는 개발 서버를 실행함

런타임 통신, 빌드, 업데이트

  • 백엔드와 UI 통신에는 인프로세스 채널을 사용함
    • 값은 호출 경계를 넘을 때 인코딩됨
    • Deno 코드와 webview 사이에 교차 프로세스 왕복이 없음
  • 한 머신에서 macOS, Windows, Linux용으로 교차 컴파일할 수 있음
    • 백엔드는 로컬에서 빌드하지 않고 필요할 때 다운로드됨
  • 자동 업데이트는 latest.json 매니페스트와 bsdiff 패치를 사용하는 내장 바이너리 차분 업데이트 방식임
    • 런타임이 폴링, 적용, 실패한 실행에 대한 롤백을 처리함

간단한 예제와 문서 구성

  • 한 파일짜리 데스크톱 앱은 Deno.serve()로 HTML 응답을 반환하는 main.ts를 만들고 deno desktop main.ts를 실행해 만들 수 있음
Deno.serve(() => new Response("<h1>Hello, desktop</h1>", { headers: { "content-type": "text/html" }, }) ); deno desktop main.ts
  • 컴파일된 바이너리는 Deno.serve() 핸들러에 바인딩된 로컬 HTTP 서버를 가리키는 창을 엶
    • macOS/Linux에서는 ./main으로 실행함
    • Windows에서는 .\main.exe로 실행함
  • Deno.serve()는 webview가 이동하는 주소에 자동 바인딩되므로 포트나 호스트 이름을 넘길 필요가 없음
  • 관련 문서는 설정, 백엔드, HTTP 서빙, 프레임워크, 창 관리, 바인딩, 메뉴, 트레이와 dock, 대화상자, 알림, HMR, DevTools, 자동 업데이트, 오류 보고, 배포, 비교, CLI 참조로 나뉨
    • Deno.BrowserWindow는 창 생명주기, 여러 창, 이벤트와 관련됨
    • Deno.autoUpdate()는 매니페스트, bsdiff, 롤백과 관련됨
    • bindings.<name>()은 webview에서 Deno 코드를 호출하는 바인딩 방식임
Read Entire Article