Компоненты тем Discourse теперь поддерживают Wasm 🎊

WebAssembly (Wasm) — это технология, встроенная во все современные браузеры, которая позволяет разработчикам распространять переносимые двоичные программы.

Это означает, что разработчики могут использовать практически любой язык программирования и ориентироваться на веб.

В контексте Discourse это открывает возможность распространения довольно широкого набора расширений, которые ранее были доступны только создателям плагинов.

Примеры могут включать:

  • Добавление водяных знаков к изображениям / изменение их размера / кадрирование
  • Генерацию графиков с помощью graphviz или svgbob
  • Песочницы для программирования (например, посты, встраивающие среду выполнения Ruby)
  • и многое другое

Ранее из-за политики безопасности контента (CSP) в Discourse доступ к Wasm был заблокирован, за исключением установок с локальными загрузками и без CDN.

В клиентскую часть были добавлены новые интерфейсы для поддержки распространения JavaScript-активов в теме, которые всегда доступны через локальный домен.

Это позволяет разработчикам тем аккуратно размещать Wasm; процесс выглядит следующим образом:

компонент → локальный веб-воркер → Wasm, размещённый на CDN

Discourse svgbob — это пример сквозной реализации новых паттернов. Два ключевых изменения:

  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() для включения дополнительных скриптов в глобальную область видимости воркера, как мне включить эти скрипты для импорта внутри компонента темы?

Возможно, я спрашиваю: как загрузить скрипт по URL внутри компонента темы Discourse?

2 лайка

В данном сценарии я использовал postMessage из основного JS-скрипта для передачи URL-адресов, которые необходимо импортировать. Это сообщение обрабатывается в обработчике воркера, который может выполнить importScript для полученных URL-адресов.

2 лайка

Спасибо, Рафаэль! У вас есть пример с открытым исходным кодом, на который можно сослаться?

2 лайка

Я использовал этот же паттерн в ядре

6 лайков

Я использую конструктор тем для создания нового компонента темы, который должен использовать wasm. В качестве отправной точки я попытался загрузить svgbob в качестве компонента темы. Однако мне это не разрешено, так как он содержит файл wasm.

Является ли это преднамеренным ограничением конструктора тем? Или нельзя просто установить svgbob в таком виде?

2 лайка

Я подозреваю, что в конструкторе тем есть ограничение на типы файлов, которое нужно снять.

3 лайка

Я сбросил Themecreator, чтобы он использовал настройки по умолчанию для «разрешённых расширений темы», куда входит WASM. Теперь всё должно работать, @Heinenen.

(Не уверен, почему стояло нестандартное значение… возможно, раньше отсутствовало одно из распространённых расширений :man_shrugging:)

2 лайка

Да, очень круто, могу подтвердить, что теперь всё работает. Спасибо!

3 лайка

Хорошо, похоже, мне придется немного отступить — пока что всё работает не идеально.
Я попробовал снова загрузить svgbob, и это сработало.

Теперь, когда я попытался загрузить свой собственный wasm-файл, взятый с MDN, возникла ошибка:
Произошла ошибка: вы передали некорректные параметры в запрос: строка содержит нулевой байт

В моём dev-контейнере это не является проблемой, и я могу загрузить тот же файл без каких-либо затруднений.

2 лайка

Разве запуск исполняемого файла с веб-сайта не представляет угрозу безопасности, к которой следует подходить с осторожностью? Возможно, именно поэтому это не было установлено по умолчанию. Что вы думаете, @Roman?

1 лайк

По умолчанию это разрешено в темах. Просто настройка сайта на discourse.theme-creator.io была изменена. (Это обычный сайт Discourse с плагином, позволяющим любому пользователю загружать и публиковать темы).

WASM всё ещё работает в изолированной среде браузера, поэтому уровень риска для безопасности эквивалентен .js файлу.

4 лайка