angular2 - in action

59
Angular 2 IN ACTION

Upload: sebastian-pozoga

Post on 13-Apr-2017

2.443 views

Category:

Education


2 download

TRANSCRIPT

Page 1: Angular2  - In Action

Angular 2IN ACTION

Page 2: Angular2  - In Action

NG2 INTRODUCTION

Part 2

Page 4: Angular2  - In Action

TSD

Page 5: Angular2  - In Action

TSD

npm install tsd -g

tsd install angular2/angular2 angular2/router rx es6-promise

Page 6: Angular2  - In Action

TSC

tsc app.ts --target ES5

--module system --experimentalDecorators

--moduleResolution node

--emitDecoratorMetadata

--outFile app.js

Page 7: Angular2  - In Action

Start

Page 8: Angular2  - In Action

HTML

<!doctype html><html lang="en">

<body><my-app></my-app><script src="js/bundle.js"></script>

</body></html>

Page 9: Angular2  - In Action

APP.TS - IMPORTS

/// <reference path="../../typings/tsd.d.ts" />

import {Component, View, bootstrap, CORE_DIRECTIVES, FORM_DIRECTIVES, provide

} from 'angular2/angular2';

//...

Page 10: Angular2  - In Action

APP.TS - COMPONENT

@Component({selector: 'my-app',template: APP_TEMPLATE,directives: [HeaderComponent,

ROUTER_DIRECTIVES],provides: [PostsStorage, Core]

})

class AppComponent {}

Page 11: Angular2  - In Action

APP.TS - BOOTSTRAP

bootstrap(AppComponent, [// CommonPostsStorage,Core,

// Ng2ROUTER_PROVIDERS,HTTP_PROVIDERS,provide(APP_BASE_HREF, {useValue: '/'})

]);

Page 12: Angular2  - In Action

Templates

Page 13: Angular2  - In Action

TEMPLATES - IMPORT

import {

APP_TEMPLATE

} from './templates';

Page 14: Angular2  - In Action

TEMPLATES - EXAMPLE COMPONENT

class AppComponent { text:string = 'hello';

typing($event){

this.text = $event.target.value;

}

}

Page 15: Angular2  - In Action

TEMPLATES - CODE

<h1>Bound Textbox</h1>

<input [value]="text" (keyup)="typing($event)" />

{{text}}

Page 16: Angular2  - In Action

TEMPLATES - SYNTAX

<todo-cmp [model]="my_value"></todo-cmp>

<input [ng-model]="todo.text"(ng-model-change)="todo.text=$event"

></input>

<input [(ng-model)]="todo.text"></input>

Page 17: Angular2  - In Action

TEMPLATES - SYNTAX

<video-player #player></video-player>

<button (click)="player.pause()">Pause

</button>

<input #i> {{i.value}}

Page 18: Angular2  - In Action

PIPE

Page 19: Angular2  - In Action

PIPE - USAGE

@Pipe({name: 'publicName'

})

class ClassPipeName implements PipeTransform {

transform(value: number, args: any[]) {//…

}

}

Page 20: Angular2  - In Action

PIPE - USAGE

@Pipe({name: 'publicName'

})

class ClassPipeName implements PipeTransform {

transform(value: number, args: any[]) {//…

}

}

Page 21: Angular2  - In Action

Routing

Page 22: Angular2  - In Action

ROUTING - @RouteConfig

import {AboutComponent

} from './components/about/index';

@RouteConfig([{path: '/About/:id',component: AboutComponent,name: 'About'

}])

class AppComponent {}

Page 23: Angular2  - In Action

ROUTING - @RouteConfig

export class AboutComponent { id: number;

constructor( @Inject(RouteParams) params: RouteParams) {

this.id = params.get('id');

}}

Page 24: Angular2  - In Action

ROUTING - TEMPLATE

<nav><ul>

<a [router-link]="['./About', {id: 1}]" href="#" class="list-group-item">About</a>

<a [router-link]="['./Home']" href="#" class="list-group-item">Home</a>

<a [router-link]="['./PostsList']" href="#" class="list-group-item">Posts list</a>

</ul></nav>

<route-transclusion name="main"></route-transclusion>

Page 26: Angular2  - In Action

BUILDING / COMPILE / TRANSCRIPTION

Part 2

Page 27: Angular2  - In Action

Browserify

Page 28: Angular2  - In Action

ROUTING - TEMPLATE

var browserify = require('gulp-browserify');

gulp.src('build/ts/app/app.js')

.pipe(browserify({insertGlobals : true,debug : !gulp.env.production

}))

.pipe(gulp.dest('./dist/app'))

Page 29: Angular2  - In Action

NO

Page 30: Angular2  - In Action

JSPM

Page 31: Angular2  - In Action

JSMP

“jspm is a package manager for the SystemJS universal module loader, built on top of the dynamic ES6 module loader”

React applications with JSPM

Page 32: Angular2  - In Action

JSMP

● ES6, AMD, CommonJS and globals) ● npm and GitHub...● load modules as separate files● optimize into a bundle● realtime transcript

Page 33: Angular2  - In Action

System.js

Page 34: Angular2  - In Action

SYSTEM.JS - PRODUCTION

npm install -g jspm

jspm init

jspm install angular2/angular2

jspm bundle-sfx --minify zone.js + whatwg-fetch + reflect-metadata + src/app/app dist/js/bundle.js

Page 35: Angular2  - In Action

SYSTEM.JS - DEVELOPMENT

<script src="jspm_packages/system.js"></script>

<script src="config.js"></script>

<script>System.import('reflect-metadata')

.then(function(){System.import('zone.js')})

// .then(function(){System.import('es5-shim')}) <- LOL

.then(function(){System.import('es6-shim')})

.then(function(){System.import('whatwg-fetch')})

.then(function(){System.import('src/app/app')});</script>

Page 36: Angular2  - In Action

SYSTEM.JS - PRODUCTION

<!doctype html><html lang="en">

<body><my-app></my-app><script src="js/bundle.js"></script>

</body></html>

Page 37: Angular2  - In Action

Gulp

Page 38: Angular2  - In Action

GULP - TEMPLATESvar ng2Template = "export const <%= template.url %> = '<%= template.escapedContent %>';\n";

function fnRename(templateUrl, templateFile) {var pathParts = templateUrl.replace('.tpl.html', '').split('/'),

folder = pathParts[pathParts.length - 2],file = pathParts[pathParts.length - 1],name = (folder ? folder + '_' : '') + file + '_TEMPLATE';return name.toUpperCase().replace(/-[\.\-]/g,

function (match) {return '_';

});}

}

/*...*/.pipe(ngHtml2Js({rename: fnRename,template: ng2Template

})

Page 39: Angular2  - In Action

PRERENDER

Part 3

Page 40: Angular2  - In Action

Metadata

Page 41: Angular2  - In Action

Metadata - HTML

<!doctype html><html lang="en">

<head><title>{{ no.work.here }}</title>

<head><body>

<my-app></my-app><script src="js/bundle.js"></script>

</body></html>

Page 42: Angular2  - In Action

METADATA - SERVICE

export class HeadDOM {private titleDom:HTMLElement;

get title():string {return this.titleDom.innerText;

}

set title(title:string) {this.titleDom.innerText = title;this.ogTitle = title;

}

//…}

Page 43: Angular2  - In Action

Prerender.io

Page 44: Angular2  - In Action

PRERENDER.IO - COST

Page 45: Angular2  - In Action

PRERENDER.IO - GITHUB

https://github.com/prerender/prerender

Page 46: Angular2  - In Action

Webrender-service

Page 47: Angular2  - In Action

Webrender-service - Overview

● (+) Render png file● (+) Render pdf file● (+) Render html file● (+) No-overwrite js functions● (+) Servers whitelist● (+) Token security● (-) Legacy code● (-) Small community● (-) No-good tested● (-) Use node-babel● (-) Alpha

Page 48: Angular2  - In Action

Webrender-service - Todo

● Remove babel (problems with debugging)● Write unit tests● Remove cache (I recommend to use solution like varnish)

Page 49: Angular2  - In Action

WEBRENDER SERVICE (ALPHA) - GITHUB

https://bitbucket.org/spozoga/webrender-service

Page 50: Angular2  - In Action

PhantomJS

Page 51: Angular2  - In Action

PhantomJS - Error #1

Map is a pretty new structure. Use npm install harmony-collections --save-dev and add "node_modules/harmony-collections/harmony-collections.min.js", to the karma config.

Page 52: Angular2  - In Action

PhantomJS - Error #2

ORIGINAL EXCEPTION: TypeError: 'undefined' is not a function (evaluating 'window.requestAnimationFrame(callback)')

Page 53: Angular2  - In Action

PhantomJS - Error #3

RangeError: Maximum call stack size exceeded.

at quote (/Users/spozoga/dev/prerender/node_modules/phantom/shim.js:1065)

………..

Page 54: Angular2  - In Action

DevOps

Page 55: Angular2  - In Action

VARNISH

Page 56: Angular2  - In Action

PRERENDER.IO - GITHUB

https://github.com/prerender/prerender

Page 57: Angular2  - In Action

PRERENDER-VARNISH - GITHUB

https://github.com/MWers/prerender-varnish

Page 58: Angular2  - In Action

The end

Page 59: Angular2  - In Action

Sebastian Poż[email protected]