Благодаря @david у нас появился очень чистый паттерн для «жадной» загрузки JavaScript в темах.
Это означает, что вы просто помещаете файлы *.js.es6 в директорию javascripts, и всё работает точно так же, как с плагинами — это великолепно.
Например, вот как теперь создаётся инициализатор, имеющий 100% паритет с плагинами:
- Создайте файл с именем
/javascripts/discourse/initializers/my-init.js.es6
import { withPluginApi } from "discourse/lib/plugin-api";
function initialize(api) {
// инициализация через api здесь
}
export default {
name: "discourse-otp",
initialize() {
withPluginApi("0.8.28", initialize);
}
};
Это чрезвычайно важная функция, потому что теперь мы можем разбивать большие сложные темы на множество частей, получать линтинг, подсветку синтаксиса и всё остальное хорошее.
Однако в некоторых случаях нам может потребоваться опционально поставлять JS-нагрузку.
Например, предположим, что мы декорируем посты, но только те, которые содержат очень специфичный Markdown. Нет смысла загружать 100 КБ библиотеку, пока мы не уверены, что будем её использовать.
Я обошёл это в своём компоненте, следуя этому изящному изменению:
С помощью:
import loadScript from "discourse/lib/load-script";
function generateOtp($elem) {
loadScript(settings.theme_uploads.jsotp).then(() => {
// здесь код
});
}
Это означало:
- Мне нужно было добавить
.jsв «разрешённые расширения темы». - Мне нужно было добавить обход CSP для конкретного актива в «список источников скриптов политики безопасности контента».
- Мне нужно было указать имя актива в моём файле about.json.
Для автора компонента темы это слишком много препятствий, ведь у вас нет шансов в игре по распространению, если требуется такой уровень ниндзя.
Я думаю, чтобы сделать это удобным, у нас есть два варианта на выбор:
-
Мы можем научить систему автоматически применять CSP к
.js-активам в активных темах и по умолчанию разрешать темам загружать.js. -
Мы можем перейти к чему-то вроде
javascript_cache, которое используется для JS тем без отложенной загрузки.
Я склоняюсь к варианту 1, потому что добавление .js в разрешённые расширения темы кажется тривиальным, а автоматическое применение CSP не должно быть невозможным.
@pmusaraj / @Johani / @Osama, есть ли у вас какие-либо мысли по этому поводу?