Grazie a @david, abbiamo un pattern molto pulito per il caricamento “eager” di JavaScript nei temi.
Ciò significa che basta inserire i file *.js.es6 nella directory javascripts e funzionano esattamente come i plugin: è glorioso.
Ad esempio, ecco come si crea un inizializzatore ora, con il 100% di parità rispetto ai plugin:
- Crea un file chiamato
/javascripts/discourse/initializers/my-init.js.es6
import { withPluginApi } from "discourse/lib/plugin-api";
function initialize(api) {
// init via api qui
}
export default {
name: "discourse-otp",
initialize() {
withPluginApi("0.8.28", initialize);
}
};
Questa è una funzionalità enormemente importante perché ora possiamo suddividere temi grandi e complessi in molte parti, ottenendo linting, evidenziazione della sintassi e tutte le altre cose positive.
Tuttavia, in alcuni casi potremmo voler opzionalmente distribuire un payload JS.
Ad esempio, diciamo che stiamo decorando i post, ma solo quelli con un markdown molto specifico. Non ha senso scaricare una libreria complessa da 100KB finché non sappiamo che la useremo.
Ho risolto questo problema nel mio componente seguendo questo elegante cambiamento:
https://github.com/discourse/discourse/commit/719a93c312b9caa6c71de22d67f1ce1a78c1c8b2
Con:
import loadScript from "discourse/lib/load-script";
function generateOtp($elem) {
loadScript(settings.theme_uploads.jsotp).then(() => {
// il codice va qui
});
}
Questo ha significato:
- Dovevo aggiungere
.jsalle “estensioni autorizzate per il tema” - Dovevo aggiungere una bypass alla CSP per la risorsa specifica in “content security policy script src”
- Dovevo nominare la risorsa nel mio about.json
Come autore di componenti per i temi, è semplicemente troppo attrito, perché non hai alcuna possibilità nel gioco della distribuzione richiedendo questo livello di abilità ninja.
Penso che per renderlo utilizzabile ci siano 2 alternative tra cui possiamo scegliere:
-
Possiamo insegnare al sistema di applicare automaticamente la CSP alle risorse
.jsnei temi attivi e, per impostazione predefinita, permettere ai temi di caricare.js -
Possiamo spostarci verso qualcosa come javascript_cache che usa il JS del tema non differito.
Sono un po’ propenso alla soluzione 1, perché aggiungere .js alle estensioni autorizzate per il tema sembra banale e l’applicazione automatica della CSP non dovrebbe essere impossibile.
@pmusaraj / @Johani / @Osama, avete qualche pensiero a riguardo?