Para meus alunos do primeiro ano, eu forneci uma biblioteca simples baseada no ES5, escrita usando o Revealing Module Pattern. Aqui está um trecho do módulo / espaço para nome "principal", que abrigará outras extensões:
window.Library = (function ($) {
if (!$) {
alert("The Library is dependent on jQuery, which is not loaded!");
}
return {};
})(window.jQuery);
Isso funciona para praticamente 99,9% dos estudantes que são novos no desenvolvimento da Web e não estão usando coisas sofisticadas como o ES6 em combinação com o Webpack ou o Babel.
Os 0,1% agora solicitaram que eu forneça uma versão baseada no ES6, que pode ser importada corretamente. Eu ficaria feliz em fornecer isso, mas estou meio confuso sobre a melhor maneira de abordar isso.
Obviamente, quero manter o caminho do ES5, para que meus alunos possam apenas incluir o arquivo usando uma tag de script e digitar Library.SomeExtension.aFunction();
sempre que desejarem. Além disso, algumas das extensões dependem do jQuery, que é injetado de maneira semelhante ao snippet acima.
Agora estou procurando uma maneira sustentável de obter o melhor dos dois mundos, com uma base de código e o jQuery como dependência. Quero dar 99,9% a window.Library
, enquanto quero dar aos 0,1% uma maneira de usar import Library from 'library'
.
Posso fazer isso com um único arquivo JS que faz as duas coisas? Ou precisaria de uma versão especial do ES6 (não é um problema)? E acima de tudo: como eu reorganizaria meu código (todos semelhantes ao snippet acima) de maneira a suportar ambas as situações?
Todos e quaisquer indicadores serão muito apreciados!
EDIT: Assim como uma nota lateral, eu já tenho um gulpfile.js
no lugar que decorre esta biblioteca através de Babel
, minifiers
entre outras coisas. Portanto, ter que estender isso para resolver o problema acima não é um problema!
Library.SubLibrary.functionName
instalação e também em arquivos separados, mesmo se alguém a importar como ES6 ou qualquer outra coisa. (Isso ocorre principalmente porque as extensões também podem se usar e, usando uma configuração padrão do ES6, isso causaria referências circulares).
export
e o outro atribua window
. Eu estava pensando que seria ótimo se as duas coisas pudessem ser feitas em um único arquivo, já que isso pareceria muito mais elegante, mas a export
palavra - chave parece funcionar apenas dentro de a type=module
. Não sei se há uma solução alternativa ou se é apenas impossível.