Discourse 테마 컴포넌트가 이제 Wasm을 지원합니다 🎉

WebAssembly (Wasm)는 모든 최신 브라우저에 탑재되어 개발자가 휴대 가능한 바이너리 프로그램을 배포할 수 있게 해주는 기술입니다.

즉, 개발자는 거의 모든 프로그래밍 언어를 사용해 웹을 대상으로 애플리케이션을 개발할 수 있습니다.

Discourse의 맥락에서 이는 과거에 플러그인 개발자에게만 제공되었던 상당히 풍부한 확장 기능 세트를 배포할 수 있는 문을 열어줍니다.

예를 들면 다음과 같습니다:

  • 이미지 워터마킹 / 리사이징 / 크롭
  • graphviz 또는 svgbob을 사용한 그래프 생성
  • 프로그래밍 샌드박스 (예: Ruby 런타임을 내장한 게시물)
  • 그리고 훨씬 더 많은 것들

과거에는 Discourse의 Content Security Policy 때문에 로컬 업로드와 CDN이 모두 없는 설치 환경이 아닌 한 Wasm에 대한 접근이 차단되었습니다.

클라이언트 측에 새로운 인터페이스가 추가되어, 로컬 도메인을 통해 무조건적으로 접근 가능한 테마 내 JavaScript 에셋을 배포할 수 있도록 지원하게 되었습니다.

이를 통해 테마 개발자가 Wasm을 깔끔하게 호스팅할 수 있으며, 그 흐름은 다음과 같습니다:

컴포넌트 → 로컬 웹 워커 → CDN에 호스팅된 Wasm

Discourse svgbob 은 새로운 패턴의 끝에서 끝까지(end-to-end)의 예시이며, 두 가지 핵심 변경 사항은 다음과 같습니다:

  1. 모든 .js 에셋은 로컬 서버에서도 CDN과 함께 사용 가능하게 됩니다:
{
...
  "assets": {
    "worker": "assets/will-be-avilable-on-local.js"
  }
}
  1. 로컬 에셋의 URL은 settings.theme_uploads_local을 통해 접근 가능합니다.

따라서 위의 예시에서:

settings.theme_uploads_local.worker; // 로컬 에셋
settings.theme_uploads.worker; // CDN 에셋
36개의 좋아요

wasm과 직접적인 관련은 없지만, 이 코드에 대해 다른 흥미로운 점을 발견했습니다. 이 기능은 새로운 것인가요?

예제에서 loadScript가 더 이상 필요하지 않은 것 같습니다. (import가 중복된 것 아닌가요?):

대신, 워커가 존재하지 않는다고 판단되면 워커 스크립트가 JIT로 로드되는 것인가요?

에셋 참조에서 생성된 URL을 사용하고 있습니다.

훌륭한 패턴이며 매우 유용합니다!

다만, 워커에 대해 질문이 있습니다.

세 번째 당사자(third party) 워커 스크립트를 사용했는데, 해당 스크립트에 워커의 전역 범위에 추가 스크립트를 포함하기 위한 importScripts() 문이 포함되어 있다면, 테마 컴포넌트 내에서 import를 위해 해당 스크립트를 어떻게 포함해야 할까요?

아마도 제가 묻고 싶은 것은: Discourse 테마 컴포넌트 내에서 URL로부터 스크립트를 어떻게 요구(require)하는지에 대한 것일 수 있습니다.

2개의 좋아요

이 시나리오에서 저는 메인 JS 스크립트에서 가져오려는 URL을 포함하여 postMessage를 사용했습니다. 이는 워커의 메시지 핸들러에서 수신되며, 수신된 URL을 importScript할 수 있습니다.

2개의 좋아요

라파엘, 감사합니다! 참고할 오픈소스 예시가 있나요?

2개의 좋아요

저는 코어에서 동일한 패턴을 사용했습니다

6개의 좋아요

theme creator를 사용하여 wasm을 사용하도록 설계된 새로운 테마 컴포넌트를 만들고 있습니다. 시작점으로 svgbob을 테마 컴포넌트로 업로드해 보았지만, wasm 파일이 포함되어 있어 업로드가 허용되지 않았습니다.

이것이 테마 크리에이터의 의도된 제한 사항인가요? 아니면 svgbob을 그대로 설치할 수 없는 건가요?

2개의 좋아요

테마 제작자의 파일 유형 제한이 문제인 것 같고, 이를 해제해야 할 것 같습니다.

3개의 좋아요

themecreator를 기본 ‘theme authorized extensions’ 설정으로 리셋했는데, 여기에는 WASM도 포함되어 있습니다. 이제 작동해야 할 것 같아요 @Heinenen.

(왜 기본값이 아닌 다른 설정으로 되어 있었는지 모르겠네요… 아마 과거에 일반적인 확장 프로그램 중 하나가 빠져 있었나 봐요 :man_shrugging:)

2개의 좋아요

네, 정말 멋지네요. 이제 제대로 작동하는 것을 확인했습니다. 감사합니다!

3개의 좋아요

음, 아직 완벽하게 작동하지 않는 것 같으니 조금 돌아가야 할 것 같습니다.
svgbob를 다시 업로드해 보았는데, 이번에는 성공했습니다.

이제 MDN에서 가져온 wasm 파일을 직접 업로드해 보았더니 다음과 같은 오류가 발생합니다:
An error occurred: You supplied invalid parameters to the request: string contains null byte

제 개발 컨테이너에서는 문제가 되지 않으며, 같은 파일을 문제없이 업로드할 수 있습니다.

2개의 좋아요

웹사이트에서 바이너리를 실행하는 것은 보안 위험을 초래할 수 있으므로 신중하게 선택해야 하지 않나요? 그것이 기본값으로 설정되지 않은 이유가 될 수도 있습니다. @Roman, 어떻게 생각하시나요?

1개의 좋아요

기본적으로 테마에서 허용됩니다. discourse.theme-creator.io의 사이트 설정이 변경되었을 뿐입니다. (그것은 누구나 테마를 업로드하고 공유할 수 있는 플러그인이 있는 일반 Discourse 사이트입니다).

WASM은 여전히 브라우저에 의해 샌드박싱되므로, 보안 노출은 .js 파일과 동일합니다.

4개의 좋아요