SlideShare una empresa de Scribd logo
1 de 58
Descargar para leer sin conexión
FRONT-END TOOLING
David Avellaneda
AGENDA
➤ about:me
➤ intro
➤ package management
➤ workflow & tasks automation
➤ bundling systems
➤ scaffolding
DAVID AVELLANEDA
➤ ing. sistemas
➤ co-fundador Monoku
➤ co-organizador BogotáJS
➤ co-organizador JSConf.co
➤ co-organizador char.la
➤ @davsket
INTRO
too many options
Muchas herramientas
que usamos hoy en día
no existían hace 

5 años...
Ya que es gracias al nacimiento
de NodeJS en el 2009 (y NPM en
el 2010), que surgen nuevas
herramientas para facilitar
nuestro trabajo día a día.
PACKAGE MANAGEMENT
manejo de dependencias
ANTES
A. Necesitas una librería
B. Buscas la librería (Google)
C. Buscas donde descargarla
librería en la página
D. La descargas
E. La agregabas a tu proyecto
F. la importabas en tu HTML
G. Si necesitas otra repites el
paso A.
ANTES (PRINCIPALES PROBLEMAS)
A. Gastas mucho tiempo buscando el
script
B. Al descargarlo debes ordenar tus
librerías manualmente
C. Si clonaste un proyecto hay dos
opciones:
1. Las librerías están incluidas en
el repositorio (ok, no tienes
que repetir el proceso, pero el
repositorio pesa mucho más
de lo que debería)
2. No están incluidas las
librerías, pero hay
documentación de dónde
descargar cada una.
HOY
A. Necesitabas una librería
B. La buscabas en el gestor de
paquetes
C. La instalas con un comando
D. la importabas en tu HTML o
JS
E. Si necesitas otra repites el
paso A.
HOY (VENTAJAS)
A. Puedes buscar la librería
desde la terminal
B. Sólo buscas en un mismo
lugar
C. Se mantiene un registro de las
librerías requeridas para el
proyecto
D. Ya las librerías pueden estar
excluidas del repositorio
E. Todo se reinstala con un solo
comando
OPCIONES DE PACKAGE MANAGEMENT
NPM (NODE PACKAGE MANAGER)
➤ Es el primer gestor de
paquetes para JavaScript
➤ Es el gestor de paquetes por
defecto para en entorno de JS
en Node.js
➤ Tiene en la página el listado de
todos los repositorios
➤ Usa un archivo llamado
package.json
➤ Se usa tanto para instalar
dependencias como para
publicar módulos a NPM
$ npm init
$ npm install lodash --save
$ npm uninstall lodash --save
$ # new clone
$ npm install
BOWER
➤ Creado y mantenido por
Twitter
➤ Usa Github como fuente de
librerías
➤ Usa un archivo que se llama
bower.json (y opcionalmente
un .bowerrc)
➤ Se usa tanto para instalar
dependencias como para
exponer repositorios a Bower
➤ Está más centrado en módulos
para Front-end
$ npm install -g bower
$ bower init
$ bower install lodash --save
$ bower uninstall lodash --save
$ # new clone
$ bower install
YARN
➤ Es la competencia más
reciente y directa de NPM
➤ Creado y mantenido por
Facebook
➤ Es más rápido y maneja mejor
el cache
➤ Es muy reciente...$ npm install -g yarn
$ yarn init
$ yarn add lodash
$ yarn remove lodash
$ # new clone
$ yarn
NPM VS BOWER
➤ NPM tiene mayor
mantenimiento
➤ Bower está comenzando a perder
mantenibilidad y generación de
nuevos features
➤ NPM es estándar de Node.js
➤ NPM es más rápido y eficiente
que Bower
➤ NPM no usa repositorios como
paquetes (son muy diferentes)
➤ NPM gestiona las versiones
recursivamente, no hay
colisiones
vs
o por lo menos usar alguno
recomendación: usar
WORKFLOW & TASKS AUTOMATION
o cómo facilitar nuestro trabajo diario
ANTES
A. Tienes tus archivos de estilos
(probablemente con algún
preprocesador como LESS, Sass o
Stylus)
B. Tienes tus archivos JS (deseablemente
tu código en más de un solo archivo)
C. Tienes que subir una nueva versión...
D. Compilas los estilos con un comando
largo y los mandas a una carpeta
E. Compilas los scripts con otro
comando
F. Minificas/Ofuscas los generados para
que sean más livianos
G. etc..
ANTES (PRINCIPALES PROBLEMAS)
A. Te toca lidiar con la terminal por
montones
B. Es difícil de mantener comandos
(varían por OS)
C. Si no usas la terminal te toca estar
subiendo a algún servicio web como
Closure (Google) etc.
D. Tienes que memorizar o
documentar tu proceso, es manual y
puede fallar con facilidad
E. Si deseas agregar un paso adicional,
te toca tenerlo en cuenta en tu
proceso de trabajo
F. Probablemente termines agregando
los compilados al repositorio
HOY
A. Instalas una herramienta
como Grunt, Gulp o Broccoli
(etc)
B. Configuras tu flujo de trabajo
C. Ejecutas un comando en la
terminal
D. Puedes crear flujos más
complejos, como
automatización de build de
Cordova, templates,
documentación, etc.
HOY (VENTAJAS)
A. Lidias con JavaScript para
configurar el flujo de trabajo
B. El módulo se encarga de
hacer esto por tí
C. Puedes replicar el proceso en
otros ambientes (CLI) (OS)
D. Puedes excluir los compilados
(distribution) del repositorio
OPCIONES DE AUTOMATIZACIÓN
GRUNT
➤ Es el primer task runner
(popular)
➤ Tiene una gran cantidad de
plugins: sass, coffee script, jshint,
less, stylus, etc.
➤ Se apoya en un archivo que se
llama Gruntfile.js
➤ Instalas con npm los plugins a
usar
➤ Los agregas a la configuración
➤ Ejecutas la tarea
➤ Puedes crear flujos de tareas con
aliases
$ npm install -g grunt-cli
$ npm install grunt --save
$ grunt <task-name>
$ npm install --save
grunt-contrib-concat
$ npm install --save
grunt-contrib-uglify
$ grunt concat
$ grunt uglify
$ grunt
/* Gulpfile.js */
module.exports = function(grunt) {
grunt.initConfig({
concat: {
'dist/app.js': ['app/js/a.js', 'app/js/b.js']
},
uglify: {
build: {
src: 'dist/app.js',
dest: 'dist/app.min.js'
}
},
});
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.registerTask('default', ['concat', 'uglify']);
}
GULP
➤ Gulp funciona bajo el concepto
de streams (unix)
➤ Usas módulos que funcionan
como tuberías
➤ Estos módulos reciben
archivos, los modifican y los
mandan como resultado
➤ Usa un archivo llamado
Gulpfile.js
➤ Ya no trabajas con un objeto
grande de configuración
➤ Al final es más fácil de
mantener
$ npm install -g gulp
$ npm install gulp --save
$ gulp <task-name>
$ npm install --save
gulp-concat
$ npm install --save
gulp-uglify
$ gulp dist
$ gulp
/* Gulpfile.js */
var gulp = require('gulp')
var concat = require('gulp-concat')
var uglify = require('gulp-uglify')
gulp.task('dist', function() {
return gulp.src('app/js/*.js')
.pipe(concat('app.js'))
.pipe(uglify())
.pipe(gulp.dest('dist/js/'))
})
gulp.task('default', ['dist'])
$ gulp watch
$ gulp
/* Gulpfile.js */
var gulp = require('gulp')
var concat = require('gulp-concat')
gulp.task('concat', function() {
return gulp.src('app/js/*.js')
.pipe(concat('app.js'))
.pipe(gulp.dest('dist/js/'))
})
gulp.task('watch', function() {
gulp.watch('app/js/*.js', ['concat'])
})
gulp.task('default', ['watch'])
BROCCOLI
➤ Funciona como todo un flujo
para la aplicación
➤ Es rápido
➤ Usa un archivo que se llama
Brocfile.js
➤ Es opinionado
➤ Cuenta con muchos plugins
también
➤ Es usado por Ember-cli
➤ No expone tareas, es todo el
flujo
$ npm install -g broccoli-cli
$ npm install broccoli --save
$ broccoli build dist
$ npm install --save
broccoli-sass
$ npm install --save
broccoli-coffee
$ npm install --save
broccoli-merge-trees
/* Brocfile.js */
var compileSass = require('broccoli-sass');
var filterCoffeeScript = require('broccoli-coffee');
var mergeTrees = require('broccoli-merge-trees');
var sassDir = 'app/scss';
var coffeeDir = 'app/coffeescript';
// Tell Broccoli how we want the assets
// to be compiled
var styles = compileSass([sassDir],
'app.scss', 'app.css');
var scripts = filterCoffeeScript(coffeeDir);
// Merge the compiled styles and scripts into
// one output directory.
module.exports = mergeTrees([styles, scripts]);
BROCCOLI VS GRUNT VS GULP
configuración media/compleja fácil fácil
personalización baja alta alta
mantenibilidad alta media alta
curva
alta (poca
documentación)
baja
media-alta (una
vez entiendes
streams)
ecosistema medio grande+ grande
tareas no sí sí
BUNDLERS
empaquetamiento de la aplicación
SIN BUNDLER
A. Tienes un conjunto de scripts,
estilos, imágenes, etc.
B. Necesitas mandar eso a
producción
C. Manualmente procesas cada
origen para mandarlo al
destino deseado
D. Haces el paso anterior para JS,
luego para CSS, luego para
Imágenes, etc.
E. Si tienes tiempo automatizas
esta tarea con Grunt, Gulp o
Broccoli
SIN BUNDLER (PROBLEMAS)
A. La actividad de agrupar
(empaquetar) estos archivos
es manual
B. Puede variar entre ambientes
y sistemas operativos
C. Debes tener cuidado con el
orden y las dependencias
CON BUNDLER
A. Usas un empaquetador como
webpack u otro
B. Instalas los plugins (sass,
ES6, coffee-script, etc)
C. Configuras qué empaquetar
D. El empaquetador hace el
trabajo por tí
CON BUNDLER (VENTAJAS)
A. Son más eficientes para el
manejo de empaquetamiento
B. Entienden del manejo de
dependencias entre diferentes
módulos
C. Pueden compilar en un solo
script TODOS los recursos si
lo deseas (css/js/img/html)
D. Si creas un nuevo módulo,
solamente lo importas como
dependencia de otro
(automágicamente)
TASK AUTOMATION VS BUNDLERS
A. Los bundlers generalmente
no te permiten definir tareas
B. No obstante controlan el flujo
de trabajo de tu proyecto
C. Task automators
naturalmente no saben cómo
manejar las dependencias
(con plugins sí)
D. Hay plugins de los bundlers
para los task automators (no
son excluyentes)
OPCIONES DE BUNDLERS
REQUIRE.JS + R.JS
➤ Usa AMD (w0t?)
$ npm install --save requirejs
$ # creas tu build.js
$ node build.js
AMD
(ASYNCHRONOUS MODULE DEFINITION)
➤ Es asíncrono
➤ Usa callbacks para invocar los
módulos cuando sus
dependencias hayan cargado
➤ Usado en web, donde los
scripts se halan por request
➤ El cb de require es ejecutado
cuando todos los scripts hayan
terminado de descargarse
/* main.js */
require(['hello'], function
(hello) {
console.log(hello)
// > hello there
})
/* hello.js */
define([], function () {
return 'hello there'
})
require([deps], cb)
define('name', [deps], cb)
REQUIRE.JS + R.JS
➤ Usa AMD (ok!)
➤ Funciona sin compilar todo en
paquetes (bundles)
➤ Usa R.js para compilar los
módulos según como lo
configures
➤ Te permite incluir en los
scripts: texto (cualquier
formato), imágenes, json, css,
entre otros)
➤ Te permite usar ES6, Less,
entre otros
$ npm install --save requirejs
$ # creas tu build.js
$ node r.js -o build.js
<script src="require.js" data-main="main.js"></script>
Full AMD
Bundling
/* build.js */
{
"appDir": "app/js/",
"mainConfigFile": "app/js/app.js",
"dir": "dist/",
"modules": [
{
"name": "app"
}
]
}
/* app.js */
requirejs.config({
baseUrl: 'lib',
paths: {
// shortcuts
}
});
$ node r.js -o build.js
BROWSERIFY
➤ Usa CommonJS (w0t??)
$ npm install -g browserify
$ browserify main.js > bundle.js
COMMONJS
➤ Por defecto disponible en
Node.js
➤ No funciona en los
navegadores
➤ Ampliamente usado en
backend
➤ No es asíncrono porque los
módulos están en disco
➤ Lo usan todos los task
automators
/* main.js */
var hello =
require('./hello.js')
console.log(hello)
// > hello there
/* hello.js */
myMod = 'hello there'
module.exports = myMod
require('modName')
module.exports = module
BROWSERIFY
➤ Usa CommonJS (ok!)
➤ Mira las dependencias de el archivo y
carga recursivamente las
dependencias en orden
➤ Al final todo queda en un solo archivo
➤ Este archivo puede ser usado en el
navegador
➤ Puedes usar módulos de NPM en el
navegador 💪
➤ Puede incluir en los bundle imágenes,
texto, json, css, etc., con plugins
➤ Puedes precopilar todo con plugins
➤ No require un archivo de config.
$ npm install -g browserify
$ browserify main.js > bundle.js
WEBPACK
➤ Soporta AMD y CommonJS (y
ES2015 modules (w0t??)
$ npm install -g web pack
$ browserify main.js > bundle.js
ES2015
➤ Nuevo estándar para
JavaScript
➤ No funciona en los
navegadores y servidores por
defecto
➤ No es asíncrono
➤ Es más sencillo
/* main.js */
import hello from './hello'
console.log(hello)
// > hello there
/* hello.js */
export default 'hello there'
import mod from 'mod'
export default myMod
WEBPACK
➤ Soporta AMD y CommonJS (y ES2015
modules (w0t??)
➤ Mira las dependencias de el archivo y
carga recursivamente las dependencias en
orden
➤ Al final todo puede quedar en un solo
archivo, o en miltiples con carga asíncrona
➤ Puedes usar módulos de NPM en el
navegador 💪
➤ Puede incluir en los bundle imágenes,
texto, json, css, etc.
➤ Cuenta con una infinidad de loaders para
preprocesar e incluir recursos.
➤ Provee un server para desarrollo (hot
loading)
➤ Puedes no usar configuración
$ npm install -g web pack
$ webpack ./app.js app.bundle.js
/* webpack.config.js */
module.exports = {
entry: './app/js/app.js',
output: {
path: './dist/js/',
filename: 'app.bundle.js'
},
module: {
loaders: [{
test: /.jsx?$/,
exclude: /node_modules/,
loader: 'babel-loader'
}]
}
};
$ npm install --save-dev 
babel-core 
babel-preset-es2015 
babel-loader
$ webpack
/* babel.rc */
{ "presets": [ "es2015" ] }
https://webpack.github.io/docs/comparison.html
SCAFFOLDING
inicialización de proyectos
SIN HERRAMIENTA
A. Creas la estructura de todo el
proyecto (css, js, dist)
B. Instalas las dependencias
básicas que vas a usar
C. Configuras tus tareas y tu
bundler
D. Pruebas que todo esté bien
E. Agregas cualquier cosa que se
te haya pasado por alto, como
pruebas
CONS
A. TIEMPO
CON HERRAMIENTA
A. Corres un comando y ya
puedes comenzar a configurar
tu proyecto
CON HERRAMIENTA
A. Corres un comando y ya puedes comenzar a configurar tu
proyecto
YEOMAN & SLUSH
➤ Hacen prácticamente lo
mismo
➤ Yeoman es más grande y tiene
muchos generadores ya
preparados
➤ Puedes crear el tuyo
➤ Slush era la alternativa con
gulp
➤ Yeoman funciona con gulp o
grunt
$ npm install -g yo
$ npm install -g generator-webapp
$ yo webapp
Gracias
@davsket

Más contenido relacionado

La actualidad más candente

[ES] Primeros pasos con Maven
[ES] Primeros pasos con Maven[ES] Primeros pasos con Maven
[ES] Primeros pasos con MavenEudris Cabrera
 
Cambia la forma de desarrollar tus aplicaciones web con groovy y grails
Cambia la forma de desarrollar tus aplicaciones web con groovy y grailsCambia la forma de desarrollar tus aplicaciones web con groovy y grails
Cambia la forma de desarrollar tus aplicaciones web con groovy y grailsFátima Casaú Pérez
 
Taller introduccion symfony2
Taller introduccion symfony2Taller introduccion symfony2
Taller introduccion symfony2Mario IC
 
Vagrant y Docker - Guía práctica de uso
Vagrant y Docker - Guía práctica de usoVagrant y Docker - Guía práctica de uso
Vagrant y Docker - Guía práctica de usoSergio Zambrano Delfa
 
PHPVigo #23 - Taller de Docker para PHP
PHPVigo #23 - Taller de Docker para PHPPHPVigo #23 - Taller de Docker para PHP
PHPVigo #23 - Taller de Docker para PHPRolando Caldas
 
Extracción de datos de páginas web con Python (webscraping)
Extracción de datos de páginas web con Python (webscraping)Extracción de datos de páginas web con Python (webscraping)
Extracción de datos de páginas web con Python (webscraping)Ernesto Crespo
 
04 taller-django
04 taller-django04 taller-django
04 taller-djangosamerscd
 
Mootools Y Otros Frameworks JS
Mootools Y Otros Frameworks JSMootools Y Otros Frameworks JS
Mootools Y Otros Frameworks JSIan Monge Pérez
 
Masterclass PHP 5.3
Masterclass PHP 5.3Masterclass PHP 5.3
Masterclass PHP 5.3ADWE Team
 
Symfony2: Optimización y rendimiento
Symfony2: Optimización y rendimientoSymfony2: Optimización y rendimiento
Symfony2: Optimización y rendimientoRaul Fraile
 
La seguridad en WordPress de la A a la Z
La seguridad en WordPress de la A a la ZLa seguridad en WordPress de la A a la Z
La seguridad en WordPress de la A a la Zwpbarcelona
 
La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR
La Caja de Herramientas del Desarrollador Moderno PHPConferenceARLa Caja de Herramientas del Desarrollador Moderno PHPConferenceAR
La Caja de Herramientas del Desarrollador Moderno PHPConferenceARPablo Godel
 
Manual de usuario crud django
Manual de usuario crud djangoManual de usuario crud django
Manual de usuario crud djangoDaniel Arevalo
 

La actualidad más candente (20)

[ES] Primeros pasos con Maven
[ES] Primeros pasos con Maven[ES] Primeros pasos con Maven
[ES] Primeros pasos con Maven
 
Dar lab1819
Dar lab1819Dar lab1819
Dar lab1819
 
Cambia la forma de desarrollar tus aplicaciones web con groovy y grails
Cambia la forma de desarrollar tus aplicaciones web con groovy y grailsCambia la forma de desarrollar tus aplicaciones web con groovy y grails
Cambia la forma de desarrollar tus aplicaciones web con groovy y grails
 
Taller introduccion symfony2
Taller introduccion symfony2Taller introduccion symfony2
Taller introduccion symfony2
 
Vagrant y Docker - Guía práctica de uso
Vagrant y Docker - Guía práctica de usoVagrant y Docker - Guía práctica de uso
Vagrant y Docker - Guía práctica de uso
 
PHPVigo #23 - Taller de Docker para PHP
PHPVigo #23 - Taller de Docker para PHPPHPVigo #23 - Taller de Docker para PHP
PHPVigo #23 - Taller de Docker para PHP
 
Extracción de datos de páginas web con Python (webscraping)
Extracción de datos de páginas web con Python (webscraping)Extracción de datos de páginas web con Python (webscraping)
Extracción de datos de páginas web con Python (webscraping)
 
Gestionando servidores con Puppet
Gestionando servidores con PuppetGestionando servidores con Puppet
Gestionando servidores con Puppet
 
Introducción a groovy & grails
Introducción a groovy & grailsIntroducción a groovy & grails
Introducción a groovy & grails
 
13proftpd
13proftpd13proftpd
13proftpd
 
04 taller-django
04 taller-django04 taller-django
04 taller-django
 
Mootools Y Otros Frameworks JS
Mootools Y Otros Frameworks JSMootools Y Otros Frameworks JS
Mootools Y Otros Frameworks JS
 
Drupal 8, de cero a producción en minutos.
Drupal 8, de cero a producción en minutos.Drupal 8, de cero a producción en minutos.
Drupal 8, de cero a producción en minutos.
 
Conceptos avanzados en docker
Conceptos avanzados en dockerConceptos avanzados en docker
Conceptos avanzados en docker
 
Masterclass PHP 5.3
Masterclass PHP 5.3Masterclass PHP 5.3
Masterclass PHP 5.3
 
Symfony2: Optimización y rendimiento
Symfony2: Optimización y rendimientoSymfony2: Optimización y rendimiento
Symfony2: Optimización y rendimiento
 
La seguridad en WordPress de la A a la Z
La seguridad en WordPress de la A a la ZLa seguridad en WordPress de la A a la Z
La seguridad en WordPress de la A a la Z
 
La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR
La Caja de Herramientas del Desarrollador Moderno PHPConferenceARLa Caja de Herramientas del Desarrollador Moderno PHPConferenceAR
La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR
 
Manual de usuario crud django
Manual de usuario crud djangoManual de usuario crud django
Manual de usuario crud django
 
Tutorial Git y Smart Git
Tutorial Git y Smart GitTutorial Git y Smart Git
Tutorial Git y Smart Git
 

Similar a Frontend Tools | Herramientas para Frontends

Similar a Frontend Tools | Herramientas para Frontends (20)

Workshop calabash appium
Workshop calabash appiumWorkshop calabash appium
Workshop calabash appium
 
Clase 3 instalación y primeros pasos
Clase 3 instalación y primeros pasosClase 3 instalación y primeros pasos
Clase 3 instalación y primeros pasos
 
Automatización de tareas con Gulp
Automatización de tareas con GulpAutomatización de tareas con Gulp
Automatización de tareas con Gulp
 
Node js Alt.net Hispano
Node js Alt.net HispanoNode js Alt.net Hispano
Node js Alt.net Hispano
 
Mercurial
MercurialMercurial
Mercurial
 
Presentación Docker
Presentación DockerPresentación Docker
Presentación Docker
 
Openldap
OpenldapOpenldap
Openldap
 
Docker 2014 v2
Docker 2014 v2Docker 2014 v2
Docker 2014 v2
 
Qué Es Cobian Backup 9
Qué Es Cobian Backup 9Qué Es Cobian Backup 9
Qué Es Cobian Backup 9
 
202204-Modernizando aplicaciones legacy
202204-Modernizando aplicaciones legacy202204-Modernizando aplicaciones legacy
202204-Modernizando aplicaciones legacy
 
Workshop Calabash Appium
Workshop Calabash AppiumWorkshop Calabash Appium
Workshop Calabash Appium
 
Docker y PostgreSQL
Docker y PostgreSQLDocker y PostgreSQL
Docker y PostgreSQL
 
Samba ubuntu11_10_12 04_slide
Samba ubuntu11_10_12 04_slideSamba ubuntu11_10_12 04_slide
Samba ubuntu11_10_12 04_slide
 
Test Unitarios y E2E front y Back
Test Unitarios y E2E front y BackTest Unitarios y E2E front y Back
Test Unitarios y E2E front y Back
 
Semana 2 Configuración entorno de desarrollo
Semana 2   Configuración entorno de desarrolloSemana 2   Configuración entorno de desarrollo
Semana 2 Configuración entorno de desarrollo
 
Buildout: Crear y desplegar entornos reproducibles en Python
Buildout: Crear y desplegar entornos reproducibles en PythonBuildout: Crear y desplegar entornos reproducibles en Python
Buildout: Crear y desplegar entornos reproducibles en Python
 
Clase9 (consola linux)
Clase9 (consola linux)Clase9 (consola linux)
Clase9 (consola linux)
 
[Phpdayperu] drupal 8 console
[Phpdayperu] drupal 8 console[Phpdayperu] drupal 8 console
[Phpdayperu] drupal 8 console
 
wp-cli
wp-cliwp-cli
wp-cli
 
Mis primeros pasos con Symfony 2
Mis primeros pasos con Symfony 2Mis primeros pasos con Symfony 2
Mis primeros pasos con Symfony 2
 

Más de David Ballén

Ocho cosas que debes saber de JavaScript
Ocho cosas que debes saber de JavaScriptOcho cosas que debes saber de JavaScript
Ocho cosas que debes saber de JavaScriptDavid Ballén
 
BogotaJS Bday 2016: Taller de SumobotJr
BogotaJS Bday 2016: Taller de SumobotJrBogotaJS Bday 2016: Taller de SumobotJr
BogotaJS Bday 2016: Taller de SumobotJrDavid Ballén
 
Wrold Bot Domination: Sumobot jr
Wrold Bot Domination: Sumobot jrWrold Bot Domination: Sumobot jr
Wrold Bot Domination: Sumobot jrDavid Ballén
 
Manipulación de Video de la Webcam con JavaScript
Manipulación de Video de la Webcam con JavaScriptManipulación de Video de la Webcam con JavaScript
Manipulación de Video de la Webcam con JavaScriptDavid Ballén
 
Cómo construir un Servidor Web y Bot de Memes para Slack
Cómo construir un Servidor Web y Bot de Memes para SlackCómo construir un Servidor Web y Bot de Memes para Slack
Cómo construir un Servidor Web y Bot de Memes para SlackDavid Ballén
 
Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript
Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript
Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript David Ballén
 

Más de David Ballén (6)

Ocho cosas que debes saber de JavaScript
Ocho cosas que debes saber de JavaScriptOcho cosas que debes saber de JavaScript
Ocho cosas que debes saber de JavaScript
 
BogotaJS Bday 2016: Taller de SumobotJr
BogotaJS Bday 2016: Taller de SumobotJrBogotaJS Bday 2016: Taller de SumobotJr
BogotaJS Bday 2016: Taller de SumobotJr
 
Wrold Bot Domination: Sumobot jr
Wrold Bot Domination: Sumobot jrWrold Bot Domination: Sumobot jr
Wrold Bot Domination: Sumobot jr
 
Manipulación de Video de la Webcam con JavaScript
Manipulación de Video de la Webcam con JavaScriptManipulación de Video de la Webcam con JavaScript
Manipulación de Video de la Webcam con JavaScript
 
Cómo construir un Servidor Web y Bot de Memes para Slack
Cómo construir un Servidor Web y Bot de Memes para SlackCómo construir un Servidor Web y Bot de Memes para Slack
Cómo construir un Servidor Web y Bot de Memes para Slack
 
Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript
Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript
Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript
 

Frontend Tools | Herramientas para Frontends

  • 2. AGENDA ➤ about:me ➤ intro ➤ package management ➤ workflow & tasks automation ➤ bundling systems ➤ scaffolding
  • 3. DAVID AVELLANEDA ➤ ing. sistemas ➤ co-fundador Monoku ➤ co-organizador BogotáJS ➤ co-organizador JSConf.co ➤ co-organizador char.la ➤ @davsket
  • 5. Muchas herramientas que usamos hoy en día no existían hace 
 5 años...
  • 6. Ya que es gracias al nacimiento de NodeJS en el 2009 (y NPM en el 2010), que surgen nuevas herramientas para facilitar nuestro trabajo día a día.
  • 8. ANTES A. Necesitas una librería B. Buscas la librería (Google) C. Buscas donde descargarla librería en la página D. La descargas E. La agregabas a tu proyecto F. la importabas en tu HTML G. Si necesitas otra repites el paso A.
  • 9. ANTES (PRINCIPALES PROBLEMAS) A. Gastas mucho tiempo buscando el script B. Al descargarlo debes ordenar tus librerías manualmente C. Si clonaste un proyecto hay dos opciones: 1. Las librerías están incluidas en el repositorio (ok, no tienes que repetir el proceso, pero el repositorio pesa mucho más de lo que debería) 2. No están incluidas las librerías, pero hay documentación de dónde descargar cada una.
  • 10. HOY A. Necesitabas una librería B. La buscabas en el gestor de paquetes C. La instalas con un comando D. la importabas en tu HTML o JS E. Si necesitas otra repites el paso A.
  • 11. HOY (VENTAJAS) A. Puedes buscar la librería desde la terminal B. Sólo buscas en un mismo lugar C. Se mantiene un registro de las librerías requeridas para el proyecto D. Ya las librerías pueden estar excluidas del repositorio E. Todo se reinstala con un solo comando
  • 12. OPCIONES DE PACKAGE MANAGEMENT
  • 13. NPM (NODE PACKAGE MANAGER) ➤ Es el primer gestor de paquetes para JavaScript ➤ Es el gestor de paquetes por defecto para en entorno de JS en Node.js ➤ Tiene en la página el listado de todos los repositorios ➤ Usa un archivo llamado package.json ➤ Se usa tanto para instalar dependencias como para publicar módulos a NPM $ npm init $ npm install lodash --save $ npm uninstall lodash --save $ # new clone $ npm install
  • 14. BOWER ➤ Creado y mantenido por Twitter ➤ Usa Github como fuente de librerías ➤ Usa un archivo que se llama bower.json (y opcionalmente un .bowerrc) ➤ Se usa tanto para instalar dependencias como para exponer repositorios a Bower ➤ Está más centrado en módulos para Front-end $ npm install -g bower $ bower init $ bower install lodash --save $ bower uninstall lodash --save $ # new clone $ bower install
  • 15. YARN ➤ Es la competencia más reciente y directa de NPM ➤ Creado y mantenido por Facebook ➤ Es más rápido y maneja mejor el cache ➤ Es muy reciente...$ npm install -g yarn $ yarn init $ yarn add lodash $ yarn remove lodash $ # new clone $ yarn
  • 16. NPM VS BOWER ➤ NPM tiene mayor mantenimiento ➤ Bower está comenzando a perder mantenibilidad y generación de nuevos features ➤ NPM es estándar de Node.js ➤ NPM es más rápido y eficiente que Bower ➤ NPM no usa repositorios como paquetes (son muy diferentes) ➤ NPM gestiona las versiones recursivamente, no hay colisiones vs
  • 17. o por lo menos usar alguno recomendación: usar
  • 18. WORKFLOW & TASKS AUTOMATION o cómo facilitar nuestro trabajo diario
  • 19. ANTES A. Tienes tus archivos de estilos (probablemente con algún preprocesador como LESS, Sass o Stylus) B. Tienes tus archivos JS (deseablemente tu código en más de un solo archivo) C. Tienes que subir una nueva versión... D. Compilas los estilos con un comando largo y los mandas a una carpeta E. Compilas los scripts con otro comando F. Minificas/Ofuscas los generados para que sean más livianos G. etc..
  • 20. ANTES (PRINCIPALES PROBLEMAS) A. Te toca lidiar con la terminal por montones B. Es difícil de mantener comandos (varían por OS) C. Si no usas la terminal te toca estar subiendo a algún servicio web como Closure (Google) etc. D. Tienes que memorizar o documentar tu proceso, es manual y puede fallar con facilidad E. Si deseas agregar un paso adicional, te toca tenerlo en cuenta en tu proceso de trabajo F. Probablemente termines agregando los compilados al repositorio
  • 21. HOY A. Instalas una herramienta como Grunt, Gulp o Broccoli (etc) B. Configuras tu flujo de trabajo C. Ejecutas un comando en la terminal D. Puedes crear flujos más complejos, como automatización de build de Cordova, templates, documentación, etc.
  • 22. HOY (VENTAJAS) A. Lidias con JavaScript para configurar el flujo de trabajo B. El módulo se encarga de hacer esto por tí C. Puedes replicar el proceso en otros ambientes (CLI) (OS) D. Puedes excluir los compilados (distribution) del repositorio
  • 24. GRUNT ➤ Es el primer task runner (popular) ➤ Tiene una gran cantidad de plugins: sass, coffee script, jshint, less, stylus, etc. ➤ Se apoya en un archivo que se llama Gruntfile.js ➤ Instalas con npm los plugins a usar ➤ Los agregas a la configuración ➤ Ejecutas la tarea ➤ Puedes crear flujos de tareas con aliases $ npm install -g grunt-cli $ npm install grunt --save $ grunt <task-name>
  • 25. $ npm install --save grunt-contrib-concat $ npm install --save grunt-contrib-uglify $ grunt concat $ grunt uglify $ grunt /* Gulpfile.js */ module.exports = function(grunt) { grunt.initConfig({ concat: { 'dist/app.js': ['app/js/a.js', 'app/js/b.js'] }, uglify: { build: { src: 'dist/app.js', dest: 'dist/app.min.js' } }, }); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-concat'); grunt.registerTask('default', ['concat', 'uglify']); }
  • 26. GULP ➤ Gulp funciona bajo el concepto de streams (unix) ➤ Usas módulos que funcionan como tuberías ➤ Estos módulos reciben archivos, los modifican y los mandan como resultado ➤ Usa un archivo llamado Gulpfile.js ➤ Ya no trabajas con un objeto grande de configuración ➤ Al final es más fácil de mantener $ npm install -g gulp $ npm install gulp --save $ gulp <task-name>
  • 27. $ npm install --save gulp-concat $ npm install --save gulp-uglify $ gulp dist $ gulp /* Gulpfile.js */ var gulp = require('gulp') var concat = require('gulp-concat') var uglify = require('gulp-uglify') gulp.task('dist', function() { return gulp.src('app/js/*.js') .pipe(concat('app.js')) .pipe(uglify()) .pipe(gulp.dest('dist/js/')) }) gulp.task('default', ['dist'])
  • 28. $ gulp watch $ gulp /* Gulpfile.js */ var gulp = require('gulp') var concat = require('gulp-concat') gulp.task('concat', function() { return gulp.src('app/js/*.js') .pipe(concat('app.js')) .pipe(gulp.dest('dist/js/')) }) gulp.task('watch', function() { gulp.watch('app/js/*.js', ['concat']) }) gulp.task('default', ['watch'])
  • 29. BROCCOLI ➤ Funciona como todo un flujo para la aplicación ➤ Es rápido ➤ Usa un archivo que se llama Brocfile.js ➤ Es opinionado ➤ Cuenta con muchos plugins también ➤ Es usado por Ember-cli ➤ No expone tareas, es todo el flujo $ npm install -g broccoli-cli $ npm install broccoli --save $ broccoli build dist
  • 30. $ npm install --save broccoli-sass $ npm install --save broccoli-coffee $ npm install --save broccoli-merge-trees /* Brocfile.js */ var compileSass = require('broccoli-sass'); var filterCoffeeScript = require('broccoli-coffee'); var mergeTrees = require('broccoli-merge-trees'); var sassDir = 'app/scss'; var coffeeDir = 'app/coffeescript'; // Tell Broccoli how we want the assets // to be compiled var styles = compileSass([sassDir], 'app.scss', 'app.css'); var scripts = filterCoffeeScript(coffeeDir); // Merge the compiled styles and scripts into // one output directory. module.exports = mergeTrees([styles, scripts]);
  • 31. BROCCOLI VS GRUNT VS GULP configuración media/compleja fácil fácil personalización baja alta alta mantenibilidad alta media alta curva alta (poca documentación) baja media-alta (una vez entiendes streams) ecosistema medio grande+ grande tareas no sí sí
  • 33. SIN BUNDLER A. Tienes un conjunto de scripts, estilos, imágenes, etc. B. Necesitas mandar eso a producción C. Manualmente procesas cada origen para mandarlo al destino deseado D. Haces el paso anterior para JS, luego para CSS, luego para Imágenes, etc. E. Si tienes tiempo automatizas esta tarea con Grunt, Gulp o Broccoli
  • 34. SIN BUNDLER (PROBLEMAS) A. La actividad de agrupar (empaquetar) estos archivos es manual B. Puede variar entre ambientes y sistemas operativos C. Debes tener cuidado con el orden y las dependencias
  • 35. CON BUNDLER A. Usas un empaquetador como webpack u otro B. Instalas los plugins (sass, ES6, coffee-script, etc) C. Configuras qué empaquetar D. El empaquetador hace el trabajo por tí
  • 36. CON BUNDLER (VENTAJAS) A. Son más eficientes para el manejo de empaquetamiento B. Entienden del manejo de dependencias entre diferentes módulos C. Pueden compilar en un solo script TODOS los recursos si lo deseas (css/js/img/html) D. Si creas un nuevo módulo, solamente lo importas como dependencia de otro (automágicamente)
  • 37. TASK AUTOMATION VS BUNDLERS A. Los bundlers generalmente no te permiten definir tareas B. No obstante controlan el flujo de trabajo de tu proyecto C. Task automators naturalmente no saben cómo manejar las dependencias (con plugins sí) D. Hay plugins de los bundlers para los task automators (no son excluyentes)
  • 39. REQUIRE.JS + R.JS ➤ Usa AMD (w0t?) $ npm install --save requirejs $ # creas tu build.js $ node build.js
  • 40. AMD (ASYNCHRONOUS MODULE DEFINITION) ➤ Es asíncrono ➤ Usa callbacks para invocar los módulos cuando sus dependencias hayan cargado ➤ Usado en web, donde los scripts se halan por request ➤ El cb de require es ejecutado cuando todos los scripts hayan terminado de descargarse /* main.js */ require(['hello'], function (hello) { console.log(hello) // > hello there }) /* hello.js */ define([], function () { return 'hello there' }) require([deps], cb) define('name', [deps], cb)
  • 41. REQUIRE.JS + R.JS ➤ Usa AMD (ok!) ➤ Funciona sin compilar todo en paquetes (bundles) ➤ Usa R.js para compilar los módulos según como lo configures ➤ Te permite incluir en los scripts: texto (cualquier formato), imágenes, json, css, entre otros) ➤ Te permite usar ES6, Less, entre otros $ npm install --save requirejs $ # creas tu build.js $ node r.js -o build.js
  • 42. <script src="require.js" data-main="main.js"></script> Full AMD Bundling /* build.js */ { "appDir": "app/js/", "mainConfigFile": "app/js/app.js", "dir": "dist/", "modules": [ { "name": "app" } ] } /* app.js */ requirejs.config({ baseUrl: 'lib', paths: { // shortcuts } }); $ node r.js -o build.js
  • 43. BROWSERIFY ➤ Usa CommonJS (w0t??) $ npm install -g browserify $ browserify main.js > bundle.js
  • 44. COMMONJS ➤ Por defecto disponible en Node.js ➤ No funciona en los navegadores ➤ Ampliamente usado en backend ➤ No es asíncrono porque los módulos están en disco ➤ Lo usan todos los task automators /* main.js */ var hello = require('./hello.js') console.log(hello) // > hello there /* hello.js */ myMod = 'hello there' module.exports = myMod require('modName') module.exports = module
  • 45. BROWSERIFY ➤ Usa CommonJS (ok!) ➤ Mira las dependencias de el archivo y carga recursivamente las dependencias en orden ➤ Al final todo queda en un solo archivo ➤ Este archivo puede ser usado en el navegador ➤ Puedes usar módulos de NPM en el navegador 💪 ➤ Puede incluir en los bundle imágenes, texto, json, css, etc., con plugins ➤ Puedes precopilar todo con plugins ➤ No require un archivo de config. $ npm install -g browserify $ browserify main.js > bundle.js
  • 46. WEBPACK ➤ Soporta AMD y CommonJS (y ES2015 modules (w0t??) $ npm install -g web pack $ browserify main.js > bundle.js
  • 47. ES2015 ➤ Nuevo estándar para JavaScript ➤ No funciona en los navegadores y servidores por defecto ➤ No es asíncrono ➤ Es más sencillo /* main.js */ import hello from './hello' console.log(hello) // > hello there /* hello.js */ export default 'hello there' import mod from 'mod' export default myMod
  • 48. WEBPACK ➤ Soporta AMD y CommonJS (y ES2015 modules (w0t??) ➤ Mira las dependencias de el archivo y carga recursivamente las dependencias en orden ➤ Al final todo puede quedar en un solo archivo, o en miltiples con carga asíncrona ➤ Puedes usar módulos de NPM en el navegador 💪 ➤ Puede incluir en los bundle imágenes, texto, json, css, etc. ➤ Cuenta con una infinidad de loaders para preprocesar e incluir recursos. ➤ Provee un server para desarrollo (hot loading) ➤ Puedes no usar configuración $ npm install -g web pack $ webpack ./app.js app.bundle.js
  • 49. /* webpack.config.js */ module.exports = { entry: './app/js/app.js', output: { path: './dist/js/', filename: 'app.bundle.js' }, module: { loaders: [{ test: /.jsx?$/, exclude: /node_modules/, loader: 'babel-loader' }] } }; $ npm install --save-dev babel-core babel-preset-es2015 babel-loader $ webpack /* babel.rc */ { "presets": [ "es2015" ] }
  • 52. SIN HERRAMIENTA A. Creas la estructura de todo el proyecto (css, js, dist) B. Instalas las dependencias básicas que vas a usar C. Configuras tus tareas y tu bundler D. Pruebas que todo esté bien E. Agregas cualquier cosa que se te haya pasado por alto, como pruebas
  • 54. CON HERRAMIENTA A. Corres un comando y ya puedes comenzar a configurar tu proyecto
  • 55. CON HERRAMIENTA A. Corres un comando y ya puedes comenzar a configurar tu proyecto
  • 56. YEOMAN & SLUSH ➤ Hacen prácticamente lo mismo ➤ Yeoman es más grande y tiene muchos generadores ya preparados ➤ Puedes crear el tuyo ➤ Slush era la alternativa con gulp ➤ Yeoman funciona con gulp o grunt $ npm install -g yo $ npm install -g generator-webapp $ yo webapp
  • 57.