From 6d01f8d5509796a37f8014048efa3cb488b6db2a Mon Sep 17 00:00:00 2001 From: Seokju Na Date: Thu, 2 Jul 2026 11:30:06 +0900 Subject: [PATCH] docs: refine English and Korean docs for clarity and consistency MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A polish pass over all 57 documentation pairs (English + Korean), applying a shared style guide distilled from three references: Vite's concise, active voice; the technical-writing.dev review principles; and Toss's Korean 존댓말 conventions. Korean (41 files): - Fix 19 josa errors — "번들" ends in ㄹ so it takes 은/을/이, but "Webview Bundle는" / "Bundle를" were incorrect. - Unify terminology: 첫 페인트 → 첫 화면, 미리보기 → 미리 보기, 내려받다 → 다운로드, and the `builtin` source 내장 → 빌트인 (generic "built-in signing / SHA check" stays 내장). - Remove translationese and unnecessary passive constructions. English (7 files): - Passive → active voice, split run-on sentences, tighten wording; grammatical "over-the-air" (adjective) vs "over the air" (adverb). No code, commands, API signatures, config keys, URLs, versions, or frontmatter titles were changed; EN and KO kept in structural lockstep (net diff is 89/89 balanced, in-place edits only). Validated with `yarn gen:fumadocs` and `yarn build`. Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_01Gz6nnskhiMrHZvJ2dGE9qa --- content/docs/changelog/index.ko.mdx | 2 +- content/docs/changelog/index.mdx | 2 +- content/docs/config/index.ko.mdx | 2 +- content/docs/config/remote.ko.mdx | 4 ++-- content/docs/guide/bundle-sources.ko.mdx | 2 +- content/docs/guide/cli-programmatic.ko.mdx | 2 +- content/docs/guide/cli.ko.mdx | 4 ++-- content/docs/guide/commands/builtin.ko.mdx | 8 ++++---- content/docs/guide/commands/deploy.mdx | 2 +- content/docs/guide/commands/download.ko.mdx | 2 +- content/docs/guide/commands/download.mdx | 2 +- content/docs/guide/commands/pack.mdx | 2 +- content/docs/guide/index.ko.mdx | 4 ++-- content/docs/guide/platform-support.ko.mdx | 2 +- content/docs/guide/platforms/android.ko.mdx | 4 ++-- content/docs/guide/platforms/deno.ko.mdx | 4 ++-- .../guide/platforms/electron/builder.ko.mdx | 16 +++++++-------- .../guide/platforms/electron/forge.ko.mdx | 2 +- .../guide/platforms/electron/index.ko.mdx | 4 ++-- content/docs/guide/platforms/ios.mdx | 2 +- content/docs/guide/platforms/tauri.ko.mdx | 4 ++-- content/docs/guide/protocol-handling.ko.mdx | 6 +++--- content/docs/guide/providers/aws.ko.mdx | 2 +- .../docs/guide/providers/cloudflare.ko.mdx | 8 ++++---- content/docs/guide/providers/local.ko.mdx | 2 +- content/docs/guide/remote-bundles.ko.mdx | 2 +- content/docs/guide/spec/errors.ko.mdx | 2 +- content/docs/guide/spec/get-current.ko.mdx | 2 +- content/docs/guide/spec/head-current.ko.mdx | 2 +- content/docs/guide/spec/index.ko.mdx | 2 +- content/docs/guide/spec/list-bundles.ko.mdx | 2 +- content/docs/guide/why-webview-bundle.ko.mdx | 20 +++++++++---------- content/docs/references/bridge/index.ko.mdx | 6 +++--- content/docs/references/bridge/index.mdx | 2 +- content/docs/references/bridge/remote.ko.mdx | 2 +- content/docs/references/bridge/source.ko.mdx | 10 +++++----- content/docs/references/bridge/testing.ko.mdx | 2 +- content/docs/references/bridge/updater.ko.mdx | 2 +- content/docs/references/deno/index.ko.mdx | 6 +++--- content/docs/references/deno/protocol.ko.mdx | 2 +- content/docs/references/deno/source.ko.mdx | 2 +- content/docs/references/deno/updater.ko.mdx | 2 +- content/docs/references/deno/updater.mdx | 2 +- content/docs/references/node/bundle.ko.mdx | 2 +- content/docs/references/node/protocol.ko.mdx | 2 +- content/docs/references/node/remote.ko.mdx | 6 +++--- content/docs/references/node/source.ko.mdx | 2 +- content/docs/references/node/updater.ko.mdx | 4 ++-- 48 files changed, 90 insertions(+), 90 deletions(-) diff --git a/content/docs/changelog/index.ko.mdx b/content/docs/changelog/index.ko.mdx index 1728b53..208453c 100644 --- a/content/docs/changelog/index.ko.mdx +++ b/content/docs/changelog/index.ko.mdx @@ -1,6 +1,6 @@ --- title: 변경 이력 -description: Webview Bundle 릴리스를 추적하는 곳이며, 지금까지 배포된 버전을 확인할 수 있습니다. +description: Webview Bundle 릴리스와 지금까지 배포된 버전을 추적합니다. --- 릴리스는 패키지별로 발행됩니다. 따라서 공식 릴리스 노트는 각 레지스트리와 GitHub 릴리스 페이지에 있습니다. diff --git a/content/docs/changelog/index.mdx b/content/docs/changelog/index.mdx index f4e6ab1..0ac4339 100644 --- a/content/docs/changelog/index.mdx +++ b/content/docs/changelog/index.mdx @@ -1,6 +1,6 @@ --- title: Changelog -description: Where Webview Bundle releases are tracked, and the versions published so far. +description: Track Webview Bundle releases and the versions published so far. --- Releases are cut per package, so the authoritative release notes live with each registry and the diff --git a/content/docs/config/index.ko.mdx b/content/docs/config/index.ko.mdx index f3d2133..de045d9 100644 --- a/content/docs/config/index.ko.mdx +++ b/content/docs/config/index.ko.mdx @@ -63,7 +63,7 @@ wvb pack --config ./configs/wvb.prod.ts ### defineConfig 설정을 `@wvb/config`의 `defineConfig`로 감싸세요. 이 함수는 런타임에서는 항등 함수이며, -타입을 붙이는 것이 유일한 역할입니다. 객체, 설정으로 해석되는 프로미스, 또는 설정을 +타입을 붙이는 것이 유일한 역할입니다. 객체, 설정으로 이행되는 프로미스, 또는 설정을 반환하는 동기 혹은 비동기 함수를 받습니다. 따라서 불러오는 시점에 값을 계산할 수 있습니다. diff --git a/content/docs/config/remote.ko.mdx b/content/docs/config/remote.ko.mdx index 2decd74..6415779 100644 --- a/content/docs/config/remote.ko.mdx +++ b/content/docs/config/remote.ko.mdx @@ -161,8 +161,8 @@ signature: async ({ message }) => myExternalSigner(message), 클라이언트는 대응하는 **공개** 키로 검증하며, 검증 측은 서명 측과 다른 키 포맷을 받습니다. SPKI, - PKCS#1(RSA 전용), SEC1(ECDSA 전용), raw 32바이트(Ed25519 전용)를 받지만 JWK는 받지 않습니다. - 검증에 대해서는 [원격 번들](/docs/guide/remote-bundles)을, 클라이언트 측 헬퍼에 대해서는 [Node API + PKCS#1(RSA 전용), SEC1(ECDSA 전용), raw 32바이트(Ed25519 전용)를 받지만 JWK는 받지 않습니다. 검증 + 방법은 [원격 번들](/docs/guide/remote-bundles)을, 클라이언트 측 헬퍼는 [Node API 레퍼런스](/docs/references/node)를 참고하세요. diff --git a/content/docs/guide/bundle-sources.ko.mdx b/content/docs/guide/bundle-sources.ko.mdx index 380ae13..4e62ef8 100644 --- a/content/docs/guide/bundle-sources.ko.mdx +++ b/content/docs/guide/bundle-sources.ko.mdx @@ -86,7 +86,7 @@ description: Webview Bundle이 builtin 및 remote 소스에 걸쳐 번들을 디 | `entries.{name}.currentVersion` | string (optional) | 이 번들에 대해 제공되는 활성 버전입니다. | | `entries.{name}.previousVersion` | string (optional) | 현재 버전 직전에 활성이었던 버전입니다. | -각 버전의 메타데이터는 모든 필드가 선택 사항인 객체입니다. 빈 `{}`도 유효합니다. 메타데이터는 번들을 다운로드할 때 remote 서버의 응답 헤더로부터만 채워지기 때문입니다. +각 버전의 메타데이터는 모든 필드가 선택 사항인 객체입니다. 빈 `{}`도 유효합니다. 메타데이터는 번들을 다운로드할 때 remote 서버의 응답 헤더에서만 채워지기 때문입니다. | Field | Type | Description | | -------------- | ------ | ------------------------------------------------------------- | diff --git a/content/docs/guide/cli-programmatic.ko.mdx b/content/docs/guide/cli-programmatic.ko.mdx index e2db7d4..ff5157d 100644 --- a/content/docs/guide/cli-programmatic.ko.mdx +++ b/content/docs/guide/cli-programmatic.ko.mdx @@ -63,7 +63,7 @@ yarn add -D @wvb/cli ### pack -소스 디렉터리를 `.wvb` 아카이브로 패킹합니다. `outFile`에 확장자를 생략하면 `.wvb` 확장자가 자동으로 +소스 디렉터리를 `.wvb` 아카이브로 패킹합니다. `outFile`에서 확장자를 생략하면 `.wvb` 확장자가 자동으로 붙습니다. ```ts diff --git a/content/docs/guide/cli.ko.mdx b/content/docs/guide/cli.ko.mdx index 6d7cc97..762ac6a 100644 --- a/content/docs/guide/cli.ko.mdx +++ b/content/docs/guide/cli.ko.mdx @@ -54,7 +54,7 @@ yarn wvb --help ## 설정 파일 탐색 -명령어는 작업 디렉터리에 있는 `wvb.config` 파일에서 기본값을 로드합니다. 특정 파일을 가리키려면 `--config `를 전달하세요. 전달하지 않으면 `wvb`는 다음 순서로 첫 번째로 일치하는 파일을 찾습니다. +명령어는 작업 디렉터리에 있는 `wvb.config` 파일에서 기본값을 로드합니다. 특정 파일을 가리키려면 `--config `를 전달하세요. 전달하지 않으면 `wvb`는 다음 순서에 따라 첫 번째로 일치하는 파일을 찾습니다. ```text wvb.config.js @@ -111,7 +111,7 @@ wvb.config.jsonc /_.wvb` 형태로 배치된 파일을 하나씩 기록합니다. 내장 소스와 원격 소스가 함께 동작하는 방식은 [번들 소스](/docs/guide/bundle-sources)를 참고하세요. +이 명령어는 설치된 번들 집합을 설명하는 `manifest.json`과, 번들마다 `/_.wvb` 형태로 배치된 파일을 하나씩 기록합니다. 빌트인 소스와 원격 소스가 함께 동작하는 방식은 [번들 소스](/docs/guide/bundle-sources)를 참고하세요. ## Usage @@ -69,7 +69,7 @@ wvb builtin --no-write The version is the `--version` (`-V`) flag, not a positional argument. If you omit it, deploy uses diff --git a/content/docs/guide/commands/download.ko.mdx b/content/docs/guide/commands/download.ko.mdx index e7f4a2b..0467eab 100644 --- a/content/docs/guide/commands/download.ko.mdx +++ b/content/docs/guide/commands/download.ko.mdx @@ -15,7 +15,7 @@ wvb download app --no-write 첫 번째 예제는 현재 배포된 `app` 버전을 작업 디렉터리의 `app.wvb`로 다운로드합니다. 두 번째 예제는 특정 버전(`1.2.0`)을 명시한 경로로 다운로드하며, 기존 파일이 있으면 덮어씁니다. 세 번째 예제는 번들을 가져와 정보를 출력하되 디스크에는 아무것도 쓰지 않습니다. -번들 이름과 엔드포인트는 모두 [`wvb.config`](/docs/config/remote) 파일 값으로 대체되므로, 설정이 갖춰진 프로젝트 안에서는 보통 플래그 없이 `wvb download`만 실행해 현재 버전을 가져올 수 있습니다. +번들 이름과 엔드포인트는 모두 [`wvb.config`](/docs/config/remote) 파일 값을 기본값으로 사용하므로, 설정이 갖춰진 프로젝트 안에서는 보통 플래그 없이 `wvb download`만 실행해 현재 버전을 가져올 수 있습니다. ## Options diff --git a/content/docs/guide/commands/download.mdx b/content/docs/guide/commands/download.mdx index 862cd95..2fd3812 100644 --- a/content/docs/guide/commands/download.mdx +++ b/content/docs/guide/commands/download.mdx @@ -3,7 +3,7 @@ title: wvb download description: Download a bundle from a remote server to disk, or fetch and print its metadata. --- -`wvb download` fetches a bundle from a remote server and, by default, saves it to disk as a `.wvb` file. Pass a bundle name and an optional version; omit the version to download the version that is currently deployed. This is the read side of the publishing workflow that `wvb upload` and `wvb deploy` drive, and it is handy for verifying what a remote actually serves. +`wvb download` fetches a bundle from a remote server and, by default, saves it to disk as a `.wvb` file. Pass a bundle name and an optional version; omit it to download the version that is currently deployed. This is the read side of the publishing workflow that `wvb upload` and `wvb deploy` drive, and it is handy for verifying what a remote actually serves. ## Usage diff --git a/content/docs/guide/commands/pack.mdx b/content/docs/guide/commands/pack.mdx index 2adb959..27a6e5c 100644 --- a/content/docs/guide/commands/pack.mdx +++ b/content/docs/guide/commands/pack.mdx @@ -3,7 +3,7 @@ title: wvb pack description: Pack a directory of built web assets into a single compressed, integrity-checked .wvb archive. --- -`wvb pack` packs a directory of built web assets (HTML, JS, CSS, media) into a single `.wvb` archive. The archive is compressed and checksummed, and it is the unit your app ships and serves to its webview, or uploads to a remote for over-the-air (OTA) updates. +`wvb pack` packs a directory of built web assets (HTML, JS, CSS, media) into a single `.wvb` archive. The archive is compressed and checksummed. It is the unit your app ships and serves to its webview, or uploads to a remote for over-the-air (OTA) updates. Most projects run `wvb pack` with no arguments. The source directory, output path, and other defaults come from the [`wvb.config`](/docs/config) file discovered in the working directory. diff --git a/content/docs/guide/index.ko.mdx b/content/docs/guide/index.ko.mdx index cb12f70..25b25a8 100644 --- a/content/docs/guide/index.ko.mdx +++ b/content/docs/guide/index.ko.mdx @@ -6,7 +6,7 @@ description: 웹뷰 기반 프레임워크와 플랫폼을 위한 오프라인 Webview Bundle(`wvb`)은 빌드한 웹 자산(HTML/JS/CSS/미디어)을 압축되고 무결성이 검증된 단일 아카이브(`.wvb`)로 묶습니다. 앱은 이 아카이브를 함께 배포하고, 커스텀 URL 스킴을 통해 웹뷰에 제공합니다. 따라서 첫 화면은 네트워크를 기다리지 않습니다. 원격 서버를 설정하면 앱이 더 새로운 -번들을 무선(OTA, over-the-air)으로 내려받아, 네이티브 앱스토어 배포 없이 갱신된 코드를 +번들을 무선(OTA, over-the-air)으로 다운로드하여, 네이티브 앱스토어 배포 없이 갱신된 코드를 전달합니다. 하나의 `.wvb` 포맷이 공유 Rust 코어를 통해 모든 웹뷰 플랫폼에서 동작합니다. ![빌드 산출물을 .wvb 아카이브로 묶어 웹뷰에 제공하고, 원격 서버에서 무선으로 갱신합니다.](https://static.wvb.dev/diagrams/pack-serve-update.svg) @@ -43,7 +43,7 @@ yarn add -D @wvb/cli # ./dist를 .wvb/으로 묶습니다 (--outfile,-O로 변경). npx wvb pack -# http://localhost:4312에서 로컬 미리보기용으로 번들을 제공합니다. +# http://localhost:4312에서 로컬 미리 보기용으로 번들을 제공합니다. npx wvb serve ``` diff --git a/content/docs/guide/platform-support.ko.mdx b/content/docs/guide/platform-support.ko.mdx index 83d868f..35f0c67 100644 --- a/content/docs/guide/platform-support.ko.mdx +++ b/content/docs/guide/platform-support.ko.mdx @@ -122,7 +122,7 @@ webView.load(URLRequest(url: URL(string: "app://app.wvb")!)) ## Deno Desktop -Deno Desktop은 가장 최신 통합이며, JSR에 `@wvb/deno-desktop`로 올라와 있습니다. 번들 소스를 빌드하고 `Deno.serve` 호환 핸들러를 노출하며, 윈도우마다 하나의 프로토콜을 사용합니다. +Deno Desktop은 가장 최신 통합이며, JSR에 `@wvb/deno-desktop`으로 올라와 있습니다. 번들 소스를 빌드하고 `Deno.serve` 호환 핸들러를 노출하며, 윈도우마다 하나의 프로토콜을 사용합니다. Deno Desktop은 실험적입니다. [Deno Desktop 가이드](/docs/guide/platforms/deno)와 [Deno API diff --git a/content/docs/guide/platforms/android.ko.mdx b/content/docs/guide/platforms/android.ko.mdx index 40673a9..c65a787 100644 --- a/content/docs/guide/platforms/android.ko.mdx +++ b/content/docs/guide/platforms/android.ko.mdx @@ -108,7 +108,7 @@ wvb(context, config) // 짧은 별칭 ## 파일 제공 동작 방식 -커스텀 URL 스킴은 등록되지 않습니다. `install()`은 `WebViewClient`를 설정하며, 이 클라이언트의 `shouldInterceptRequest`가 일반적인 `http`/`https` 요청을 검사해 일치하는 요청을 번들 소스에서 제공합니다. 각 요청마다 핸들러는 호스트를 소문자로 바꾼 뒤 등록된 프로토콜을 순서대로 살펴봅니다. 호스트를 처음으로 받아들이는 매처가 승리합니다. 번들 프로토콜은 첫 번째 호스트 레이블을 번들 이름으로 삼고, 요청 경로에 해당하는 파일을 반환합니다. 일치하는 것이 없으면 `null`을 반환하고 `WebView`는 네트워크에서 로드합니다. +커스텀 URL 스킴은 등록되지 않습니다. `install()`은 `WebViewClient`를 설정하며, 이 클라이언트의 `shouldInterceptRequest`가 일반적인 `http`/`https` 요청을 검사해 일치하는 요청을 번들 소스에서 제공합니다. 각 요청마다 핸들러는 호스트를 소문자로 바꾼 뒤 등록된 프로토콜을 순서대로 살펴봅니다. 호스트를 처음으로 받아들이는 매처가 선택됩니다. 번들 프로토콜은 첫 번째 호스트 레이블을 번들 이름으로 삼고, 요청 경로에 해당하는 파일을 반환합니다. 일치하는 것이 없으면 `null`을 반환하고 `WebView`는 네트워크에서 로드합니다. 핸들러가 예외를 던지면 라이브러리는 `500 text/plain` 응답을 만들고 선택적 `onError` 콜백을 호출합니다. 요청 경로가 `.wvb` 안의 파일로 어떻게 매핑되는지는 [프로토콜 처리](/docs/guide/protocol-handling)를 참고하세요. @@ -179,7 +179,7 @@ WebViewBundleConfig( ## 프로토콜 -프로토콜은 `WebView` 요청을 어떤 호스트에서 제공할지 결정합니다. 프로토콜은 `WebViewBundleConfig.protocols`에 등록하며, 순서대로 평가되어 처음 일치하는 것이 승리합니다. 따라서 `bundle()`은 모든 호스트에 일치하므로 **가장 마지막에 등록하세요**. +프로토콜은 `WebView` 요청을 어떤 호스트에서 제공할지 결정합니다. 프로토콜은 `WebViewBundleConfig.protocols`에 등록하며, 순서대로 평가되어 처음 일치하는 것이 선택됩니다. 따라서 `bundle()`은 모든 호스트에 일치하므로 **가장 마지막에 등록하세요**. diff --git a/content/docs/guide/platforms/deno.ko.mdx b/content/docs/guide/platforms/deno.ko.mdx index 97e9331..de7ceb3 100644 --- a/content/docs/guide/platforms/deno.ko.mdx +++ b/content/docs/guide/platforms/deno.ko.mdx @@ -19,7 +19,7 @@ const win = new Deno.BrowserWindow({ url: `http://localhost:${server.addr.port}` await win.closed; ``` -`@wvb/deno-desktop`는 통합 계층입니다. `@wvb/deno`는 [`@wvb/node`](/docs/references/node)의 FFI 짝으로, 공유 Rust 코어를 구동합니다. +`@wvb/deno-desktop`은 통합 계층입니다. `@wvb/deno`는 [`@wvb/node`](/docs/references/node)의 FFI 짝으로, 공유 Rust 코어를 구동합니다. ## 구성 방식 @@ -151,7 +151,7 @@ deno run -A jsr:@wvb/deno/install --out vendor/wvb --target x86_64-unknown-linux ## 제한 사항 -현재 Deno 바인딩에는 두 가지 공백이 있습니다. +현재 Deno 바인딩에는 두 가지 제약이 있습니다. **커스텀 verifier 콜백은 지원하지 않습니다.** `Updater`는 **선언적** `signatureVerifier`만 받습니다. 이는 `algorithm`과 `key`를 가진 `SignatureVerifierOptions`입니다. diff --git a/content/docs/guide/platforms/electron/builder.ko.mdx b/content/docs/guide/platforms/electron/builder.ko.mdx index 26027f6..ba2d6ad 100644 --- a/content/docs/guide/platforms/electron/builder.ko.mdx +++ b/content/docs/guide/platforms/electron/builder.ko.mdx @@ -1,15 +1,15 @@ --- title: Electron Builder -description: 패키징 시점에 내장 .wvb 번들을 설치하고, electron-builder 앱에서 네이티브 @wvb/node 애드온을 유지합니다. +description: 패키징 시점에 빌트인 .wvb 번들을 설치하고, electron-builder 앱에서 네이티브 @wvb/node 애드온을 유지합니다. --- -`@wvb/electron-builder`는 Webview Bundle을 [electron-builder](https://www.electron.build/) 패키징과 통합합니다. electron-builder의 `afterPack` 단계에 훅을 걸어, 내장 `.wvb` 번들을 패키징된 앱의 리소스에 설치합니다. 그 결과 `@wvb/electron`이 런타임에 제공하는 번들이 앱과 함께 배포됩니다. 단, 네이티브 `@wvb/node` 애드온을 ASAR 아카이브에서 제외하도록 electron-builder를 직접 설정해야 합니다. 런타임 설정은 [Electron 가이드](/docs/guide/platforms/electron)를 먼저 읽으세요. Forge용 동일 기능은 [Electron Forge](/docs/guide/platforms/electron/forge)를 참고하세요. +`@wvb/electron-builder`는 Webview Bundle을 [electron-builder](https://www.electron.build/) 패키징과 통합합니다. electron-builder의 `afterPack` 단계에 훅을 걸어, 빌트인 `.wvb` 번들을 패키징된 앱의 리소스에 설치합니다. 그 결과 `@wvb/electron`이 런타임에 제공하는 번들이 앱과 함께 배포됩니다. 단, 네이티브 `@wvb/node` 애드온을 ASAR 아카이브에서 제외하도록 electron-builder를 직접 설정해야 합니다. 런타임 설정은 [Electron 가이드](/docs/guide/platforms/electron)를 먼저 읽으세요. Forge용 동일 기능은 [Electron Forge](/docs/guide/platforms/electron/forge)를 참고하세요. ## 하는 일 -패키징 시점에 이 플러그인은 Webview Bundle 설정을 해석하고 내장 번들을 설치합니다. 내장 번들은 `remote` 타깃에서 다운로드하거나, `@wvb/cli`를 통해 로컬 워크스페이스에서 패킹합니다. 그런 다음 번들을 `/.wvb/builtin/bundles/-` 아래에 준비하고, 패키징된 앱의 `Resources/` 디렉터리로 복사합니다. 이 경로는 `@wvb/electron`이 패키징된 상태에서 내장 번들을 읽는 위치(`process.resourcesPath/bundles`)와 정확히 일치합니다. 따라서 런타임은 추가 설정 없이 번들을 인식합니다. +패키징 시점에 이 플러그인은 Webview Bundle 설정을 해석하고 빌트인 번들을 설치합니다. 빌트인 번들은 `remote` 타깃에서 다운로드하거나, `@wvb/cli`를 통해 로컬 워크스페이스에서 패킹합니다. 그런 다음 번들을 `/.wvb/builtin/bundles/-` 아래에 준비하고, 패키징된 앱의 `Resources/` 디렉터리로 복사합니다. 이 경로는 `@wvb/electron`이 패키징된 상태에서 빌트인 번들을 읽는 위치(`process.resourcesPath/bundles`)와 정확히 일치합니다. 따라서 런타임은 추가 설정 없이 번들을 인식합니다. -이 플러그인은 `electron-builder` 24 이상을 필요로 하며(선택적 peer 의존성으로 선언됨), 번들을 해석하고 패킹하기 위해 `@wvb/cli`와 `@wvb/config`를 가져옵니다. +이 플러그인은 `electron-builder` 24 이상이 필요하며(선택적 peer 의존성으로 선언됨), 번들을 해석하고 패킹하기 위해 `@wvb/cli`와 `@wvb/config`를 가져옵니다. ## 플러그인 설정 @@ -42,7 +42,7 @@ export default withWebviewBundle( ); ``` -훅을 직접 연결하고 싶다면, electron-builder의 `afterPack` 함수를 반환하는 로우 레벨 팩토리 `webviewBundleAfterPack(options?)`(별칭 `wvbAfterPack`)를 사용하세요. 이 패키지는 `resolveResourcesPath(ctx)`도 내보냅니다. 이 함수는 주어진 빌드 컨텍스트에 대해 패키징된 앱의 리소스 디렉터리를 반환합니다. +훅을 직접 연결하고 싶다면, electron-builder의 `afterPack` 함수를 반환하는 로우 레벨 팩토리 `webviewBundleAfterPack(options?)`(별칭 `wvbAfterPack`)을 사용하세요. 이 패키지는 `resolveResourcesPath(ctx)`도 내보냅니다. 이 함수는 주어진 빌드 컨텍스트에 대해 패키징된 앱의 리소스 디렉터리를 반환합니다. ### 옵션 @@ -51,7 +51,7 @@ export default withWebviewBundle( | Option | Type | Default | Meaning | | ------------------------- | ------------------- | ----------- | --------------------------------------------------------------------------------------------- | | `root` | `string` | (resolved) | 설정과 번들을 찾는 데 사용하는 프로젝트 루트 | -| `builtin` | `BuiltinConfig` | from config | 설정 파일을 덮어쓰는 인라인 내장 설정 | +| `builtin` | `BuiltinConfig` | from config | 설정 파일을 덮어쓰는 인라인 빌트인 설정 | | `bundlesDir` | `string` | `'bundles'` | 패키징된 `Resources` 아래의 대상 디렉터리 이름 | | `configFile` | `string \| boolean` | `true` | `true`는 자동으로 찾아 병합하고, 경로를 지정하면 명시적으로 로드하며, `false`는 인라인만 사용 | | `channel` | `string` | — | 번들을 설치할 릴리스 채널(예: `"beta"`) | @@ -70,7 +70,7 @@ export default withWebviewBundle( } ``` -플러그인이 내장 번들 설치를 처리하므로, 번들을 위해 `extraResources`를 지정할 필요는 없습니다. 플러그인을 쓰지 않고 `.wvb` 파일을 직접 준비한다면, 해당 디렉터리를 추가 리소스로 배포해 `Resources/bundles`에 들어가게 하세요. +플러그인이 빌트인 번들 설치를 처리하므로, 번들을 위해 `extraResources`를 지정할 필요는 없습니다. 플러그인을 쓰지 않고 `.wvb` 파일을 직접 준비한다면, 해당 디렉터리를 추가 리소스로 배포해 `Resources/bundles`에 들어가게 하세요. ```json title="electron-builder 설정" { @@ -94,7 +94,7 @@ export default withWebviewBundle( /.wvb/builtin/bundles` 아래에 배치하고, 복사된 앱 디렉터리 옆의 패키징된 앱 리소스로 복사합니다. 이 위치가 바로 `@wvb/electron`이 런타임에 빌트인 번들을 읽어 들이는 곳입니다. +이 플러그인은 Forge의 `PluginBase`를 확장하고 `packageAfterCopy`에 훅을 겁니다. 패키징 시점에 Webview Bundle 설정을 확인하고, 빌트인 `.wvb` 번들을 설치합니다(`remote` 타깃에서 다운로드하거나 `@wvb/cli`로 로컬 워크스페이스에서 패킹합니다). 그런 다음 번들을 `/.wvb/builtin/bundles` 아래에 배치하고, 복사된 앱 디렉터리 옆의 패키징된 앱 리소스로 복사합니다. 이 위치가 바로 `@wvb/electron`이 런타임에 빌트인 번들을 읽어 들이는 곳입니다. 정확한 인터페이스는 패키지 소스를 참고하세요: [`@wvb/electron-forge`](https://github.com/webview-bundle/webview-bundle/tree/main/packages/electron-forge). diff --git a/content/docs/guide/platforms/electron/index.ko.mdx b/content/docs/guide/platforms/electron/index.ko.mdx index 1ab5f77..eeb8770 100644 --- a/content/docs/guide/platforms/electron/index.ko.mdx +++ b/content/docs/guide/platforms/electron/index.ko.mdx @@ -7,7 +7,7 @@ description: 커스텀 프로토콜을 통해 Electron UI를 .wvb 번들에서 ## Install -`@wvb/electron`은 Electron 15 이상을 요구하며 `@wvb/node`(사전 빌드된 N-API 바이너리 — Rust 툴체인 불필요)를 함께 설치합니다. `@wvb/cli`는 빌드 시점에 번들을 패킹합니다. +`@wvb/electron`은 Electron 15 이상이 필요하며 `@wvb/node`(사전 빌드된 N-API 바이너리 — Rust 툴체인 불필요)를 함께 설치합니다. `@wvb/cli`는 빌드 시점에 번들을 패킹합니다. @@ -222,7 +222,7 @@ npx wvb pack ./dist --outfile bundles/app/app_1.0.0.wvb ## Troubleshooting - **빈 윈도우 또는 `ERR_FAILED`** — `wvb(...)`가 실행되고 `whenProtocolRegistered()`가 `loadURL` 전에 resolve되는지, 그리고 URL의 번들 이름이 패킹된 파일과 일치하는지 확인하세요(`app://app.wvb` → 번들 `app`). -- **렌더러가 브리지 API에 접근하지 못함** — 프리로드가 로드되지 않았습니다. `webPreferences.preload`와 그것이 `preload()`를 호출하는지 확인하세요. +- **렌더러가 브리지 API에 접근하지 못함** — 프리로드가 로드되지 않았습니다. `webPreferences.preload`와 프리로드가 `preload()`를 호출하는지 확인하세요. - **`remote_not_initialized` / `updater_not_initialized`** — `remote.*` / `updater.*` 호출이 있었지만 `wvb(...)`에 `updater` 블록을 전달하지 않았습니다. [무선(OTA) 업데이트](#configure-over-the-air-updates) 설정을 추가하세요. - **개발에서는 동작하지만 패키징하면 실패함** — `bundles` 리소스나 네이티브 `@wvb/node` 바이너리가 패키지에 포함되지 않았습니다. [패키징](#packaging)을 참고하세요. diff --git a/content/docs/guide/platforms/ios.mdx b/content/docs/guide/platforms/ios.mdx index 1794691..d376dcc 100644 --- a/content/docs/guide/platforms/ios.mdx +++ b/content/docs/guide/platforms/ios.mdx @@ -20,7 +20,7 @@ The package binds the Rust core through a UniFFI-generated module named `WebView exposed under the `WebViewBundle` module. See [Platform integration](/docs/guide/platform-integration) for how the shared core reaches each platform. -Add the package as a dependency (the native FFI is wired in by the install script below): +Add the package as a dependency (the install script below wires in the native FFI): ```swift title="Package.swift" dependencies: [ diff --git a/content/docs/guide/platforms/tauri.ko.mdx b/content/docs/guide/platforms/tauri.ko.mdx index fe01b48..81b4b58 100644 --- a/content/docs/guide/platforms/tauri.ko.mdx +++ b/content/docs/guide/platforms/tauri.ko.mdx @@ -162,7 +162,7 @@ resources에 디렉터리를 나열하여 빌드와 함께 배포하세요. ## 프런트엔드에서 업데이트 제어 -`Remote`를 추가하면 OTA 다운로드를 활성화합니다. +`Remote`를 추가하면 OTA 다운로드가 활성화됩니다. ```rust title="src-tauri/src/lib.rs" use wvb_tauri::{Config, Protocol, Remote, Source}; @@ -279,7 +279,7 @@ try { ## 서명 검증 및 무결성 고정 -`SignatureVerifier`가 포함된 `Updater`를 추가하면 다운로드된 번들에 게시자 서명을 요구합니다. 검증기는 클로저로부터 지연 방식으로 만들어집니다. +`SignatureVerifier`가 포함된 `Updater`를 추가하면 다운로드된 번들에 게시자 서명을 요구합니다. 검증기는 클로저에서 지연 방식으로 만들어집니다. ```rust title="src-tauri/src/lib.rs" use wvb_tauri::{Config, Ed25519Verifier, IntegrityPolicy, Protocol, Remote, Source, Updater}; diff --git a/content/docs/guide/protocol-handling.ko.mdx b/content/docs/guide/protocol-handling.ko.mdx index 42865f9..f2c8409 100644 --- a/content/docs/guide/protocol-handling.ko.mdx +++ b/content/docs/guide/protocol-handling.ko.mdx @@ -12,7 +12,7 @@ Rust 코어는 스킴을 등록하거나 검증하지 않습니다. 코어는 UR ## bundle 프로토콜 -요청은 URI의 두 부분으로 번들 소스에 대해 해석됩니다. 하나는 **번들 이름**(첫 `.`까지의 호스트)이고, 다른 하나는 **경로**(퍼센트 디코딩된 값)입니다. +요청은 URI의 두 부분을 기준으로 번들 소스에서 해석됩니다. 하나는 **번들 이름**(첫 `.`까지의 호스트)이고, 다른 하나는 **경로**(퍼센트 디코딩된 값)입니다. ```text app://app.wvb/index.html -> bundle "app", file "/index.html" @@ -33,7 +33,7 @@ app://myapp.wvb/assets/logo.png -> bundle "myapp", file "/assets/logo.png" `GET`과 `HEAD`만 제공하며, 그 외의 메서드는 **405 Method Not Allowed**를 반환합니다. `HEAD`는 본문이 비어 있는 헤더를 반환합니다. -제공되는 파일에 대해 핸들러는 인덱스에 저장된 해당 파일의 헤더를 재생한 뒤, `Content-Type`(인덱스 엔트리에서 가져옴)과 `Content-Length`(압축 해제된 크기)를 덮어씁니다. +파일을 제공할 때 핸들러는 인덱스에 저장된 해당 파일의 헤더를 재생한 뒤, `Content-Type`(인덱스 엔트리에서 가져옴)과 `Content-Length`(압축 해제된 크기)를 덮어씁니다. ```text GET app://app.wvb/assets/app.js @@ -148,7 +148,7 @@ app.whenReady().then(async () => { } ``` -권한과 렌더러 브리지에 대해서는 [Electron 가이드](/docs/guide/platforms/electron)를 참고하세요. +권한과 렌더러 브리지는 [Electron 가이드](/docs/guide/platforms/electron)를 참고하세요. diff --git a/content/docs/guide/providers/aws.ko.mdx b/content/docs/guide/providers/aws.ko.mdx index c50dd02..00dd16b 100644 --- a/content/docs/guide/providers/aws.ko.mdx +++ b/content/docs/guide/providers/aws.ko.mdx @@ -3,7 +3,7 @@ title: AWS 프로바이더 description: S3, CloudFront, Lambda@Edge와 선택적 KMS 서명을 사용해 AWS에서 원격 Webview Bundle을 호스팅하고, 제공하고, 프로비저닝합니다. --- -번들을 직접 관리하는 AWS 계정에 게시하고 글로벌 CDN으로 제공합니다. 번들은 **S3**에 저장되고, **CloudFront**가 이를 캐싱하며, 두 개의 **Lambda@Edge** 함수가 원격 HTTP 계약을 S3 읽기로 변환합니다. 그리고 **KMS**로 각 번들에 선택적으로 서명할 수 있습니다. +직접 관리하는 AWS 계정에 번들을 게시하고 글로벌 CDN으로 제공합니다. 번들은 **S3**에 저장되고, **CloudFront**가 이를 캐싱하며, 두 개의 **Lambda@Edge** 함수가 원격 HTTP 계약을 S3 읽기로 변환합니다. 그리고 **KMS**로 각 번들에 선택적으로 서명할 수 있습니다. 이 구성 요소들이 구현하는 계약과 프로바이더를 선택하는 방법은 [원격 구축하기](/docs/guide/remote)를 참고하세요. ## 지원 서비스 diff --git a/content/docs/guide/providers/cloudflare.ko.mdx b/content/docs/guide/providers/cloudflare.ko.mdx index e02e98e..10e6be7 100644 --- a/content/docs/guide/providers/cloudflare.ko.mdx +++ b/content/docs/guide/providers/cloudflare.ko.mdx @@ -68,7 +68,7 @@ export default defineConfig({ | `uploader` | object | 내부 S3 업로더에 대한 선택적 재정의(`key`, `contentType`, `metadata` 등). | | `deployer` | object | KV 디플로이어에 대한 선택적 재정의(`key`, `expiration`, `expirationTtl`, `metadata`). | -기본값: 업로더는 `region: 'auto'`와 엔드포인트 `https://.r2.cloudflarestorage.com`을 설정한 다음, `bundles//_.wvb` 키에 객체를 저장하고 `webview-bundle-*` 커스텀 메타데이터를 붙입니다. 디플로이어는 `` 키(채널 배포일 때는 `/`)에 버전을 KV로 씁니다. +기본값: 업로더는 `region: 'auto'`와 엔드포인트 `https://.r2.cloudflarestorage.com`을 설정한 다음, `bundles//_.wvb` 키에 객체를 저장하고 `webview-bundle-*` 커스텀 메타데이터를 붙입니다. 디플로이어는 버전을 KV의 `` 키(채널 배포일 때는 `/`)에 씁니다. 레이아웃이 다르면 둘 중 어느 쪽이든 재정의하세요. @@ -88,7 +88,7 @@ export default defineConfig({ }), ``` -R2에는 S3 자격 증명이 필요합니다. AWS와 동일한 방식으로 제공하세요. S3 클라이언트가 읽는 환경변수를 통해 전달합니다. +R2에는 S3 자격 증명이 필요합니다. AWS와 동일한 방식으로, S3 클라이언트가 읽는 환경변수를 통해 제공하세요. ```sh export AWS_ACCESS_KEY_ID= @@ -103,7 +103,7 @@ wvb upload --version 1.2.0 wvb deploy --version 1.2.0 ``` -`wvb upload`는 기본적으로 배포하지 않습니다. `wvb deploy`를 실행하거나(또는 `upload`에 `--deploy`를 전달하여) 해당 버전을 라이브 상태로 만드세요. +`wvb upload`는 기본적으로 배포하지 않습니다. `wvb deploy`를 실행하거나 `upload`에 `--deploy`를 전달해 해당 버전을 라이브 상태로 만드세요. ```sh wvb upload --version 1.2.0 --deploy @@ -164,7 +164,7 @@ Worker를 배포하세요. npx wrangler deploy ``` -라이브 엔드포인트에 대해 계약을 검증하세요. +라이브 엔드포인트에서 계약을 검증하세요. ```sh curl https://bundles.example.com/bundles diff --git a/content/docs/guide/providers/local.ko.mdx b/content/docs/guide/providers/local.ko.mdx index ddb0418..65e307c 100644 --- a/content/docs/guide/providers/local.ko.mdx +++ b/content/docs/guide/providers/local.ko.mdx @@ -130,7 +130,7 @@ wvb remote local --base-dir ~/.wvb/my-app --port 4313 ### allowOtherVersions -기본적으로 서버는 배포된 버전만 제공합니다. `GET /bundles/{name}/{version}`은 `403 Forbidden`을 반환하는데, 이는 클라우드 프로바이더와 동일하며 클라이언트를 특정 버전에 고정된 상태로 유지합니다. +기본적으로 서버는 배포된 버전만 제공합니다. `GET /bundles/{name}/{version}`은 `403 Forbidden`을 반환하는데, 이는 클라우드 프로바이더와 동일하며 클라이언트를 특정 버전에 고정해 둡니다. ```sh curl -i http://localhost:4313/bundles/app/1.0.0 diff --git a/content/docs/guide/remote-bundles.ko.mdx b/content/docs/guide/remote-bundles.ko.mdx index 276bfb9..b7a4381 100644 --- a/content/docs/guide/remote-bundles.ko.mdx +++ b/content/docs/guide/remote-bundles.ko.mdx @@ -92,7 +92,7 @@ let info = updater.download("app", Some("1.1.0".into())).await?; ## 원격 HTTP 규약 -Webview Bundle 서버는 네 개의 엔드포인트를 구현합니다. 프로바이더 패키지(local, AWS, Cloudflare)가 이 명세를 구현하며, 이에 맞춰 직접 구현할 수도 있습니다. +Webview Bundle 서버는 네 개의 엔드포인트를 구현합니다. 프로바이더 패키지(local, AWS, Cloudflare)가 이 명세를 구현하며, 이에 맞춰 직접 만들 수도 있습니다. | 메서드와 경로 | 목적 | | ------------------------------- | ------------------------------------------- | diff --git a/content/docs/guide/spec/errors.ko.mdx b/content/docs/guide/spec/errors.ko.mdx index b143ad5..92f7ce5 100644 --- a/content/docs/guide/spec/errors.ko.mdx +++ b/content/docs/guide/spec/errors.ko.mdx @@ -37,7 +37,7 @@ HTTP/1.1 404 Not Found ## 그 밖의 오류 -그 밖의 `2xx` 외 상태에 대해서는 `{ "message": string }` 형태의 JSON 본문을 반환하세요. 클라이언트는 이 본문을 파싱하여, 상태 코드와 메시지를 모두 담은 원격 HTTP 오류를 발생시킵니다. +그 밖의 `2xx` 외 상태에는 `{ "message": string }` 형태의 JSON 본문을 반환하세요. 클라이언트는 이 본문을 파싱하여, 상태 코드와 메시지를 모두 담은 원격 HTTP 오류를 발생시킵니다. ```http HTTP/1.1 500 Internal Server Error diff --git a/content/docs/guide/spec/get-current.ko.mdx b/content/docs/guide/spec/get-current.ko.mdx index ac6b11f..1280941 100644 --- a/content/docs/guide/spec/get-current.ko.mdx +++ b/content/docs/guide/spec/get-current.ko.mdx @@ -62,7 +62,7 @@ Webview-Bundle-Integrity: sha256:n4bQgYhMfWWaL+qgxVrQFaO/TxsrC4Is0V1sFbDwCgg= ``` -`?channel=`으로 채널의 현재 버전을 선택합니다. +`?channel=`로 채널의 현재 버전을 선택합니다. ```sh curl -s 'http://localhost:4313/bundles/app?channel=beta' -o app-beta.wvb diff --git a/content/docs/guide/spec/head-current.ko.mdx b/content/docs/guide/spec/head-current.ko.mdx index e0a6ddc..5133a60 100644 --- a/content/docs/guide/spec/head-current.ko.mdx +++ b/content/docs/guide/spec/head-current.ko.mdx @@ -3,7 +3,7 @@ title: 현재 메타데이터 조회 description: HEAD /bundles/{name}은 현재 배포된 버전의 메타데이터를 응답 헤더로 반환하며, 본문은 없습니다. --- -`HEAD /bundles/{name}`은 번들의 현재 배포된 버전의 메타데이터를 응답 헤더로 반환하며, 본문은 없습니다. 업데이터는 무언가를 다운로드하기 전에 더 새로운 버전이 있는지 확인하기 위해 이 요청을 호출합니다. +`HEAD /bundles/{name}`은 번들의 현재 배포된 버전의 메타데이터를 응답 헤더로 반환하며, 본문은 없습니다. 업데이터는 무언가를 다운로드하기 전에 이 요청을 호출하여 더 새로운 버전이 있는지 확인합니다. ```http HEAD /bundles/{name} diff --git a/content/docs/guide/spec/index.ko.mdx b/content/docs/guide/spec/index.ko.mdx index 4a3140a..e6027ed 100644 --- a/content/docs/guide/spec/index.ko.mdx +++ b/content/docs/guide/spec/index.ko.mdx @@ -11,7 +11,7 @@ description: Webview Bundle 클라이언트와 업데이터가 번들을 나열 ## 규약 -이 규약은 모든 엔드포인트에 공통으로 적용됩니다. 각 엔드포인트 페이지는 해당 라우트에만 특정한 내용만 반복합니다. +이 규약은 모든 엔드포인트에 공통으로 적용됩니다. 각 엔드포인트 페이지는 해당 라우트에 고유한 내용만 반복합니다. ### 응답 헤더 diff --git a/content/docs/guide/spec/list-bundles.ko.mdx b/content/docs/guide/spec/list-bundles.ko.mdx index bce977a..153a9e6 100644 --- a/content/docs/guide/spec/list-bundles.ko.mdx +++ b/content/docs/guide/spec/list-bundles.ko.mdx @@ -21,7 +21,7 @@ GET /bundles | ------ | ----------------------------------- | | `200` | 현재 배포된 번들의 JSON 배열입니다. | -4xx 응답에 대해서는 [오류](/docs/guide/spec/errors)를 참고하세요. +4xx 응답은 [오류](/docs/guide/spec/errors)를 참고하세요. ### 응답 헤더 diff --git a/content/docs/guide/why-webview-bundle.ko.mdx b/content/docs/guide/why-webview-bundle.ko.mdx index fbe2e87..7a29c4d 100644 --- a/content/docs/guide/why-webview-bundle.ko.mdx +++ b/content/docs/guide/why-webview-bundle.ko.mdx @@ -1,17 +1,17 @@ --- -title: Webview Bundle를 선택하는 이유 +title: Webview Bundle을 선택하는 이유 description: 웹 앱을 오프라인 우선 .wvb 번들로 출시하고 무선(OTA) 업데이트로 배포하는 방법을 설명합니다. --- -Webview Bundle는 빌드된 웹 앱을 하나의 압축된, 무결성이 검증되는 아카이브(`.wvb`)로 묶고, 이를 커스텀 URL 스킴을 통해 웹뷰에 제공합니다. 웹뷰는 HTML, JS, CSS, 미디어를 네트워크가 아닌 로컬 저장소에서 읽습니다. 원격을 설정하면 앱이 더 새로운 번들을 무선으로 다운로드하며, 네이티브 앱스토어 출시 없이도 갱신된 코드를 배포합니다. +Webview Bundle은 빌드된 웹 앱을 하나의 압축된, 무결성이 검증되는 아카이브(`.wvb`)로 묶고, 이를 커스텀 URL 스킴을 통해 웹뷰에 제공합니다. 웹뷰는 HTML, JS, CSS, 미디어를 네트워크가 아닌 로컬 저장소에서 읽습니다. 원격을 설정하면 앱이 더 새로운 번들을 무선으로 다운로드하며, 네이티브 앱스토어 출시 없이도 갱신된 코드를 배포합니다. -팀이 Webview Bundle를 선택하는 이유는 세 가지입니다. 오프라인 우선 전달, 무선(OTA) 업데이트, 그리고 모든 웹뷰 플랫폼을 아우르는 하나의 워크플로입니다. +팀이 Webview Bundle을 선택하는 이유는 세 가지입니다. 오프라인 우선 전달, 무선(OTA) 업데이트, 그리고 모든 웹뷰 플랫폼을 아우르는 하나의 워크플로입니다. ## 기본으로 오프라인 우선 -원격 URL을 사용하면 첫 페인트가 네트워크를 기다려야 합니다. 캐시가 비어 있거나, 캡티브 포털에 걸리거나, 연결이 끊기면 빈 화면이 나타납니다. +원격 URL을 사용하면 첫 화면이 네트워크를 기다려야 합니다. 캐시가 비어 있거나, 캡티브 포털에 걸리거나, 연결이 끊기면 빈 화면이 나타납니다. -Webview Bundle는 앱과 함께 출시되는 로컬 `.wvb`에서 자산을 곧바로 제공합니다. 프로토콜은 각 요청을 번들 안의 파일로 매핑하고 그 파일을 반환합니다. +Webview Bundle은 앱과 함께 출시되는 로컬 `.wvb`에서 자산을 곧바로 제공합니다. 프로토콜은 각 요청을 번들 안의 파일로 매핑하고 그 파일을 반환합니다. ```text bundle://app/index.html -> index.html inside the app bundle @@ -33,7 +33,7 @@ const res = await protocol.handle('get', 'bundle://app/index.html'); // res: { status, headers, body } ``` -첫 페인트는 절대 네트워크를 기다리지 않습니다. 지하철에서든, 비행기에서든, 세션 도중 연결이 끊겨도 앱은 로컬 번들에서 화면을 그립니다. 네트워크는 최적화 수단이 됩니다. +첫 화면은 절대 네트워크를 기다리지 않습니다. 지하철에서든, 비행기에서든, 세션 도중 연결이 끊겨도 앱은 로컬 번들에서 화면을 그립니다. 네트워크는 최적화 수단이 됩니다. 번들 프로토콜은 `GET`과 `HEAD`를 지원하고, 각 파일에 저장된 헤더를 그대로 재현하며, 미디어에 대한 @@ -45,7 +45,7 @@ const res = await protocol.handle('get', 'bundle://app/index.html'); 앱스토어 출시는 느리고 심사에 막힙니다. 문구 오타 하나, 동작하지 않는 버튼 하나가 며칠에 걸친 심사에 묶일 수 있습니다. 앱 코드가 `.wvb` 안에 있기 때문에, 새 번들 버전을 배포하고 설치된 앱이 이를 무선(OTA)으로 다운로드하게 하면 문제를 고칠 수 있습니다. 네이티브 바이너리는 전혀 바뀌지 않습니다. -업데이트 모델은 두 개의 소스로 뒷받침됩니다. `builtin` 소스는 출시 시 함께 담은 읽기 전용 번들입니다. `remote` 소스는 다운로드한 번들을 담으며 우선권을 가집니다. 다운로드나 활성화가 실패하면 `builtin`으로 되돌아가므로, OTA가 기기를 동작하는 앱이 없는 상태로 만드는 일은 결코 없습니다. +두 개의 소스가 업데이트 모델을 뒷받침합니다. `builtin` 소스는 출시 시 함께 담은 읽기 전용 번들입니다. `remote` 소스는 다운로드한 번들을 담으며 우선권을 가집니다. 다운로드나 활성화가 실패하면 `builtin`으로 되돌아가므로, OTA가 기기를 동작하는 앱이 없는 상태로 만드는 일은 결코 없습니다. ```ts title="두 소스: remote가 우선, builtin이 최후의 보루" new BundleSource({ @@ -110,7 +110,7 @@ const updater = new Updater(source, remote, { ## 웹 개발자를 위해 -이미 알고 있는 방식 그대로 앱을 작성하세요. Webview Bundle는 소스가 아니라 번들러의 출력물을 대상으로 동작하므로 React, Vue, Svelte, 순수 HTML 모두 그대로 동작합니다. 커스텀 프레임워크도, 특별한 빌드 단계도 필요 없습니다. `wvb pack`을 빌드 디렉터리로 향하게 하세요. +이미 알고 있는 방식 그대로 앱을 작성하세요. Webview Bundle은 소스가 아니라 번들러의 산출물을 대상으로 동작하므로 React, Vue, Svelte, 순수 HTML 모두 그대로 동작합니다. 커스텀 프레임워크도, 특별한 빌드 단계도 필요 없습니다. `wvb pack`을 빌드 디렉터리로 향하게 하세요. ```sh title="빌드 산출물을 하나의 .wvb로 패킹" npm install --save-dev @wvb/cli @@ -153,8 +153,8 @@ platform.type; // 'electron' | 'tauri' | 'android' | 'ios' 흔히 쓰이는 두 가지 대안이 같은 문제의 일부를 해결합니다. -- **플랫폼별 네이티브 자산 번들링.** 웹 빌드를 각 셸에 임베드하고, 서빙 및 업데이트 로직을 플랫폼마다 한 번씩 작성하는 방식입니다. 동작은 하지만 툴체인, 자산 포맷, 업데이트 코드가 플랫폼마다 다르고 그 모두를 직접 유지보수해야 합니다. Webview Bundle는 공유된 Rust 코어를 기반으로 Electron, Tauri, Android, iOS 전반에 하나의 `.wvb`와 하나의 사고 모델을 제공합니다. -- **CodePush 방식의 OTA.** 호스팅형 OTA 서비스는 스토어 심사 없이 JS 업데이트를 배포합니다. 원격 소스와 같은 이점을 줍니다. 다만 절충점이 다릅니다. Webview Bundle는 관리형 서드파티 서비스가 아니라, builtin 폴백, 채널 롤아웃, 무결성과 선택적 서명을 갖춘, 직접 호스팅하는 검증 가능한 번들 포맷입니다. 서버와 아티팩트를 여러분이 소유합니다. +- **플랫폼별 네이티브 자산 번들링.** 웹 빌드를 각 셸에 임베드하고, 서빙 및 업데이트 로직을 플랫폼마다 한 번씩 작성하는 방식입니다. 동작은 하지만 툴체인, 자산 포맷, 업데이트 코드가 플랫폼마다 다르고 그 모두를 직접 유지보수해야 합니다. Webview Bundle은 공유된 Rust 코어를 기반으로 Electron, Tauri, Android, iOS 전반에 하나의 `.wvb`와 하나의 사고 모델을 제공합니다. +- **CodePush 방식의 OTA.** 호스팅형 OTA 서비스는 스토어 심사 없이 JS 업데이트를 배포합니다. 원격 소스와 같은 이점을 줍니다. 다만 절충점이 다릅니다. Webview Bundle은 관리형 서드파티 서비스가 아니라, builtin 폴백, 채널 롤아웃, 무결성과 선택적 서명을 갖춘, 직접 호스팅하는 검증 가능한 번들 포맷입니다. 서버와 아티팩트를 여러분이 소유합니다. 솔직한 절충점은 이렇습니다. 번들 포맷과 패킹 단계를 도입하고 원격을 직접 운영해야 합니다. 그 대가로 오프라인 우선 전달, 스토어 심사 없는 OTA, 그리고 플랫폼을 추가해도 변하지 않는 하나의 워크플로를 얻습니다. diff --git a/content/docs/references/bridge/index.ko.mdx b/content/docs/references/bridge/index.ko.mdx index 460c3c0..57a31c9 100644 --- a/content/docs/references/bridge/index.ko.mdx +++ b/content/docs/references/bridge/index.ko.mdx @@ -37,7 +37,7 @@ yarn add @wvb/bridge ## invoke -`invoke()`는 저수준 진입점입니다. 타입이 지정된 모든 명령어 헬퍼가 이 위에 만들어져 있으므로, 보통은 `source`, `remote`, `updater`를 사용합니다. 타입이 지정된 그룹이 다루지 않는 명령어에만 `invoke()`를 직접 사용하세요. +`invoke()`는 저수준 진입점입니다. 타입이 지정된 모든 명령어 헬퍼가 이를 기반으로 만들어져 있으므로, 보통은 `source`, `remote`, `updater`를 사용합니다. 타입이 지정된 그룹이 다루지 않는 명령어에만 `invoke()`를 직접 사용하세요. ```ts import { invoke } from '@wvb/bridge'; @@ -80,7 +80,7 @@ console.log(platform.type); // 'electron' | 'tauri' | 'android' | 'ios' ## Transports -각 플랫폼은 저마다의 전송 방식을 가지며, 모두 `invoke()` 뒤에 숨겨져 있습니다. +각 플랫폼에는 저마다의 전송 방식이 있으며, 모두 `invoke()` 뒤에 숨겨져 있습니다. - **Electron**은 `window.wvbElectron.invoke(name, params)`를 호출합니다. - **Tauri**는 `wvb-tauri` 플러그인 명령어를 호출하며, 명령어 이름을 snake case로 변환합니다. @@ -97,7 +97,7 @@ console.log(platform.type); // 'electron' | 'tauri' | 'android' | 'ios' 실험적 @@ -9,7 +9,7 @@ Deno 연동은 실험적입니다. `@wvb/deno`는 Webview Bundle의 Deno 바인딩입니다. [`@wvb/node`](/docs/references/node)의 FFI 대응 패키지로, 동일한 프로토콜, 소스, 원격, 업데이터 기능을 제공합니다. Deno FFI로 로드한 네이티브 cdylib를 통해 -Deno 데스크톱 웹뷰에 이를 제공합니다. 이 페이지에서는 네이티브 라이브러리를 로드하는 방법을 다룹니다. +Deno 데스크톱 웹뷰에 이를 전달합니다. 이 페이지에서는 네이티브 라이브러리를 로드하는 방법을 다룹니다. 클래스, 옵션, 타입은 아래 카테고리 페이지에서 설명합니다. ## API 표면 @@ -113,7 +113,7 @@ Deno 바인딩은 FFI 경계를 넘나들기 때문에, 일부 `@wvb/node` 기 - **선언적 검증만 지원합니다.** `Updater`는 선언적 `signatureVerifier` (`SignatureVerifierOptions`)를 지원합니다. `@wvb/node`의 커스텀 함수형 `integrityChecker`와 - `signatureVerifier` 콜백은 FFI로 지원되지 않습니다. + `signatureVerifier` 콜백은 FFI에서는 지원되지 않습니다. - **`HttpOptions.defaultHeaders`는 지원되지 않습니다.** Deno `Remote`에서는 사용할 수 없습니다. ## Deno Desktop 연동 diff --git a/content/docs/references/deno/protocol.ko.mdx b/content/docs/references/deno/protocol.ko.mdx index 5e2bf51..7010896 100644 --- a/content/docs/references/deno/protocol.ko.mdx +++ b/content/docs/references/deno/protocol.ko.mdx @@ -11,7 +11,7 @@ Deno 바인딩은 두 가지 프로토콜 핸들러를 제공합니다. `BundleP `BundleProtocol`은 로드된 `lib`과 [`BundleSource`](/docs/references/deno/source)를 받습니다. 들어오는 각 요청을 해석된 번들 안의 파일로 매핑합니다. -`LocalProtocol`은 `app://host/...` 요청을 로컬호스트 주소로 프록시합니다. 개발 서버를 대상으로 개발할 때 유용합니다. +`LocalProtocol`은 `app://host/...` 요청을 로컬호스트 주소로 프록시합니다. 개발 서버를 대상으로 작업할 때 유용합니다. 각 핸들러는 HTTP 메서드, 요청 URL, 헤더 객체를 받아 FFI 응답으로 해석하는 `handle` 메서드를 제공합니다. 이 응답은 `toResponse(res)`로 웹 `Response`로 변환합니다. diff --git a/content/docs/references/deno/source.ko.mdx b/content/docs/references/deno/source.ko.mdx index 19a0ec1..a4e505b 100644 --- a/content/docs/references/deno/source.ko.mdx +++ b/content/docs/references/deno/source.ko.mdx @@ -3,7 +3,7 @@ title: 소스 description: builtin 디렉터리와 remote 디렉터리에서 번들을 해석하는 Deno의 BundleSource 클래스입니다. --- -`BundleSource`는 디스크에서 번들을 읽어 들이는 Deno 바인딩의 진입점입니다. builtin 디렉터리와 remote 디렉터리에서 번들을 해석하며, 이때 remote 디렉터리가 우선합니다. 또한 [`@wvb/node`](/docs/references/node)의 `BundleSource`와 동일한 데이터 API를 제공합니다. Deno 바인딩의 다른 대부분의 클래스 — `BundleProtocol`, `Updater` — 는 `BundleSource`를 받아 이를 통해 데이터를 읽습니다. +`BundleSource`는 디스크에서 번들을 읽어 들이는 Deno 바인딩의 진입점입니다. builtin 디렉터리와 remote 디렉터리에서 번들을 해석하며, 이때 remote 디렉터리가 우선합니다. 또한 [`@wvb/node`](/docs/references/node)의 `BundleSource`와 동일한 데이터 API를 제공합니다. Deno 바인딩의 다른 클래스 대부분 — `BundleProtocol`, `Updater` — 은 `BundleSource`를 받아 이를 통해 데이터를 읽습니다. ## 소스 생성하기 diff --git a/content/docs/references/deno/updater.ko.mdx b/content/docs/references/deno/updater.ko.mdx index 2889050..04b17cf 100644 --- a/content/docs/references/deno/updater.ko.mdx +++ b/content/docs/references/deno/updater.ko.mdx @@ -13,7 +13,7 @@ description: '@wvb/deno의 Updater로 Deno 데스크톱 앱에서 원격에 최 ## Constructor `Updater`는 로드된 `lib`, `BundleSource`, `Remote`, 그리고 선택적인 `UpdaterOptions`로 생성합니다. -소스와 원격은 같은 `lib`를 사용해야 합니다. +소스와 원격은 같은 `lib`을 사용해야 합니다. ```ts title="updater.ts" import { loadLibViaPlug, BundleSource, Remote, Updater } from 'jsr:@wvb/deno'; diff --git a/content/docs/references/deno/updater.mdx b/content/docs/references/deno/updater.mdx index 1612591..1776cca 100644 --- a/content/docs/references/deno/updater.mdx +++ b/content/docs/references/deno/updater.mdx @@ -6,7 +6,7 @@ description: Check a remote for newer bundles and install them in a Deno desktop `Updater` checks a [remote](/docs/references/deno/remote) for newer versions of a bundle and installs them into the local store. It ties a [`BundleSource`](/docs/references/deno/source) to a `Remote`, applies your integrity and signature policy, and writes the downloaded bundle so the next launch serves -the updated app code. This is how a Deno desktop app delivers updates over-the-air (OTA) without a new +the updated app code. This is how a Deno desktop app delivers updates over the air (OTA) without a new release. For the end-to-end model, see [Remote bundles](/docs/guide/remote-bundles); for the rest of the binding, see the [Deno API overview](/docs/references/deno). diff --git a/content/docs/references/node/bundle.ko.mdx b/content/docs/references/node/bundle.ko.mdx index 04f0a89..9776006 100644 --- a/content/docs/references/node/bundle.ko.mdx +++ b/content/docs/references/node/bundle.ko.mdx @@ -3,7 +3,7 @@ title: Bundle description: .wvb 아카이브를 읽고, 빌드하고, 검사하기 위한 @wvb/node 클래스. --- -`@wvb/node`는 메모리와 디스크에서 `.wvb` 아카이브를 다루는 소규모 클래스 집합을 제공합니다. `Bundle`과 `BundleBuilder`는 번들 전체를 읽고 씁니다. `BundleDescriptor`, `Header`, `Index`, `LoadedDescriptor`는 번들의 구조를 검사하고, 전체를 메모리에 올리지 않고도 개별 파일을 가져오게 해줍니다. +`@wvb/node`는 메모리와 디스크에서 `.wvb` 아카이브를 다루는 소규모 클래스 집합을 제공합니다. `Bundle`과 `BundleBuilder`는 번들 전체를 읽고 씁니다. `BundleDescriptor`, `Header`, `Index`, `LoadedDescriptor`는 번들의 구조를 검사하고, 전체를 메모리에 올리지 않고도 개별 파일을 가져올 수 있게 합니다. 소스, 프로토콜, 원격 클라이언트, 업데이터까지 패키지의 전체 표면은 [Node API 개요](/docs/references/node)를 참고하세요. 바이트가 디스크에 배치되는 방식은 [.wvb 번들 포맷](/docs/guide/bundle-format)을 참고하세요. diff --git a/content/docs/references/node/protocol.ko.mdx b/content/docs/references/node/protocol.ko.mdx index 87ca928..0a19300 100644 --- a/content/docs/references/node/protocol.ko.mdx +++ b/content/docs/references/node/protocol.ko.mdx @@ -3,7 +3,7 @@ title: 프로토콜 description: '@wvb/node 프로토콜 핸들러 레퍼런스 — BundleProtocol은 번들 자산을 제공하고, LocalProtocol은 localhost로 프록시합니다.' --- -`@wvb/node`는 웹뷰의 요청을 HTTP 방식의 응답으로 바꾸는 두 가지 프로토콜 핸들러를 제공합니다. `BundleProtocol`은 `BundleSource`에서 자산을 제공하고, `LocalProtocol`은 개발 중에 요청을 localhost 서버로 프록시합니다. 두 핸들러 모두 HTTP 메서드, URI, 그리고 선택적 헤더를 받아 `HttpResponse`로 반환합니다. 이 스킴들이 웹뷰 플랫폼에 어떻게 들어맞는지는 [프로토콜 처리](/docs/guide/protocol-handling)를 참고하세요. +`@wvb/node`는 웹뷰의 요청을 HTTP 방식의 응답으로 바꾸는 두 가지 프로토콜 핸들러를 제공합니다. `BundleProtocol`은 `BundleSource`에서 자산을 제공하고, `LocalProtocol`은 개발 중에 요청을 localhost 서버로 프록시합니다. 두 핸들러 모두 HTTP 메서드, URI, 선택적 헤더를 받아 `HttpResponse`를 반환합니다. 이 스킴들이 웹뷰 플랫폼에 어떻게 들어맞는지는 [프로토콜 처리](/docs/guide/protocol-handling)를 참고하세요. 두 핸들러는 동일한 호출 형태를 공유합니다. diff --git a/content/docs/references/node/remote.ko.mdx b/content/docs/references/node/remote.ko.mdx index ce35ca2..13bf3ad 100644 --- a/content/docs/references/node/remote.ko.mdx +++ b/content/docs/references/node/remote.ko.mdx @@ -28,7 +28,7 @@ const remote = new Remote('https://bundles.example.com'); | `download` | `(bundleName, channel?): Promise<[RemoteBundleInfo, Bundle, Buffer]>` | | `downloadVersion` | `(bundleName, version): Promise<[RemoteBundleInfo, Bundle, Buffer]>` | -`listBundles`는 원격이 제공하는 번들을 나열하며, `channel`로 필터링할 수도 있습니다. `getInfo`는 단일 번들의 현재 메타데이터를 읽습니다. `download`는 번들의 현재 버전을 가져오고, `downloadVersion`은 특정 버전을 가져옵니다. 두 다운로드 메서드 모두 번들 정보, 파싱된 [`Bundle`](/docs/references/node/bundle), 그리고 원본 `.wvb` 바이트를 담은 `Buffer`로 이루어진 튜플로 반환됩니다. +`listBundles`는 원격이 제공하는 번들을 나열하며, `channel`로 필터링할 수도 있습니다. `getInfo`는 단일 번들의 현재 메타데이터를 읽습니다. `download`는 번들의 현재 버전을 가져오고, `downloadVersion`은 특정 버전을 가져옵니다. 두 다운로드 메서드 모두 번들 정보, 파싱된 [`Bundle`](/docs/references/node/bundle), 그리고 원본 `.wvb` 바이트를 담은 `Buffer`로 이루어진 튜플을 반환합니다. ```ts const [info, bundle, bytes] = await remote.download('my-app', 'stable'); @@ -99,7 +99,7 @@ const remote = new Remote('https://bundles.example.com', { ## Result shapes -`getInfo`, `download`, `downloadVersion`는 `RemoteBundleInfo`를 반환합니다. `listBundles`는 `ListRemoteBundleInfo` 배열을 반환합니다. +`getInfo`, `download`, `downloadVersion`은 `RemoteBundleInfo`를 반환합니다. `listBundles`는 `ListRemoteBundleInfo` 배열을 반환합니다. ```ts type ListRemoteBundleInfo = { @@ -117,7 +117,7 @@ type RemoteBundleInfo = { }; ``` -`integrity`와 `signature` 필드는 원격이 `Webview-Bundle-Integrity`와 `Webview-Bundle-Signature` 응답 헤더로 알리는 값을 담습니다. `404`(배포되지 않음)나 `403`(금지됨) 같은 실패 응답을 클라이언트가 어떻게 표면화하는지는 [Errors](/docs/guide/spec/errors)를 참고하세요. +`integrity`와 `signature` 필드는 원격이 `Webview-Bundle-Integrity`와 `Webview-Bundle-Signature` 응답 헤더로 알리는 값을 담습니다. `404`(배포되지 않음)나 `403`(금지됨) 같은 실패 응답을 클라이언트가 어떻게 드러내는지는 [Errors](/docs/guide/spec/errors)를 참고하세요. ## Related diff --git a/content/docs/references/node/source.ko.mdx b/content/docs/references/node/source.ko.mdx index 0c518b2..f86573c 100644 --- a/content/docs/references/node/source.ko.mdx +++ b/content/docs/references/node/source.ko.mdx @@ -56,7 +56,7 @@ const source = new BundleSource({ `fetch*` 메서드는 파싱된 [`Bundle`](/docs/references/node/bundle)을 읽습니다. `fetchBundle`은 우선 규칙을 따르고, `fetchBuiltinBundle`과 `fetchRemoteBundle`은 특정 디렉터리 하나만 대상으로 합니다. `fetchDescriptor`는 모든 파일을 메모리에 로드하지 않고 [`BundleDescriptor`](/docs/references/node/bundle)를 반환합니다. -`loadDescriptor`는 single-flight 방식으로 `LoadedDescriptor`를 캐시합니다. 따라서 동시에 호출한 여러 호출자가 하나의 로드를 공유합니다. `unloadDescriptor`는 캐시된 핸들을 해제합니다. remote 디렉터리에 기록하는 경로는 `writeRemoteBundle`입니다. 이 메서드는 다운로드한 번들과 그 [`BundleManifestMetadata`](/docs/references/node/types)를 저장합니다. `remoteRetainedVersions`는 소스가 이름에 대해 보관하는 버전(현재 버전과 이전 버전)을 나열합니다. `removeRemoteBundle`은 특정 버전을 삭제하고, `pruneRemoteBundles`는 더 이상 보관되지 않는 버전을 제거합니다. +`loadDescriptor`는 single-flight 방식으로 `LoadedDescriptor`를 캐시합니다. 따라서 여러 호출자가 동시에 호출해도 하나의 로드를 공유합니다. `unloadDescriptor`는 캐시된 핸들을 해제합니다. remote 디렉터리에 기록하는 경로는 `writeRemoteBundle`입니다. 이 메서드는 다운로드한 번들과 그 [`BundleManifestMetadata`](/docs/references/node/types)를 저장합니다. `remoteRetainedVersions`는 소스가 이름에 대해 보관하는 버전(현재 버전과 이전 버전)을 나열합니다. `removeRemoteBundle`은 특정 버전을 삭제하고, `pruneRemoteBundles`는 더 이상 보관되지 않는 버전을 제거합니다. 상위 수준의 OTA 흐름은 대개 [`Updater`](/docs/references/node/updater)를 통해 이 메서드들을 diff --git a/content/docs/references/node/updater.ko.mdx b/content/docs/references/node/updater.ko.mdx index 59b2ea4..dc72e26 100644 --- a/content/docs/references/node/updater.ko.mdx +++ b/content/docs/references/node/updater.ko.mdx @@ -3,7 +3,7 @@ title: Updater description: '@wvb/node의 Updater 클래스 — 원격 서버에서 최신 번들을 확인하고, 무결성과 서명 검증을 거쳐 스테이징한 뒤 활성화합니다.' --- -`Updater`는 번들의 무선(OTA) 업데이트를 처리합니다. [`BundleSource`](/docs/references/node/source)와 [`Remote`](/docs/references/node/remote)를 짝지어 동작합니다. 원격 서버에서 더 새로운 버전을 확인하고, 소스의 원격 디렉터리로 다운로드한 뒤 활성화합니다. 확인, 다운로드, 활성화 단계는 각각 별도의 메서드입니다. 따라서 백그라운드에서 업데이트를 스테이징해 두고 나중에 전환할 수 있습니다. 예를 들어 다음 앱 재시작 시점에 전환하면 됩니다. 전체 흐름은 [원격 번들](/docs/guide/remote-bundles)을 참고하세요. +`Updater`는 번들의 무선(OTA) 업데이트를 처리합니다. [`BundleSource`](/docs/references/node/source)와 [`Remote`](/docs/references/node/remote)를 짝지어 동작합니다. 원격 서버에서 더 새로운 버전을 확인하고, 소스의 원격 디렉터리로 다운로드한 뒤 활성화합니다. 확인, 다운로드, 활성화 단계는 각각 별도의 메서드입니다. 따라서 백그라운드에서 업데이트를 스테이징해 두고 나중에 전환할 수 있습니다. 예를 들어 다음 앱 재시작 시점입니다. 전체 흐름은 [원격 번들](/docs/guide/remote-bundles)을 참고하세요. ```ts import { BundleSource, Remote, Updater } from '@wvb/node'; @@ -32,7 +32,7 @@ const updater = new Updater(source, remote, options); | `download` | `(bundleName, version?): Promise` | 버전을 원격 디렉터리에 스테이징합니다. 설정된 경우 무결성과 서명을 검증합니다. 활성화하지는 않습니다. | | `install` | `(bundleName, version): Promise` | 스테이징된 버전을 활성화합니다. 다시 검증하고, 현재 버전을 교체하고, 캐시된 디스크립터를 버리고, 오래된 버전을 정리합니다. | -`getUpdate`가 확인 단계입니다. `check`라는 이름의 메서드는 없습니다. `download`와 `install`을 분리해 두면 업데이트 단계를 재시작할 수 있습니다. 네트워크가 가능할 때 바이트를 스테이징한 뒤, 안전한 시점에 활성화하세요. +`getUpdate`가 확인 단계입니다. `check`라는 이름의 메서드는 없습니다. `download`와 `install`을 분리해 두면 업데이트 단계를 재시작할 수 있습니다. 네트워크를 사용할 수 있을 때 바이트를 스테이징한 뒤, 안전한 시점에 활성화하세요. `download`에서 `version` 인자를 생략하면, 업데이터는 설정된 채널의 현재 원격 버전을 가져옵니다. 특정 버전을 스테이징하려면 그 `version`을 직접 전달하세요.