이 글을 작성하는 시점(2024년 4월 7일)에서, Dart(Flutter)의 WASM(WebAssembly) 지원은 beta 상태입니다. 하지만 조만간 Dart 3.4에서 dart2wasm cli 포함이 알려지고 있습니다. 이에 따라 2024년 3월 13일 업데이트된 Flutter 공식 사이트의 WASM 설명에서도, 이를 위한 준비 작업이 게시되고 있습니다. WASM 자체가 아직 신기술이여서, 당분간은 매우 제한적인 개발만 가능하겠지만, 공식 버전에 담길 예정이니, 의미는 크다고 볼 수 있습니다.
Dart(Flutter)로 WASM을 경험하기 위해서, 기존의 dart:html 대신 package:web을 사용하는 것이 대대적으로 강조되고 있습니다. 아래는 공식 사이트의 원문을 그대로 가져온 버전입니다.
“If you maintain a public Flutter package that uses dart:html or any of the other Dart SDK web libraries, you should migrate to package:web as soon as possible. package:web is replacing dart:html and other web libraries as Dart’s web interop solution long-term. Read the package:web vs dart:html section for more information.”
dart:html 대신 package:Web을 사용해야 하는 이유에 대해서는 3가지로 설명하고 있습니다.
첫째로, WASM 호환성 입니다.
WASM 과의 호환성을 위해서는 dart:js_interop와 dart:js_interop_unsafe를 사용하는 패키지를 사용해야 한다고 합니다. package:web은 dart:js_interop를 사용하여 문제가 없다고 합니다. 따라서 3.4 공식 버전에 탑재될 dart2wasm에서 지원이 됩니다. 그러나, dart:html과 dart:svg는 WASM에서 지원되지 않는다고 합니다.
둘째로, Web IDL 입니다.
WebIDL 은 웹 애플리케이션 프로그래밍 인터페이스(API)를 구성하는 데이터 타입, 인터페이스, 메서드, 속성 및 기타 구성 요소를 설명하는 데 사용되는 인터페이스 설명 언어입니다. 특정 프로그래밍 언어와는 독립적인 다소 양식이 있는 구문을 사용합니다. 그래서 각 API를 구축하는 데 사용되는 기본 코드는 가장 적합한 언어로 작성될 수 있으며 동시에 API 구성요소를 JavaScript에 호환이 되는 구성에 매핑할 수도 있습니다.
이에 맞춰서 package:web은 Web IDL을 사용하여 interop members와 interop types를 정의합니다. 따라서 최근의 Web 기술을 수용하는 보다 진보된 패키지로 볼 수 있습니다.
셋째로, 버전 관리의 용이성이라고 합니다.
기존에 dart:html을 사용한 코드는 일단 dart:html을 import한 구문을 삭제하고, package:web을 import하는 것으로 migration을 시작하라고 합니다. 이후 case-by-case로 발생 가능한 사항은 홈페이지(출처#)에 게시되어 있으니 참조하기 바랍니다.
[출처#] Migrate to package:web