際際滷

際際滷Share a Scribd company logo
Optimiza tu frontend
workflow con Twig,
Bower y Gulp
Manel L坦pez Torrent
Ingeniero en inform叩tica
Web Developer
@mloptor
malotor@gmail.com
Jon叩s Talavera
Ingeniero t. en inform叩tica
Web Developer
@jonas_tg
jonastg@gmail.com
Motor
de plantillas
Gestor de
paquetes
Task
Runner
Frontend
+
FrontEnd
Optimizado !!!!
多C坦mo cre叩bamos nuestros sitios html?
<?php include("header.php"); ?>
<p>Hello world! This is HTML5
Boilerplate.</p>
<?php include("footer.php"); ?>
<!doctype html>
<html class="no-js" lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title></title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="apple-touch-icon" href="apple-touch-icon.png">
<!-- Place favicon1.ico in the root directory -->
<link rel="stylesheet" href="css/normalize.css">
<link rel="stylesheet" href="css/main.css">
<script src=/slideshow/workflow-twig-bower-y-gulp-52334437/52334437/"js/vendor/modernizr-2.8.3.min.js"></script>
</head>
<body>
<footer>
<p>Footer</p>
</fotter>
</body>
</html>
index.php
header.php
footer.php
<?php include("header.php"); ?>
<p>This is a contact page.</p>
<?php include("footer.php"); ?>
contact.php
Workflow twig, bower y gulp
Twig
 Control de flujo
 Escapado autom叩tico
 Herencia de plantillas
 Filtros
 i18n support (gettext)
 Macros
 Extensiones
{% extends "base.html" %}
{% block navigation %}
<ul id="navigation">
{% for item in navigation %}
<li>
<a href="{{ item.href }}">
{% if 2 == item.level %}
&nbsp;&nbsp;
{% endif %}
{{ item.caption|upper }}
</a>
</li>
{% endfor %}
</ul>
{% endblock navigation %}
Twig features
Workflow twig, bower y gulp
Workflow twig, bower y gulp
Workflow twig, bower y gulp
Twig templates HTML Static site
?
SCULPINSCULPIN
http://sculpin.io
Twig templates
Markdown files
HTML Static site
HTML files
$ cd project_folder/
$ curl -O
https://download.sculpin.io/sculpin.phar
$ chmod +x sculpin.phar
$ sudo mv sculpin.php /usr/bin/sculpin
$ sculpin install
Instalar Sculping
app/
 config
 sculpin_kernel.yml
 sculpin_site.yml
# The contents of this file are
parsed and made available as
# via `site.*`. So for example, {{
site.title }} can be used
# in a template to get the contents
of the `title` key.
title: PHPValencia Demo
subtitle: Gulp, Bower and Twig
/app/config/sculpin_site.yml
Variables
Globales
source/
 _layouts
  default.html
 about.md
 css
  styles.css
 img
  slideshow
  image1.jpg
  image2.jpg
  image3.jpg
  image4.jpg
 index.html
 js
 javascript.js
source/
 _layouts
  default.html
 about.md
 css
  styles.css
 img
  slideshow
  image1.jpg
  image2.jpg
  image3.jpg
  image4.jpg
 index.html
 js
 javascript.js
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>{% block title %}{{ page.title }}{% endblock %}</title>
{% block stylesheets %}{% endblock %}
<script src=/slideshow/workflow-twig-bower-y-gulp-52334437/52334437/"js/javascript.js"></script>
<link rel="stylesheet" href="css/styles.css"/>
</head>
<body>
{% block content_wrapper %}{% block content %}{% endblock %}{% endblock %}
{% block javascripts %}{% endblock %}
</body>
</html>
/source/_layouts/default.html
source/
 _layouts
  default.html
 about.md
 css
  styles.css
 img
  slideshow
  image1.jpg
  image2.jpg
  image3.jpg
  image4.jpg
 index.html
 js
 javascript.js
source/
 _layouts
  default.html
 about.md
 css
  styles.css
 img
  slideshow
  image1.jpg
  image2.jpg
  image3.jpg
  image4.jpg
 index.html
 js
 javascript.js
---
layout: default
title: Home
---
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-
toggle="collapse" data-target="#navbar" aria-expanded="false" aria-
controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Project name</a>
</div>
/index.html
---
layout: default
title: Home
---
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-
toggle="collapse" data-target="#navbar" aria-expanded="false" aria-
controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Project name</a>
</div>
/index.html Block
Content
---
layout: default
title: Markdown
---
An h1 header
============
Paragraphs are separated by a blank line.
2nd paragraph. *Italic*, **bold**, and `monospace`. Itemized lists
look like:
* this one
* that one
* the other one
Note that --- not considering the asterisk --- the actual text
content starts at 4-columns in.
/about.md
output_dev/
 about
  index.html
 components
  bootstrap
  highlightjs
  jquery
  require-built.js
  require.config.js
  require.css
  require.js
 css
  styles.css
 img
  slideshow
 index.html
 js
 javascript.js
$ sculpin generate --watch --server
http://localhost:8000
Bower
Gestor de paquetes
para la Web
 > 34700 paquetes disponibles (junio 2015).
 Necesita nodejs & npm y git.
 Versionado sem叩ntico (Semver).
Semantic versioning
 Formato: MAJOR.MINOR.PATCH:
 MAJOR: cambios que hacen incompatible la API actual.
 MINOR: nueva funcionalidad que mantiene la
compatibilidad hacia atr叩s.
 PATCH: cambios menores, correcci坦n de bugs.
 Se permiten etiquetas como extensiones del formato
MAJOR.MINOR.PATH. Ej.: 1.0.0-alpha, 2.3.0-beta
 Operadores:
 <, >, <=, >=, =: operadores de comparaci坦n.
 <2.0.0
 >=1.8.0
 hyphen-range: define un conjunto de valores posibles
 0.8.0 - 2.0.0 ~= 0.8.0 >= v <= 2.0.0
 X-range: x, * para modificar uno de los valores de x.y.z
 * ~= v >= 0.0.0
 1.5.x = 1.5.* ~= 1.5.0 <= v < 1.6.0
 Operadores:
 ~ (tilde): permite cambios en el valor menor de x.y.z
especificado.
 ~1.2.3 ~= 1.2.3 <= v < 1.3 (igual a 1.2.x)
 ~1 ~= 1.0.0 <= v < 2.0.0 (igual a 1.x.x)
 ^ (caret): permite cambios en el primer valor de versi坦n
desde la izquierda distinto de cero
 ^1.2.3 ~= 1.2.3 <= v < 2.0.0
 ^0.2.3 ~= 0.2.3 <= v < 0.3.0
 ^0.0.3 ~= 0.0.3 <= v < 0.0.4
 Bower API:
 $ bower init: crea un fichero bower.json de forma
interactiva.
 $ bower install [--save] <name#version>: instala un
nuevo paquete.
 $ bower list: lista los paquetes instalados y posibles
actualizaciones.
 $ bower update [<name>]: actualiza paquetes
instalados o uno espec鱈fico.
 $ bower info <name>: muestra info sobre un paquete.
 bower.json:
Gulp
Automatiza tareas
comunes
 Basado en streams & pipes.
 Funcionalidad mediante plugins.
 Maximiza la ejecuci坦n de tareas
en paralelo.
Gulp vs Grunt
 C坦digo vs configuraci坦n.
 Plugins vs tareas predefinidas.
 Streams vs ficheros temporales.
 ~ 1500 plugins vs ~ 4400 plugins
 Gulp API:
 gulp.src(globs[, options]): devuelve un stream de
lectura que se puede dirigir a un plugin.
 Gulp API:
 gulp.dest(path[, options]): escribe un flujo de datos en
disco.
 Gulp API:
 gulp.task(name[, deps], fn): define una tarea.
 Gulp API:
 gulp.watch(glob[, options], tasks): observa un
conjunto de ficheros y se ejecutan tareas cuando
cambian.
Workflow twig, bower y gulp
Demo
Gracias por
asistir!!!
Esperamos
que os haya
gustado :D

More Related Content

Workflow twig, bower y gulp

  • 1. Optimiza tu frontend workflow con Twig, Bower y Gulp
  • 2. Manel L坦pez Torrent Ingeniero en inform叩tica Web Developer @mloptor malotor@gmail.com Jon叩s Talavera Ingeniero t. en inform叩tica Web Developer @jonas_tg jonastg@gmail.com
  • 7. <?php include("header.php"); ?> <p>Hello world! This is HTML5 Boilerplate.</p> <?php include("footer.php"); ?> <!doctype html> <html class="no-js" lang=""> <head> <meta charset="utf-8"> <meta http-equiv="x-ua-compatible" content="ie=edge"> <title></title> <meta name="description" content=""> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="apple-touch-icon" href="apple-touch-icon.png"> <!-- Place favicon1.ico in the root directory --> <link rel="stylesheet" href="css/normalize.css"> <link rel="stylesheet" href="css/main.css"> <script src=/slideshow/workflow-twig-bower-y-gulp-52334437/52334437/"js/vendor/modernizr-2.8.3.min.js"></script> </head> <body> <footer> <p>Footer</p> </fotter> </body> </html> index.php header.php footer.php <?php include("header.php"); ?> <p>This is a contact page.</p> <?php include("footer.php"); ?> contact.php
  • 10. Control de flujo Escapado autom叩tico Herencia de plantillas Filtros i18n support (gettext) Macros Extensiones {% extends "base.html" %} {% block navigation %} <ul id="navigation"> {% for item in navigation %} <li> <a href="{{ item.href }}"> {% if 2 == item.level %} &nbsp;&nbsp; {% endif %} {{ item.caption|upper }} </a> </li> {% endfor %} </ul> {% endblock navigation %} Twig features
  • 14. Twig templates HTML Static site ?
  • 16. Twig templates Markdown files HTML Static site HTML files
  • 17. $ cd project_folder/ $ curl -O https://download.sculpin.io/sculpin.phar $ chmod +x sculpin.phar $ sudo mv sculpin.php /usr/bin/sculpin $ sculpin install Instalar Sculping
  • 18. app/ config sculpin_kernel.yml sculpin_site.yml # The contents of this file are parsed and made available as # via `site.*`. So for example, {{ site.title }} can be used # in a template to get the contents of the `title` key. title: PHPValencia Demo subtitle: Gulp, Bower and Twig /app/config/sculpin_site.yml Variables Globales
  • 19. source/ _layouts default.html about.md css styles.css img slideshow image1.jpg image2.jpg image3.jpg image4.jpg index.html js javascript.js
  • 20. source/ _layouts default.html about.md css styles.css img slideshow image1.jpg image2.jpg image3.jpg image4.jpg index.html js javascript.js
  • 21. <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>{% block title %}{{ page.title }}{% endblock %}</title> {% block stylesheets %}{% endblock %} <script src=/slideshow/workflow-twig-bower-y-gulp-52334437/52334437/"js/javascript.js"></script> <link rel="stylesheet" href="css/styles.css"/> </head> <body> {% block content_wrapper %}{% block content %}{% endblock %}{% endblock %} {% block javascripts %}{% endblock %} </body> </html> /source/_layouts/default.html
  • 22. source/ _layouts default.html about.md css styles.css img slideshow image1.jpg image2.jpg image3.jpg image4.jpg index.html js javascript.js
  • 23. source/ _layouts default.html about.md css styles.css img slideshow image1.jpg image2.jpg image3.jpg image4.jpg index.html js javascript.js
  • 24. --- layout: default title: Home --- <nav class="navbar navbar-inverse navbar-fixed-top"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data- toggle="collapse" data-target="#navbar" aria-expanded="false" aria- controls="navbar"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="#">Project name</a> </div> /index.html
  • 25. --- layout: default title: Home --- <nav class="navbar navbar-inverse navbar-fixed-top"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data- toggle="collapse" data-target="#navbar" aria-expanded="false" aria- controls="navbar"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="#">Project name</a> </div> /index.html Block Content
  • 26. --- layout: default title: Markdown --- An h1 header ============ Paragraphs are separated by a blank line. 2nd paragraph. *Italic*, **bold**, and `monospace`. Itemized lists look like: * this one * that one * the other one Note that --- not considering the asterisk --- the actual text content starts at 4-columns in. /about.md
  • 27. output_dev/ about index.html components bootstrap highlightjs jquery require-built.js require.config.js require.css require.js css styles.css img slideshow index.html js javascript.js $ sculpin generate --watch --server http://localhost:8000
  • 28. Bower Gestor de paquetes para la Web > 34700 paquetes disponibles (junio 2015). Necesita nodejs & npm y git. Versionado sem叩ntico (Semver).
  • 29. Semantic versioning Formato: MAJOR.MINOR.PATCH: MAJOR: cambios que hacen incompatible la API actual. MINOR: nueva funcionalidad que mantiene la compatibilidad hacia atr叩s. PATCH: cambios menores, correcci坦n de bugs. Se permiten etiquetas como extensiones del formato MAJOR.MINOR.PATH. Ej.: 1.0.0-alpha, 2.3.0-beta
  • 30. Operadores: <, >, <=, >=, =: operadores de comparaci坦n. <2.0.0 >=1.8.0 hyphen-range: define un conjunto de valores posibles 0.8.0 - 2.0.0 ~= 0.8.0 >= v <= 2.0.0 X-range: x, * para modificar uno de los valores de x.y.z * ~= v >= 0.0.0 1.5.x = 1.5.* ~= 1.5.0 <= v < 1.6.0
  • 31. Operadores: ~ (tilde): permite cambios en el valor menor de x.y.z especificado. ~1.2.3 ~= 1.2.3 <= v < 1.3 (igual a 1.2.x) ~1 ~= 1.0.0 <= v < 2.0.0 (igual a 1.x.x) ^ (caret): permite cambios en el primer valor de versi坦n desde la izquierda distinto de cero ^1.2.3 ~= 1.2.3 <= v < 2.0.0 ^0.2.3 ~= 0.2.3 <= v < 0.3.0 ^0.0.3 ~= 0.0.3 <= v < 0.0.4
  • 32. Bower API: $ bower init: crea un fichero bower.json de forma interactiva. $ bower install [--save] <name#version>: instala un nuevo paquete. $ bower list: lista los paquetes instalados y posibles actualizaciones. $ bower update [<name>]: actualiza paquetes instalados o uno espec鱈fico. $ bower info <name>: muestra info sobre un paquete.
  • 34. Gulp Automatiza tareas comunes Basado en streams & pipes. Funcionalidad mediante plugins. Maximiza la ejecuci坦n de tareas en paralelo.
  • 35. Gulp vs Grunt C坦digo vs configuraci坦n. Plugins vs tareas predefinidas. Streams vs ficheros temporales. ~ 1500 plugins vs ~ 4400 plugins
  • 36. Gulp API: gulp.src(globs[, options]): devuelve un stream de lectura que se puede dirigir a un plugin.
  • 37. Gulp API: gulp.dest(path[, options]): escribe un flujo de datos en disco.
  • 38. Gulp API: gulp.task(name[, deps], fn): define una tarea.
  • 39. Gulp API: gulp.watch(glob[, options], tasks): observa un conjunto de ficheros y se ejecutan tareas cuando cambian.
  • 41. Demo

Editor's Notes

  • #4: En esta sesi坦n vamos a hablar de estas 3 herramientas que har叩n que nuestro trabajo diar鱈o con el frontend sea mucho m叩s productivo. Esta son Twig , Bower y Gulp). Yo os voy a hablar de la parte de Twig y Jon叩s se encargar叩 de Bower y Gulp.
  • #7: 多C坦mo cre叩bamos hace 15 a単os los sitios web?
  • #8: Basicamente los que controlaban un poco de PHP se montaban sus plantillas de forma manual para poder reutilizar un poco de c坦digo.
  • #9: Despues apareci坦n Smarty, un motor de plantillas que nos facilitaba bastante la creaci坦n de estos sitios.
  • #10: En el 2012 aparece Twig a escena.
  • #11: Creado por Creado por Armin Ronacher Fabien Potencier twig nos ofrece muchas nuevas posibilidades como: Control del flujo entro de las pantillas Escapado autom叩tica Herencia de plantillas Filtros i18n sortes Macros Podemos crear nuestras propias extensiones
  • #12: Como todos sab辿is Twig se introduce como motor de plantillas por defecto en Drupal 8 y Symfony.
  • #13: Pero, twig tambien lo podemos usar de forma standalone para crear otro tipo de aplicaciones que no parten de un framework o que no necesitan uno de estos frameworks de base. Estas aplicaciones son aplicaciones js de Apache Cordova, OnePage Application hechas con AngularJS o React o incluso p叩ginas simples hechas en HTML5, JS y CSS3.
  • #15: 多C坦mo podemos crear unos html est叩ticos a partir de las plantillas de twig?
  • #16: Hay varias herramientas en internet que nos facilitan el trabajo. Entre las que vi la que m叩s me gust坦 fu辿 Sculping.
  • #17: Sculpin es un generador de html est叩ticos a partir de plantillas de twig, archivos html y archivos markdown.
  • #18: Lo primero que tenemos que hacer es instalarlo en nuestro proyecto. Para ello descargamos el phar y de damos permisos de ejecuci坦n. Lo podemos instalar de forma global en el sistema.
  • #20: Lo siguiente es crear nuestro directorio con los fuentes.
  • #21: Lo primero que vemos es tener los layouts de twig dentro de la carpeta _layouts. Aquellas carpetas que tengan el gui坦n bajo delante sculpin no las procesar叩.
  • #23: Lo segundo ser叩 tener los archivos de imagenes , javascript y css de nuestro proyecto. Este tipo de archivos tampoc se procesan por parte de sculpin.
  • #24: Y por 炭ltimo los archivos html y markdown son los que va a procesar sculpin.
  • #25: Estoy archivos tiene unos textos de cabecera donde indicaremos el layout que se debemos usar podemos pasar diferentes variables al template. Despues de esta cabecera vendr叩 el bloque content.
  • #27: Como podemos ver podemos definir archivos en formato markdown
  • #28: Una vez hemos creado esta estructura b叩sica
  • #29: Bower es un gestor de paquetes para la Web. Entre los paquetes disponibles podemos encontrar frameworks (Angular, Bootstrap, React, ...), librer鱈as (jQuery, lodash, underscore, ), utilidades (Modernizr, ) y assets (font-awesome, ). Estad鱈sticas: http://bower.io/stats/ Bower vs npm: web/nodejs, flat dependencies/nested dependencies. Se instala con npm install -g bower
  • #30: Semver http://semver.org/
  • #33: Bower API http://bower.io/docs/api/
  • #35: http://gulpjs.com/
  • #36: http://gulpjs.com/plugins/ http://gruntjs.com/plugins