Dart 튜토리얼 23편: Web 앱 개발(Web·Deployment·Wasm)
요약
핵심 요지
- 문제 정의: 웹 앱은 “개발용 빌드”와 “배포용 빌드”가 다르고, JS/Wasm 타깃에 따라 제약이 달라서 기준 없이 진행하면 배포 단계에서 막힌다.
- 핵심 주장: Dart 웹은 기본적으로 “개발(빠른 반복) ↔ 배포(최적화)” 컴파일 흐름이 있고, Wasm 컴파일은 stable이지만 여전히 제약과 임시 절차가 존재한다.
- 주요 근거: 배포 빌드는
webdev build1, Wasm은dart compile wasm2와 별도 정적 파일 복사/부트스트랩 구성 예시가 제시된다. - 실무 기준: JS 배포는
webdev build로, Wasm은 “지원 패키지 +package:web3 기반”을 전제로 실험적으로 접근한다.
문서가 설명하는 범위
- Dart 웹 플랫폼의 개요(개발용/배포용 JS 컴파일러)
- 배포용 빌드(
webdev build)와 배포 최적화(지연 로딩, 불필요 파일 제거 등) - Wasm 컴파일의 지원 범위/제약(브라우저, JS interop, webdev 미지원 등)과 임시 빌드 절차
읽는 시간: 12분 | 난이도: 초급
참고 자료
문제 상황
웹 앱은 “코드를 작성한다”에서 끝나지 않고, 브라우저가 이해할 수 있는 형태로 컴파일해 배포해야 합니다.
그런데 개발 단계(빠른 새로고침)와 배포 단계(작고 빠른 파일)는 목표가 다릅니다.
또한 Wasm은 안정 채널에서도 사용할 수 있지만, 아직 제약이 많아서 “그냥 켜면 된다” 수준이 아닙니다.
그래서 이 글은 웹 앱을 배포하는 기준과, Wasm 타깃을 언제/어떻게 고려해야 하는지 정리합니다.
해결 방법
단계 1: Dart 웹은 “개발용 컴파일”과 “배포용 컴파일”이 다르다는 전제를 둔다
Why
NOTE개발 단계에서는 빠르게 고치고 확인하는 반복이 중요합니다.
반면 배포 단계에서는 다운로드 크기와 실행 속도가 중요합니다.
웹에서는 이 두 목표가 충돌할 수 있으므로, 처음부터 모드를 분리해서 생각해야 합니다.
What
NOTE웹 플랫폼 페이지는 “개발(빠른 edit-refresh)용”과 “배포(코드 크기/속도)용” Dart→JavaScript 컴파일러가 있다는 개요를 제공합니다.
How
TIP학습/개발 단계에서는 “빠른 반복이 가능한 도구”를 사용하고, 배포 단계에서는 “배포용 빌드”로 넘어간다는 기준을 고정합니다.
이 기준이 잡히면, 배포용 빌드에서 나오는 결과물 위치/정리 작업도 자연스럽게 따라옵니다.
Watch out
WARNING웹 타깃을 바꿀 때(JS ↔ Wasm)는 단순 옵션 변경이 아니라 “지원되는 라이브러리/interop 방식”까지 영향을 받습니다.
즉, 처음부터 “타깃이 바뀔 수 있다”면 의존성 선택 기준을 더 엄격하게 가져가야 합니다.
결론: 웹 개발은 “개발용 ↔ 배포용” 모드를 분리해서 잡아야 배포 단계에서 흔들리지 않습니다.
단계 2: JS 배포는 webdev build로 결과물을 고정한다
Why
NOTE배포는 “서빙할 정적 파일 묶음”이 확정되어야 합니다.
그래야 CDN/정적 호스팅에 올리는 작업이 단순해집니다.
What
NOTE배포 빌드에서는
webdev도구로 앱을 빌드하고, 결과물이build/web/main.dart.js에 생성된다고 설명합니다.
또한 트리 셰이킹(tree shaking)로 코드가 줄어든다는 설명이 함께 제시됩니다.
How
TIP배포용 빌드는
webdev build로 수행합니다.
또한 빌드 후 개발용 산출물(예:.js.map)을 제거하는 예시가 제시됩니다.Terminal window # 앱 루트에서:$ find build -type f -name \"*.js.map\" -exec rm {} +
Watch out
WARNING배포 최적화는 빌드 도구만으로 끝나지 않을 수 있습니다.
예를 들어 “지연 로딩(deferred loading)” 같은 언어 기능을 적용하면 초기 다운로드 크기를 줄일 수 있다는 안내가 있습니다.
즉, 성능 목표가 있다면 코드 구조까지 함께 고려해야 합니다.
결론: JS 배포는 webdev build로 결과물 경로를 고정하고, 배포에 불필요한 파일은 제거합니다.
단계 3: Wasm은 “stable이지만 제약이 있다”를 먼저 받아들인다
Why
NOTEWasm은 브라우저에서 빠른 실행과 새로운 방향성을 제공하지만, 웹 생태계 전체가 완전히 동일한 상태는 아닙니다.
따라서 “지원 범위”를 모르고 시작하면 중간에 막힐 가능성이 큽니다.
What
NOTEWasm 타깃은 다음 제약을 안내합니다.
WasmGC 기반 타깃이므로 브라우저 지원이 제한될 수 있고, 표준 Wasm 런타임(wasmtime/wasmer) 실행을 지원하지 않으며, JS interop는 next-gen 방식만 지원합니다.
또한webdev는 Wasm을 위한serve/build를 현재 지원하지 않는다고 안내합니다.
How
TIPWasm 컴파일러는
dartCLI에 포함되어 있으며, 도움말 예시가 제시됩니다.Terminal window $ dart help compile wasmCompile Dart to a WebAssembly/WasmGC module.Usage: dart compile wasm [arguments] <dart entry point>-h, --help Print this usage information.-o, --output Write the output to <file name>.This can be an absolute or relative path.-v, --verbose Print debug output during compilation--enable-asserts Enable assert statements.-D, --define=<key=value> Define an environment declaration.
Watch out
WARNINGWasm 빌드는 임시 절차가 제시됩니다.
예를 들어dart create -t web으로 시작하고,package:web기반이어야 하며,webdev없이 산출물을 구성해 서빙하는 방식이 안내됩니다.
즉, Wasm은 “실험/검증” 관점에서 접근하는 편이 안전합니다.
결론: Wasm은 stable이지만 제약이 크므로, 지원 범위를 먼저 확인하고 실험적으로 적용합니다.
Footnotes
공유
이 글이 도움이 되었다면 다른 사람과 공유해주세요!