개요
에디터 “뇌”를 Rust로 옮겨도 브라우저 편집 특성이
사라지지는 않습니다. 조합 입력, 클립보드 정규화, Selection API,
실행 취소와의 상호작용은 호스트 책임이며, 표면을 통째로 캔버스로
바꾸지 않는 한 contenteditable·입력 이벤트와 함께
갑니다.
이 섹션은 아키텍처와 경계에 초점을 둡니다: 어디서 편집이 일어나는지, IME와 Rust 모델을 어떻게 맞출지, 데이터가 JS↔WASM을 어떻게 넘는지, 협업(CRDT)이 WASM 모듈 옆에 어떻게 붙는지.
언어에 무관한 에디터 설계(스키마, 트랜잭션, HTML 매핑)는 에디터 문서를 보고, 여기서는 Rust 코어 + 브라우저 호스트를 가정합니다.
왜 여러 페이지로 나눴나
- 에디팅 방식(DOM·캔버스·하이브리드)에 따라 캐럿·IME·접근성 책임 주체가 달라집니다.
- IME는 브라우저에서 “Rust로 다시 구현”하는 게 아니라, 조합 이벤트에 맞춰 모델을 맞추는 쪽입니다.
- FFI: 키 입력마다 전체 문서를 넘기면 알고리즘 전에 병목이 납니다.
- 협업: Rust CRDT + WASM 바인딩과 JS 에디터 호스트가 함께 쓰이는 경우가 많습니다.
사이트 다른 곳과의 관계
시나리오·케이스는 실제 브라우저 동작(IME, 붙여넣기, 선택)을 모읍니다. WASM을 쓰더라도 현상은 같고, 이 가이드는 그걸 Rust 코어와 어떻게 연결할지 설명합니다.
가이드
에디팅 방식
contenteditable + WASM: 진실 원천, 이벤트 순서, DOM↔모델 루프, 정규화, Rust 호출 시점.
IME·조합 입력
조합 이벤트, Rust 문서 모델 동기화, IME는 여전히 브라우저 영역인 이유.
JS ↔ WASM 경계
문자열·복사·배치 연산, 비동기와 입력 이벤트, 핫 패스 비용 줄이기.
클립보드·입력 라우팅
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 호스팅.