Frontend
Architect
4 horas diarias, lunes a viernes. 160 horas de contenido en 8 semanas. Angular enterprise y React (Hooks, Redux Toolkit, Zustand) con la misma profundidad, antes de la fase de arquitectura a escala.
Consolidar los fundamentos avanzados
JavaScript internals, TypeScript avanzado, patrones de arquitectura frontend y tooling moderno. Las bases mentales que un arquitecto necesita antes de entrar a los frameworks.
class: es prototype chain, closures y this. La reactividad empieza con el Observer Pattern, mucho antes de que existieran los Signals.Dominio enterprise
De la API clásica a las APIs modernas. Lifecycle hooks, RxJS, Signals, Forms, NgRx y Module Federation. El framework enterprise por excelencia.
Mismo nivel, segundo framework
Hooks a fondo, Context y sus límites reales, Redux Toolkit y Zustand con comparativa directa contra NgRx, routing con data APIs, testing con RTL y las features concurrentes que sostienen a Next.js. Misma profundidad que Angular, para pensar en patrones y no en sintaxis de un solo framework.
Sistemas a escala
Micro-frontends, design systems, performance, API patterns, security, a11y, testing y CI/CD. El salto de senior a arquitecto.
Los 8 Pilares del Arquitecto Frontend
Un arquitecto frontend no es solo un senior que sabe más. Es alguien que diseña sistemas, habilita equipos y toma decisiones que perduran en el tiempo.
Distribucion semanal
20 horas semanales en 4 horas diarias de lunes a viernes. Cada modulo de contenido (~5-9h) se completa en poco mas de 1 dia. Los 26 modulos de la ruta (Core, Angular, React y Arquitectura) se cubren en 8 semanas calendario.
Contenido de la semana
- Prototypal inheritance: `prototype`, `__proto__`, `Object.create` — la herencia real detrás de `class` ES6; entender esto hace que todo Angular DI y los decoradores tengan sentido
- `class` ES6 y `this` binding: campos privados (#), static, extends, super — y las 4 reglas de `this`: implícita, explícita (call/apply/bind), new, arrow — el error más frecuente en callbacks y event handlers
- Closures y Execution Context: scope chain, variable capture, IIFE — la base conceptual de los servicios como singletons y del patrón module antes de ES modules
- Event Loop profundo: call stack, microtask queue (Promise/queueMicrotask), macrotask queue — por qué el orden importa en el browser y en el change detection de Angular
- Observer Pattern & Reactivity mental model: publicador/suscriptor, pull model (dirty checking / Zone.js) vs push model (Signals / Observables) — el puente que une AngularJS con Signals y RxJS
- Proxy & Reflect: trampas (get/set/has/apply), meta-programación — la base interna de Vue 3 Reactivity System, MobX y de cómo Angular Signals detecta cambios sin Zone.js
Fuentes de referencia
Contenido de la semana
- TypeScript Generics avanzados: constraints (extends), infer en conditional types, mapped types con -readonly/-? — type systems que documentan la arquitectura sin comentarios
- Template Literal Types, Discriminated Unions y Branded Types: el type system como herramienta de arquitectura — hacer imposibles los estados imposibles
- Feature-Sliced Design (FSD): capas (shared/entities/features/widgets/pages/app), reglas de dependencia — solo hacia abajo, nunca lateral
- Clean Architecture y SOLID en componentes: casos de uso, ports & adapters, SRP por componente, DIP (inyectar servicios) — adaptados al browser
- Vite internals: dev server con ESM nativo + HMR, producción con Rollup — por qué es más rápido que webpack y cuándo importa en Angular
- Monorepos: Nx vs Turborepo — DAG de tareas, caché local y remota, generators, affected commands — la base para escalar a múltiples apps Angular
Fuentes de referencia
Contenido de la semana
- Anatomía de un componente Angular: selector, template, styles, encapsulation, changeDetection — la base que todo el ecosistema hereda
- @Input y @Output decoradores: property binding, EventEmitter, unidirectional data flow — la API clásica presente en todo código legado que vas a leer y mantener
- Lifecycle hooks completos: ngOnChanges, ngOnInit, ngDoCheck, ngAfterViewInit, ngOnDestroy — cuándo se dispara cada uno y los errores más comunes
- Memory leaks con subscriptions: el patrón takeUntil + Subject completado en ngOnDestroy — el bug más frecuente en código legacy y cómo evitarlo
- async pipe: el pipe que gestiona subscribe y unsubscribe automáticamente — por qué es la práctica correcta para Observables en templates
- Control flow moderno (@if/@for/@switch): reemplaza *ngIf/*ngFor/*ngSwitch como estándar desde Angular 17 — mejor performance y sin necesidad de CommonModule
Fuentes de referencia
Contenido de la semana
- DI Jerárquico: ModuleInjector (app-level) vs ElementInjector (component-level), cómo se resuelve la cadena de providers
- InjectionToken: tokens tipados para valores no-clase, multi providers, useFactory con deps declaradas explícitamente
- Standalone por defecto: bootstrapApplication, provideRouter — los NgModules son hoy la excepción, no la norma; solo se ven en código legacy
- Angular Signals: signal(), computed(), effect() — el modelo reactivo por defecto de Angular; Zoneless es el comportamiento estándar desde la v21
- Signal Inputs/Outputs: input(), output(), model() — la forma estándar de declarar entradas/salidas de un componente, no un "reemplazo" sino la API vigente
- OnPush ChangeDetectionStrategy: por qué sigue siendo relevante incluso en zoneless, signal() como disparador de detección de cambios
Fuentes de referencia
Contenido de la semana
- input() signal-based: la forma estándar de declarar entradas desde Angular 17 — required(), alias, transform para convertir el valor entrante
- output() signal-based: OutputEmitterRef — la API vigente para eventos de salida, tipada y sin decoradores en standalone
- model(): two-way binding reactivo con Signals — la alternativa a [(ngModel)] para componentes propios, composable y con historial de cambios observable
- linkedSignal(): estable desde Angular 20. Signal derivado que acepta escritura manual — casos de uso reales: paginación que se resetea, selección dependiente de otro filtro
- httpResource() (estable desde Angular 21): fetching declarativo sobre HttpClient con estados value()/isLoading()/error() como Signals — resource() es el primitivo genérico del que deriva
- Zoneless por defecto (Angular 21+): provideZonelessChangeDetection() ya no es necesario en apps nuevas; Zone.js pasa a ser opt-in explícito para proyectos legacy con provideZoneChangeDetection()
Fuentes de referencia
Contenido de la semana
- Observable contract: Producer/Observer/Subscriber, cold vs hot observables — la diferencia que determina si el stream se repite o comparte estado entre suscriptores
- Subjects: Subject (control manual), BehaviorSubject (valor inicial + replay para late subscribers), ReplaySubject (buffer N), AsyncSubject (solo último antes de complete)
- State Services con BehaviorSubject: el patrón pre-NgRx — servicio con BehaviorSubject privado y Observable público vía asObservable() — todavía frecuente en proyectos sin NgRx
- Operators fundamentales: map, filter, tap, take, debounceTime, distinctUntilChanged, shareReplay — el 80% del uso real en Angular
- Operators de aplanamiento: switchMap (cancela anterior), exhaustMap (ignora nuevos), mergeMap (paralelo), concatMap (en orden) — y Higher-order: combineLatest, forkJoin, withLatestFrom
- Custom Operators y error handling: catchError, retry con backoff, composición reutilizable y testeable de forma aislada
- toSignal() / toObservable(): el bridge estándar entre RxJS y Signals — completionBehavior y las trampas más comunes
- takeUntilDestroyed(destroyRef): el patrón moderno de unsubscription, reemplaza el manual takeUntil + Subject; Marble Testing (TestScheduler) queda como herramienta puntual para librerías compartidas, no para el día a día
Fuentes de referencia
Contenido de la semana
- Reactive Forms: FormControl (con value y status como Signals desde Angular 14), FormGroup, FormBuilder — por qué template-driven forms no escalan en apps enterprise
- FormArray: listas dinámicas de controles, addControl/removeAt, validar el array completo como unidad — el caso clásico de ítems dinámicos
- Validators síncronos y asíncronos: ValidatorFn, AsyncValidatorFn, cross-field validation en el FormGroup padre — composición sin duplicación
- Custom Validators: función pura que recibe AbstractControl y retorna ValidationErrors | null — testeable sin DOM, reutilizable entre formularios
- HttpClient: get/post/put/delete tipados con genéricos, HttpParams, HttpHeaders, responseType — el cliente HTTP oficial de Angular con soporte SSR
- Interceptors funcionales: HttpInterceptorFn, cadena de interceptors — auth token bearer, logging de requests, error handling global con retry
Fuentes de referencia
Contenido de la semana
- NgRx SignalStore: el estándar actual para state management en Angular — withState, withComputed, withMethods, patchState, mucho menos boilerplate que el Store clásico
- Entity management en SignalStore: withEntities, normalización de colecciones, CRUD pattern predefinido
- Store clásico (Actions/Reducers/Effects/Selectors): createAction, createReducer, createSelector memoizado — sigue siendo relevante en código legacy y para equipos con background Redux
- Effects: Actions stream, ofType, tap vs switchMap vs exhaustMap en efectos, error handling con catchError + EMPTY
- Migración progresiva: cómo convive SignalStore con Store clásico en la misma app durante una migración incremental
- Component Store / estado local: estado acotado a un componente complejo, alternativa cuando no hace falta estado global
Fuentes de referencia
Contenido de la semana
- Lazy Loading con standalone: loadComponent vs loadChildren, nested lazy routes — cómo el router resuelve los bundles en runtime sin configuración de webpack
- Guards funcionales: canActivate, canDeactivate, canMatch como funciones puras con inject() — eliminando clases Guard con boilerplate innecesario
- Resolvers funcionales: resolve como función que retorna Observable/Promise — datos pre-cargados antes de activar la ruta sin loading states en componentes
- Deferrable Views (@defer): triggers (on viewport, on interaction, when condition), prefetch strategies — lazy loading de UI sin split de ruta
- Preloading Strategies: PreloadAllModules, QuicklinkStrategy (solo links visibles en viewport), custom preloader — impacto en LCP y TTI
- Angular CDK: component harnesses para testing sin acceder al DOM directo, drag-and-drop, virtual scroll, overlay API
Fuentes de referencia
Contenido de la semana
- Vitest como test runner por defecto de Angular desde la v21 — Karma queda deprecado (sin nuevas features ni fixes); migración de un proyecto existente con la guía oficial
- Spectator: createComponent, createService, byRole/byText — compatible con Jasmine, Jest y Vitest, mucho menos boilerplate que TestBed puro
- ng-mocks: MockComponent, MockDirective, MockPipe, MockProvider — aislamiento correcto, sin over-mocking ni NO_ERRORS_SCHEMA
- TestBed avanzado: override providers en tests standalone, configureTestingModule, runInInjectionContext
- Testing Signals: assertions sobre signal values, testing de computed() y de efectos con effect()
- Cypress Component Testing: montar Angular components en un browser real con hot reload, para casos que necesitan DOM/CSS real y no solo jsdom
Fuentes de referencia
Contenido de la semana
- Cuándo micro-frontends: múltiples equipos con releases independientes — y cuándo NO agregar esta complejidad
- Module Federation: host (shell) y remote apps, exposes vs remotes, shareScope para singletons
- @angular-architects/module-federation: loadRemoteModule, routing dinámico hacia remotes en runtime — la librería estándar para Angular
- Module Federation 2.0: nuevo runtime, dynamic federation, type-safe sharing, version management entre equipos
- Single-SPA: orchestrator-based approach, parcels para componentes transversales, múltiples frameworks conviviendo en una página
- Shell Application: routing de micro-frontends, error boundaries por remote, fallback cuando el remote falla
- Contratos entre equipos: shared component libraries con versionado semántico, breaking change detection entre shell y remotes
- Deploy independiente: pipelines por remote, registry de remotes en JSON/API, rollback granular sin afectar al resto de la app
Fuentes de referencia
Contenido de la semana
- JSX no es HTML: Babel lo transforma a React.createElement/jsx-runtime, expresiones embebidas, fragments — el mismo tipo de "syntactic sugar" que el template compiler de Angular
- Modelo de componentes: function components como estándar, props inmutables de solo lectura, composición vía children — el equivalente conceptual al content projection (ng-content) de Angular
- Reconciliation y Fiber: el algoritmo de diffing, keys en listas — por qué usar el índice como key es un anti-patrón real, no una sugerencia de estilo
- Qué dispara un render vs qué actualiza el DOM: por qué "render" no es "repintar", React.memo para evitar renders innecesarios — el equivalente a OnPush pero sin declararlo explícito
- StrictMode: doble invocación intencional en desarrollo para exponer side effects impuros — no es un bug, es una herramienta de detección
- Setup 2026: Vite + React como estándar para SPAs, frameworks (Next.js) cuando se necesita SSR/RSC — create-react-app está oficialmente deprecado
Fuentes de referencia
Contenido de la semana
- useState y batching: actualizaciones asíncronas y agrupadas (automatic batching desde React 18), updater functions cuando el nuevo estado depende del anterior
- useEffect completo: array de dependencias, función de cleanup, el error más común (dependencias faltantes) y por qué el linter no es opcional
- useLayoutEffect vs useEffect: cuándo el timing síncrono antes del paint importa — casos reales, no la opción por defecto
- useMemo y useCallback: cuándo memoizar realmente aporta (referencias estables para props, cálculos costosos) y cuándo es optimización prematura sin medir
- useRef: refs al DOM vs valores mutables que no disparan render — el escape hatch para imperative code
- Custom hooks: extracción de lógica reutilizable, convención useX, composición de hooks — el equivalente a un servicio Angular pero sin DI ni singleton implícito
- Rules of Hooks: por qué el orden de llamada importa (linked list interna de Fiber), eslint-plugin-react-hooks como gate obligatorio, no opcional
Fuentes de referencia
Contenido de la semana
- createContext/useContext: Provider pattern, valores por defecto, composición de múltiples providers
- El problema real de Context: cualquier cambio en el value re-renderiza TODOS los consumidores — no hay selectors nativos, no hay memoización granular
- Compound Components pattern: componentes que comparten estado implícito vía Context (ej. Tabs/Tab, Accordion/Item) — composición explícita sobre configuración por props
- Render props y children as function: patrones previos a los hooks, todavía presentes en librerías legacy — reconocerlos para mantener código existente
- Context vs DI de Angular: Context NO es inyección de dependencias real — no hay jerarquía de tokens, no hay multi-providers, no hay scopes — es props drilling con azúcar sintáctico
- Cuándo Context alcanza: estado que cambia poco (theme, locale, usuario autenticado) — la frontera exacta antes de necesitar una librería de estado externa
Fuentes de referencia
Contenido de la semana
- Por qué Redux "clásico" (mapStateToProps, connect, action types como strings) quedó obsoleto — Redux Toolkit es el estándar oficial desde 2019
- createSlice: reducers + action creators autogenerados a partir de un solo objeto — elimina el boilerplate histórico de Redux
- Immer bajo el capó: mutación aparente del estado dentro de un reducer que en realidad produce un nuevo estado inmutable vía Proxy
- configureStore: setup con DevTools y middleware (thunk) habilitados por defecto, sin configuración manual
- RTK Query: data fetching + caching + invalidación integrados en el store — el equivalente funcional a NgRx + un HTTP client combinados
- Comparación directa con NgRx: Actions/Reducers/Selectors son el mismo patrón Flux con distinta sintaxis — Effects ≈ RTK middleware/thunks, memoized selectors ≈ createSelector
Fuentes de referencia
Contenido de la semana
- Zustand: create() sin Provider, sin boilerplate de actions/reducers — un store es literalmente un custom hook
- Selectors: suscripción granular a slices del estado para evitar re-renders — el equivalente a los selectors memoizados de NgRx pero sin ceremonia
- Middleware: persist (localStorage/sessionStorage), devtools (Redux DevTools compatible), immer para mutación aparente igual que en RTK
- Slices pattern en Zustand: dividir un store grande en slices combinables — cómo escalar sin perder la simplicidad inicial
- Matriz de decisión real: Context (estado simple, poco cambio) vs Zustand (estado compartido sin ceremonia) vs Redux Toolkit (equipos grandes, time-travel debugging, ecosistema de middleware maduro)
- Comparación con NgRx SignalStore: Zustand es filosóficamente más cercano a SignalStore (API mínima, sin Actions/Reducers explícitos) que a NgRx clásico
Fuentes de referencia
Contenido de la semana
- React Router v7 en "framework mode": loaders y actions como forma declarativa de data fetching ligado a la ruta — el equivalente a los resolvers funcionales de Angular
- Nested routes y layouts: Outlet, rutas anidadas que comparten UI persistente entre navegaciones
- Protected routes: patrón de loader que redirige si no hay sesión — el equivalente funcional a un canActivate guard
- TanStack Query: useQuery, staleTime vs gcTime, refetchOnWindowFocus — el reemplazo de HttpClient + interceptors + async pipe combinados en una sola librería
- useMutation: onMutate para optimistic updates, invalidateQueries granular por queryKey, rollback con onError
- Comparación con el ecosistema Angular: React Router ≈ Angular Router (guards/resolvers funcionales), TanStack Query ≈ HttpClient + RxJS operators + caching manual con shareReplay
Fuentes de referencia
Contenido de la semana
- Filosofía de RTL: "test como lo usa el usuario" — queries priorizadas (getByRole > getByLabelText > getByTestId como último recurso)
- user-event vs fireEvent: por qué user-event simula interacciones reales del navegador (focus, hover, keyboard) y fireEvent no
- MSW (Mock Service Worker): interceptar requests a nivel de red en vez de mockear fetch/axios — tests que no conocen la implementación HTTP interna
- Testing de custom hooks: renderHook de @testing-library/react, act() para envolver actualizaciones de estado
- Vitest como test runner: el mismo runner que Angular adoptó como default desde la v21 — consistencia de tooling entre ambos ecosistemas
- Qué NO testear: implementation details (estado interno, nombres de props internas) — tests frágiles que rompen con refactors que no cambian comportamiento
Fuentes de referencia
Contenido de la semana
- Suspense para data fetching: fallback UI declarativo mientras un componente hijo "suspende", integración con TanStack Query y frameworks
- Concurrent rendering: startTransition para marcar actualizaciones como no urgentes, useDeferredValue para inputs que no deben bloquear el render
- useOptimistic: UI optimista nativa de React sin librería externa, para mutaciones que se sienten instantáneas
- React Server Components (RSC): componentes que se ejecutan solo en el servidor, cero JS enviado al cliente para esa parte del árbol — el cambio de paradigma más grande desde los hooks
- El modelo de Next.js App Router: Server Components por defecto, "use client" como boundary explícito, streaming SSR con Suspense
- use() hook: lectura condicional de promises y de Context — por qué rompe las Rules of Hooks tradicionales de forma intencional y controlada
- Cierre conceptual: esto es la base técnica de "Rendering Strategies" en la fase de Arquitectura que sigue — CSR/SSR/RSC no son buzzwords, son este conjunto de primitivas
Fuentes de referencia
Contenido de la semana
- CSR vs SSR vs SSG: impacto en TTFB, LCP, SEO, complejidad operacional y costo de infraestructura — cuadro comparativo
- ISR (Incremental Static Regeneration): stale-while-revalidate para páginas, revalidación on-demand por tag
- Islands Architecture: hidratación parcial, componentes isleños solo donde hay interactividad — Astro como caso de estudio
- Streaming SSR: chunks progresivos con Suspense en React, Angular SSR con hydration y prerendering de rutas
- Angular SSR options: outputMode: static (prerendering completo) vs server (dinámico) — cuándo cada uno
- Edge Rendering: ejecutar SSR en CDN edge nodes, Vercel Edge Functions, Cloudflare Workers — trade-off latencia vs cold starts
Fuentes de referencia
Contenido de la semana
- Design Tokens: tokens semánticos vs primitivos, W3C DTCG format, Style Dictionary — pipeline completo de tokens a CSS/JS/iOS
- Component API Design: composición vs configuración, variance con class-variance-authority (CVA), compound pattern y slots
- Storybook 8: stories como documentación viva, Controls, Decorators, Accessibility addon, MSW integration en stories
- Chromatic: visual regression en CI, story-by-story diffing, workflow de review automático, umbral de cambio configurable
- Publishing en npm: semantic versioning, Changesets para CHANGELOG automático, peer dependencies y bundling con Vite lib mode
- Web Components como delivery mechanism: LitElement, framework-agnostic components, adoptabilidad cross-stack
Fuentes de referencia
Contenido de la semana
- Core Web Vitals: LCP (Largest Contentful Paint), INP (Interaction to Next Paint, reemplazó FID en 2024), CLS (Layout Shift)
- RUM vs Synthetic: Web Vitals API en producción real (CrUX) vs Lighthouse — por qué el Lab no refleja el campo
- Resource Hints: preconnect, preload (LCP images), prefetch (next route), modulepreload — cuándo y en qué orden
- Service Workers: Cache First, Network First, Stale While Revalidate — Workbox para no escribirlos desde cero
- Image Pipeline: Angular ngOptimizedImage, srcset + sizes, lazy loading nativo, AVIF/WebP, responsive images pipeline
- Performance Budgets: presupuestos por métrica en lighthouse-ci, alertas en GitHub Actions por degradación de score
Fuentes de referencia
Contenido de la semana
- BFF (Backend for Frontend): por qué el frontend no debería hablar directo a microservicios — aggregation y shaping
- tRPC: end-to-end type safety sin código generado, procedimientos, queries y mutations con React Query adapter
- Apollo Client: cache normalizado (normalize por __typename + id), optimistic updates, polling, subscriptions
- Optimistic Updates en TanStack Query: useMutation, onMutate, rollback con onError — UX de baja latencia percibida
- Cache Invalidation: invalidateQueries granular, staleTime strategies por endpoint, refetchOnWindowFocus
- WebSockets vs SSE: cuándo usar cada uno, reconnection exponential backoff, state management de realtime data
Fuentes de referencia
Contenido de la semana
- XSS en el browser: reflected, stored, DOM-based — cómo Angular mitiga automáticamente y dónde sigue siendo vulnerable
- CSP (Content Security Policy): headers, nonces para inline scripts, strict-dynamic — configuración real en Nginx/Vercel
- Auth en SPA: OAuth 2.0 + PKCE en aplicaciones SPA, token storage seguro (cookie HttpOnly es la respuesta correcta)
- WCAG 2.2 AA: criterios de percepción, operabilidad y robustez — los 10 más relevantes para SPAs interactivas
- ARIA Authoring Practices Guide: roles, properties, states — patrones del W3C para Modal, Accordion, Combobox, Tabs
- axe-core en CI: @axe-core/playwright en E2E, @axe-core/react en unit tests — configurar severidad y desactivar falsos positivos
Fuentes de referencia
Contenido de la semana
- Testing Trophy: integration tests (foco principal) > unit (lógica pura) > E2E (flujos críticos) — la proporción correcta
- Contract Testing con Pact.js: contrato consumer-driven entre frontend y backend, independencia de deploys entre equipos
- Visual Regression CI: Chromatic en GitHub Actions, diff automático por story, workflow de aprobación de cambios visuales
- GitHub Actions avanzado: matrix builds, reusable workflows, caché de node_modules con actions/cache, artifacts entre jobs
- Feature Flags: LaunchDarkly, Statsig, OpenFeature estándar — gradual rollout, kill switch, A/B testing por usuario
- Preview Deployments y Canary: Vercel preview por PR, Cloudflare Pages, estrategia de promotion gradual a producción
Fuentes de referencia
Contenido de la semana
- Diseño documentado con ADRs: una decisión técnica por componente del sistema (shell, remotes, design system, CI/CD)
- C4 Model nivel Container y Component: diagrama de la arquitectura completa con Structurizr DSL o Mermaid C4
- Design system en Nx monorepo: tokens semánticos, componentes para Angular, Storybook por librería
- Module Federation: shell Angular + 2 remotes con singletons compartidos y routing dinámico
- Pipelines independientes: GitHub Actions workflows, registry de remotes en JSON/API, rollback por app
- Observabilidad por micro-frontend: Web Vitals API separada por app, Sentry con source maps, alertas por remote
Fuentes de referencia
Libros recomendados
Recursos esenciales organizados por fase del programa. Los que ya tenes marcados son los que debes leer primero.

