Enterprise Angular con Nrwl

Jesús Rodríguez (@Foxandxss)

Agenda

  • ¿Qué es enterprise y cómo lo hago?
  • Problemas comunes en proyectos enterprise
  • Monorepos
  • Demo 1
  • Solución propuesta
  • Demo 2
  • Consejos y trucos

¿Qué es Enterprise?

Un proyecto Enterprise más que por complejidad de dominio, sería un proyecto donde se involucran a muchas personas y muchas areas diferentes.

¿Qué problemas existen?

  • Proyectos con similitudes o diferentes plataformas
  • Diferentes herramientas
  • Versionado
  • Compartir código
  • INTEGRACIÓN

Monorepos

  • Proyectos similares bajo el mismo repositorio
  • Mismas versiones
  • Mejor integración
  • Permisos para distintas partes
  • Se pueden mezclar herramientas
  • Independencia entre partes de la app
  • Affected

Monorepo - Angular

¿Cómo conseguimos esto?

Nrwl - NX

Nx - Aplicaciones

  • App Angular
  • App React
  • App Nest
  • App Typescript
  • App Escritorio / Web / Móvil

Se pueden añadir extras si nos hiciera falta

Nx - Librerías

  • Feature Libraries
  • UI Libraries
  • Data-Access Libraries
  • Utility Libraries

¿Ventajas?

DEMO

Modo mock

// environment.mock.ts
mockServices: true

// app.module.ts
imports: [environment.mockServices ? MockServicesModule : []]

// https://github.com/angular/in-memory-web-api

Trazas del router

// environment.mock.ts
logRouter: false

// app-routing.module.ts
imports: [RouterModule.forRoot(routes, { enableTracing: environment.logRouter })]

Trazas HTTP

@Injectable()
export class LoggingHttpInterceptor implements HttpInterceptor {
  requestId = 0;

  constructor(private logger: LoggerService) { }

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return environment.logHttp ? this.interceptLogging(request, next) : next.handle(request);
  }

  private interceptLogging(request: HttpRequest<any>, next: HttpHandler) {
    const id = this.requestId += 1;

    this.logRequest(id, request);
    return next.handle(request).pipe(
      tap(response => this.logResponse(id, request, response)),
    );
  }

  private logRequest(id: number, req: HttpRequest<any>) {
    const m = `%c>>> (#${id}) ${req.method} ${req.url}`;
    const c = 'color: green; font-style: italic; font-weight: bold;';
    this.logger.log(m, c, req);
  }

  private logResponse(id: number, req: HttpRequest<any>, response: any) {
    const m = `%c<<< (#${id}) ${req.method} ${req.url}`;
    const c = 'color: blue; font-style: italic;';
    this.logger.log(m, c, response);
  }
}

Trazas Auth

private eventsSubject = new BehaviorSubject('Auth created');

...

this.events$ = this.eventsSubject.asObservable();

...

this.events$.subscribe(event => environment.logAuth && this.logger.log('Auth Tracing: ' + event));

...

logEvent(event: string) {
  this.eventsSubject.next(event);
}

Enlaces

¿Preguntas?

Enterprise Angular con Nrwl

By Jesus Rodriguez

Enterprise Angular con Nrwl

  • 400