Percebi que os arquivos JS adicionados usando register_asset por meio de plugins são passados como string para a função eval.
O problema com o eval é que ele não adiciona o objeto ao escopo global, conforme discutido aqui: https://stackoverflow.com/questions/4670805/javascript-eval-on-global-scope, o que é essencial para usar uma biblioteca JS.
Especificamente, eu estava tentando usar https://github.com/muaz-khan/RecordRTC/blob/master/RecordRTC.js em um plugin, mas as funções não estavam acessíveis nos arquivos do Ember.
A solução alternativa é processar o arquivo com o webpack, usando libraryTarget como umd.
Muitas bibliotecas são processadas dessa forma, o que parece funcionar sem necessidade de configuração adicional.
Agora, não sou especialista nessas coisas, mas estou apenas me perguntando se faria sentido que o Discourse adicionasse os ativos registrados ao escopo global.
Nota: Peço desculpas se algo disso parecer bobo. Eu não esperava ter que mexer com o webpack para fazer bibliotecas JS funcionarem com o Discourse, o que me motivou a publicar este relato.
Outra constatação minha é que os arquivos JS incluídos tanto no discourse-spoiler-alert quanto no lazy-yt injetam funções no objeto jQuery global, mas não declaram nenhuma função de nível superior.
Olhei para o seu plugin e posso confirmar que o eval está presente apenas no modo de desenvolvimento. Em produção, ele será inserido no escopo global. Entendo que isso não seja ideal, mas também não acho que bibliotecas devam normalmente ser distribuídas sem algum tipo de suporte a módulos (por exemplo, UMD).
Minha sugestão seria reempacotar o JS com algum tipo de suporte a UMD e depois importá-lo, mas isso é um pouco complicado de configurar se você não tem muita experiência com JS e módulos.
Em vez disso, uma maneira fácil de fazer isso funcionar é editar o RecordRTC.js e adicionar a seguinte linha:
window.RecordRTC = RecordRTC;
Seria ainda melhor envolver todo o conteúdo em um IIFE:
(function(exports) {
// o conteúdo original do arquivo vai aqui
exports.RecordRTC = RecordRTC;
})(window);
Sim, concordo. Muitas delas são distribuídas dessa forma e funcionam perfeitamente. Obrigado por investigar isso e pela confirmação Optei por empacotar a biblioteca via webpack e funciona sem nem mesmo precisar importar. Deveria ter testado no modo de produção, no entanto.