WebAssembly (Wasm)는 모든 최신 브라우저에 탑재되어 개발자가 휴대 가능한 바이너리 프로그램을 배포할 수 있게 해주는 기술입니다.
즉, 개발자는 거의 모든 프로그래밍 언어를 사용해 웹을 대상으로 애플리케이션을 개발할 수 있습니다.
Discourse의 맥락에서 이는 과거에 플러그인 개발자에게만 제공되었던 상당히 풍부한 확장 기능 세트를 배포할 수 있는 문을 열어줍니다.
예를 들면 다음과 같습니다:
- 이미지 워터마킹 / 리사이징 / 크롭
- graphviz 또는 svgbob을 사용한 그래프 생성
- 프로그래밍 샌드박스 (예: Ruby 런타임을 내장한 게시물)
- 그리고 훨씬 더 많은 것들
과거에는 Discourse의 Content Security Policy 때문에 로컬 업로드와 CDN이 모두 없는 설치 환경이 아닌 한 Wasm에 대한 접근이 차단되었습니다.
클라이언트 측에 새로운 인터페이스가 추가되어, 로컬 도메인을 통해 무조건적으로 접근 가능한 테마 내 JavaScript 에셋을 배포할 수 있도록 지원하게 되었습니다.
이를 통해 테마 개발자가 Wasm을 깔끔하게 호스팅할 수 있으며, 그 흐름은 다음과 같습니다:
컴포넌트 → 로컬 웹 워커 → CDN에 호스팅된 Wasm
Discourse svgbob 은 새로운 패턴의 끝에서 끝까지(end-to-end)의 예시이며, 두 가지 핵심 변경 사항은 다음과 같습니다:
- 모든
.js에셋은 로컬 서버에서도 CDN과 함께 사용 가능하게 됩니다:
{
...
"assets": {
"worker": "assets/will-be-avilable-on-local.js"
}
}
- 로컬 에셋의 URL은
settings.theme_uploads_local을 통해 접근 가능합니다.
따라서 위의 예시에서:
settings.theme_uploads_local.worker; // 로컬 에셋
settings.theme_uploads.worker; // CDN 에셋