Uso carregadores de JavaScript há anos, seja o carregador Dojo, curl.jsou mesmo usando jQuery como um carregador de JavaScriptO jQuery é um carregador de JavaScript, que é incrivelmente útil para solicitar um conjunto de recursos e reagir assim que o carregamento for concluído. Cada carregador de JavaScript é repleto de recursos, eficiente e faz um excelente trabalho de shimming da API Promise que não existia no navegador quando o carregador foi criado. O seguinte não é esse tipo de carregador.
Este super simples permite o carregamento de arquivos de imagem, CSS e JavaScript, usando o API Promisee dispara um retorno de chamada em caso de sucesso ou falha. Esse pequeno “carregador” (eu nem deveria chamá-lo assim) faz não:
- resultados do cache (embora isso fosse fácil)
- fornecer um módulo/objeto de volta
- fazem chamadas AJAX (embora um XHR-to-Promise está disponível, ou o senhor pode usar o buscar)
- … ou qualquer outra coisa avançada
Aqui está o pequeno “carregador” em toda a sua glória:
var load = (function() { // Function which returns a function: https://davidwalsh.name/javascript-functions function _load(tag) { return function(url) { // This promise will be used by Promise.all to determine success or failure return new Promise(function(resolve, reject) { var element = document.createElement(tag); var parent="body"; var attr="src"; // Important success and error for the promise element.onload = function() { resolve(url); }; element.onerror = function() { reject(url); }; // Need to set different attributes depending on tag type switch(tag) { case 'script': element.async = true; break; case 'link': element.type="text/css"; element.rel="stylesheet"; attr="href"; parent="head"; } // Inject into document to kick off loading element[attr] = url; document[parent].appendChild(element); }); }; } return { css: _load('link'), js: _load('script'), img: _load('img') } })(); // Usage: Load different file types with one callback Promise.all([ load.js('lib/highlighter.js'), load.js('lib/main.js'), load.css('lib/highlighter.css'), load.img('images/logo.png') ]).then(function() { console.log('Everything has loaded!'); }).catch(function() { console.log('Oh no, epic failure!'); });
A load
é criado com o js
, css
, e img
que aceitam um URL para carregar. Cada função retorna uma Promise e a função onload
ou onerror
da tag do recurso aciona o evento resolve
ou reject
para a promessa. Promise.all
coleta os recursos a serem carregados e then
é acionado após o carregamento bem-sucedido de todos os recursos, catch
se algum deles falhar.
Devo enfatizar que este é um “carregador” muito, muito simples; por favor, guarde os comentários sobre o fato de ele não ter os recursos que outros carregadores têm. Eu adoro o fato de o API Promise faz gerenciamento assíncrono e de carregamento de recursos, assim como a API ServiceWorker e o API fetch. Faça um favor a si mesmo e dê uma olhada nessas APIs incríveis!