84
Tech Talks Facundo Viale

Despegar Tech Talk - AngularJS

Embed Size (px)

Citation preview

Page 1: Despegar Tech Talk - AngularJS

Tech Talks

Facundo Viale

Page 2: Despegar Tech Talk - AngularJS

Temario: Parte I● ¿Porqué AngularJS?

○ ¿Qué tenemos hoy?

● Orígenes de AngularJS

● Introducción a AngularJS○ Modularidad, ID y Providers

○ Templating y Databindings

○ Scopes y Controllers

○ Eventos

○ Directives

○ Asincronismos

○ Location Handling

Page 3: Despegar Tech Talk - AngularJS

Temario: Parte II● Las buenas experiencias

● Las malas experiencias

● Soporte para SEO

● Pre-Loading

● El Futuro de Angular

○ 1.3.x

○ ECMAScript 6

● Debate

Page 4: Despegar Tech Talk - AngularJS

¿Porqué AngularJS?

Page 5: Despegar Tech Talk - AngularJS

¿Porqué AngularJS?Nuestras Motivaciones:

● Encontrar una solución integral que permita solucionar lo que hoy logramos con diversas herramientas. Ej: Handlebars, Amplify, RequireJS y LoadJS.

● Reducir el código, volviéndolo más legible y seguible.

● Poder modelar nuestro código para orientarlo a servicios y centralizar los componentes que manejan estado.

● Eliminamos la fuerte relación que hay entre la lógica que hay en JS y el layout. Separando comportamiento visual de la página de la lógica del flow y el estado del modelo.

● Sumado a esto último, facilidad a la hora de refactorizar el layout y los estilos, sin tener mucho impacto en el JS.

Page 6: Despegar Tech Talk - AngularJS

¿Porqué AngularJS?

¿Qué desafíos y situaciones íbamos a afrontar?

● Re-hacer toda una pagina ( Obvio no? )

● Afrontar nuevas metodologías de desarrollo y nuevos conceptos. Ej: Módulos, Controllers, Servicios, Scopes, Bindings, etc …

● Pasariamos de usar JQuery para casi todo, a usarlos en muy pocas situaciones. En cuestiones de solución tecnológica:

○ JQuery seria lo que Apache Commons o Guava es a Java○ AngularJS sería lo que Play es a Java

● Una nueva forma de entender como manejar el SEO en la página.

Page 7: Despegar Tech Talk - AngularJS

Orígenes de AngularJS

Page 8: Despegar Tech Talk - AngularJS

Orígenes de AngularJS

Es un framework desarrollado por un Team dentro de Google, que intenta cubrir las necesidades de las Web modernas dentro de una solución integral.

Necesidades actuales:

○ Módulos e Inyección de dependencias

○ Data-Binding

○ Templating

○ Desacoplamiento de HTML

○ Single source of truth

○ Single Page ( En relación con lo anterior )

○ Testing

Page 9: Despegar Tech Talk - AngularJS

Orígenes de AngularJSFeatures● Arquitectura modular

● Inyección de dependencias

● Two-ways data binding

● Templating

● Asincronismo

● Scopes

● Soporte de Eventos

● Directives

● Location Handling

Page 10: Despegar Tech Talk - AngularJS

¿Porqué AngularJS?

Tecnologias / Necesidades

¿Qué soluciones tenemos hoy?

¿Qué soluciones tendríamos?

Templating HandelbarsJS AngularJS

Eventos Amplify AngularJS

Binding - AngularJS

Asincronismo PromiseJS / JQuery AngularJS

Location Handling - AngularJS

Modulos Solución casera / RequireJS AngularJS

Partial Views * AngularJS

Inyección de Dependencias RequireJS AngularJS

Tools varias JQuery / Underscore.js JQuery + AngularJS + Underscore.js + etc ...

* Se podría hacer una solución propia usando JQuery y Handlebars

Page 11: Despegar Tech Talk - AngularJS

Introducción a AngularJS

Page 12: Despegar Tech Talk - AngularJS

Modularidad

Page 13: Despegar Tech Talk - AngularJS

Introducción a AngularJS

JQuery:

Page 14: Despegar Tech Talk - AngularJS

Introducción a AngularJS

RequireJS:

I

II

Page 15: Despegar Tech Talk - AngularJS

Introducción a AngularJS

AngularJS Todo se encuentra dentro de un módulo, incluso para inicializar nuestra aplicación debemos indicar el módulo inicial.

Page 16: Despegar Tech Talk - AngularJS

Inyección de Dependencias

Page 17: Despegar Tech Talk - AngularJS

Introducción a AngularJS

Page 18: Despegar Tech Talk - AngularJS

Introducción a AngularJSInyección de Dependencias

Page 19: Despegar Tech Talk - AngularJS

Introducción a AngularJS

Desarrollo multi-modulo

Page 20: Despegar Tech Talk - AngularJS

Providers

Page 21: Despegar Tech Talk - AngularJS

Introducción a AngularJSServiciosNuestra premisa:

Exponen comportamiento y se inyectan en otros servicios o “controllers”

Angular nos provee varias formas de exponer estados y funcionalidad para construir nuestros servicios:

● Value

● Constant

● Services

● Factory

● Provider

Page 22: Despegar Tech Talk - AngularJS

Introducción a AngularJS

Tipo de

ProviderCódigo Descripción

Value app.value('clientId', 'a12345654321x'); Nos permite inyectar un valor entre varios servicios que es editable

Constant app.constant('magicNumber', 42); Idem a Value, pero su valor no es editable

Service app.service('userService', function() {}); Retorna la instancia de la función, es util cuando queremos construir un servicio singleton

Factory app.factory('userServiceFactory', function() {}); Retorna el resultado generado al ejecutar la función proveída

Provide app.provide('userProvider', function() {}); La función/objeto debe poseer un método $get que actúa como factory tal como el ejemplo anterior.La diferencia es que este servicio es configurable al poder inyectarlo el el comienzo del life-cicle de angular para especficarlé parámetros.

Page 23: Despegar Tech Talk - AngularJS

Introducción a AngularJS

Ej de Factory:

Page 24: Despegar Tech Talk - AngularJS

Introducción a AngularJS

Ej de Provider:

Page 25: Despegar Tech Talk - AngularJS

Templatingy

Databinding

Page 26: Despegar Tech Talk - AngularJS

Introducción a AngularJS

Templating

● JQuery con HandlebarsJS

Page 27: Despegar Tech Talk - AngularJS

Introducción a AngularJS

Templating

● JQuery con HandlebarsJS

Page 28: Despegar Tech Talk - AngularJS

Introducción a AngularJS

Templating

● AngularJS

Page 29: Despegar Tech Talk - AngularJS

Scopes y

Controllers

Page 30: Despegar Tech Talk - AngularJS

Introducción a AngularJS

Scopes y Controller:

Los controllers son un tipo de “Servicio”, que tiene la característica de poseer un scope. El scope, es un contexto, que puede contener variables y funciones. El alcance de este, está definido el elemento del DOM al cual se encuentra “atachado”.

La idea de los controllers es la de actuar una interfaz entre los servicios y el estado, actiones y comportamientos asociado en el HTML.

Page 31: Despegar Tech Talk - AngularJS

Introducción a AngularJS

Ej de Controller

Page 32: Despegar Tech Talk - AngularJS

Introducción a AngularJS

Page 33: Despegar Tech Talk - AngularJS

Introducción a AngularJSScopes y Controller:

Los controllers soporta herencia de scope, esto es cuando un controller está definido en un elemento del DOM que a la vez este se encuentra contenido dentro de otro elemento del DOM que tiene otro controller asociado

Todo lo definido dentro del Scope A se encuentra dentro del Scope de B

DIV 2DIV 1

Controller A

Controller B

Page 34: Despegar Tech Talk - AngularJS

Introducción a AngularJS

Diferencias

● La integración entre handlebars y JQuery no es transparente.

● Con JQuery y Handlebars, no puedo lograr el que el HTML esté donde lo voy a usar, ya que necesito tenerlo dentro de un Tag Script. Mientras que con Angular no necesito romper la maqueta para asociarle valores.

● En la metodología JQuery/Handlebars es inevitable que nuestro código JS quede atado a las estructuras del HTML y CSS, debido al uso de Selectores. Por lo que cualquier refactor de front por más de que solo sea maqueta o estilos podría implicar cambios en el JS.

● Con AngularJS nuestros servicios y modelos, nunca están atados directamente a la estructura del HTML o el CSS. Por lo que los cambios en estilos o maquetas no modificarían el JS.

Page 35: Despegar Tech Talk - AngularJS

Introducción a AngularJS

Databinding

Handlebars AngularJS

Ejemplo:http://docs.angularjs.org/guide/forms

Page 36: Despegar Tech Talk - AngularJS

Introducción a AngularJS

Databinding - Integración con estilos

o

http://docs.angularjs.org/api/ng.directive:ngClass

Page 37: Despegar Tech Talk - AngularJS

Introducción a AngularJS

Databinding - FiltrosLos filtros son un herramienta que se aplica tanto a elementos como a listas. Estos permiten transformar y/o filtrar estos valores para renderizarlos sin necesidad de alterar nuestros objetos.

Page 38: Despegar Tech Talk - AngularJS

Introducción a AngularJS

Databinding - Filtros

Page 39: Despegar Tech Talk - AngularJS

Introducción a AngularJS

Databinding - Filtros

Más Ejemplos:

http://docs.angularjs.org/api/ng.filter:date

http://docs.angularjs.org/api/ng.filter:currency

http://docs.angularjs.org/api/ng.filter:filter

Servicio:

http://docs.angularjs.org/api/ng.$filter

Page 40: Despegar Tech Talk - AngularJS

Introducción a AngularJSDatabinding - Filtros

Page 41: Despegar Tech Talk - AngularJS

Eventos

Page 42: Despegar Tech Talk - AngularJS

Introducción a AngularJS

Evento

Similar a como funciona AmplifyJS, salvo que Angular soporta jerarquías de scopes. Lo que le permite enviar eventos hacia arriba ( padres ) o hacia abajo ( hijos ).

Page 43: Despegar Tech Talk - AngularJS

Introducción a AngularJS

Dentro de los eventos, también es posible escuchar cambios sobre una variable que esté contenida en el scope.

Page 44: Despegar Tech Talk - AngularJS

Directives

Page 45: Despegar Tech Talk - AngularJS

Introducción a AngularJS

¿Qué son?

Son una herramienta que nos permiten atachar comportamiento, a un elemento del DOM de forma declarativa. La forma de atachar este comportamiento, se puede hacer a través de un atributo, una clase o un tag.

Es la forma más común de asociar un comportamiento con un componente HTML. Es preferible tener HTML asociado a valores o comportamiento, que tener JS atado al layout del HTML.

Page 46: Despegar Tech Talk - AngularJS

Introducción a AngularJS

Directivas ng-click y ng-model

Page 48: Despegar Tech Talk - AngularJS

Introducción a AngularJS

¿ Porqué usar Directives ?

● Desacoplan el HTML y los componentes del codigo JS

● Por ende tratamos de minimizar la cantidad de lógica de interacción visual de nuestro código JS.

● El HTML se ve penalizado con una sintaxis adicional, pero válida para HTML.○ Evitamos tener que tener templates sueltos y tener que codear

la lógica de integración.○ No es necesario rastrear entre cientos de líneas de JS, para

ver como se va a comportar un componentes ya que declarativamente es visible en el layout.

○ El HTML es para quien lo usa y lo ve, o sea los programadores. Los usuarios sólo ven el resultado del renderizado de este por parte del browser.

Page 49: Despegar Tech Talk - AngularJS

Asincronismo

Page 50: Despegar Tech Talk - AngularJS

Introducción a AngularJSAsincronismo

En Angular todo se resuelve de manera asincrónica, pero en vez manejar la respuesta a estos procesamientos asincrónicos mediante un esquema de callbacks, lo hace a través del Promise Pattern.

Angular nos provee un servicio llama $q, con el que podemos construir las promises y los deferred.

Page 51: Despegar Tech Talk - AngularJS

Introducción a AngularJS

Promise Pattern vs Callback

Recuerdan las callbacks?

doStuff1(function(data1) {doStuff2(data1, function(data2) {

doStuff3(data2, function(data3) {doStuff4(data3);

});});

});

Page 52: Despegar Tech Talk - AngularJS

Introducción a AngularJS

Promise Pattern vs Callback

Usando promise:

Todas nuestras funciones siempre retornan una Promise

doStuff1().then(doStuff2).then(doStuff3).then(doStuff4)

Page 53: Despegar Tech Talk - AngularJS

Introducción a AngularJS

Promise Pattern vs Callback

¿Algo más complejo?

$q.all([doStaff1, doStaff2, doStaff3]).then(doStaff4)

Page 54: Despegar Tech Talk - AngularJS

Introducción a AngularJS

Ventajas de las Promise:

● Encapsulan el resultado a futuro de la operación, de manera tal que es fácil de volver a obtener una vez finalizado esta.

● Al estar encapsulado, es fácil de compartir entre servicios y controllers

● Las promises nos proveen diferentes handlers a través de los cuales podemos estar a la espera de la finalización de esta:○ promise.success(function(result){ … })○ promise.error(function(result){ … })○ promise.then(function(result){ … })

● Fácil de encadenar con otras promise para generar comportamiento más complejo

Page 55: Despegar Tech Talk - AngularJS

Introducción a AngularJS

Servicios de Angular que usan Promise

● $http

● $timeout

● $interval

● $resource

● Si usamos angular-bootstrap incluso las Modal retornan una promise

Page 56: Despegar Tech Talk - AngularJS

Introducción a AngularJS

Caso especial de $resource. ¿Donde esta la promise?

Page 57: Despegar Tech Talk - AngularJS

Introducción a AngularJS

Esto ocurre por una cuestión de comodidad, para cuando el modelo es bindeado a los otros componentes.

Page 58: Despegar Tech Talk - AngularJS

Location Handling

Page 59: Despegar Tech Talk - AngularJS

Introducción a AngularJS

¿ Qué es location handling ?

Es detectar cambios en la URL que no impactar a nivel back-end pero si internamente dentro de la página.

> http://foo.com/#/main

Es útil cuando necesitamos guardar estado, modificando la URL pero no deseamos que los cambios en la URL afecten al servidor sino que necesitamos que disparen comportamiento a nivel Web.

Son comúnmente usados con Partial View.

Angular nos provee el servicio $location para manejar las URL.

Page 60: Despegar Tech Talk - AngularJS

Introducción a AngularJS

¿ Qué es una Partial View ?

Debido a que las Web tienden a ser dinámicas y hacer uso de Ajax para obtener datos y dibujar la pantalla. Es natural pensar que es poco práctico traerse todo el HTML que van a necesitar, en la carga inicial de la página. Esto es parte del modelo Single Page y es lo que le da sentido al Single Source of Truth.

Una Partial View, es un fragmento de la página Web que va a ser requerido en algún momento de la carga de la página. Cuando es requerido, se obtiene dinámicamente y se le asocia dinámicamente un comportamiento ( un controller asociado ).

Ej:http://docs.angularjs.org/api/ngRoute.$route

Page 61: Despegar Tech Talk - AngularJS

Introducción a AngularJS

Beneficios

● Carga mucho más rápida de la página.

● Posibilidad de dividir una pagina, en pequeñas partes o “sub-páginas” y re-integrarlas fácilmente.

● Permite mantener de manera más fácil y transparente el concepto de Single Source of Truth, al permitirnos evitar salir de la página.

● Con el uso de una caché de view podemos re-utilizar vistas minimizando el acceso al servidor.

● Implementación transparente y fácil de utilizar a través de ng-view.

Page 62: Despegar Tech Talk - AngularJS

Las Buenas Experiencias

Page 63: Despegar Tech Talk - AngularJS

Las Buenas Experiencias

● La cantidad de código de la aplicación se redujo muchísimo.

● Mejor diseño es interacción de las diferentes partes.

● El código se volvió mucho más legible y simple.

● Tuvimos muchos cambios de UX, lo que solo nos implicó mover las directivas de lugar. Ej: ng-model, ng-repeat y ng-click

● La curva de aprendizaje no fue muy grande, por lo que la adopción no fue difícil.

● Como nuestra página de resultados y de landing son muy similares re-utilizamos muchisimos modulos, servicios y controllers.

● Mayor control de los errores, a través del $excepcionHandler

Page 64: Despegar Tech Talk - AngularJS

Las “Malas” Experiencias

Page 65: Despegar Tech Talk - AngularJS

Las “Malas” Experiencias

● Stackoverflow tiene más respuestas y documentación que la misma página de AngularJS.

● A veces, hacer una directiva no es tan facil.

● Adaptarnos a las nuevas versiones, trajo muchos cambios con ello ( Aunque, no fueron tan serios ).

● Errores insolucionables o indeseados al capturar las excepciones con el $excepcionHandler

Page 66: Despegar Tech Talk - AngularJS

Soporte para SEO

Page 67: Despegar Tech Talk - AngularJS

Soporte para SEO

Problema:

● Metodología Single Page hace uso extensivo de AJAX.

● Angular tiene comportamiento asincrónico.

● No hay que penalizar al usuario con algo que solo los crawlers necesitan.

Page 68: Despegar Tech Talk - AngularJS

Soporte para SEO

Solución:

Simplemente basta con detectar a los crawlers, por su user-agent y pre-procesar la página usando PhantomJS.

Metodología:

● Standalone

● Prerender

● Necromancer

Page 69: Despegar Tech Talk - AngularJS

Pre-Loading

Page 70: Despegar Tech Talk - AngularJS

Pre-Loading

El gran potencial de Angular radica en su data-binding, por lo que siempre es preferible que angular pueda poseer los objetos y no tener que caer en usar el template-engine para planchar los valores en el HTML.

Problema:

● Queremos evitar usar Ajax porque ya poseemos los datos para rellenar la página al momento de recibir el request.

● Queremos devolver el html junto con algunas las partial views dentro de este.

Page 71: Despegar Tech Talk - AngularJS

Pre-Loading

Solución:

Angular posee un cache tanto para los templates que utilizar para la partial views como para los datos provenientes por Ajax. Nos es posible proveer nuestro propio servicio de caché a Angular, que lea los datos pre-cacheados.

● text/ng-template

● Poner el JSON en el html y desde JS poner eso en la cache

Fuente: Minimizing initialization time in AngularJS

Page 72: Despegar Tech Talk - AngularJS

Pre-Loading

Cache de Partial Views

Page 73: Despegar Tech Talk - AngularJS

Pre-Loading

Cache de JSON

Page 74: Despegar Tech Talk - AngularJS

Pre-Loading

Cache de JSON

Page 75: Despegar Tech Talk - AngularJS

El Futuro de Angular

Page 76: Despegar Tech Talk - AngularJS

El Futuro de Angular

1.3.x - Pierde soporte para IE8Why we're doing this:● Modern browsers have evolved. Although our stats tell us that only a

small percentage of users are on Internet Explorer 8, maintaining compatibility requires code that slows the rest of AngularJS down.

● In April 2014, Microsoft will be ending support for Windows XP, which means the end of support for the operating system most of Internet Explorer 8 users use.

Dropping support for Internet Explorer 8 will enable us to add more exciting features to Angular faster, decrease Angular's support burden, and cut our build time in half, while affecting only a very small proportion of users.

Page 77: Despegar Tech Talk - AngularJS

El Futuro de Angular

Angular + ECMAScript 6

● ES6 Modules

○ Como es un estándar se puede reutilizar y compatir entre diferentes frameworks.

○ Como es un estándar se puede integrar fácilmente con otras herramientas como por ej: Bower o Yeoman

○ Inyección de dependencias basado en annotations

Page 78: Despegar Tech Talk - AngularJS

El Futuro de Angular

Ahora:

angular.module('myStuff', []).value('x', 42);

A Futuro:

module "myStuff" { export let x = 42;}

Page 79: Despegar Tech Talk - AngularJS

El Futuro de Angular

Angular

● Mejor separación del core módulos

angular-resource.jsangular-route.jsangular-sanitize.js+ angular-http.js+ angular-filter.js+ …

Page 80: Despegar Tech Talk - AngularJS

El Futuro de Angular

Angular + ECMAScript 6

● ES6 Modules + HTTP2 ( Akka SPDY )

ServerHTTP/1.1

Browser

inde

x.ht

ml

app.

js

my-

mod

ule.

js

my-

part

ial.

htm

l

ServerHTTP/2.0

Browserin

dex.

htm

l index.html

app.jsm

y-module.js

my-partial.htm

l

4 requests → 4 responses 1 requests → 4 responses

Page 81: Despegar Tech Talk - AngularJS

El Futuro de Angular

Angular

Integración con zone.js

A Zone is an execution context that persists across async tasks. You can think of it as thread-local storage for JavaScript VMs.

Page 82: Despegar Tech Talk - AngularJS

El Futuro de Angular

Angular + ECMAScript 6

Ahora:

● digest cycle

● dirty-checking

● $apply

A futuro:

● Soporte nativo de JavaScript para ser notificado cuando un objeto cambia: Object.observe

Page 83: Despegar Tech Talk - AngularJS

El Futuro de Angular

Ahora:

socket.on('data', function (data) { $scope.$apply(function () {

$scope.model = data;

});

});

A futuro:

socket.on('data', function (data) { $scope.$apply(function () {

$scope.model = data;

});

});

Page 84: Despegar Tech Talk - AngularJS

Debate