Upgrade to Pro — share decks privately, control downloads, hide ads and more …

"Angular on Rails": Model-driven Angular with S...

Manfred Steyer
November 08, 2018
370

"Angular on Rails": Model-driven Angular with Schematics, CLI and TypeScript Compiler API @wjax 2018 in München

Manfred Steyer

November 08, 2018
Tweet

More Decks by Manfred Steyer

Transcript

  1. ManfredSteyer "Angular on Rails": Model-driven Angular with Schematics, CLI and

    TypeScript Compiler API Manfred Steyer SOFTWAREarchitekt.at ManfredSteyer
  2. ManfredSteyer About me… • Manfred Steyer • Blog: SOFTWAREarchitekt.at •

    Angular Trainings and Consultancy • Google Developer Expert (GDE) Page ▪ 4 Manfred Steyer Public: Vienna, München In-House: everywhere http://softwarearchitekt.at/workshops
  3. ManfredSteyer Have you ever tried to … … setup a

    modern JavaScript project manually? • Compiler/ Transpiler • Package manager and packages • Build chain optimized for bundle size, performance, etc. • Testing tools including code coverage • Linting tools
  4. ManfredSteyer Contents • What is Schematics? • How to create

    custom schematics? • How to use parameters? • How to use templates? • How to scaffold whole projects?
  5. ManfredSteyer Schematics Scaffolding Tool used by Angular CLI Schematics: The

    whole project Schematic: Code Generator Collection: Set of Schematics
  6. ManfredSteyer Calling a Schematic • ng new project --collection myCollection

    • ng generate myCollection:menu side-menu • ng add library • ng update library
  7. ManfredSteyer DEMO • ng new pwa • cd pwa •

    ng add @angular/pwa • ng add @angular/material • ng generate @angular/material:table table • ng generate @angular/material:nav nav • Manual: App → Nav → Table
  8. ManfredSteyer Schematics are atomic (like db transactions) A B D

    E C F A B D E C F Your Project Staging Area Tree Object
  9. ManfredSteyer Schematics are atomic (like db transactions) A B D

    E C F A B D' E C F Your Project Staging Area Tree Object
  10. ManfredSteyer Schematics are atomic (like db transactions) A B D

    E C F A B D' E C F G Your Project Staging Area Tree Object
  11. ManfredSteyer Schematics are atomic (like db transactions) A B D

    E C F A B D' E C F G Your Project Staging Area Tree Object
  12. ManfredSteyer Schematics are atomic (like db transactions) A B D'

    E C F G A B D' E C F G Your Project Staging Area Tree Object
  13. ManfredSteyer Rule Factory export function helloWorld(options: any): Rule { return

    (tree: Tree, _context: SchematicContext) => { _context.logger.debug('Manfred was here!'); tree.create('hello.txt', 'Hello World!'); return tree; }; } Rule
  14. ManfredSteyer Option Class in schema.ts export interface MenuOptions { name:

    string; project: string; […] menuService: boolean; […] } provided by the CLI custom stuff
  15. ManfredSteyer Rule Factory gets Parameter Object export default function (options:

    MenuOptions): Rule { return (host: Tree, context: SchematicContext) => { […] } }
  16. ManfredSteyer Rule Factory gets Parameter Object export default function (options:

    MenuOptions): Rule { return (host: Tree, context: SchematicContext) => { […] } }
  17. ManfredSteyer Template export interface <%= classify(name) %>Item { title: string;

    iconClass: string; } passed property passed function
  18. ManfredSteyer Rule Calling Templates export default function (options: MenuOptions): Rule

    { return (host: Tree, context: SchematicContext) => { […] } }
  19. ManfredSteyer Rule Calling Templates export default function (options: MenuOptions): Rule

    { return (host: Tree, context: SchematicContext) => { const templateSource = apply(url('./files'), [ filterTemplates(options), template({...stringUtils, ...options}), move(options.sourceDir) ]); […] } } passed properties passed functions
  20. ManfredSteyer Rule Calling Templates export default function (options: MenuOptions): Rule

    { return (host: Tree, context: SchematicContext) => { const templateSource = apply(url('./files'), [ filterTemplates(options), template({...stringUtils, ...options}), move(options.sourceDir) ]); const rule = chain([ branchAndMerge(chain([ mergeWith(templateSource), […] ])) ]); return rule(host, context); } }
  21. ManfredSteyer Declaring Generated Components import { NgModule } from '@angular/core';

    import { CommonModule } from '@angular/common'; import { SideMenuComponent } from './side-menu/side-menu.component'; @NgModule({ imports: [ CommonModule ], declarations: [ SideMenuComponent ], exports: [ SideMenuComponent ] }) export class CoreModule { }
  22. ManfredSteyer Injecting Service into Component […] import { SideMenuService }

    from './core/side-menu/side-menu.service'; @Component({ […] }) export class AppComponent { constructor(private sideMenuService: SideMenuService) { // sideMenuService.show = true; } }
  23. ManfredSteyer Code File as Syntax Tree (simplified) ClassDeclaration ClassKeyword (class)

    Identifier (Demo) … SyntaxList class Demo { constructor(otherDemo: Demo) {} } Subtree w/ Constructor …
  24. ManfredSteyer Needed Steps Example covering all cases Finding Variation Points

    Define Model to describe Variation Points Write and Test Generator
  25. ManfredSteyer Further Information • Great introduction in Angular Blog •

    https://blog.angular.io/schematics-an-introduction-dc1dfbc2a2b2 • My Tutorial/ Case Study (5 articles so far) • https://goo.gl/kGS6L5 • Angular-Crud (Generator) • https://www.npmjs.com/package/angular-crud
  26. ManfredSteyer Conclusion Automate boring tasks! Official Solution in ng world

    Staging Area, Templates, Rules schema.json w/ JSON Schema Create own or tweak existing ones