Maintainable Angular Apps

Juan Herrera

viable.at

headscroll.io

Problem

"Do whatever you want"

"My way or the highway"

"You are free"

"Don't limit your creativity"

"My way or the highway"

"My way, please"

1st Year

2nd Year

3rd Year

4th Year

FOUR YEARS

What's NOT on the styleguide

What I assess on an interview

What I've learned in the past years

Linting

Eslint

Linting

Eslint

Linting

Prettier

Linting

Stylelint

Linting

Stylelint

CSS

ITCSS

CSS

BEM

CSS

Utility First CSS

RxJS

UntilDestroy 🦊

import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';

@UntilDestroy()
@Component({})
export class InboxComponent {
  ngOnInit() {
    interval(1000)
      .pipe(untilDestroyed(this))
      .subscribe();
  }
}

RxJS

Merging/Combining

RxJS

Merging/Combining

State Management

NGXS and NgRx

State Management

NgRx Data

Documentation

Compodocs

TypeScript

TypeScript

lodash-es

import cloneDeep from 'lodash-es/cloneDeep';

const objects = [{ 'a': 1 }, { 'b': 2 }];
 
const deep = _.cloneDeep(objects);

console.log(deep[0] === objects[0]);
// => false

TypeScript

Path Mappings

TypeScript

Path Mappings

TypeScript

Utility Types

export interface Todo {
  title: string;
  description: string;
}
function updateTodo(todo: Todo, fieldsToUpdate: Partial<Todo>) {
  return { ...todo, ...fieldsToUpdate };
}

TypeScript

Utility Types

interface CatInfo {
  age: number;
  breed: string;
}

type CatName = "miffy" | "boris" | "mordred";

const cats: Record<CatName, CatInfo> = {
  miffy: { age: 10, breed: "Persian" },
  boris: { age: 5, breed: "Maine Coon" },
  mordred: { age: 16, breed: "British Shorthair" },
};

cats.juan;
// ^ Error!

TypeScript

Enums

enum Direction {
  Up = "UP",
  Down = "DOWN",
  Left = "LEFT",
  Right = "RIGHT",
}
export interface Content {
  title: string;
  placement: Direction;
}
switch (data.direction) {
    case Direction.Up: {...}
    case Direction.Down: {...}
    case Direction.Left: {...}
    case Direction.Right: {...}
}

TypeScript

.? + ??

// First Year
const { name } = data.person;

// Second Year
const name = data.person.name ? data.person.name : 'Juan';

// Third Year
const name = data.person.name || 'Juan';

// Fourth Year
const name = data?.person?.name || 'Juan';

// Fifth Year
const name = data?.person?.name ?? 'Juan';


Angular

Modules

Thomas Rundle:

https://medium.com/@ct7/angular2-module-architecture-and-example-seed-project-35b7410264f5

Tooling

VSCode

Tooling

VSCode

Tooling

VSCode

Tooling

VSCode

Tooling

VSCode

WRAP UP

THANKS

@jdjuan

🙏🏻

Maintainable Angular Apps

By Juan Herrera

Maintainable Angular Apps

  • 1,070