How to ship javascript library with plugin?

Hi,
I’d like to ask what is recommended way to ship javascript library with some plugin? I can load it asynchronously from external url using e.g.

Em.$.getScript('https://cdnjs.cloudflare.com/ajax/libs/......min.js').done(function() {
...
}

But I’d prefer storing library locally. Normally I’d use vendor.js to include it and have it loaded before the plugin code, but this approach needs hacking with the Discourse core… So what is recommended way and where to add external js library to plugin? Is there some convention? Thx.

Just add the js lib at the assets folder in your plugin, or if available, as a gem dependency.

2 „Gefällt mir“

Thanks… In the assets folder will it be loaded automatically or do I need to take care of asynchronous load as quoted in previous post? I need to load library before running plugin code.

It’s loaded in the plugin-third-party file, inside the HEAD. You can use ES6 modules to require stuff.

1 „Gefällt mir“

I asked a similar question a few days ago (Existing JS module import into ES6 plugin). The problem I have is, that I want it included server side and I have no idea on which path I should require it in ES6 modules.

Got back to you there, so we don’t pollute here.

Thanks… placing js lib in asset folder and register_asset in plugin.rb did the trick.

2 „Gefällt mir“

Entschuldigung, dass ich diesen Thread wiederbelebe, aber Google hat mich hierher geführt. Ich versuche seit ein paar Stunden, eine JS-Bibliothek in mein Plugin zu laden.

  • In meinem Ordner app/assets/javascripts befindet sich eine Datei namens argdown-core.js.
  • In meiner plugin.rb-Datei verwende ich register_asset 'javascripts/argdown-core.js'.
  • In assets/javascripts/discourse-markdown/argdown.js.es6 verwende ich import { argdown } from "argdown-core.js".

Ich habe viele Variationen davon ausprobiert und erhalte weiterhin den Fehler: Uncaught Error: Could not find module argdown-core.js imported from discourse/plugins/Argdown/discourse-markdown/argdown.

Einige der Dinge, die ich versucht habe:

  • Die Datei in verschiedene Ordner verschoben
  • Viele Permutationen der import-Zeile ausprobiert
  • Die Endung .es6 an die Dateierweiterung angehängt – andere JS-Dateien scheinen das zum Ausführen zu benötigen
  • :server_side ans Ende meiner register_asset-Zeile in plugin.rb gesetzt, da dies dort ausgeführt werden sollte
  • Nach anderen Plugins gesucht, die Bibliotheken von Drittanbietern verwenden – konnte keine finden, die Strategien nutzen, die ich nicht bereits verwende
  • Durch den Discourse-Code gegraben, um das Bounding-System zu verstehen

Das ist wahrscheinlich einfach und ich übersehe etwas Offensichtliches. Kann mir jemand helfen?

1 „Gefällt mir“

GitHub - discourse/discourse-algolia: A plugin for indexing and searching your Discourse with Algolia · GitHub macht dies beispielsweise. Ich empfehle dir, einen Blick auf den Code zu werfen, insbesondere auf den Anfang von plugin.rb.

Außerdem ein kleiner Tipp: Beim Programmieren wirken Dinge oft schwierig, wenn man das Gefühl hat, die Auswirkungen des eigenen Handelns nicht zu kennen. Es ist wichtig zu wissen, was vor sich geht. Ich empfehle dir, folgenden Befehl in deiner Konsole auszuführen: window.requirejs.entries. Das könnte dir helfen, einige Dinge besser zu verstehen.

5 „Gefällt mir“

Vielen Dank, das ist sehr hilfreich! Das Unterbringen meiner Bibliothek im Ordner assets/lib bringt bereits viel.

Jetzt, wo ich den korrekten Pfad habe, verhält sich die Bibliothek merkwürdig. :man_facepalming: Es ist eine große Bibliothek mit vielen Submodulen – argdown.js benötigt ArgdownApplication.js und einige weitere. Beim Versuch, ArgdownApplication.js zu laden, erscheint die Meldung: „Uncaught ReferenceError: exports is not defined.

1 „Gefällt mir“

Ich empfehle Ihnen, sich für die Komplettlösung zu entscheiden.

1 „Gefällt mir“