Arquitectura de AngularJS
AngularJS se apoya en una arquitectura Modelo-Vista-Controlador (MVC) muy flexible. Las piezas fundamentales son:
- Módulos: agrupan la funcionalidad y declaran dependencias.
- Controladores: enlazan datos del modelo con la vista.
- Scopes: actúan como contexto y puente entre vista y lógica.
- Servicios: encapsulan lógica reutilizable y acceso a datos.
- Directivas / Componentes: extienden HTML para construir UI reutilizable.
Comprender cómo interactúan es la clave para dominar el framework.
Componentes clave
- Scopes: objetos jerárquicos que propagan datos y eventos a través de la vista.
- Digest cycle: bucle que detecta cambios evaluando watchers. El rendimiento depende de mantener pocos watchers y evitar operaciones pesadas dentro de
ng-repeat. - Directivas: encapsulan lógica de UI. Directivas estructurales como
ng-ifong-repeatalteran el árbol DOM; directivas de atributo agregan comportamiento reutilizable. - Servicios y factories: singletons compartidos mediante inyección de dependencias, ideales para lógica de negocio y comunicación con APIs.
- Filtros: formatean datos en la vista, equivalentes a los pipes de Angular moderno.
Flujo de datos
graph TD
A[Modelo] -->|two-way binding| B[Vista]
B -->|evento| C[Controlador]
C -->|actualiza| A
C -->|utiliza| D[Servicio]
El enlace bidireccional simplifica formularios, pero dificulta escalar cuando la lógica de presentación crece. Usa one-time bindings (::propiedad) para renderizados estáticos.
Buenas prácticas
- Modulariza: usa
angular.module('app', [...])para separar dominios. - Evita lógica pesada en controladores: delega en servicios.
- Optimiza watchers: utiliza
track byenng-repeaty divide vistas complejas en componentes. - Prueba directivas: escribe specs con
ngMockpara garantizar su comportamiento. - Prepara la migración: adopta
component()y TypeScript cuando sea posible para acercarte a Angular moderno.
Arquitectura para proyectos grandes
- Feature modules: agrupa cada dominio funcional (
users,billing,reports) en su propio módulo con entradas claras (users.module.js,users.routes.js,users.component.js). - Core y shared:
app.corecontiene servicios singleton (logger, interceptores, configuraciones), mientras queapp.sharedexporta directivas, filtros y componentes reutilizables. - Archivo
index.jspor carpeta: reexporta elementos y reduce rutas de importación cuando usas bundlers modernos (export * from './users.service';). - Servicios anti-estado global: usa
session.service.js,auth.service.jso stores basados en$rootScope.$broadcast()para evitar dependencias circulares. - Convenciones de nombres:
*.module.jsdefine el módulo y sus dependencias.*.component.jsregistra componentes (angular.module('app').component('userList', {...})).*.controller.js,*.service.js,*.directive.jsencapsulan cada pieza.*.routes.jscontiene la configuración deui-routerongRoute.*.spec.jsagrupa pruebas unitarias junto al código que testean.
Integración con entornos mixtos
En organizaciones con múltiples aplicaciones AngularJS conviviendo con Angular moderno u otros stacks:
- Expone cada app como micro front-end mediante
ng-appmanual y módulos root independientes. - Comparte librerías comunes (componentes, servicios HTTP) mediante paquetes npm internos o submódulos git.
- Centraliza temas (CSS variables, utilidades SCSS) y tradúcelos en un build compartido para evitar divergencias de estilos.
¿Qué sigue?
En los siguientes documentos profundizamos en cada pieza:
- Primeros pasos: cómo arrancar tu proyecto desde cero.
- Módulos y bootstrapping: ciclo de arranque,
config(),run()y DI. - Directivas y componentes: creación y patrones avanzados.
- Filtros y pipes: formateo y reutilización.
- Routing, formularios, testing y despliegue: guía completa para llevar la aplicación a producción.