Escolar Documentos
Profissional Documentos
Cultura Documentos
Front-end
O front-end a marcao, aparncia, acessibilidade, usabilidade e performance da sua aplicao em mltiplos browsers, plataformas e dispositivos.
Front-end
Marcao e aparncia
Escrever os tais HTML e CSS.
Front-end
Acessibilidade e usabilidade
Contedo disponvel e de fcil entendimento indiferente das condies do usurio.
Front-end
Performance
Fazer tudo isto como um ninja e garantir qualidade na navegao e rapidez no carregamento. http://browserdiet.com
Front-end
Mltiplos meios
Innidade de browsers, plataformas e dispositivos considerando seus diferentes usos. http://jcemer.com/hipermidia-as-avessas.html
Quem so vocs?
Rubistas
Desenvolvedor Rails que caiu naquele projeto furada e agora precisa fazer HTML e CSS, urgh! http://developer.mozilla.org http://learnlayout.com http://diveintohtml5.info http://bonsaiden.github.io/JavaScript-Garden
Confeiteiros
via @vitor42
Desenvolvedor front-end que pegou aquele job descolado e no sabe o que o Ruby tem de Rails. http://mislav.uniqpath.com/poignant-guide http://guides.rubyonrails.org http://akitaonrails.com/FrontEnd
http://jcemer.com
http://codeminer42.com
Views e partials
Template Engines
Atravs de dados e templates, so usados para produzir um resultado formatado. Em nosso caso, geralmente HTML.
Template Engines
Erb
<section class="container"> <h1><%= post.title %></h1> <h2><%= post.subtitle %></h2> <div class="content"> <%= post.content %> </div> </section>
Template Engines
Erb
Use .erb se voc no quer aprender uma nova sintaxe ou adicionar gems de outros engines ao seu projeto.
Template Engines
Haml
%section.container %h1= post.title %h2= post.subtitle .content = post.content
Template Engines
Haml
Nunca mais esquea de fechar uma tag. Partials tornam-se auto-contidas, toda tag abre e fecha no mesmo arquivo.
Template Engines
Slim
section.container h1 = post.title h2 = post.subtitle .content = post.content
Template Engines
Slim
Baseado no Haml e ainda com output padro j sem espaos entre as tags o que facilita algumas tcnicas. Slim at mais performtico que Erb.
Views
Views devem conter HTML. No coloque CSS ou JavaScript nas views.
Helpers
Use com moderao. Prera partials quando tiver lgica associada e decorator quando informao for relacionada a um modelo.
Partials
Livre-se de cdigo de marcao repetido nas suas views.
Partials: herana
Use e abuse da herana de views. render "sidebar"
[controller]/_sidebar.slim application/_sidebar.slim
Partials: herana
class Campaign::FaqController < Campaign::BaseController
Partials: layouts
A herana funciona no layout tambm, no s na action da view. <body> <%= yield %> <%= render "footer" %> </body>
[controller]/_footer.slim application/_footer.slim
player/_youtube.slim player/_vimeo.slim
Decorators
class DisciplineDecorator < Draper::Decorator delegate_all def css_classname "discipline-#{object.plain_name}" end end
UJS
[data-conrm]: conrmao da ao [data-method]: denio do mtodo [data-remote]: envio assncrono
UJS: index.html
<a href="/photo/42" data-confirm="Are you sure?" data-method="delete" data-remote="true" rel="nofollow">Destroy</a>
UJS: destroy.js.erb
$('#photo_<%= params[:id] %>') .remove()
UJS: create.js.erb
<%- if @contact.errors.any? %> $('#contact-modal').html('<%= escape_jav <%- else %> $('#contact-modal').html('<%= escape_jav $('#contact-modal').append('<p class="al </p>'); setTimeout("$('.close').click();", 2000) <%- end %>
UJS
Evite usar UJS se sua aplicao for de mdio porte, prera organizar o comportamento nos assets da sua aplicao.
Asset pipeline
Separao
Organize os arquivos com base nos componentes do seu projeto e entregue um nico arquivo de JavaScript e CSS para cada grande seo da sua aplicao.
Pipeline
Compila arquivos em ordem conforme suas extenses.
le.css.scss.erb
Pipeline
Cache
Um ngerprint includo nos arquivos buscando uma estratgia de cache de front-end ideal.
application-908e25f486 8d8683022a5b62f54.css
Pipeline
Informaes
Os templates .erb e gems de prprocessadores de CSS possuem acesso ao asset path e demais informaes da aplicao.
CSS
Pr-processador de CSS
No tem porque usar outro pr-processador e muito menos no usar SASS.
Pr-processador de CSS
Settings
$button-font: $sinalization-font; $title-font: $sinalization-font; $navigation-font: $sinalization-font;
$main-font: "Ruda", sans-serif; $dialog-font: "Chau Philomene One", sans-s $sinalization-font: "Raleway", sans-serif;
Pr-processador de CSS
Helpers: Placeholders
%arrow-top { &:before { @extend %vertical-arrow; top: -13px; border-bottom: 6px white solid; } }
Pr-processador de CSS
Helpers: Mixins
@mixin arrow-top-color($color) { &:before { border-bottom-color: $color; } }
Pr-processador de CSS
Helpers
Mixins imprimem no CSS todo seu contedo a cada @include. Placeholders no replicam o cdigo, mas no aceitam argumentos.
http://sass-lang.com/documentation/ le.SASS_REFERENCE.html#placeholder_selectors_
Pr-processador de CSS
Bibliotecas
Compass e Bourbon vm com uma toneladas de mixins e outras facilidades.
JavaScript
Organizao de JavaScript
Arquivos depois de concatenados possuem o mesmo escopo.
Organizao de JavaScript
Problema 1
Diferentes arquivos vo compartilhar das mesmas variveis.
Organizao de JavaScript
Organizao de JavaScript
CoffeeScript
class Mediabox constructor: (@data) ->
Organizao de JavaScript
CoffeeScript: transpilado
Cada arquivo vai ser compilado e ganhar uma IIFE automaticamente.
Organizao de JavaScript
CoffeeScript: transpilado
(function() { var Mediabox; Mediabox = (function() { function Mediabox(data) { this.data = data; } return Mediabox; })(); }).call(this);
Organizao de JavaScript
Problema 2
Se cada arquivo tiver um escopo, no tenho como compartilhar algo.
Organizao de JavaScript
Namespace
App.modules.name = (function () { var data = {}; return { ! data: data, ! parser: // ... } })();
Organizao de JavaScript
Require.js
define('mediabox', ['jquery', 'util/counter'], function ($, Counter) { // ... return { Mediabox: Mediabox, // ... }; } );
Organizao de JavaScript
Require.js
Mdulos podem ser carregados de forma assncrona. Em geral, pacotes e at mesmo todos os mdulos so distribudos em um nico arquivo. https://github.com/jwhitley/requirejs-rails
Componentes
Denio
Um componente nada mais que uma abstrao que encapsula elementos HTML, CSS e comportamento.
Objetivo
Separao de reponsabilidades em encapsulamentos bem organizados e reusveis.
Bibliotecas e Frameworks
Plugins e widgets jQuery, mdulo AMD, Backbone, Component.io, FlightJS Component...
Instanciando
Denir o componente no tudo, ele precisa ser iniciado.
Instanciando
Por pgina
// Setup product page if ($('body').is('.page-product')) { $("[data-draggable]").draggable() $("[data-comments]").comments() } // Setup checkout page if ($('body').is('.page-checkout')) { $("[data-draggable]").draggable() $("[data-datepicker]").datepicker() }
Instanciando
Instanciando
Solues
Angular.js e Dojo usam como referncia elementos HTML para instanciar componentes.
Instanciando
Angular.js
<div ng-app="component"> <tabs> <pane title="Date"> Date: {{ '2012-04-01' | date:'fullDa </pane> <pane title="Hello"> Hi! </pane> </tabs> </div>
Instanciando
Piecemaker
<div data-pieces="colorize" data-color="#903D3D"> Colorize </div> https://github.com/jcemer/piecemaker
Instanciando
Piecemaker
var pieces = { colorize: function (container) { ! var color = container.dataset.color container.style.background = color } }
Instanciando
Piecemaker
var piecemaker = new Piecemaker({ namespace: pieces }) piecemaker.setup()
Instanciando
Piecemaker
1. Atributo data-pieces no element; 2. Construtor instanciado com o container; 3. Setup do piecemaker indicando namespace ou mdulos AMD. http://jcemer.com/atribuindocomportamento-a-componentes.html
Futuro
Web Components: Custom Elements, Shadow DOM e Templates. https://speakerdeck.com/zenorocha/umfuturo-chamado-web-components
Turbolinks
Objetivo
Dimunir at pela metade o tempo de carregamento da sua pgina. http://github.com/rails/turbolinks
Soluo
A cada clique em um link, apenas o contedo do <body> substitudo. Seu contedo pego por uma requisio XHR.
Assets
Coloque JavaScript e CSS no <head> e indique quais devem ser monitorados.
Assets: reload
Caso algum dos assets mude, a pgina totalmente recarregada.
Histrico de navegao
A URL atual alterada e as pginas visitadas so armazenadas. Voltar pgina anterior imediato.
Suporte a jQuery
Alm de $.ready(fn), voc deve esperar agora por $(document).on('page:load', fn)
Suporte a jQuery
Pginas trazidas do cache disparam $(document).on('page:restore', fn). https://github.com/kossnocorp/ jquery.turbolinks
Outros suportes
Facebook, Twitter, Google+, Google Analytics e AdSense... http://reed.github.io/turbolinkscompatibility
JavaScript
Os comportamentos das pginas j visitas continuam ativos.
Wiselinks
Vantagens
Funciona em browsers antigos, envia formulrios e processa cabealhos de resposta.
Pseudo Desvantagem
Depende de jQuery e elementos precisam de atributo indicando o uso. https://github.com/igor-alexandrov/ wiselinks/issues/48
Um ltimo assunto
Gerenciamento de dependncias
Problema
Gem no o empacotamento mais adequado para cdigo front-end.
Bower
Um gerenciador de dependncias que funciona apoiado no Node.js. http://simplesideias.com.br/gerenciandodependencias-client-side-com-bower
Versionamento
Versionar as dependncias no repositrio depois de baixadas no me deixa a vontade.
Half Pipe
Soluo
Substitui o asset pipeline por um workow baseado em Grunt.js e Bower. https://github.com/d-i/half-pipe
Grunt.js
Gerenciador de tarefas front-end escrito em JavaScript.
Fique atento
Gerenciamento de dependncias de front-end uma cincia em desenvolvimento.
No tenha dvida
As melhores ferramentas para front-end atualmente rodam em Node.js.
Obrigado
@jcemer