Discourse テーマコンポーネントがWasmに対応しました 🎊

WebAssembly(Wasm)は、開発者がポータブルなバイナリプログラムを配布できる、すべてのモダンブラウザに搭載されているテクノロジーです。

これにより、開発者はほぼすべてのプログラミング言語を使用して、Web をターゲットにすることができます。

Discourse のコンテキストでは、これにより、これまでプラグイン作成者のみが利用可能だった、かなり豊富な拡張機能のセットを配布できるようになります。

例としては、次のものが挙げられます。

  • 画像の透かし/リサイズ/クロップ
  • graphviz または svgbob を使用したグラフ生成
  • プログラミングサンドボックス(例:Ruby ランタイムを埋め込んだ投稿)
  • その他多数

以前は、Discourse の Content Security Policy により、ローカルアップロードがあり CDN がないインストールを除き、Wasm へのアクセスは無効になっていました。

ローカルドメインから無条件に到達可能なテーマ内の JavaScript アセットを配布するために、クライアントサイドに新しいインターフェイスが追加されました。

これにより、テーマ開発者は Wasm をきれいにホストできるようになります。フローは次のようになります。

コンポーネント → ローカル Web Worker → CDN でホストされている Wasm

Discourse svgbob は、新しいパターンのエンドツーエンドの例です。2 つの重要な変更点は次のとおりです。

  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 はもはや必要ありませんか?(インポートは冗長だと思います):

そして代わりに、ワーカーが存在しないことが判明したときにワーカー スクリプトが JIT でロードされるのですか?

アセット参照から構築された URL を使用して。

これは良いパターンであり、非常に役立ちます!

しかし、ワーカーについて質問があります。

サードパーティのワーカー スクリプトを使用し、そのスクリプトに importScripts()importScripts() ステートメント)が含まれており、追加のスクリプトをワーカーのグローバル スコープに含める場合、それらのスクリプトをテーマ コンポーネントにインポートするにはどうすればよいですか?

質問は、「Discourse テーマ コンポーネント内で URL からスクリプトを要求するにはどうすればよいですか?」ということかもしれません。

「いいね!」 2

このシナリオで行ったことは、メインのJSスクリプトからpostMessageを使用して、インポートするURLを渡すことです。これは、ワーカー側のメッセージハンドラーで受信され、受信したURLをimportScriptできます。

「いいね!」 2

ラファエルさん、ありがとうございます!参照できるオープンソースの例はありますか?

「いいね!」 2

コアでもこの同じパターンを使用しました

「いいね!」 6

テーマクリエイター を使用して、wasm を使用する新しいテーマコンポーネントを作成しようとしています。出発点として、svgbob をテーマコンポーネントとしてアップロードしようとしました。しかし、wasm ファイルが含まれているため、許可されていません。

これはテーマクリエイターの意図された制限ですか?それとも、svgbob をそのままインストールできないということですか?

「いいね!」 2

テーマ作成者のファイルタイプ制限を解除する必要があると思われます。

「いいね!」 3

テーマクリエイターをデフォルトの「テーマ承認済み拡張機能」(WASM を含む)を使用するようにリセットしました。これで機能するはずです @Heinenen

(なぜデフォルト以外の設定になっていたのかは不明です…過去に一般的な拡張機能のいずれかが欠けていたのかもしれません :man_shrugging:

「いいね!」 2

はい、とても素晴らしいです。今動作することを確認できました。ありがとうございます!

「いいね!」 3

少し戻る必要があるようです。まだ完璧に機能していないと思います。
もう一度 svgbob をアップロードしたところ、うまくいきました。

MDN の wasm ファイル をアップロードしようとすると、次のエラーが発生します。
エラーが発生しました: リクエストに無効なパラメーターが指定されました: 文字列にヌルバイトが含まれています

開発コンテナでは問題なく、同じファイルを問題なくアップロードできます。

「いいね!」 2

ウェブサイトからバイナリを実行することは、慎重に選択すべきセキュリティ上のリスクではありませんか?それがデフォルトでなかった理由かもしれません。どう思いますか、@Roman

「いいね!」 1

テーマではデフォルトで許可されています。変更されたのは discourse.theme-creator.io のサイト設定だけです。(これは通常のディスコースサイトで、誰でもテーマをアップロードして共有できるプラグインが付いています)。

WASM はまだブラウザによってサンドボックス化されているため、セキュリティ上のリスクは .js ファイルと同等です。

「いいね!」 4