Несколько мыслей по этому поводу.
Разработка платных курсов по Discourse
Идея курсов, связанных с разработкой под Discourse на таких платформах, как Udemy или Coursera, интересна. Я предполагаю, что основные проблемы заключаются в том, что вне команды Discourse не так много людей, которые были бы квалифицированы для создания курса по разработке под Discourse, и что потенциальное количество студентов для такого курса довольно невелико. Тем не менее, я уверен, что хороший курс по разработке тем или плагинов для Discourse со временем сможет привлечь достаточно студентов, чтобы оправдать усилия по его созданию.
Также существует возможная проблема: платные курсы по Discourse могут противоречить духу этого форума. Но я лишь строю догадки на этот счет.
Уроки по разработке под Discourse
Я считаю, что наблюдение о том, что реализация многих плагинов, тем и компонентов тем Discourse довольно проста, верно. Как и при разработке для других платформ, проблема заключается в том, чтобы преодолеть первоначальный барьер непонимания того, как части системы работают вместе. Команда Discourse (или другие квалифицированные разработчики) могла бы помочь в этом, написав несколько уроков, которые шаг за шагом проведут вас через весь процесс создания функциональных тем, компонентов тем и плагинов. Например, пошаговое руководство по созданию чего-то вроде компонента темы Discourse Placeholder.
Я понимаю, что это потребует значительных затрат времени, поэтому такая инициатива должна соответствовать бизнес-целям Discourse.
Доступные ресурсы
При небольшом поиске в этом форуме можно найти множество полезной информации о разработке под Discourse. Изучение примеров кода в репозитории Discourse на GitHub — также отличный способ научиться.
Не стоит игнорировать и недавний инструмент — GitHub Copilot. Если правильно настроить среду разработки, он может помочь понять, как разрабатывать темы и плагины для Discourse. Для разработки тем Discourse лучший подход, который я нашел, — это разработка темы (с помощью Discourse Theme CLI) в корневом каталоге локальной установки Discourse. Такая структура дает Copilot легкий доступ к кодовой базе Discourse. (Обратите внимание, что при разработке плагинов папка plugins уже находится в корневом каталоге /discourse.) (Также отмечу, что я могу ошибаться насчет того, действительно ли Copilot имеет доступ к кодовой базе Discourse, которую я загрузил в свою IDE. В любом случае, полезно иметь основной код Discourse под рукой для собственных справок.)
Чтобы избежать отвлекающих факторов и сосредоточиться на использовании Copilot как инструмента для обучения, я отключаю завершение кода Copilot в своей IDE (VS Code) и взаимодействую с ним только через чат. Вот пример того вида помощи, которую он может предоставить. (shopify.js — это файл, созданный Theme CLI в директории /javascripts/discourse/api-initializers/ моей темы.)
Разговор с Copilot
scossar: Можешь объяснить, что делает экспорт по умолчанию в
shopify.js? По сути, это шаблонный код, который предоставляется Discourse при создании темы с помощьюdiscourse_themegem. Я изменил шаблонный код так, чтобы он фиксировал каждое изменение страницы. Я понимаю вызовapi.onPageChange, но у меня нет четкого понимания того, как объектapiвнедряется в мой код.
GitHub Copilot: Объект
apiвнедряется в ваш код через функциюwithPluginApi, которая вызывается в методеinitializeобъекта, возвращаемогоapiInitializer.Вот упрощенная версия того, что происходит:
При запуске Discourse выполняет все инициализаторы.
Функция
apiInitializerсоздает инициализатор, который запускается после инициализатора"inject-objects".Когда этот инициализатор выполняется, он вызывает функцию
withPluginApi, передавая параметрыversion,cbиopts.Функция
withPluginApiпроверяет, совместима ли текущая версия Discourse с указанной версией. Если да, она вызывает обратную функцию (cb) и передает экземплярPluginApiв качестве аргумента. Этот экземплярPluginApi— это объектapi, который вы видите в своем коде.Таким образом, объект
apiявляется экземпляромPluginApi, и он передается вашему коду функциейwithPluginApi. Этот объект предоставляет множество методов для взаимодействия с Discourse, таких какonPageChange, который вы уже используете.
scossar: Значит, функция, которая является вторым аргументом экспорта по умолчанию в
shopify.js, — это обратная функция, принимаемаяapiInitializer?
GitHub Copilot: Да, всё верно. Вторым аргументом для
apiInitializerявляется обратная функция. Эта функция вызывается с экземпляромPluginApiв качестве аргумента при запуске инициализатора (при условии, что текущая версия Discourse совместима с указанной версией). Именно так объектapiстановится доступным в вашем файлеshopify.js.
После того как я разобрался с этим…
scossar: …Еще одна мысль: можно ли использовать
api.decorateCookedдля внедрения iframe с рейтингами, размещенного на внешнем приложении (например, на приложении Shopify, которое я разрабатываю)?
GitHub Copilot: Да, вы можете использовать
api.decorateCookedдля внедрения iframe в сообщение. Вот грубый пример того, как это можно сделать:api.decorateCooked($elem => { const postId = $elem.data('post-id'); const iframe = document.createElement('iframe'); iframe.src = `https://your-app.com/ratings?post_id=${postId}`; iframe.width = '100%'; iframe.height = '200'; // при необходимости измените $elem.append(iframe); }, { id: 'rating-iframe' });В этом примере
api.decorateCookedиспользуется для добавления iframe к каждому сообщению. Источник iframe устанавливается на URL вашего внешнего приложения, с включенным идентификатором сообщения в качестве параметра запроса. Вам нужно заменить'https://your-app.com/ratings'на фактический URL вашей страницы рейтингов.Обратите внимание, что это упрощенный пример. Возможно, вам придется адаптировать его под свои нужды, и вы обязательно должны добавить обработку ошибок и другие необходимые меры предосторожности, чтобы обеспечить корректную и безопасную работу.
В настоящее время нереально ожидать, что Copilot напишет весь ваш код, но это отличный инструмент для обучения написанию кода для Discourse.