Desenredando
el toolchain
de JavaScript
Jeduan
Cornejo
@jeduan
It is practically impossible
to teach good
programming to students
that have had a prior
exposure to BASIC
— Edsger W. Dijkstra
JavaScript envenena la
mente de nuestros
jóvenes programadores
JavaScript envenena la
mente de nuestros
jóvenes programadores
— Walter Mercado
Escribiendo aplicaciones web en
2017
• Lenguaje
• Herramientas
• Librerías
Escribiendo una app en 2017
• Lenguaje
• Herramientas
• Librerías Bibliotecas
Plataforma
Navegadores tienen nuevas
versiones de forma continua
• Chrome: 6 semanas
• Firefox: 6-8 semanas
• Internet Explorer: !
• Edge: Versiones mayores cada ~8 meses
• Safari: Versiones mayores cada ~6 meses
• Chrome Android: Sigue a desktop desde Lollipop (5.0)
DevTools FTW
https://developers.google.com/web/tools/chrome-
devtools/
Lenguaje
CoffeeScript
CoffeeScript
ECMAScript 2015+
• Una versión nueva del lenguaje cada año
TC39
• http://tc39.github.io
• Propuestas pasan por niveles 0 - 4
• Stage 3: Spec completo
• Stage 4: Implementada en 2 browsers
ECMAScript 2017
• async / await
• new SharedArrayBuffer()
• '8'.padStart(4, '0')
• https://github.com/tc39/proposals
Flow / TypeScript
• Agregan tipos a JavaScript
• TS: Anders Hejlsberg
• Flow: Facebook
function sayHi (name: String) : String {
return `Hola ${name}`
}
sayHi(4) // Error
Framework
VanillaJS para los muy valientes
Angular
• Google
• JS en HTML
Vue
React
• Facebook
• Vistas declarativas
• HTML en el JS
• DOM Virtual
AST
Linter
Eslint
• airbnb
• standard
Package Manager
npm & yarn
• más de 350,000 módulos
Transpilador
babel
• modulos que usan el AST para convertir sintaxis.
• babel-preset-stage-0 -> TODAS las propuestas
• flow
• recomendación babel-preset-env
Bundler
Webpack
Webpack
• Bundler: archivo + dependencias -> salidas
• Transpilación (Babel, SCSS -> CSS, TypeScript -> JS)
• Relación entre código y assets.
• Hot Module Reload para desarrollar feliz.
Webpack
• Complicado de configurar
• Recomendación: create-react-app
<link rel="stylesheet" href="/styles/bootstrap.css" />
<link rel="stylesheet" href="/styles/shared.css" />
<link rel="stylesheet" href="/styles/app.css" />
<script src="/dist/react.min.js" ></script>
<script src="/dist/react-dom.min.js" ></script>
<script src="/dist/bootstrap-react.min.js" ></script>
<script src="/dist/app.js" ></script>
import React from 'react'
class Comments extends React.Component {
// ...
}
import React from 'react'
import shuffle from 'lodash/shuffle'
import addMinute from 'date-fns/add_minutes'
class Comments extends React.Component {
// ...
}
import React from 'react'
import shuffle from 'lodash/shuffle'
import addMinute from 'date-fns/add_minutes'
import './comments.css'
class Comments extends React.Component {
render () {
return <div class="comments"></div>
}
}
import React from 'react'
import ReactDOM from 'react-dom'
import shuffle from 'lodash/shuffle'
import addMinute from 'date-fns/add_minutes'
import './component.css'
import Logo from '../logo.svg'
class Comments extends React.Component {
render () {
return <div class="comments">
<Logo />
</div>
}
}
import React from 'react'
import ReactDOM from 'react-dom'
import shuffle from 'lodash/shuffle'
import addMinute from 'date-fns/add_minutes'
import './component.css'
import Logo from '../logo.svg'
import bgImage from '../images/hero-bg.png'
class Comments extends React.Component {
render () {
return <div class="comments"
style={{backgroundImage: bgImage}}
>
<Logo />
</div>
}
}
<link rel="stylesheet" href="/dist/app.css">
<script src="/dist/app.min.js"></script>
Webpack: The advanced parts
• Tree shaking, usar sólo partes de la librería.
• CommonsChunk: librerias en un archivo y aplicación en
otro.
• import() para separar aplicación en pequeñas unidades.
<script src="/dist/vendor.min-717bc228.js" ></script>
<!-- bibliotecas minimizadas -->
<script src="/dist/vendor.min-717bc228.js" ></script>
<!-- bibliotecas minimizadas -->
<script src="/dist/boot.min.js" ></script>
<script src="/dist/vendor.min-717bc228.js" ></script>
<!-- bibliotecas minimizadas -->
<script src="/dist/boot.min.js" ></script>
<!-- inyectado de forma dinámica -->
<script src="/dist/home.min.js" ></script>
<script src="/dist/comments.min.js" ></script>
<style>
<!-- estilos inyectados de forma dinámica -->
</style>
<script src="/dist/vendor.min-717bc228.js" ></script>
<!-- bibliotecas minimizadas -->
<script src="/dist/boot.min.js" ></script>
<!-- inyectado de forma dinámica -->
<script src="/dist/home.min.js" ></script>
<script src="/dist/comments.min.js" ></script>
<style>
<!-- estilos inyectados de forma dinámica -->
</style>
<script src="/dist/vendor.min-717bc228.js" ></script>
<!-- bibliotecas minimizadas -->
<script src="/dist/boot.min.js" ></script>
<!-- inyectado de forma dinámica -->
<script src="/dist/home.min.js" ></script>
<script src="/dist/comments.min.js" ></script>
En conclusión
• JS sigue moviendose rápido.
• Nuevas herramientas permiten desarrollar aplicaciones más
complejas.
• Algunas herramientas son complicadas todavía.
• Se recomienda adoptar poco a poco.
Preguntas
@jeduan
http://
meetup.com/
eventloop

Desenredando el toolchain de Javascript