Grâce à @david, nous disposons d’un modèle très propre pour le chargement « eager » de JavaScript dans les thèmes.
Cela signifie que vous n’avez qu’à placer les fichiers *.js.es6 dans le répertoire javascripts et cela fonctionne exactement comme pour les plugins, ce qui est formidable.
Par exemple, voici comment créer un initialiseur maintenant, avec une parité à 100 % avec les plugins :
- Créez un fichier nommé
/javascripts/discourse/initializers/my-init.js.es6
import { withPluginApi } from "discourse/lib/plugin-api";
function initialize(api) {
// init via api here
}
export default {
name: "discourse-otp",
initialize() {
withPluginApi("0.8.28", initialize);
}
};
Il s’agit d’une fonctionnalité extrêmement importante car nous pouvons désormais diviser les grands thèmes complexes en de nombreuses parties, bénéficier du linting, de la coloration syntaxique et de tout le reste.
Cependant, dans certains cas, nous pourrions vouloir optionnellement livrer un payload JS.
Par exemple, disons que nous décorons les publications, mais uniquement celles contenant du markdown très spécifique. Il n’y a aucun intérêt à télécharger une bibliothèque complexe de 100 Ko tant que nous ne savons pas que nous allons l’utiliser.
J’ai contourné ce problème dans mon composant en suivant ce changement élégant :
https://github.com/discourse/discourse/commit/719a93c312b9caa6c71de22d67f1ce1a78c1c8b2
Avec :
import loadScript from "discourse/lib/load-script";
function generateOtp($elem) {
loadScript(settings.theme_uploads.jsotp).then(() => {
// stuff goes here
});
}
Cela signifiait :
- J’ai dû ajouter
.jsaux « extensions autorisées pour les thèmes » - J’ai dû ajouter une exception à la CSP pour l’actif particulier dans « content security policy script src »
- J’ai dû nommer l’actif dans mon about.json
En tant qu’auteur de composant de thème, c’est tout simplement trop de friction car vous n’avez aucune chance dans le jeu de la distribution en exigeant un tel niveau de compétence de ninja.
Je pense que pour rendre cela utilisable, nous avons deux alternatives parmi lesquelles choisir :
-
Nous pouvons enseigner au système d’appliquer automatiquement la CSP aux actifs
.jsdans les thèmes actifs et, par défaut, autoriser les thèmes à télécharger des.js -
Nous pouvons nous orienter vers quelque chose comme javascript_cache que les thèmes non différés utilisent pour le JS.
Je penche plutôt vers la solution 1 car ajouter .js aux extensions autorisées pour les thèmes semble trivial et l’application automatique de la CSP ne devrait pas être impossible.
@pmusaraj / @Johani / @Osama, avez-vous des idées à ce sujet ?