SlideShare uma empresa Scribd logo
1 de 24
Single Page Applications
A nova Web
Giovanni Bassi
giovanni@lambda3.com.br
@giovannibassi
Victor Cavalcante
vcavalcante@lambda3.com.br
@vcavalcante
@VCavalcante
@GiovanniBassi
Agenda
História Tecnologias
Novo workflow de
desenvolvimento
Arquitetura da nova
web
Testando na nova
web
Responsabilidades
do servidor web
Manifesto da Nova
Web
Competências do
“novo”
desenvolvedor web
Oportunidades e
desafios no novo
modelo
História
HTML estático
HTML dinâmico
Outlook Web
Access, XMLHttp
Request e AJAX
??
Tecnologias
.htm
CGI
PHP/ASP/Code
Fusion
Webforms, JSF
Ruby on Rails, ASP.NET
MVC, Play Framework
Sinatra, Nancy, ASP.NET
Web API
MeteorJS, NodeJS,
Vert.X,
scriptcs
Novo workflow de desenvolvimento
• Navegação:
– URI => HTML base
– URI => Javascript => Ação (HTML/Javascript/CSS)
• Que dado vou obter agora?
• Qual interface gráfica exibo agora?
• O usuário está logado?
Arquitetura da nova web
• Camadas no navegador (HTML, CSS e JS)
• Arquitetura no servidor
Frameworks para construção de SPA’s
Testando na nova web
• Servidor web: old news
• No browser:
– Jasmine
– Mocha
– QUnit
– Selenium
– Watin
describe "carrega cidades do servico e exibe no dropdown", ->
it "exibe as cidades no dropdown", ->
#arrange
setFixtures("<form>
<select id='UF' name='UF'><option
selected='selected'>Estado</option><option>RJ</option></select><select id='Cidade'
name='Cidade'><option selected='selected'>Cidade</option></select></form>")
url = ''
spyOn($, "ajax").andCallFake((options) ->
url = options.url
options.success(['Rio de Janeiro']))
#act
$('#UF').val('RJ').attr('selected','selected')
$('#UF').trigger('change')
#assert
expect(url).toEqual '/api/cadastro/UF/RJ/Cidades'
expect($('#Cidade option').length).toEqual(3)
expect($('#Cidade option:selected')[0].text).toEqual('Selecione uma cidade')
expect($('#Cidade option')[0].text).toEqual('Selecione uma cidade')
expect($('#Cidade option')[1].text).toEqual('Rio de Janeiro')
Jasmine
describe "carrega cidades do servico e exibe no dropdown", ->
it "exibe as cidades no dropdown", ->
#arrange
setFixtures("<form>
<select id='UF' name='UF'><option
selected='selected'>Estado</option><option>RJ</option></select><select id='Cidade'
name='Cidade'><option selected='selected'>Cidade</option></select></form>")
url = ''
spyOn($, "ajax").andCallFake((options) ->
url = options.url
options.success(['Rio de Janeiro']))
#act
$('#UF').val('RJ').attr('selected','selected')
$('#UF').trigger('change')
#assert
expect(url).toEqual '/api/cadastro/UF/RJ/Cidades'
expect($('#Cidade option').length).toEqual(3)
expect($('#Cidade option:selected')[0].text).toEqual('Selecione uma cidade')
expect($('#Cidade option')[0].text).toEqual('Selecione uma cidade')
expect($('#Cidade option')[1].text).toEqual('Rio de Janeiro')
Jasmine
describe "carrega cidades do servico e exibe no dropdown", ->
it "exibe as cidades no dropdown", ->
#arrange
setFixtures("<form>
<select id='UF' name='UF'><option
selected='selected'>Estado</option><option>RJ</option></select><select id='Cidade'
name='Cidade'><option selected='selected'>Cidade</option></select></form>")
url = ''
spyOn($, "ajax").andCallFake((options) ->
url = options.url
options.success(['Rio de Janeiro']))
#act
$('#UF').val('RJ').attr('selected','selected')
$('#UF').trigger('change')
#assert
expect(url).toEqual '/api/cadastro/UF/RJ/Cidades'
expect($('#Cidade option').length).toEqual(3)
expect($('#Cidade option:selected')[0].text).toEqual('Selecione uma cidade')
expect($('#Cidade option')[0].text).toEqual('Selecione uma cidade')
expect($('#Cidade option')[1].text).toEqual('Rio de Janeiro')
Jasmine
describe "carrega cidades do servico e exibe no dropdown", ->
it "exibe as cidades no dropdown", ->
#arrange
setFixtures("<form>
<select id='UF' name='UF'><option
selected='selected'>Estado</option><option>RJ</option></select><select id='Cidade'
name='Cidade'><option selected='selected'>Cidade</option></select></form>")
url = ''
spyOn($, "ajax").andCallFake((options) ->
url = options.url
options.success(['Rio de Janeiro']))
#act
$('#UF').val('RJ').attr('selected','selected')
$('#UF').trigger('change')
#assert
expect(url).toEqual '/api/cadastro/UF/RJ/Cidades'
expect($('#Cidade option').length).toEqual(3)
expect($('#Cidade option:selected')[0].text).toEqual('Selecione uma cidade')
expect($('#Cidade option')[0].text).toEqual('Selecione uma cidade')
expect($('#Cidade option')[1].text).toEqual('Rio de Janeiro')
Jasmine
Responsabilidades do servidor web
• Não precisa mais gerar HTML
• Não precisa mais manter estado
• Não precisa mais se conectar em todos os serviços que
atendem a aplicação
Quais suas novas responsabilidades?
Manifesto da Nova Web
• Menos C#/Ruby/Java/Python, mais Javascript (ou
CoffeeScript)
• Menos arrastar e soltar, mais HTML codificado à mão
• Menos poluição no HTML, mais CSS
• Menos uso do HTML para design, mais foco na semântica
• Mais Javascript, mais opções ao Javascript (Coffeescript)
Competências do “novo”
desenvolvedor web
• HTML5
• CSS3
• JavaScript / CoffeeScript
• HTTP 1.1
• Web Standards
• REST
• Linguagem do lado do servidor
Oportunidades no novo modelo
• Desenvolvimento mobile facilitado
• Consumo de conteúdo desconectado
– Local Storage
– Cache Manifest
– Sincronização
• Sensação de maior responsividade da aplicação
• SPAs
• Convergência tecnológica
Desafios do novo modelo
• Falta de conhecimento dos desenvolvedores
• Medo
• Ferramental ainda em evolução
• Segurança garantida no server side
• Código exposto no cliente
Você é desenvolvedor web?
Continuará sendo nos próximos
anos com o conhecimento atual?
Obrigado!
Giovanni Bassi
giovanni@lambda3.com.br
@giovannibassi
Victor Cavalcante
victor@cavalcante.net
@vcavalcante
www.lambda3.com.br
Days 2012

Mais conteúdo relacionado

Semelhante a Sigle Page Application - A nova Web

Backbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectadosBackbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectadosHenrique Gogó
 
Workshop Node.js + MongoDB + Mongoose
Workshop Node.js + MongoDB + MongooseWorkshop Node.js + MongoDB + Mongoose
Workshop Node.js + MongoDB + MongooseLuiz Duarte
 
Interfaces Ricas para WEB com jQuery e jQueryUI (User Interface)
Interfaces Ricas para WEB com jQuery e jQueryUI (User Interface)Interfaces Ricas para WEB com jQuery e jQueryUI (User Interface)
Interfaces Ricas para WEB com jQuery e jQueryUI (User Interface)Evandro Klimpel Balmant
 
Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)Julian Cesar
 
Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_Rodrigo Urubatan
 
QCon 2015 - Combinando AngularJS com Java EE
QCon 2015 - Combinando AngularJS com Java EEQCon 2015 - Combinando AngularJS com Java EE
QCon 2015 - Combinando AngularJS com Java EERodrigo Cândido da Silva
 
JavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersJavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersHarlley Oliveira
 
Repositório Social de Serviços Web
Repositório Social de Serviços WebRepositório Social de Serviços Web
Repositório Social de Serviços WebHenrique Dias
 
Palestra - Iniciando no Jquery
Palestra - Iniciando no JqueryPalestra - Iniciando no Jquery
Palestra - Iniciando no Jquerygrupoweblovers
 
DevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsDevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsSuissa
 
JQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBJQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBLuciano Borges
 
Google Analytics Reporting API: Bebendo água direto da fonte
Google Analytics Reporting API: Bebendo água direto da fonteGoogle Analytics Reporting API: Bebendo água direto da fonte
Google Analytics Reporting API: Bebendo água direto da fonteJohann Vivot
 
Android chat app com Node.js
Android chat app com Node.jsAndroid chat app com Node.js
Android chat app com Node.jsLuiz Duarte
 
Backbone.js nas trincheiras
Backbone.js nas trincheirasBackbone.js nas trincheiras
Backbone.js nas trincheirasLambda 3
 
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EELoiane Groner
 
API's do HTML5 - Davidson Alencar - WebBR2013
API's do HTML5 - Davidson Alencar - WebBR2013API's do HTML5 - Davidson Alencar - WebBR2013
API's do HTML5 - Davidson Alencar - WebBR2013Davidson Alencar
 

Semelhante a Sigle Page Application - A nova Web (20)

Backbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectadosBackbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectados
 
Workshop Node.js + MongoDB + Mongoose
Workshop Node.js + MongoDB + MongooseWorkshop Node.js + MongoDB + Mongoose
Workshop Node.js + MongoDB + Mongoose
 
Interfaces Ricas para WEB com jQuery e jQueryUI (User Interface)
Interfaces Ricas para WEB com jQuery e jQueryUI (User Interface)Interfaces Ricas para WEB com jQuery e jQueryUI (User Interface)
Interfaces Ricas para WEB com jQuery e jQueryUI (User Interface)
 
Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)
 
Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_
 
Node.js: serious business
Node.js: serious businessNode.js: serious business
Node.js: serious business
 
QCon 2015 - Combinando AngularJS com Java EE
QCon 2015 - Combinando AngularJS com Java EEQCon 2015 - Combinando AngularJS com Java EE
QCon 2015 - Combinando AngularJS com Java EE
 
04_Introducao_JavaScript.pdf
04_Introducao_JavaScript.pdf04_Introducao_JavaScript.pdf
04_Introducao_JavaScript.pdf
 
JavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersJavaScript e JQuery para Webdesigners
JavaScript e JQuery para Webdesigners
 
Repositório Social de Serviços Web
Repositório Social de Serviços WebRepositório Social de Serviços Web
Repositório Social de Serviços Web
 
Palestra - Iniciando no Jquery
Palestra - Iniciando no JqueryPalestra - Iniciando no Jquery
Palestra - Iniciando no Jquery
 
GUJavaSC - Combinando AngularJS com Java EE
GUJavaSC - Combinando AngularJS com Java EEGUJavaSC - Combinando AngularJS com Java EE
GUJavaSC - Combinando AngularJS com Java EE
 
DevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsDevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webapps
 
introdução a ajax
introdução a ajaxintrodução a ajax
introdução a ajax
 
JQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBJQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEB
 
Google Analytics Reporting API: Bebendo água direto da fonte
Google Analytics Reporting API: Bebendo água direto da fonteGoogle Analytics Reporting API: Bebendo água direto da fonte
Google Analytics Reporting API: Bebendo água direto da fonte
 
Android chat app com Node.js
Android chat app com Node.jsAndroid chat app com Node.js
Android chat app com Node.js
 
Backbone.js nas trincheiras
Backbone.js nas trincheirasBackbone.js nas trincheiras
Backbone.js nas trincheiras
 
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
 
API's do HTML5 - Davidson Alencar - WebBR2013
API's do HTML5 - Davidson Alencar - WebBR2013API's do HTML5 - Davidson Alencar - WebBR2013
API's do HTML5 - Davidson Alencar - WebBR2013
 

Mais de Victor Cavalcante

.NET Core Internals. O que é o .NET Platform Standard?
.NET Core Internals. O que é o .NET Platform Standard?.NET Core Internals. O que é o .NET Platform Standard?
.NET Core Internals. O que é o .NET Platform Standard?Victor Cavalcante
 
Mini Curso de jQuery Lambda3/Globalcode
Mini Curso de jQuery Lambda3/GlobalcodeMini Curso de jQuery Lambda3/Globalcode
Mini Curso de jQuery Lambda3/GlobalcodeVictor Cavalcante
 
jQuery e ASP.Net MVC a dupla dinâmica
jQuery e ASP.Net MVC a dupla dinâmicajQuery e ASP.Net MVC a dupla dinâmica
jQuery e ASP.Net MVC a dupla dinâmicaVictor Cavalcante
 

Mais de Victor Cavalcante (6)

.NET Core Internals. O que é o .NET Platform Standard?
.NET Core Internals. O que é o .NET Platform Standard?.NET Core Internals. O que é o .NET Platform Standard?
.NET Core Internals. O que é o .NET Platform Standard?
 
O futuro do asp.net mvc
O futuro do asp.net mvcO futuro do asp.net mvc
O futuro do asp.net mvc
 
Conheça o ASP.NET MVC 3
Conheça o ASP.NET MVC 3Conheça o ASP.NET MVC 3
Conheça o ASP.NET MVC 3
 
Mini Curso de jQuery Lambda3/Globalcode
Mini Curso de jQuery Lambda3/GlobalcodeMini Curso de jQuery Lambda3/Globalcode
Mini Curso de jQuery Lambda3/Globalcode
 
jQuery e ASP.Net MVC a dupla dinâmica
jQuery e ASP.Net MVC a dupla dinâmicajQuery e ASP.Net MVC a dupla dinâmica
jQuery e ASP.Net MVC a dupla dinâmica
 
jQuery e ASP.Net mvc2
jQuery e ASP.Net mvc2jQuery e ASP.Net mvc2
jQuery e ASP.Net mvc2
 

Sigle Page Application - A nova Web

  • 1. Single Page Applications A nova Web Giovanni Bassi giovanni@lambda3.com.br @giovannibassi Victor Cavalcante vcavalcante@lambda3.com.br @vcavalcante
  • 3.
  • 4.
  • 5. Agenda História Tecnologias Novo workflow de desenvolvimento Arquitetura da nova web Testando na nova web Responsabilidades do servidor web Manifesto da Nova Web Competências do “novo” desenvolvedor web Oportunidades e desafios no novo modelo
  • 6. História HTML estático HTML dinâmico Outlook Web Access, XMLHttp Request e AJAX ??
  • 7. Tecnologias .htm CGI PHP/ASP/Code Fusion Webforms, JSF Ruby on Rails, ASP.NET MVC, Play Framework Sinatra, Nancy, ASP.NET Web API MeteorJS, NodeJS, Vert.X, scriptcs
  • 8. Novo workflow de desenvolvimento • Navegação: – URI => HTML base – URI => Javascript => Ação (HTML/Javascript/CSS) • Que dado vou obter agora? • Qual interface gráfica exibo agora? • O usuário está logado?
  • 9. Arquitetura da nova web • Camadas no navegador (HTML, CSS e JS) • Arquitetura no servidor
  • 11. Testando na nova web • Servidor web: old news • No browser: – Jasmine – Mocha – QUnit – Selenium – Watin
  • 12. describe "carrega cidades do servico e exibe no dropdown", -> it "exibe as cidades no dropdown", -> #arrange setFixtures("<form> <select id='UF' name='UF'><option selected='selected'>Estado</option><option>RJ</option></select><select id='Cidade' name='Cidade'><option selected='selected'>Cidade</option></select></form>") url = '' spyOn($, "ajax").andCallFake((options) -> url = options.url options.success(['Rio de Janeiro'])) #act $('#UF').val('RJ').attr('selected','selected') $('#UF').trigger('change') #assert expect(url).toEqual '/api/cadastro/UF/RJ/Cidades' expect($('#Cidade option').length).toEqual(3) expect($('#Cidade option:selected')[0].text).toEqual('Selecione uma cidade') expect($('#Cidade option')[0].text).toEqual('Selecione uma cidade') expect($('#Cidade option')[1].text).toEqual('Rio de Janeiro') Jasmine
  • 13. describe "carrega cidades do servico e exibe no dropdown", -> it "exibe as cidades no dropdown", -> #arrange setFixtures("<form> <select id='UF' name='UF'><option selected='selected'>Estado</option><option>RJ</option></select><select id='Cidade' name='Cidade'><option selected='selected'>Cidade</option></select></form>") url = '' spyOn($, "ajax").andCallFake((options) -> url = options.url options.success(['Rio de Janeiro'])) #act $('#UF').val('RJ').attr('selected','selected') $('#UF').trigger('change') #assert expect(url).toEqual '/api/cadastro/UF/RJ/Cidades' expect($('#Cidade option').length).toEqual(3) expect($('#Cidade option:selected')[0].text).toEqual('Selecione uma cidade') expect($('#Cidade option')[0].text).toEqual('Selecione uma cidade') expect($('#Cidade option')[1].text).toEqual('Rio de Janeiro') Jasmine
  • 14. describe "carrega cidades do servico e exibe no dropdown", -> it "exibe as cidades no dropdown", -> #arrange setFixtures("<form> <select id='UF' name='UF'><option selected='selected'>Estado</option><option>RJ</option></select><select id='Cidade' name='Cidade'><option selected='selected'>Cidade</option></select></form>") url = '' spyOn($, "ajax").andCallFake((options) -> url = options.url options.success(['Rio de Janeiro'])) #act $('#UF').val('RJ').attr('selected','selected') $('#UF').trigger('change') #assert expect(url).toEqual '/api/cadastro/UF/RJ/Cidades' expect($('#Cidade option').length).toEqual(3) expect($('#Cidade option:selected')[0].text).toEqual('Selecione uma cidade') expect($('#Cidade option')[0].text).toEqual('Selecione uma cidade') expect($('#Cidade option')[1].text).toEqual('Rio de Janeiro') Jasmine
  • 15. describe "carrega cidades do servico e exibe no dropdown", -> it "exibe as cidades no dropdown", -> #arrange setFixtures("<form> <select id='UF' name='UF'><option selected='selected'>Estado</option><option>RJ</option></select><select id='Cidade' name='Cidade'><option selected='selected'>Cidade</option></select></form>") url = '' spyOn($, "ajax").andCallFake((options) -> url = options.url options.success(['Rio de Janeiro'])) #act $('#UF').val('RJ').attr('selected','selected') $('#UF').trigger('change') #assert expect(url).toEqual '/api/cadastro/UF/RJ/Cidades' expect($('#Cidade option').length).toEqual(3) expect($('#Cidade option:selected')[0].text).toEqual('Selecione uma cidade') expect($('#Cidade option')[0].text).toEqual('Selecione uma cidade') expect($('#Cidade option')[1].text).toEqual('Rio de Janeiro') Jasmine
  • 16. Responsabilidades do servidor web • Não precisa mais gerar HTML • Não precisa mais manter estado • Não precisa mais se conectar em todos os serviços que atendem a aplicação Quais suas novas responsabilidades?
  • 17. Manifesto da Nova Web • Menos C#/Ruby/Java/Python, mais Javascript (ou CoffeeScript) • Menos arrastar e soltar, mais HTML codificado à mão • Menos poluição no HTML, mais CSS • Menos uso do HTML para design, mais foco na semântica • Mais Javascript, mais opções ao Javascript (Coffeescript)
  • 18. Competências do “novo” desenvolvedor web • HTML5 • CSS3 • JavaScript / CoffeeScript • HTTP 1.1 • Web Standards • REST • Linguagem do lado do servidor
  • 19. Oportunidades no novo modelo • Desenvolvimento mobile facilitado • Consumo de conteúdo desconectado – Local Storage – Cache Manifest – Sincronização • Sensação de maior responsividade da aplicação • SPAs • Convergência tecnológica
  • 20. Desafios do novo modelo • Falta de conhecimento dos desenvolvedores • Medo • Ferramental ainda em evolução • Segurança garantida no server side • Código exposto no cliente
  • 21. Você é desenvolvedor web? Continuará sendo nos próximos anos com o conhecimento atual?
  • 22.