Evento Front End SP - Arquitetura de Front

Michel Ribeiro
Michel RibeiroDev Front-End em Midia 3
Arquitetura de
 Front-end em
 aplicações de
  larga escala
   @shiota | eshiota.com
Front-end
Internet
Arquitetura simples




                      Arquitetura complexa
Na minha visão, aplicações JavaScript
de larga escala são aplicações não-
triviais que requerem um esforço
significante de manutenção por parte do
desenvolvedor, onde a maior parte do
trabalho de manipulação de dados e
visualização é atribuída ao navegador.


                              Addy Osmani
                     Developer Programs Engineer @ Google
Aplicações com front-end de larga
escala são aplicações não-triviais que
requerem um esforço significante de
manutenção por parte do
desenvolvedor, onde organização,
modularização, otimização e reutilização
de código são cruciais.


                   Eduardo Shiota Yasuda
                             Loves cat videos on Youtube
Aplicações de pequena escala
style.css




templates



application.js
& jQuery / plugins



imagens




CMS
O CSS de um blog é geralmente simples, com algumas centenas de linhas de código,
concentrado em um único arquivo. Não é tão difícil de manter.
Mesma coisa para o JS: geralmente um arquivo e alguns plugins, e tudo sendo chamado em
uma única função auto-executável.
O tema Twenty Ten do Wordpress mostra uma estrutura básica de blog: alguns templates,
um CSS. Provavelmente terá um único arquivo de JavaScript também.
Aplicações de Larga escala
Uma Intranet utilizada por dezenas de empresas e milhares de funcionários não é uma
aplicação trivial.
Ela possui diversas seções, funções, e muitos trechos podem ser reutilizados ou apenas
adaptados.
O JavaScript de uma aplicação desse porte pode ficar com alguns milhares de linhas de
código...
... o mesmo para o CSS. Nestes dois casos, eu apenas concatenei os diferentes módulos em
um único arquivo. É impossível manter dessa forma.
HTML, CSS e JavaScript
            modulares
Noção de módulo
Evento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de Front
HTML & CSS modular
Evento Front End SP - Arquitetura de Front
<section>
  <h3>Quick links</h3>

  <ul class="arrowed">
    <li>
      <a href="#">Your profile</a>
    </li>
    <li>
      <a href="#">MKX settings</a>
    </li>
    <li>
      <a href="#">MIH SWAT</a>
    </li>
    <li>
      <a href="#">Invite users</a>
    </li>
  </ul>
</section>
<section>
  <h3>Your starred content</h3>

  <ul class="iconed">
    <li class="file-locked">
      <a href="#">php|tek - 02 - PHP is cool</a><br />
      <small>in group: <a href="#">PHP</a></small>
    </li>
    <li class="photo-locked">
      <a href="#">php|tek entrance hall</a><br />
      <small>in group: <a href="#">PHP</a></small>
    </li>
    <li class="doc">
      <a href="#">Doctrine 101</a><br />
      <small>in company: <a href="#">MIH SWAT</a></small>
    </li>
    <li class="forum">
      <a href="#">PHP group files...</a><br />
      <small>in group: <a href="#">PHP</a></small>
    </li>
  </ul>
</section>
<section>
  <h3>Recommended contacts</h3>

  <ul>
    <li class="card">
       <div class="card-content">
         <hgroup>
           <h4>Lorem ipsum</h4>
           <h5>CEO @ <a href="#">MIH SWAT</h5>
         </hgroup>

        <p><a href="#">[add as contact]</a></p>
      </div>

      <img src="image.jpg" alt="Lorem ipsum" />
    </li>

    <li class="card">
      <div class="card-content">
        <hgroup>
          <h4>Lorem ipsum</h4>
          <h5>Technical Architect @ <a href="#">MIH SWAT</h5>
        </hgroup>

        <p><a href="#">[add as contact]</a></p>
      </div>

      <img src="image.jpg" alt="Lorem ipsum" />
    </li>
  </ul>
</section>
<section>
  <h3></h3>

  <ul>
    <li></li>
  </ul>
</section>
Evento Front End SP - Arquitetura de Front
<section>
  <h3>Recommended contacts</h3>

  <ul>
    <li class="card">
       <div class="card-content">
         <hgroup>
           <h4>Lorem ipsum</h4>
           <h5>CEO @ <a href="#">MIH SWAT</h5>
         </hgroup>

        <p><a href="#">[add as contact]</a></p>
      </div>

      <img src="image.jpg" alt="Lorem ipsum" />
    </li>
  </ul>
</section>
<article class="card group-activity">
  <div class="card-content">
    <p>
      <a href="#" class="actor">Rafael Dohms</a> joined a group:
      <a href="#" class="subject">PHP South Africa</a>
    </p>

    <p>
      <date>2 hours ago</date>
      <a href="#">Unlike</a>
      <a href="#">Comment entry</a>
    </p>
  </div>

  <img src="image.jpg" alt="Rafael Dohms" />
</article>
<article class="card">
  <div class="card-content">
  </div>

  <img />
</article>
Evento Front End SP - Arquitetura de Front
.button {
  border-radius: 5px;
  font-family: "proxima-nova", sans-serif;
  height: 2em;
  line-height: 2em;
  padding: 1em;
  color: #fff;
  text-shadow: 0 -1px 0 #000;
}

.large-button {
  font-size: 3em;
}

.confirm-button {
  background: #ffba00;
  box-shadow: 0 3px 0 #cd9600;
}

.send-button {
  /* styles for icon placement */
}
.button
                   .send-button




.large-button

                .confirm-button
.button
                   .send-button




.small-button

                .confirm-button
oocss.org
smacss.com
JavaScript modular
JavaScript não é (só) jQuery
shareForm.js
                                      shareField.js
shareTypeSelector.js




                       newsfeed.js
submit                              get



                                              onsuccess                            data
                       shareForm                                  shareProxy
               init                    init




shareTypeSelector                             shareField                                     newsfeed



         trigger("share-
         type-changed")     trigger("new-post")         on("share-type-changed")    on("new-post")




                                              mediator.js
Modules ± Tests = OMGBBQw00t
/**
  Loader constructor

  @params {Function} placement Function that determines the loader's placement
  @constructor
**/
ns("EDEN.ui.Loader", function (placement) {
  if (!(this instanceof EDEN.ui.Loader)) {
    return new EDEN.ui.Loader(placement);
  }

  this.frame       =   1;
  this.framesQty   =   8;
  this.stack       =   [];
  this.animating   =   false;
  this.$loader     =   $("<div class='loader'><b> </b></div>");
  this.$renderer   =   this.$loader.find("b");
  this.placement   =   placement;

  this.init();
});
/**
  Animation speed (in frames per second)

  @property fps
  @type     Number
  @default 20
**/
EDEN.ui.Loader.prototype.fps = 20;



/**
  Fading speed

  @property fadeSpeed
  @type     Number
  @default 150
**/
EDEN.ui.Loader.prototype.fadeSpeed = 150;
/**
  Inits the loader by inserting it into the DOM. If a placement argument
  wasn't passed to the constructor, uses a generic placement.

  @method init
**/
EDEN.ui.Loader.prototype.init = function () {
  if (!this.placement) {
    this.placement = function ($loader) {
       $loader.appendTo($("body"));
    };
  }

     this.placement.call(this, this.$loader);
};
/**
  Starts the loader by fading in and starting the animation.
  If there are multiple processes, stacks the requests.

  @method start
**/
EDEN.ui.Loader.prototype.start = function () {
  this.stack.push((new Date()).getTime());

     if (this.stack.length === 1) {
       this._startAnimation();
     }
};


/**
  Stops the loader by fading out and stoping the animation
  If there are any processes pending, pops the requests
  until it can actually stop.

  @method stop
**/
EDEN.ui.Loader.prototype.stop = function () {
  this.stack.pop();

     if (!this.stack.length) {
       this._stopAnimation();
     }
};
/**
  Starts the loader animation

  @private
**/
EDEN.ui.Loader.prototype._startAnimation = function () {
  this.animating = true;

     this._renderAnimation();
};



/**
  Stops the loader animation

   @private
**/
EDEN.ui.Loader.prototype._stopAnimation = function () {
   this.animating = false;
};
/**
  Loops the animation, calling itself according to the fps

  @private
**/
EDEN.ui.Loader.prototype._renderAnimation = function () {
  if (!this.animating) { return true; }

     this._draw();
     setTimeout(this._renderAnimation.bind(this), 1000 / this.fps);
};



/**
  Draws the animation

  @private
**/
EDEN.ui.Loader.prototype._draw = function () {
  this.$renderer.removeClass().addClass("f" + this.frame);

     this.frame = this.frame + 1 > this.framesQty ? 1 : this.frame + 1;
};



/**
  Returns the animation stack.

   @return Array
   @private
**/
EDEN.ui.Loader.prototype._getAnimationStack = function () {
   return this.stack;
};
Jasmine
it("appends the loader to body as a default", function () {
  var loader = new Loader();

  expect($("body").find(".loader").length).toEqual(1);
});



it("appends the loader through an argument function", function () {
  var loader = new Loader(function ($loader) {
    $("#loader-placeholder").append($loader);
  });

  expect($("#loader-placeholder").find(".loader").length).toEqual(1);
});



it("stops the animation if stack is empty", function () {
  loader.start();
  loader.stop();

  expect($(".loader").data("spinning")).not.toBeTruthy();
});
Evento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de Front
addyosmani.com/largescalejavascript
requirejs.org
//my/shirt.js now has some dependencies, a cart and inventory
//module in the same directory as shirt.js
define(["./cart", "./inventory"], function(cart, inventory) {
   //return an object to define the "my/shirt" module.
     return {
        color: "blue",
        size: "large",
        addToCart: function() {
          inventory.decrement(this);
          cart.add(this);
        }
     };
   }
);
Otimização do front-end
html5boilerplate.com
compass-style.org
Exemplos com compass
Evento Front End SP - Arquitetura de Front
core/_typography.scss
ui/_loader.scss
application.scss
application-ec8971025292ecb7dd2c99d430d7a76e.css
$icon-sprite: sprite-map("icon/*.png", $spacing:
16px, $repeat: no-repeat, $layout: vertical);
$icon-sprite: sprite-map("icon/*.png", $spacing:
16px, $repeat: no-repeat, $layout: vertical);
background: sprite($icon-sprite, arrow_dropdown) no-repeat;




background: url(/assets/icon-s5dab8c2901.png) -40px -158px no-repeat;
background: #f5f3eb inline-image("bg_dots.png") repeat;




background: #f5f3fb url('data:image/
png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAQCAMAAAAcVM5PAAAAGXRF
WHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAlQTFRF5+TW///////
/4qZUpQAAAAN0Uk5T//
8A18oNQQAAACBJREFUeNpiYGBgAgMGBkYog4mJXAbILAiDkVxzAAIMAEMOAPMId
2OWAAAAAElFTkSuQmCC') repeat;
Evento Front End SP - Arquitetura de Front
Estude
Modularize
 Organize
 Comente
  Otimize
$$ Profit $$
Thanks!
@shiota | eshiota.com
1 de 73

Recomendados

Como criar um plugin para WordPress por
Como criar um plugin para WordPressComo criar um plugin para WordPress
Como criar um plugin para WordPressLeandrinho Vieira
3.2K visualizações27 slides
Python 07 por
Python 07Python 07
Python 07Bruno Catão
1.5K visualizações31 slides
Vue.js por
Vue.jsVue.js
Vue.jsLuís Felipe Souza
256 visualizações44 slides
Criando uma arquitetura de front-end do zero por
Criando uma arquitetura de front-end do zeroCriando uma arquitetura de front-end do zero
Criando uma arquitetura de front-end do zeroEduardo Shiota Yasuda
11.8K visualizações184 slides
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com... por
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...Tchelinux
9.2K visualizações48 slides
Desafios do Desenvolvimento de Front-end em um e-commerce por
Desafios do Desenvolvimento de Front-end em um e-commerceDesafios do Desenvolvimento de Front-end em um e-commerce
Desafios do Desenvolvimento de Front-end em um e-commerceEduardo Shiota Yasuda
4.9K visualizações161 slides

Mais conteúdo relacionado

Mais procurados

Hibernate efetivo (IA-2014 / Disturbing the Mind) por
Hibernate efetivo (IA-2014 / Disturbing the Mind)Hibernate efetivo (IA-2014 / Disturbing the Mind)
Hibernate efetivo (IA-2014 / Disturbing the Mind)Rafael Ponte
1.1K visualizações172 slides
PHP robusto com Zend Framework por
PHP robusto com Zend FrameworkPHP robusto com Zend Framework
PHP robusto com Zend FrameworkJaime Neto
2.1K visualizações24 slides
JS Experience 2017 - Web APIs que você provavelmente não sabia que existiam por
JS Experience 2017 - Web APIs que você provavelmente não sabia que existiamJS Experience 2017 - Web APIs que você provavelmente não sabia que existiam
JS Experience 2017 - Web APIs que você provavelmente não sabia que existiamiMasters
273 visualizações118 slides
Dicas para Interfaces Performáticas no seu App Android por
Dicas para Interfaces Performáticas no seu App AndroidDicas para Interfaces Performáticas no seu App Android
Dicas para Interfaces Performáticas no seu App AndroidUbiratan Soares
2.9K visualizações63 slides
Ionic 2/3 + Firebase por
Ionic 2/3 + FirebaseIonic 2/3 + Firebase
Ionic 2/3 + FirebaseBruno Catão
1K visualizações76 slides
Hibernate efetivo (COALTI-2014 / ALJUG) por
Hibernate efetivo (COALTI-2014 / ALJUG)Hibernate efetivo (COALTI-2014 / ALJUG)
Hibernate efetivo (COALTI-2014 / ALJUG)Rafael Ponte
2.1K visualizações173 slides

Mais procurados(20)

Hibernate efetivo (IA-2014 / Disturbing the Mind) por Rafael Ponte
Hibernate efetivo (IA-2014 / Disturbing the Mind)Hibernate efetivo (IA-2014 / Disturbing the Mind)
Hibernate efetivo (IA-2014 / Disturbing the Mind)
Rafael Ponte1.1K visualizações
PHP robusto com Zend Framework por Jaime Neto
PHP robusto com Zend FrameworkPHP robusto com Zend Framework
PHP robusto com Zend Framework
Jaime Neto2.1K visualizações
JS Experience 2017 - Web APIs que você provavelmente não sabia que existiam por iMasters
JS Experience 2017 - Web APIs que você provavelmente não sabia que existiamJS Experience 2017 - Web APIs que você provavelmente não sabia que existiam
JS Experience 2017 - Web APIs que você provavelmente não sabia que existiam
iMasters273 visualizações
Dicas para Interfaces Performáticas no seu App Android por Ubiratan Soares
Dicas para Interfaces Performáticas no seu App AndroidDicas para Interfaces Performáticas no seu App Android
Dicas para Interfaces Performáticas no seu App Android
Ubiratan Soares2.9K visualizações
Ionic 2/3 + Firebase por Bruno Catão
Ionic 2/3 + FirebaseIonic 2/3 + Firebase
Ionic 2/3 + Firebase
Bruno Catão1K visualizações
Hibernate efetivo (COALTI-2014 / ALJUG) por Rafael Ponte
Hibernate efetivo (COALTI-2014 / ALJUG)Hibernate efetivo (COALTI-2014 / ALJUG)
Hibernate efetivo (COALTI-2014 / ALJUG)
Rafael Ponte2.1K visualizações
Aplicações rápidas para a Web com Django por Freedom DayMS
Aplicações rápidas para a Web com DjangoAplicações rápidas para a Web com Django
Aplicações rápidas para a Web com Django
Freedom DayMS1.1K visualizações
Apresentando o Yii Framework por angellicacardozo
Apresentando o Yii FrameworkApresentando o Yii Framework
Apresentando o Yii Framework
angellicacardozo3.6K visualizações
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT) por Rafael Ponte
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Rafael Ponte3.8K visualizações
Javascript truquesmagicos por ponto hacker
Javascript truquesmagicosJavascript truquesmagicos
Javascript truquesmagicos
ponto hacker635 visualizações
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere por Juliano Martins
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphereCriando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
Juliano Martins2.9K visualizações
Migrations for Java (QCONSP2013) por Rafael Ponte
Migrations for Java (QCONSP2013)Migrations for Java (QCONSP2013)
Migrations for Java (QCONSP2013)
Rafael Ponte6.7K visualizações
Web Performance Client Side por Levy Carneiro Jr.
Web Performance Client SideWeb Performance Client Side
Web Performance Client Side
Levy Carneiro Jr.742 visualizações
Autenticação com AngularJS e loadOnDemand por Douglas Lira
Autenticação com AngularJS e loadOnDemandAutenticação com AngularJS e loadOnDemand
Autenticação com AngularJS e loadOnDemand
Douglas Lira3.9K visualizações
Desenvolvendo aplicacoes mobile_com_html_css_ por Rodrigo Urubatan
Desenvolvendo aplicacoes mobile_com_html_css_Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_
Rodrigo Urubatan637 visualizações
Evento Front End SP - Organizando o Javascript por Michel Ribeiro
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o Javascript
Michel Ribeiro890 visualizações
Migrations for Java (Javou #4 - JavaCE) por Rafael Ponte
Migrations for Java (Javou #4 - JavaCE)Migrations for Java (Javou #4 - JavaCE)
Migrations for Java (Javou #4 - JavaCE)
Rafael Ponte1.5K visualizações
JS Experience 2017 - Javascript Funcional por iMasters
JS Experience 2017 - Javascript FuncionalJS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript Funcional
iMasters180 visualizações
Desenvolvimento Front end (AngularJS e Bootstrap) por Julian Cesar
Desenvolvimento Front end (AngularJS e Bootstrap)Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)
Julian Cesar8.2K visualizações

Similar a Evento Front End SP - Arquitetura de Front

Aplicacoes Rapidas Para Web Com Django por
Aplicacoes Rapidas Para Web Com DjangoAplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com DjangoDiemesleno Souza Carvalho
976 visualizações49 slides
Java e Cloud Computing por
Java e Cloud ComputingJava e Cloud Computing
Java e Cloud ComputingMario Jorge Pereira
1.7K visualizações64 slides
LambdaDay: Backbone.js por
LambdaDay: Backbone.jsLambdaDay: Backbone.js
LambdaDay: Backbone.jsGiovanni Bassi
2.5K visualizações35 slides
Play Framework - FLISOL por
Play Framework - FLISOLPlay Framework - FLISOL
Play Framework - FLISOLgrupoweblovers
1K visualizações46 slides
Wicket 2008 por
Wicket 2008Wicket 2008
Wicket 2008Claudio Miranda
933 visualizações67 slides
Tutorial.yii por
Tutorial.yiiTutorial.yii
Tutorial.yiiRenato Mendes
477 visualizações9 slides

Similar a Evento Front End SP - Arquitetura de Front(20)

Java e Cloud Computing por Mario Jorge Pereira
Java e Cloud ComputingJava e Cloud Computing
Java e Cloud Computing
Mario Jorge Pereira1.7K visualizações
LambdaDay: Backbone.js por Giovanni Bassi
LambdaDay: Backbone.jsLambdaDay: Backbone.js
LambdaDay: Backbone.js
Giovanni Bassi2.5K visualizações
Play Framework - FLISOL por grupoweblovers
Play Framework - FLISOLPlay Framework - FLISOL
Play Framework - FLISOL
grupoweblovers1K visualizações
Wicket 2008 por Claudio Miranda
Wicket 2008Wicket 2008
Wicket 2008
Claudio Miranda933 visualizações
Tutorial.yii por Renato Mendes
Tutorial.yiiTutorial.yii
Tutorial.yii
Renato Mendes477 visualizações
Backbone.js nas trincheiras por Lambda 3
Backbone.js nas trincheirasBackbone.js nas trincheiras
Backbone.js nas trincheiras
Lambda 32.1K visualizações
Como Perder Peso (no browser) por Zeno Rocha
Como Perder Peso (no browser)Como Perder Peso (no browser)
Como Perder Peso (no browser)
Zeno Rocha2.9K visualizações
PHP FrameWARks - FISL por Marcio Albuquerque
PHP FrameWARks - FISLPHP FrameWARks - FISL
PHP FrameWARks - FISL
Marcio Albuquerque961 visualizações
TechDay - Sistemas WEB em Java - Rogério N. Jr. por Rogério Napoleão Jr.
TechDay - Sistemas WEB em Java - Rogério N. Jr.TechDay - Sistemas WEB em Java - Rogério N. Jr.
TechDay - Sistemas WEB em Java - Rogério N. Jr.
Rogério Napoleão Jr.1.7K visualizações
Apache Wicket - Desenvolvimento WEB orientado a componentes por CI&T
Apache Wicket - Desenvolvimento WEB orientado a componentesApache Wicket - Desenvolvimento WEB orientado a componentes
Apache Wicket - Desenvolvimento WEB orientado a componentes
CI&T2.5K visualizações
JavaScript e JQuery para Webdesigners por Harlley Oliveira
JavaScript e JQuery para WebdesignersJavaScript e JQuery para Webdesigners
JavaScript e JQuery para Webdesigners
Harlley Oliveira4.4K visualizações
Componentes para a Web por Jean Carlo Emer
Componentes para a WebComponentes para a Web
Componentes para a Web
Jean Carlo Emer521 visualizações
Introdução ao Zend Framework 2 por Elton Minetto
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2
Elton Minetto1.7K visualizações
Desenvolvimento de aplicações para o Google App Engine por Campus Party Brasil
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App Engine
Campus Party Brasil11.2K visualizações
Desenvolvimento de Aplicações para o Google App Engine (CPBR5) por Carlos Duarte do Nascimento
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Carlos Duarte do Nascimento3.8K visualizações
Os 10 Maus Hábitos dos Desenvolvedores JSF por tarsobessa
Os 10 Maus Hábitos dos Desenvolvedores JSFOs 10 Maus Hábitos dos Desenvolvedores JSF
Os 10 Maus Hábitos dos Desenvolvedores JSF
tarsobessa5.4K visualizações
Desenvolvimento de Módulos Divi Builder por Daniel Paz
Desenvolvimento de Módulos Divi BuilderDesenvolvimento de Módulos Divi Builder
Desenvolvimento de Módulos Divi Builder
Daniel Paz80 visualizações

Último

Conheça agora o UiPath Autopilot™ para o Studio.pdf por
Conheça agora o UiPath Autopilot™ para o Studio.pdfConheça agora o UiPath Autopilot™ para o Studio.pdf
Conheça agora o UiPath Autopilot™ para o Studio.pdfBrunaCavalcanti29
14 visualizações8 slides
Skills e Squads, como trabalhar? por
Skills e Squads, como trabalhar?Skills e Squads, como trabalhar?
Skills e Squads, como trabalhar?Annelise Gripp
32 visualizações13 slides
TechConnection 2023 Floripa Azure Container Apps por
TechConnection 2023 Floripa Azure Container AppsTechConnection 2023 Floripa Azure Container Apps
TechConnection 2023 Floripa Azure Container AppsWalter Coan
6 visualizações14 slides
MAPA - SAÚDE - FUNDAMENTOS DE FARMACOLOGIA - 54/2023 por
MAPA - SAÚDE - FUNDAMENTOS DE FARMACOLOGIA - 54/2023MAPA - SAÚDE - FUNDAMENTOS DE FARMACOLOGIA - 54/2023
MAPA - SAÚDE - FUNDAMENTOS DE FARMACOLOGIA - 54/2023AcademicaDlaUnicesum
6 visualizações3 slides
certificado excel.pdf por
certificado excel.pdfcertificado excel.pdf
certificado excel.pdfjuniorcarvalho136
5 visualizações1 slide
DevFest2023-Pragmatismo da Internet das Coisas por
DevFest2023-Pragmatismo da Internet das CoisasDevFest2023-Pragmatismo da Internet das Coisas
DevFest2023-Pragmatismo da Internet das CoisasWalter Coan
25 visualizações40 slides

Último(9)

Conheça agora o UiPath Autopilot™ para o Studio.pdf por BrunaCavalcanti29
Conheça agora o UiPath Autopilot™ para o Studio.pdfConheça agora o UiPath Autopilot™ para o Studio.pdf
Conheça agora o UiPath Autopilot™ para o Studio.pdf
BrunaCavalcanti2914 visualizações
Skills e Squads, como trabalhar? por Annelise Gripp
Skills e Squads, como trabalhar?Skills e Squads, como trabalhar?
Skills e Squads, como trabalhar?
Annelise Gripp32 visualizações
TechConnection 2023 Floripa Azure Container Apps por Walter Coan
TechConnection 2023 Floripa Azure Container AppsTechConnection 2023 Floripa Azure Container Apps
TechConnection 2023 Floripa Azure Container Apps
Walter Coan6 visualizações
MAPA - SAÚDE - FUNDAMENTOS DE FARMACOLOGIA - 54/2023 por AcademicaDlaUnicesum
MAPA - SAÚDE - FUNDAMENTOS DE FARMACOLOGIA - 54/2023MAPA - SAÚDE - FUNDAMENTOS DE FARMACOLOGIA - 54/2023
MAPA - SAÚDE - FUNDAMENTOS DE FARMACOLOGIA - 54/2023
AcademicaDlaUnicesum6 visualizações
certificado excel.pdf por juniorcarvalho136
certificado excel.pdfcertificado excel.pdf
certificado excel.pdf
juniorcarvalho1365 visualizações
DevFest2023-Pragmatismo da Internet das Coisas por Walter Coan
DevFest2023-Pragmatismo da Internet das CoisasDevFest2023-Pragmatismo da Internet das Coisas
DevFest2023-Pragmatismo da Internet das Coisas
Walter Coan25 visualizações
Shift left DevOps Experience por Walter Coan
Shift left DevOps ExperienceShift left DevOps Experience
Shift left DevOps Experience
Walter Coan5 visualizações
VIRTUS 1.6 MSI.pdf por FbioVieira85
VIRTUS 1.6 MSI.pdfVIRTUS 1.6 MSI.pdf
VIRTUS 1.6 MSI.pdf
FbioVieira855 visualizações
ProxySQL no MySQL: Apenas um load balancer? por Roberto Garcia de Bem
ProxySQL no MySQL: Apenas um load balancer?ProxySQL no MySQL: Apenas um load balancer?
ProxySQL no MySQL: Apenas um load balancer?
Roberto Garcia de Bem6 visualizações

Evento Front End SP - Arquitetura de Front

  • 1. Arquitetura de Front-end em aplicações de larga escala @shiota | eshiota.com
  • 4. Arquitetura simples Arquitetura complexa
  • 5. Na minha visão, aplicações JavaScript de larga escala são aplicações não- triviais que requerem um esforço significante de manutenção por parte do desenvolvedor, onde a maior parte do trabalho de manipulação de dados e visualização é atribuída ao navegador. Addy Osmani Developer Programs Engineer @ Google
  • 6. Aplicações com front-end de larga escala são aplicações não-triviais que requerem um esforço significante de manutenção por parte do desenvolvedor, onde organização, modularização, otimização e reutilização de código são cruciais. Eduardo Shiota Yasuda Loves cat videos on Youtube
  • 9. O CSS de um blog é geralmente simples, com algumas centenas de linhas de código, concentrado em um único arquivo. Não é tão difícil de manter.
  • 10. Mesma coisa para o JS: geralmente um arquivo e alguns plugins, e tudo sendo chamado em uma única função auto-executável.
  • 11. O tema Twenty Ten do Wordpress mostra uma estrutura básica de blog: alguns templates, um CSS. Provavelmente terá um único arquivo de JavaScript também.
  • 13. Uma Intranet utilizada por dezenas de empresas e milhares de funcionários não é uma aplicação trivial.
  • 14. Ela possui diversas seções, funções, e muitos trechos podem ser reutilizados ou apenas adaptados.
  • 15. O JavaScript de uma aplicação desse porte pode ficar com alguns milhares de linhas de código...
  • 16. ... o mesmo para o CSS. Nestes dois casos, eu apenas concatenei os diferentes módulos em um único arquivo. É impossível manter dessa forma.
  • 17. HTML, CSS e JavaScript modulares
  • 23. HTML & CSS modular
  • 25. <section> <h3>Quick links</h3> <ul class="arrowed"> <li> <a href="#">Your profile</a> </li> <li> <a href="#">MKX settings</a> </li> <li> <a href="#">MIH SWAT</a> </li> <li> <a href="#">Invite users</a> </li> </ul> </section>
  • 26. <section> <h3>Your starred content</h3> <ul class="iconed"> <li class="file-locked"> <a href="#">php|tek - 02 - PHP is cool</a><br /> <small>in group: <a href="#">PHP</a></small> </li> <li class="photo-locked"> <a href="#">php|tek entrance hall</a><br /> <small>in group: <a href="#">PHP</a></small> </li> <li class="doc"> <a href="#">Doctrine 101</a><br /> <small>in company: <a href="#">MIH SWAT</a></small> </li> <li class="forum"> <a href="#">PHP group files...</a><br /> <small>in group: <a href="#">PHP</a></small> </li> </ul> </section>
  • 27. <section> <h3>Recommended contacts</h3> <ul> <li class="card"> <div class="card-content"> <hgroup> <h4>Lorem ipsum</h4> <h5>CEO @ <a href="#">MIH SWAT</h5> </hgroup> <p><a href="#">[add as contact]</a></p> </div> <img src="image.jpg" alt="Lorem ipsum" /> </li> <li class="card"> <div class="card-content"> <hgroup> <h4>Lorem ipsum</h4> <h5>Technical Architect @ <a href="#">MIH SWAT</h5> </hgroup> <p><a href="#">[add as contact]</a></p> </div> <img src="image.jpg" alt="Lorem ipsum" /> </li> </ul> </section>
  • 28. <section> <h3></h3> <ul> <li></li> </ul> </section>
  • 30. <section> <h3>Recommended contacts</h3> <ul> <li class="card"> <div class="card-content"> <hgroup> <h4>Lorem ipsum</h4> <h5>CEO @ <a href="#">MIH SWAT</h5> </hgroup> <p><a href="#">[add as contact]</a></p> </div> <img src="image.jpg" alt="Lorem ipsum" /> </li> </ul> </section>
  • 31. <article class="card group-activity"> <div class="card-content"> <p> <a href="#" class="actor">Rafael Dohms</a> joined a group: <a href="#" class="subject">PHP South Africa</a> </p> <p> <date>2 hours ago</date> <a href="#">Unlike</a> <a href="#">Comment entry</a> </p> </div> <img src="image.jpg" alt="Rafael Dohms" /> </article>
  • 32. <article class="card"> <div class="card-content"> </div> <img /> </article>
  • 34. .button { border-radius: 5px; font-family: "proxima-nova", sans-serif; height: 2em; line-height: 2em; padding: 1em; color: #fff; text-shadow: 0 -1px 0 #000; } .large-button { font-size: 3em; } .confirm-button { background: #ffba00; box-shadow: 0 3px 0 #cd9600; } .send-button { /* styles for icon placement */ }
  • 35. .button .send-button .large-button .confirm-button
  • 36. .button .send-button .small-button .confirm-button
  • 40. JavaScript não é (só) jQuery
  • 41. shareForm.js shareField.js shareTypeSelector.js newsfeed.js
  • 42. submit get onsuccess data shareForm shareProxy init init shareTypeSelector shareField newsfeed trigger("share- type-changed") trigger("new-post") on("share-type-changed") on("new-post") mediator.js
  • 43. Modules ± Tests = OMGBBQw00t
  • 44. /** Loader constructor @params {Function} placement Function that determines the loader's placement @constructor **/ ns("EDEN.ui.Loader", function (placement) { if (!(this instanceof EDEN.ui.Loader)) { return new EDEN.ui.Loader(placement); } this.frame = 1; this.framesQty = 8; this.stack = []; this.animating = false; this.$loader = $("<div class='loader'><b> </b></div>"); this.$renderer = this.$loader.find("b"); this.placement = placement; this.init(); });
  • 45. /** Animation speed (in frames per second) @property fps @type Number @default 20 **/ EDEN.ui.Loader.prototype.fps = 20; /** Fading speed @property fadeSpeed @type Number @default 150 **/ EDEN.ui.Loader.prototype.fadeSpeed = 150;
  • 46. /** Inits the loader by inserting it into the DOM. If a placement argument wasn't passed to the constructor, uses a generic placement. @method init **/ EDEN.ui.Loader.prototype.init = function () { if (!this.placement) { this.placement = function ($loader) { $loader.appendTo($("body")); }; } this.placement.call(this, this.$loader); };
  • 47. /** Starts the loader by fading in and starting the animation. If there are multiple processes, stacks the requests. @method start **/ EDEN.ui.Loader.prototype.start = function () { this.stack.push((new Date()).getTime()); if (this.stack.length === 1) { this._startAnimation(); } }; /** Stops the loader by fading out and stoping the animation If there are any processes pending, pops the requests until it can actually stop. @method stop **/ EDEN.ui.Loader.prototype.stop = function () { this.stack.pop(); if (!this.stack.length) { this._stopAnimation(); } };
  • 48. /** Starts the loader animation @private **/ EDEN.ui.Loader.prototype._startAnimation = function () { this.animating = true; this._renderAnimation(); }; /** Stops the loader animation @private **/ EDEN.ui.Loader.prototype._stopAnimation = function () { this.animating = false; };
  • 49. /** Loops the animation, calling itself according to the fps @private **/ EDEN.ui.Loader.prototype._renderAnimation = function () { if (!this.animating) { return true; } this._draw(); setTimeout(this._renderAnimation.bind(this), 1000 / this.fps); }; /** Draws the animation @private **/ EDEN.ui.Loader.prototype._draw = function () { this.$renderer.removeClass().addClass("f" + this.frame); this.frame = this.frame + 1 > this.framesQty ? 1 : this.frame + 1; }; /** Returns the animation stack. @return Array @private **/ EDEN.ui.Loader.prototype._getAnimationStack = function () { return this.stack; };
  • 51. it("appends the loader to body as a default", function () { var loader = new Loader(); expect($("body").find(".loader").length).toEqual(1); }); it("appends the loader through an argument function", function () { var loader = new Loader(function ($loader) { $("#loader-placeholder").append($loader); }); expect($("#loader-placeholder").find(".loader").length).toEqual(1); }); it("stops the animation if stack is empty", function () { loader.start(); loader.stop(); expect($(".loader").data("spinning")).not.toBeTruthy(); });
  • 57. //my/shirt.js now has some dependencies, a cart and inventory //module in the same directory as shirt.js define(["./cart", "./inventory"], function(cart, inventory) { //return an object to define the "my/shirt" module. return { color: "blue", size: "large", addToCart: function() { inventory.decrement(this); cart.add(this); } }; } );
  • 67. $icon-sprite: sprite-map("icon/*.png", $spacing: 16px, $repeat: no-repeat, $layout: vertical);
  • 68. $icon-sprite: sprite-map("icon/*.png", $spacing: 16px, $repeat: no-repeat, $layout: vertical);
  • 69. background: sprite($icon-sprite, arrow_dropdown) no-repeat; background: url(/assets/icon-s5dab8c2901.png) -40px -158px no-repeat;
  • 70. background: #f5f3eb inline-image("bg_dots.png") repeat; background: #f5f3fb url('data:image/ png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAQCAMAAAAcVM5PAAAAGXRF WHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAlQTFRF5+TW/////// /4qZUpQAAAAN0Uk5T// 8A18oNQQAAACBJREFUeNpiYGBgAgMGBkYog4mJXAbILAiDkVxzAAIMAEMOAPMId 2OWAAAAAElFTkSuQmCC') repeat;
  • 72. Estude Modularize Organize Comente Otimize $$ Profit $$