Verwendung der JS-API

Die JavaScript-API von Discourse ermöglicht es Themes und Plugins, umfassende Anpassungen am Nutzererlebnis vorzunehmen. Der einfachste Weg, sie zu nutzen, besteht darin, im Admin-Bereich ein neues Theme zu erstellen, auf „Code bearbeiten“ zu klicken und dann zum JS-Tab zu wechseln.

Bei dateibasierten Themes kann die API genutzt werden, indem eine Datei im Verzeichnis api-initializers erstellt wird. Für Themes lautet der Pfad {theme}/javascripts/api-initializers/init-theme.gjs, für Plugins {plugin}/assets/javascripts/discourse/api-initializers/init-plugin.js. Der Inhalt sollte wie folgt aussehen:

import { apiInitializer } from "discourse/lib/api";

export default apiInitializer((api) => {
  // Dein Code hier
});

Alle verfügbaren APIs sind im Quellcode von plugin-api.gjs im Discourse-Kernel aufgeführt, jeweils mit einer kurzen Beschreibung und Beispielen.

Für ein vollständiges Tutorial, einschließlich von Beispielen zur Nutzung der JS-API, schau hier:


Dieses Dokument wird versioniert – Änderungen können auf GitHub vorgeschlagen werden.

39 „Gefällt mir“

What’s the best way to “import” as a Site Customisation? - is it just to use require?

Whilst this works:

<script type="text/discourse-plugin" version="0.1">
var HamburgerMenuComponent = require('discourse/components/hamburger-menu').default;
</script>

This does not:

<script type="text/discourse-plugin" version="0.1">
import {default as HamburgerMenuComponent2 } from 'discourse/components/hamburger-menu';

</script>

Where I get this error:

<script type="text/discourse-js-error">unknown: 'import' and 'export' may only appear at the top level (3:0)
  1 | Discourse._registerPluginCode('0.1', api => {
  2 |   
> 3 | import {default as HamburgerMenuComponent2 } from 'discourse/components/hamburger-menu';
    | ^
  4 | 
  5 | 
  6 | }); at <eval>:8695:14</script>
2 „Gefällt mir“

Instead of importing it, you can look it up with

api.container.lookupFactory('component:hamburger-menu')
5 „Gefällt mir“

Is there a way to get access to the h helper from virtual-dom in a site customization? I’m trying to add a simple dropdown widget to use in our header, and I can’t get that darned h, even though I can get createWidget

Does:

h = require('virtual-dom').h;

not work?

2 „Gefällt mir“

Yes it does! Works perfectly, thanks a ton!

I wouldn’t recommend doing it that way as it would likely break future compatibility. You can use this for now but I’ll try to introduce a workaround shortly that will be safer long term.

5 „Gefällt mir“

Makes sense, it’s kinda circumventing the whole Plugin API thing and relying on implementation details of the ES6 compilation output, both things that are Dangerous™

Anyways, I’ll definitely keep an eye out for a better solution

I’ll try to get to it soon and I’ll reply in this topic, so watch it and you’ll see :slight_smile:

4 „Gefällt mir“

Actually thinking about it, the decorateWidget helper gets called with an object that has the h method. How are you inserting your widget if not via a decorator?

If you could post code that would be helpful.

{{mount-widget}} in a template for a plugin outlet.

1 „Gefällt mir“

Ah that’s clever – I didn’t think people would try that. Okay, let me try something out.

Okay, I’ve added h to the pluginApi object as long as you request plugin api v0.3:

<script type="text/discourse-plugin" version="0.3">
  console.log(api.h('b', ['hello', 'world']));
</script>

That should work for you!

https://github.com/discourse/discourse/commit/b10b6c673d5f4936d0ee107e16531df106fae75e

9 „Gefällt mir“

Dies ist nun veraltet ab:

1 „Gefällt mir“

Hier und in einer Reihe anderer versionsverwalteter Dokumente aktualisiert. Danke für den Hinweis @NateDhaliwal

2 „Gefällt mir“

Dieser Link funktioniert nicht mehr, ich erhalte diese Meldung:

Der main-Branch von discourse enthält nicht den Pfad app/assets/javascripts/discourse/app/lib/plugin-api.gjs.

2 „Gefällt mir“

Ah, das liegt daran, dass die JavaScript-Dateien in das Verzeichnis frontend/ verschoben wurden, anstatt nach app/assets/javascripts/.

Ich habe einen PR geöffnet:

5 „Gefällt mir“

Diesen PR hochschieben. Könnte er überprüft werden? Danke!

1 „Gefällt mir“

Im Dezember zusammengeführt. :tada:

1 „Gefällt mir“