Nesse artigo vou mostrar como carregar os scripts e estilos de acordo com a necessidade no AngularJS usando técnica de lazy loading e UI route resolver.
Vamos pensar em um problema:
Você tem uma tela “A” que usa o plugin jqGrid plugin e duas outras telas “B” e “C” que não usam esse plugin. Normalmente você referencia o script do plugin na master page da aplicação e todas as telas “A”, “B” e “C” carregarão esse script mas apenas a tela “A” irá usá-lo. Esse é um problema de performance que começa a ficar complexo quando há muitos scripts.
A solução:
Usar uma combinação do plugin de lazy loading para o AngularJS e AngularJS UI router resolver para carregar os scripts conforme a necessidade antes de abrir a tela.
Vamos ver o código:
Arquivo: app.definition.ts:
var definitions = function () {
var baseFolder = '';
return {
grid: {
devDependencies: [
baseFolder + 'Css/plugins/jQueryUI/jquery-ui-1.10.4.custom.min.css',
baseFolder + 'Css/plugins/jqGrid/ui.jqgrid.css',
baseFolder + 'Css/style.jqGrid.css',
baseFolder + 'Scripts/plugins/jqGrid/i18n/grid.locale-pt.js',
baseFolder + 'Scripts/plugins/jqGrid/jquery.jqGrid.min.js',
baseFolder + 'Scripts/plugins/jquery-ui/jquery-ui.min.js'
]
}
};
} ();
O container “definitions” guarda a configuração para cada plugin e suas dependências de scripts e css.
Arquivo: app.routes.ts:
(function () {
class AppRoutes {
constructor(
private utilProvider: App.Util,
private $stateProvider: ng.ui.IStateProvider,
private $urlRouterProvider: ng.ui.IUrlRouterProvider
) {
let genericRoute = new App.Core.State.GenericState(this.utilProvider);
this.$urlRouterProvider.otherwise("/login");
this.$stateProvider.state('homemenu', genericRoute.getState({
url: '/',
views: {
root: {
template: 'The page does not use GRID scripts. Go to <a ui-sref="homeperson">Person Page</a>'
}
}
}));
this.$stateProvider.state('homeperson', genericRoute.getState({
url: '/person',
dependencies: ['grid'],
views: {
root: {
template: 'That page uses GRID scripts. Back to <a ui-sref="homemenu">Home Page</a>'
}
}
}));
}
}
AppRoutes.$inject = [
'utilProvider',
'$stateProvider',
'$urlRouterProvider'
];
angular
.module('app')
.config(AppRoutes);
})();
O código acima eu configurei as rotas para esse artigo. Apenas a rota “/person” usa o jqGrid plugin e suas dependências. O método “getState” a gente configura o lazy loading e verifica as dependências no container “definition” para saber quais scripts ou estilos serão carregados.
Tente você mesmo:
Acesse a homepage:
Veja no “fiddler” que nenhum scripts ou estilo do plugin do GRID serão ou foram carregados:
Clique no link “Person Page”, irá navegar até a outras tela que usa o grid:
Veja no “fiddler” que para essa rota, todos os scripts e estilos para o plugin do grid foram carregados.
Bom é isso. Esperto que tenha ajudado.
Abaixo encontrará alguns links úteis.
Angular lazy loading: Perguntas, sugestões ou críticas são bem vindas. Boa sorte!
| Faça download completo do código fonte no github. | |
| Veja um demo online dessa aplicação no codefinal. |





