Criando componentes
interativos em páginas AMP
com <amp-bind>
Accelerated Mobile Pages
Possibilita criar páginas que
sejam atraentes, fáceis e
carregadas quase que
instantaneamente para os
usuários.
AMP HTML
É basicamente HTML estendido com propriedades AMP personalizadas
AMP JS
Biblioteca JS que implementa todas as melhores práticas de desempenho
da AMP, gerencia o carregamento de recursos e fornece as tags
personalizada
AMP CACHE
O Google AMP Cache é uma rede de entrega de conteúdo baseada em proxy
para entregar todos os documentos válidos de AMP.
NÃO É PERMITIDO
JSCUSTOMIZADO
➔ <amp-iframe>
➔ Pull request no Github
➔ <amp-bind>
Como criar interações
complexas em páginas
AMP?
<amp-bind>
O <amp-bind> possui três
componentes principais:
➔ State
➔ Expressions
➔ Binding
State
➔ É um objeto JSON mutável
no escopo do documento.
➔ É possível especificar uma
URL CORS.
State
<amp-state id="myState">
<script type="application/json">
{ myText: "Hello AMP" }
</script>
</amp-state>
O estado do <amp-bind>
pode ser inicializado
através do componente
<amp-state>
State
<amp-state id="myState">
<script type="application/json">
{ myText: "Hello AMP" }
</script>
</amp-state>
<span [text]="myState.myText">
Hello World
</span>
Para melhor desempenho e
evitar saltos de conteúdo na
página, o amp-bind não
avalia expressões no
carregamento da página.
AMP.setState
AMP.setState mescla um
objeto no estado do
<amp-bind>.
<amp-state id="myState">
<script type="application/json">
{ "myText": "Hello AMP" }
</script>
</amp-state>
<span [text]="myState.myText">Hello World</span>
<button on="tap:AMP.setState({
myState: { myText: 'Hello Binding' }
})">SetState</button>
AMP.pushState
AMP.pushState é
semelhante a AMP.setState,
exceto que também altera o
histórico do navegador.
<amp-state id="myState">
<script type="application/json">
{ "myText": "Hello world AMP" }
</script>
</amp-state>
<!-- change browser history -->
<button on="tap:AMP.pushState({
myState: { myText: 'Browser History' }
})">SetState</button>
Expressions
Expressions
São expressões semelhantes às
do JavaScript, mas com
algumas diferenças
importantes.
Expressions
➔ Não têm acesso as globais como
document e window
➔ Variáveis undefined e array-index-out-of-
bounds retornam NULL em vez de
undefined ou throw error
// Returns [1, 2, 3]
[3, 2, 1].sort()
// Returns 6.
[1, 2, 3].reduce((x, y) => x + y)
// Object to Array
keys(event.speakers).map(x => event.speakers[x])
String
charAt charCodeAt concat
indexOf lastIndexOf slice
split substr substring
toLowerCase toUpperCase
Number
toExponential toFixed
toPrecision toString
Objects
keys value
Array
concat filter includes
indexOf join lastIndexOf
map reduce slice some sort
splice
Math
abs ceil floor max min
random round
Global
encodeURIComponent
<amp-list id="speakers"
[src]="keys(speakers).map(x => speakers[x])")>
<template type="amp-mustache">
<strong>{{name}}</strong>
<span>{{jobTitle}}</span>
</template>
</amp-list>
Expressões podem ser
reutilizadas definindo um
amp-bind-macro.
<amp-bind-macro id="circle"
arguments="r"
expression="3.14 * r * r" />
Reutilizando Expressions
<amp-bind-macro id="SpeakersBind" arguments="speakers"
expression="keys(speakers).map(x => speakers[x])" />
<amp-list id="speakers" [src]="SpeakersBind(event.speakers)")>
<template type="amp-mustache">
<strong>{{name}}</strong>
<span>{{jobTitle}}</span>
</template>
</amp-list>
Binding
Binding
São atributos [property] que
vinculam a propriedade de
um elemento a uma
expressão.
<input type="checkbox"
[checked]="selecteds._1177"
[disabled]="checkeds == 4">
https://goo.gl/wcxCR
6
<input type="checkbox" [checked]="cards && cards._1177"
[disabled]="checkeds == 4 && !current._1177"
on="change:AMP.setState({
cards: {
_1177: event.checked,
},
checkeds: (event.checked ? checkeds+1 : checkeds-1),
})">
<span [text]="cards._1177 ? 'Remover' : 'Comparar'") Comparar </span>
<button on="tap:AMP.setState({ checkeds: 0, cards: null })") Remover tudo </button>
Debbuging
Adicione esse fragmento de código
na URL para destacar avisos e erros
durante o desenvolvimento.
#development=1
AMP.printState()
https://goo.gl/wy2FJ
T
Murilo Siqueira Ferreira
FrontEnd @ Foregon
@muhroots

Criando componentes interativos em páginas AMP com amp-bind

Notas do Editor

  • #8 “AMP Conf 2017” AMP Bind é basicamente React + Angular - 90% da complexidade
  • #9 Async, sandbox
  • #10 Async, sandbox
  • #19 Async, sandbox
  • #23 Uma macro não pode ser chamada recursivamente.
  • #24 Utilizando amp-bind-macro para converter uma lista de objetos em um array de objetos e integrando com amp-list
  • #26 Quando o estado muda, as expressões são reavaliadas e as propriedades dos elementos ligados são atualizadas com os novos resultados da expressão.
  • #31 https://github.com/ampproject/amphtml/blob/master/contributing/building-an-amp-extension.md#a-word-on-contributing
  • #32 https://www.ampstart.com/