개요
이벤트는 JS에서 들어옵니다. WASM으로 넘길 때마다 문자열·버퍼 복사가
붙을 수 있고, 매 input마다 전체 문서를 직렬화하면 내부
diff 알고리즘 전에 병목이 납니다.
복사 비용·인코딩
- UTF-16 vs UTF-8: JS는 UTF-16 코드 유닛, Rust
String은 UTF-8 바이트 인덱스. 경계에서는 스칼라 오프셋·바이트 오프셋을 명시적으로 통일하세요. - 큰 문자열: HTML 전체를 매번 Rust로 넘기면 메모리 이중화. 증분 패치·해시된 스냅샷·보안 모델이 허용하는 공유 뷰를 검토합니다.
배치·연산 스트림
가능하면 작은 연산(삽입·삭제·서식)을 넘기고, 협업에서는 바이너리 CRDT 업데이트가 텍스트 스냅샷보다 작을 때가 많습니다.
검증 비용 줄이려고 디바운스할 수는 있지만, 조합·커밋 순서를 뒤섞지 않도록 하세요.
비동기와 입력
WASM에서 시작한 Promise는 마이크로태스크로 이어집니다. Rust 작업이 비동기면 선택·입력 레이스를 막을 가드가 필요합니다.
FFI 위생
- 문서 상태는 길게 살아가는 핸들(박스 포인터)로 좁은 API 노출.
- “전체 트리 교체”보다 “연산 적용”을 우선.
- 성능 패널에서 glue vs WASM 본연 시간을 분리해 측정.
Wasm 가이드
에디팅 방식
contenteditable + WASM: 진실 원천, 이벤트 순서, DOM↔모델 루프, 정규화, Rust 호출 시점.
IME·조합 입력
조합 이벤트, Rust 문서 모델 동기화, IME는 여전히 브라우저 영역인 이유.
클립보드·입력 라우팅
beforeinput, 붙여넣기, JS에서 라우팅할지 WASM에서 정제할지.
툴링·번들·워커
wasm-pack, wasm-opt, 코드 스플릿, Web Worker, COOP/COEP·스레드.
협업·CRDT (WASM)
Yrs·y-crdt, Yjs 연동, 스냅샷 vs 업데이트 스트림.
선택·Range·오프셋
UTF-16 vs UTF-8, JS Selection/Range, Rust 모델 매핑·getTargetRanges.
실행 취소·다시 실행 모델
브라우저 undo 스택 vs 모델 히스토리, 프로그래밍 DOM, WASM 트랜잭션.
접근성 (WASM 호스트)
편집 표면이 브라우저일 때 역할·포커스·스크린 리더.
테스트·디버깅
E2E, JS↔WASM 경계 프로파일링, IME·붙여넣기 CI 재현.
보안·배포
CSP, SRI, 모듈 무결성, contenteditable 옆 WASM 호스팅.