Ein paar Gedanken dazu.
Entwicklung bezahlter Discourse-Kurse
Die Idee von Kursen zur Discourse-Entwicklung auf einer Plattform wie Udemy oder Coursera ist interessant. Ich vermute, die Hauptprobleme sind, dass es nicht viele Leute außerhalb des Discourse-Teams gibt, die qualifiziert wären, einen Kurs in Discourse-Entwicklung zu erstellen, und dass die potenzielle Anzahl von Studenten für einen Kurs recht gering ist. Das heißt, ich bin sicher, dass ein guter Kurs zur Entwicklung von Discourse-Themes oder Plugins im Laufe der Zeit genügend Studenten finden könnte, um die Erstellung eines Kurses lohnenswert zu machen.
Es gibt auch ein mögliches Problem, dass die Gebühr für Discourse-Kurse gegen den Geist dieses Forums verstoßen könnte. Aber das ist nur Spekulation.
Discourse-Entwicklungstutorials
Ich denke, die Beobachtung, dass die tatsächliche Implementierung vieler Discourse-Plugins, Themes und Theme-Komponenten recht einfach ist, ist korrekt. Wie bei der Entwicklung für andere Plattformen besteht das Problem darin, die anfängliche Hürde zu überwinden, nicht zu verstehen, wie die Teile zusammenpassen. Das Discourse-Team (oder andere qualifizierte Entwickler) könnte dabei helfen, indem es einige Tutorials schreibt, die Sie durch den gesamten Prozess der Erstellung funktionaler Themes, Theme-Komponenten und Plugins führen. Zum Beispiel eine Schritt-für-Schritt-Anleitung zur Erstellung einer Theme-Komponente wie Discourse Placeholder.
Ich erkenne an, dass dies eine große Zeitinvestition erfordert, daher müsste es mit den Geschäfts Zielen von Discourse übereinstimmen.
Aktuell verfügbare Ressourcen
Mit ein wenig Suche gibt es viele gute Informationen zur Discourse-Entwicklung in diesem Forum. Das Betrachten von Codebeispielen aus dem Discourse GitHub-Repository ist ebenfalls eine großartige Lernmöglichkeit.
Ein aktuelles Tool, das nicht ignoriert werden sollte, ist GitHub Copilot. Wenn Sie Ihre Entwicklungsumgebung richtig einrichten, kann es hilfreich sein, ein Gefühl dafür zu bekommen, wie man Discourse-Themes und Plugins entwickelt. Für die Entwicklung von Discourse-Themes ist der beste Ansatz, den ich gefunden habe, das Theme (mit dem Discourse Theme CLI) im Stammverzeichnis meiner lokalen Discourse-Installation zu entwickeln. Die Strukturierung auf diese Weise gibt Copilot einfachen Zugriff auf die Discourse-Codebasis. (Beachten Sie, dass sich für die Plugin-Entwicklung der Ordner plugins bereits im Stammverzeichnis /discourse befindet.) (Beachten Sie auch, dass ich falsch liegen könnte, was die tatsächliche Zugänglichkeit des Discourse-Codes durch Copilot betrifft, den ich in meiner IDE geladen habe. In jedem Fall ist es hilfreich, den Kern-Discourse-Code zu Referenzzwecken verfügbar zu haben.)
Um Ablenkungen zu vermeiden und mich auf die Nutzung von Copilot als Lernwerkzeug zu konzentrieren, deaktiviere ich Copilot Completions in meiner IDE (VS Code) und interagiere nur über den Chat mit Copilot. Hier ist ein Beispiel für die Art von Unterstützung, die es bieten kann. (shopify.js ist die Datei, die vom Theme CLI in dem Verzeichnis /javascripts/discourse/api-initializers/ meines Themes erstellt wurde.)
Konversation mit Copilot
_scossar: Können Sie erklären, was der Standardexport in shopify.js tut? Es ist im Wesentlichen der Boilerplate-Code, der von Discourse bereitgestellt wird, wenn ein Theme mit dem discourse_theme-Gem erstellt wird. Ich habe den Boilerplate-Code geändert, sodass er jeden Seitenwechsel protokolliert. Ich verstehe den Aufruf von api.onPageChange, aber ich habe kein klares Verständnis davon, wie das api-Objekt in meinen Code injiziert wird.
GitHub Copilot: Das
api-Objekt wird über die FunktionwithPluginApiin Ihren Code injiziert, die in derinitialize-Methode des Objekts aufgerufen wird, das vonapiInitializerzurückgegeben wird.
Hier ist eine vereinfachte Version dessen, was passiert:
- Wenn Discourse startet, führt es alle Initialisierer aus.
- Die Funktion
apiInitializererstellt einen Initialisierer, der nach dem Initialisierer"inject-objects"ausgeführt wird.
- Wenn dieser Initialisierer ausgeführt wird, ruft er die Funktion
withPluginApiauf und übergibt die Parameterversion,cbundopts.
- Die Funktion
withPluginApiprüft, ob die aktuelle Discourse-Version mit der angegebenen Version kompatibel ist. Wenn ja, ruft sie die Callback-Funktion (cb) auf und übergibt diePluginApi-Instanz als Argument. DiesesPluginApi-Instanz ist dasapi-Objekt, das Sie in Ihrem Code sehen.
Das
api-Objekt ist also eine Instanz vonPluginApiund wird Ihnen von der FunktionwithPluginApizur Verfügung gestellt. Dieses Objekt bietet eine Reihe von Methoden, mit denen Sie mit Discourse interagieren können, wie z. B.onPageChange, das Sie bereits verwenden.
_scossar: Die Funktion, die das zweite Argument des Standardexports in shopify.js ist, ist also die Callback-Funktion, die von apiInitializer akzeptiert wird?
GitHub Copilot: Ja, das ist richtig. Das zweite Argument von
apiInitializerist eine Callback-Funktion. Diese Funktion wird mit derPluginApi-Instanz als Argument aufgerufen, wenn der Initialisierer ausgeführt wird (vorausgesetzt, die aktuelle Discourse-Version ist mit der angegebenen Version kompatibel). So wird dasapi-Objekt in Ihrershopify.js-Datei verfügbar gemacht.
Nachdem ich das geklärt hatte…
_scossar: …Ein anderer Gedanke, könnte api.decorateCooked verwendet werden, um einen Ratings-Iframe einzufügen, der auf einer externen Anwendung gehostet wurde (zum Beispiel gehostet von der Shopify-App, die ich entwickle)?
GitHub Copilot: Ja, Sie können
api.decorateCookedverwenden, um einen Iframe in einen Beitrag einzufügen. Hier ist ein grobes Beispiel, wie Sie das tun könnten:
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'; // nach Bedarf anpassen $elem.append(iframe); }, { id: 'rating-iframe' });
In diesem Beispiel wird
api.decorateCookedverwendet, um jedem Beitrag einen Iframe anzuhängen. Die Quelle des Iframes wird auf eine URL Ihrer externen Anwendung gesetzt, wobei die Beitrags-ID als Abfrageparameter enthalten ist. Sie würden'https://your-app.com/ratings'durch die tatsächliche URL Ihrer Ratings-Seite ersetzen.
Bitte beachten Sie, dass dies ein vereinfachtes Beispiel ist. Möglicherweise müssen Sie es an Ihre Bedürfnisse anpassen und Sie sollten definitiv Fehlerbehandlung und andere notwendige Vorsichtsmaßnahmen hinzufügen, um sicherzustellen, dass es korrekt und sicher funktioniert.
Es ist zu diesem Zeitpunkt nicht realistisch zu erwarten, dass Copilot Ihren gesamten Code schreibt, aber es ist ein großartiges Werkzeug, um zu lernen, wie man Discourse-Code schreibt.