Graças ao @david, temos um padrão muito limpo para carregamento “eager” de JavaScript em temas.
Isso significa que basta colocar arquivos *.js.es6 no diretório javascripts e funciona exatamente como os plugins, o que é glorioso.
Por exemplo, é assim que você cria um inicializador agora, com 100% de equivalência aos plugins:
- Crie um arquivo chamado
/javascripts/discourse/initializers/my-init.js.es6
import { withPluginApi } from "discourse/lib/plugin-api";
function initialize(api) {
// inicialização via api aqui
}
export default {
name: "discourse-otp",
initialize() {
withPluginApi("0.8.28", initialize);
}
};
Esta é uma funcionalidade extremamente importante, pois agora podemos dividir temas grandes e complexos em muitas partes, obter linting, destaque de sintaxe e tudo o mais de bom.
No entanto, em alguns casos, podemos querer enviar opcionalmente um payload JS.
Por exemplo, digamos que estamos decorando posts, mas apenas posts com markdown muito específico. Não há sentido em baixar uma biblioteca elaborada de 100KB até sabermos que vamos usá-la.
Contornei isso no meu componente seguindo essa mudança sofisticada:
https://github.com/discourse/discourse/commit/719a93c312b9caa6c71de22d67f1ce1a78c1c8b2
Com:
import loadScript from "discourse/lib/load-script";
function generateOtp($elem) {
loadScript(settings.theme_uploads.jsotp).then(() => {
// conteúdo vai aqui
});
}
Isso significou que:
- Eu precisei adicionar
.jsàs “extensões autorizadas do tema” - Eu precisei adicionar uma exceção à CSP para o ativo específico em “content security policy script src”
- Eu precisei nomear o ativo no meu about.json
Como escritor de componente de tema, isso é simplesmente muita fricção, pois você não tem chance no jogo de distribuição exigindo esse nível de ninja.
Estou pensando que, para tornar isso utilizável, temos 2 alternativas das quais podemos escolher:
-
Podemos ensinar o sistema a aplicar CSP automaticamente aos ativos
.jsem temas ativos e, por padrão, permitir que temas façam upload de.js -
Podemos migrar para algo como javascript_cache que os temas JS não defer usam.
Estou meio que inclinado para a opção 1, pois adicionar .js às extensões autorizadas do tema parece trivial e o CSP automático não deve ser impossível.