SlideShare uma empresa Scribd logo
1 de 86
Baixar para ler offline
Modern Web Development
@ipeychev
Evolution of the Web
frameworks and libraries
2006 2015
Pros Cons
Cross browser API
Powerful DOM queries
OOTB Ajax
Plugins system
Tight coupling with HTML tags
Tracking DOM events is hard
Misleading API
("on" might be on or delegate, it
depends)
Slow
2006 2014
Pros Cons
Cross browser API
Powerful DOM queries
OOTB Ajax, PJax, etc.
Plugins system
Traversing DOM was slow
Some of the modules were
crappy
Tried to provide everything
Contributing was hard
Loading modules
Widgets
App framework
Designed to serve the old
browsers
2009 2015
Pros Cons
Two way data binding
Declarative HTML
Complex concepts
Slow dirty checking
Logic everywhere
Client-side framework
(rendering on the server is possible,
but tricky)
They invented Karma :)
2010 2015
Pros Cons
Auto-synced models via
REST API
Robust event system
Bare-bones features
jQuery like views
2011 2015
Pros Cons
True MVC pattern
Templating system
based on Handlebars
A lot of black magic
Context switching
Complicated two-way data
binding
2013 2015
REACT
Pros Cons
Minimal (view part only)
One-way data flow
Requires change of mindset
Simple concepts
Fast (60 fps)
Isomorphic applications,
client-side applications,
native applications
Abolishes the rules made of
stone
REACT
React in a nutshell
React in a nutshell
Library, not a
framework
Implements one-
way reactive data
flow
Blazingly fast
React in a nutshell
Virtual DOM
JSX
JavaScript syntax
extension (JSX)
React in a nutshell
Native
applications
Isomorphic
applications
Client-side
applications
Creating UI with React
Main UI
Nested
Components
Data flow
Creating a component
Render the component
Change the state
And rendering is fast
Virtual DOM rulez
Performance
EcmaScript 6 and 7
ES6 & 7 main features
Classes
Modules importing
Syntactic sugar over functions
Class and properties decorators (annotations)
Variables and constants
Block scoping
Built-in Promises
Template strings
Default function parameter values
Function generators
Symbols
Proxies … more here
ES6 & 7 main features
EcmaScript 6 and 7 in action
1 import screwdriver from '/tools/bag';
2 import pliers from '/tools/bag';
3 import Visible from '/state/Visible';
4 import {Attribute as attr} from '/attributes/Attribute';
5
6 @Visible
7 class Component extends Base {
8 constructor() {
9 super();
10 }
11
12 helloWorld() {
13 return {
14 myProp: () => { return 'Hello World!';}
15 };
16 }
17
18 @attr
19 prop1 = 23;
20 }
21
22 export default Some;
EcmaScript 6 and 7 in action
1 import screwdriver from '/tools/bag';
2 import pliers from '/tools/bag';
3 import Visible from '/state/Visible';
4 import {Attribute as attr} from '/attributes/Attribute';
5
6 @Visible
7 class Component extends Base {
8 constructor() {
9 super();
10 }
11
12 helloWorld() {
13 return {
14 myProp: () => { return 'Hello World!';}
15 };
16 }
17
18 @attr
19 prop1 = 23;
20 }
21
22 export default Some;
Imports
EcmaScript 6 and 7 in action
1 import screwdriver from '/tools/bag';
2 import pliers from '/tools/bag';
3 import Visible from '/state/Visible';
4 import {Attribute as attr} from '/attributes/Attribute';
5
6 @Visible
7 class Component extends Base {
8 constructor() {
9 super();
10 }
11
12 helloWorld() {
13 return {
14 myProp: () => { return 'Hello World!';}
15 };
16 }
17
18 @attr
19 prop1 = 23;
20 }
21
22 export default Some;
Class
annotations
EcmaScript 6 and 7 in action
1 import screwdriver from '/tools/bag';
2 import pliers from '/tools/bag';
3 import Visible from '/state/Visible';
4 import {Attribute as attr} from '/attributes/Attribute';
5
6 @Visible
7 class Component extends Base {
8 constructor() {
9 super();
10 }
11
12 helloWorld() {
13 return {
14 myProp: () => { return 'Hello World!';}
15 };
16 }
17
18 @attr
19 prop1 = 23;
20 }
21
22 export default Some;
Classes
EcmaScript 6 and 7 in action
1 import screwdriver from '/tools/bag';
2 import pliers from '/tools/bag';
3 import Visible from '/state/Visible';
4 import {Attribute as attr} from '/attributes/Attribute';
5
6 @Visible
7 class Component extends Base {
8 constructor() {
9 super();
10 }
11
12 helloWorld() {
13 return {
14 myProp: () => { return 'Hello World!';}
15 };
16 }
17
18 @attr
19 prop1 = 23;
20 }
21
22 export default Some;
Inheritance
EcmaScript 6 and 7 in action
1 import screwdriver from '/tools/bag';
2 import pliers from '/tools/bag';
3 import Visible from '/state/Visible';
4 import {Attribute as attr} from '/attributes/Attribute';
5
6 @Visible
7 class Component extends Base {
8 constructor() {
9 super();
10 }
11
12 helloWorld() {
13 return {
14 myProp: () => { return 'Hello World!';}
15 };
16 }
17
18 @attr
19 prop1 = 23;
20 }
21
22 export default Some;
Functions
EcmaScript 6 and 7 in action
1 import screwdriver from '/tools/bag';
2 import pliers from '/tools/bag';
3 import Visible from '/state/Visible';
4 import {Attribute as attr} from '/attributes/Attribute';
5
6 @Visible
7 class Component extends Base {
8 constructor() {
9 super();
10 }
11
12 helloWorld() {
13 return {
14 myProp: () => { return 'Hello World!';}
15 };
16 }
17
18 @attr
19 prop1 = 23;
20 }
21
22 export default Some;
Fat arrows
EcmaScript 6 and 7 in action
1 import screwdriver from '/tools/bag';
2 import pliers from '/tools/bag';
3 import Visible from '/state/Visible';
4 import {Attribute as attr} from '/attributes/Attribute';
5
6 @Visible
7 class Component extends Base {
8 constructor() {
9 super();
10 }
11
12 helloWorld() {
13 return {
14 myProp: () => { return 'Hello World!';}
15 };
16 }
17
18 @attr
19 prop1 = 23;
20 }
21
22 export default Some;
Props annotations
EcmaScript 6 and 7 in action
1 import screwdriver from '/tools/bag';
2 import pliers from '/tools/bag';
3 import Visible from '/state/Visible';
4 import {Attribute as attr} from '/attributes/Attribute';
5
6 @Visible
7 class Component extends Base {
8 constructor() {
9 super();
10 }
11
12 helloWorld() {
13 return {
14 myProp: () => { return 'Hello World!';}
15 };
16 }
17
18 @attr
19 prop1 = 23;
20 }
21
22 export default Some;
Class
properties
EcmaScript 6 and 7 in action
1 import screwdriver from '/tools/bag';
2 import pliers from '/tools/bag';
3 import Visible from '/state/Visible';
4 import {Attribute as attr} from '/attributes/Attribute';
5
6 @Visible
7 class Component extends Base {
8 constructor() {
9 super();
10 }
11
12 helloWorld() {
13 return {
14 myProp: () => { return 'Hello World!';}
15 };
16 }
17
18 @attr
19 prop1 = 23;
20 }
21
22 export default Some;
Module exports
What is the
situation
now?
One-way directional data flow wins
Plenty of React-wanna-be frameworks
and libraries
Plenty of Flux implementations
React like libraries/frameworks
Mithril
Mercury
Vue.js
Ripple.js
Riot Reactive
Cito.js
Hyperd
React like libraries/frameworks
Cyclejs
r-js
Copernicium
jFlux
vbridge
Tungsten.js
Cape.js
… more here
Plenty of Virtual DOM implementations
A lot of on GitHub
as part of framework/library or just like a module
The other frameworks evolve
Ember changes to benefit from React’s ideas
Angular too
Framework evolution in the wrong way
Reactive programming
(warning - changes the mindset)
Changes the way we think about
asynchronous programming
Everything is Observable
Reactive programming
including the events
Let’s implement Drag&Drop
1 var dragTarget = document.getElementById('dragTarget');
2
3 var mousedown = Observable.fromEvent(dragTarget, 'mousedown');
4 var mousemove = Observable.fromEvent(document, 'mousemove');
5 var mouseup = Observable.fromEvent(dragTarget, 'mouseup');
6
7 var mousedrag = mousedown.flatMap(function(mousedown) {
8 var startX = mousedown.offsetX,
9 startY = mousedown.offsetY;
10
11 return mousemove.map(function(mousemove) {
12 mousemove.preventDefault();
13
14 return {
15 left: mousemove.clientX - startX,
16 top: mousemove.clientY - startY
17 };
18 }).takeUntil(mouseup);
19 });
20
21 var subscription = mousedrag.subscribe(function(pos) {
22 dragTarget.style.top = pos.top + 'px';
23 dragTarget.style.left = pos.left + 'px';
24 });
Let’s implement Drag&Drop
1 var dragTarget = document.getElementById('dragTarget');
2
3 var mousedown = Observable.fromEvent(dragTarget, 'mousedown');
4 var mousemove = Observable.fromEvent(document, 'mousemove');
5 var mouseup = Observable.fromEvent(dragTarget, 'mouseup');
6
7 var mousedrag = mousedown.flatMap(function(mousedown) {
8 var startX = mousedown.offsetX,
9 startY = mousedown.offsetY;
10
11 return mousemove.map(function(mousemove) {
12 mousemove.preventDefault();
13
14 return {
15 left: mousemove.clientX - startX,
16 top: mousemove.clientY - startY
17 };
18 }).takeUntil(mouseup);
19 });
20
21 var subscription = mousedrag.subscribe(function(pos) {
22 dragTarget.style.top = pos.top + 'px';
23 dragTarget.style.left = pos.left + 'px';
24 });
Get the drag
target
Let’s implement Drag&Drop
1 var dragTarget = document.getElementById('dragTarget');
2
3 var mousedown = Observable.fromEvent(dragTarget, 'mousedown');
4 var mousemove = Observable.fromEvent(document, 'mousemove');
5 var mouseup = Observable.fromEvent(dragTarget, 'mouseup');
6
7 var mousedrag = mousedown.flatMap(function(mousedown) {
8 var startX = mousedown.offsetX,
9 startY = mousedown.offsetY;
10
11 return mousemove.map(function(mousemove) {
12 mousemove.preventDefault();
13
14 return {
15 left: mousemove.clientX - startX,
16 top: mousemove.clientY - startY
17 };
18 }).takeUntil(mouseup);
19 });
20
21 var subscription = mousedrag.subscribe(function(pos) {
22 dragTarget.style.top = pos.top + 'px';
23 dragTarget.style.left = pos.left + 'px';
24 });
Observables
from events
Let’s implement Drag&Drop
1 var dragTarget = document.getElementById('dragTarget');
2
3 var mousedown = Observable.fromEvent(dragTarget, 'mousedown');
4 var mousemove = Observable.fromEvent(document, 'mousemove');
5 var mouseup = Observable.fromEvent(dragTarget, 'mouseup');
6
7 var mousedrag = mousedown.flatMap(function(mousedown) {
8 var startX = mousedown.offsetX,
9 startY = mousedown.offsetY;
10
11 return mousemove.map(function(mousemove) {
12 mousemove.preventDefault();
13
14 return {
15 left: mousemove.clientX - startX,
16 top: mousemove.clientY - startY
17 };
18 }).takeUntil(mouseup);
19 });
20
21 var subscription = mousedrag.subscribe(function(pos) {
22 dragTarget.style.top = pos.top + 'px';
23 dragTarget.style.left = pos.left + 'px';
24 });
Process these
as arrays
Let’s implement Drag&Drop
1 var dragTarget = document.getElementById('dragTarget');
2
3 var mousedown = Observable.fromEvent(dragTarget, 'mousedown');
4 var mousemove = Observable.fromEvent(document, 'mousemove');
5 var mouseup = Observable.fromEvent(dragTarget, 'mouseup');
6
7 var mousedrag = mousedown.flatMap(function(mousedown) {
8 var startX = mousedown.offsetX,
9 startY = mousedown.offsetY;
10
11 return mousemove.map(function(mousemove) {
12 mousemove.preventDefault();
13
14 return {
15 left: mousemove.clientX - startX,
16 top: mousemove.clientY - startY
17 };
18 }).takeUntil(mouseup);
19 });
20
21 var subscription = mousedrag.subscribe(function(pos) {
22 dragTarget.style.top = pos.top + 'px';
23 dragTarget.style.left = pos.left + 'px';
24 });
Map mouse
move
Let’s implement Drag&Drop
1 var dragTarget = document.getElementById('dragTarget');
2
3 var mousedown = Observable.fromEvent(dragTarget, 'mousedown');
4 var mousemove = Observable.fromEvent(document, 'mousemove');
5 var mouseup = Observable.fromEvent(dragTarget, 'mouseup');
6
7 var mousedrag = mousedown.flatMap(function(mousedown) {
8 var startX = mousedown.offsetX,
9 startY = mousedown.offsetY;
10
11 return mousemove.map(function(mousemove) {
12 mousemove.preventDefault();
13
14 return {
15 left: mousemove.clientX - startX,
16 top: mousemove.clientY - startY
17 };
18 }).takeUntil(mouseup);
19 });
20
21 var subscription = mousedrag.subscribe(function(pos) {
22 dragTarget.style.top = pos.top + 'px';
23 dragTarget.style.left = pos.left + 'px';
24 });
Stop on
mouse up
Let’s implement Drag&Drop
1 var dragTarget = document.getElementById('dragTarget');
2
3 var mousedown = Observable.fromEvent(dragTarget, 'mousedown');
4 var mousemove = Observable.fromEvent(document, 'mousemove');
5 var mouseup = Observable.fromEvent(dragTarget, 'mouseup');
6
7 var mousedrag = mousedown.flatMap(function(mousedown) {
8 var startX = mousedown.offsetX,
9 startY = mousedown.offsetY;
10
11 return mousemove.map(function(mousemove) {
12 mousemove.preventDefault();
13
14 return {
15 left: mousemove.clientX - startX,
16 top: mousemove.clientY - startY
17 };
18 }).takeUntil(mouseup);
19 });
20
21 var subscription = mousedrag.subscribe(function(pos) {
22 dragTarget.style.top = pos.top + 'px';
23 dragTarget.style.left = pos.left + 'px';
24 });
Update position
on mousedrag
CSS
acronym for CSS Seriously Sucks ;)
Flexbox
Can be dynamically collapsed or uncollapsed along the main
axis while preserving the container’s cross size.
Can be laid out in any flow direction (leftwards, rightwards, downwards,
upwards)
Can have display order reversed or rearranged at the style layer
(i.e., visual order can be independent of source and speech order)
Can be laid out linearly along a single (main) axis or wrapped
into multiple lines along a secondary (cross) axis
Can “flex” element’s sizes to respond to the available space
Can be aligned with respect to their container or each other
Child elements in Flexbox
Modular CSS
Every time you add CSS rule,
Global CSS sucks
you risk clashing with something else
Webpack’s CSS modules
CSS as modules,
local scope by default
Webpack’s CSS Modules
The CSS for a module is isolated,
despite of class names like ‘.main’
Webpack’s CSS Modules
You can extend
and import classes
Webpack’s CSS Modules
MyComponent.css
1 .main {
2 border-width: 2px;
3 border-style: solid;
4 border-color: #777;
5 padding: 0 20px;
6 margin: 0 6px;
7 max-width: 400px;
8 }
9
10 .text {
11 color: #777;
12 font-size: 24px;
13 font-family: helvetica, arial, sans-serif;
14 font-weight: 600;
15 }
Webpack’s CSS Modules
MyComponent.js
1 import styles from './MyComponent.css';
2 import React, {Component} from 'react';
3
4 export default class MyComponent extends Component {
5
6 render() {
7 return (
8 <div className={styles.main}>
9 <p className={styles.text}>Scoped Selectors</p>
10 </div>
11 );
12 }
13 };
Webpack’s CSS Modules
Webpack will compile the CSS classes
prefix and isolate them so they won’t clash
Webpack’s CSS Modules
Global selectors are available
(but please avoid them)
1 .main {
2 border-width: 2px;
3 border-style: solid;
4 border-color: #777;
5 padding: 0 20px;
6 margin: 0 6px;
7 max-width: 400px;
8 }
9
10 .main :global p {
11 color: #777;
12 font-size: 24px;
13 font-family: helvetica, arial, sans-serif;
14 font-weight: 600;
15 }
Webpack’s CSS Modules
MyComponent.css
This will style al `p`
inside the component
Webpack’s CSS Modules
MyComponent.js
1 import styles from './MyComponent.css';
2 import React, {Component} from 'react';
3
4 export default class MyComponent extends Component {
5
6 render() {
7 return (
8 <div className={styles.main}>
9 <p>content</p>
10 </div>
11 );
12 }
13 };
`p` will be styled b/c of
the global selector
Webpack’s CSS Modules
CSS inheritance from shared modules
Webpack’s CSS Modules
1 .container {
2 border-width: 2px;
3 border-style: solid;
4 padding: 0 20px;
5 margin: 0 6px;
6 max-width: 400px;
7 }
layout.css
Webpack’s CSS Modules
1 .main {
2 extends: container from "layout.css";
3 border-color: red;
4 }
MyComponent.css
This is CSS finally fixed
Testing
Unit tests
Karma + Mocha + Chai + Sinon
Integration/Functional tests
Pioneer.js
Nightwatch.js
Intern … more here
Pioneer.js
You write the tests in the English-like Gherkin syntax
Cucumber
Pioneer.js
Feature: TODO MVC
Background:
Given I am viewing todomvc
Scenario: Adding and Completing
When I add a new todo
And I finish it
Then I should see no undone todos
Pioneer.js
1 module.exports = function() {
2 this.Given(/^I am viewing todomvc$/, function() {
3 return this.driver.visit('http://todomvc.com/architecture-examples/backbone/');
4 });
5
6 this.When(/^I add a new todo$/, function() {
7 return this.Widget.fill({
8 selector: '#new-todo',
9 value: ['doge', Driver.Key.Enter]
10 })
11 });
Pioneer.js
1 this.When(/^I finish it$/, function() {
2 return this.Widget.click({
3 selector: '#todo-list .toggle'
4 });
5 });
6 return this.Then(/^I should see no undone todos$/, function() {
7 return this.Widget.read({
8 selector: '#todo-count'
9 }).should.eventually.eql('0 items left');
10 });
11 };
Future
?
!
It is yours, work on it
Thank you!
ipeychev

Mais conteúdo relacionado

Mais procurados

State Models for React with Redux
State Models for React with ReduxState Models for React with Redux
State Models for React with ReduxStephan Schmidt
 
Workshop 22: React-Redux Middleware
Workshop 22: React-Redux MiddlewareWorkshop 22: React-Redux Middleware
Workshop 22: React-Redux MiddlewareVisual Engineering
 
React + Redux + TypeScript === ♥
React + Redux + TypeScript === ♥React + Redux + TypeScript === ♥
React + Redux + TypeScript === ♥Remo Jansen
 
Better web apps with React and Redux
Better web apps with React and ReduxBetter web apps with React and Redux
Better web apps with React and ReduxAli Sa'o
 
Redux data flow with angular 2
Redux data flow with angular 2Redux data flow with angular 2
Redux data flow with angular 2Gil Fink
 
Designing applications with Redux
Designing applications with ReduxDesigning applications with Redux
Designing applications with ReduxFernando Daciuk
 
React for Dummies
React for DummiesReact for Dummies
React for DummiesMitch Chen
 
Better React state management with Redux
Better React state management with ReduxBetter React state management with Redux
Better React state management with ReduxMaurice De Beijer [MVP]
 
Workshop 23: ReactJS, React & Redux testing
Workshop 23: ReactJS, React & Redux testingWorkshop 23: ReactJS, React & Redux testing
Workshop 23: ReactJS, React & Redux testingVisual Engineering
 
Angular2 workshop
Angular2 workshopAngular2 workshop
Angular2 workshopNir Kaufman
 
Inversion Of Control
Inversion Of ControlInversion Of Control
Inversion Of ControlChad Hietala
 
Getting started with ReactJS
Getting started with ReactJSGetting started with ReactJS
Getting started with ReactJSKrishna Sunuwar
 
Introduction to ReactJS and Redux
Introduction to ReactJS and ReduxIntroduction to ReactJS and Redux
Introduction to ReactJS and ReduxBoris Dinkevich
 
React Lifecycle and Reconciliation
React Lifecycle and ReconciliationReact Lifecycle and Reconciliation
React Lifecycle and ReconciliationZhihao Li
 

Mais procurados (20)

React / Redux Architectures
React / Redux ArchitecturesReact / Redux Architectures
React / Redux Architectures
 
State Models for React with Redux
State Models for React with ReduxState Models for React with Redux
State Models for React with Redux
 
Workshop 22: React-Redux Middleware
Workshop 22: React-Redux MiddlewareWorkshop 22: React-Redux Middleware
Workshop 22: React-Redux Middleware
 
React + Redux + TypeScript === ♥
React + Redux + TypeScript === ♥React + Redux + TypeScript === ♥
React + Redux + TypeScript === ♥
 
Better web apps with React and Redux
Better web apps with React and ReduxBetter web apps with React and Redux
Better web apps with React and Redux
 
Redux data flow with angular 2
Redux data flow with angular 2Redux data flow with angular 2
Redux data flow with angular 2
 
Designing applications with Redux
Designing applications with ReduxDesigning applications with Redux
Designing applications with Redux
 
React, Flux and a little bit of Redux
React, Flux and a little bit of ReduxReact, Flux and a little bit of Redux
React, Flux and a little bit of Redux
 
React for Dummies
React for DummiesReact for Dummies
React for Dummies
 
Workshop React.js
Workshop React.jsWorkshop React.js
Workshop React.js
 
Let's Redux!
Let's Redux!Let's Redux!
Let's Redux!
 
Better React state management with Redux
Better React state management with ReduxBetter React state management with Redux
Better React state management with Redux
 
Advanced redux
Advanced reduxAdvanced redux
Advanced redux
 
ReactJS for Beginners
ReactJS for BeginnersReactJS for Beginners
ReactJS for Beginners
 
Workshop 23: ReactJS, React & Redux testing
Workshop 23: ReactJS, React & Redux testingWorkshop 23: ReactJS, React & Redux testing
Workshop 23: ReactJS, React & Redux testing
 
Angular2 workshop
Angular2 workshopAngular2 workshop
Angular2 workshop
 
Inversion Of Control
Inversion Of ControlInversion Of Control
Inversion Of Control
 
Getting started with ReactJS
Getting started with ReactJSGetting started with ReactJS
Getting started with ReactJS
 
Introduction to ReactJS and Redux
Introduction to ReactJS and ReduxIntroduction to ReactJS and Redux
Introduction to ReactJS and Redux
 
React Lifecycle and Reconciliation
React Lifecycle and ReconciliationReact Lifecycle and Reconciliation
React Lifecycle and Reconciliation
 

Semelhante a MODERN WEB DEV EVOLUTION

Vue JS @ MindDoc. The progressive road to online therapy
Vue JS @ MindDoc. The progressive road to online therapyVue JS @ MindDoc. The progressive road to online therapy
Vue JS @ MindDoc. The progressive road to online therapyDarío Blanco Iturriaga
 
Construire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradleConstruire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradleThierry Wasylczenko
 
The 2016 Android Developer Toolbox [MOBILIZATION]
The 2016 Android Developer Toolbox [MOBILIZATION]The 2016 Android Developer Toolbox [MOBILIZATION]
The 2016 Android Developer Toolbox [MOBILIZATION]Nilhcem
 
20150516 modern web_conf_tw
20150516 modern web_conf_tw20150516 modern web_conf_tw
20150516 modern web_conf_twTse-Ching Ho
 
Http Communication in Angular 2.0
Http Communication in Angular 2.0Http Communication in Angular 2.0
Http Communication in Angular 2.0Eyal Vardi
 
Angular2: Quick overview with 2do app example
Angular2: Quick overview with 2do app exampleAngular2: Quick overview with 2do app example
Angular2: Quick overview with 2do app exampleAlexey Frolov
 
Introducing Vuex in your project
Introducing Vuex in your projectIntroducing Vuex in your project
Introducing Vuex in your projectDenny Biasiolli
 
State manager in Vue.js, from zero to Vuex
State manager in Vue.js, from zero to VuexState manager in Vue.js, from zero to Vuex
State manager in Vue.js, from zero to VuexCommit University
 
Migrating from Flux to Redux. Why and how.
Migrating from Flux to Redux. Why and how.Migrating from Flux to Redux. Why and how.
Migrating from Flux to Redux. Why and how.Astrails
 
The Beauty Of Java Script V5a
The Beauty Of Java Script V5aThe Beauty Of Java Script V5a
The Beauty Of Java Script V5arajivmordani
 
Recoil at Codete Webinars #3
Recoil at Codete Webinars #3Recoil at Codete Webinars #3
Recoil at Codete Webinars #3Mateusz Bryła
 
Single Page Applications in Angular (italiano)
Single Page Applications in Angular (italiano)Single Page Applications in Angular (italiano)
Single Page Applications in Angular (italiano)Fabio Biondi
 
Apollo. The client we deserve
Apollo. The client we deserveApollo. The client we deserve
Apollo. The client we deserveYuri Nezdemkovski
 
[FEConf Korea 2017]Angular 컴포넌트 대화법
[FEConf Korea 2017]Angular 컴포넌트 대화법[FEConf Korea 2017]Angular 컴포넌트 대화법
[FEConf Korea 2017]Angular 컴포넌트 대화법Jeado Ko
 
Universal JavaScript - Frontend United Athens 2017
Universal JavaScript - Frontend United Athens 2017Universal JavaScript - Frontend United Athens 2017
Universal JavaScript - Frontend United Athens 2017Luciano Mammino
 

Semelhante a MODERN WEB DEV EVOLUTION (20)

Side effects-con-redux
Side effects-con-reduxSide effects-con-redux
Side effects-con-redux
 
Vue JS @ MindDoc. The progressive road to online therapy
Vue JS @ MindDoc. The progressive road to online therapyVue JS @ MindDoc. The progressive road to online therapy
Vue JS @ MindDoc. The progressive road to online therapy
 
Ngrx
NgrxNgrx
Ngrx
 
Construire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradleConstruire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradle
 
Intro to Ember.JS 2016
Intro to Ember.JS 2016Intro to Ember.JS 2016
Intro to Ember.JS 2016
 
The 2016 Android Developer Toolbox [MOBILIZATION]
The 2016 Android Developer Toolbox [MOBILIZATION]The 2016 Android Developer Toolbox [MOBILIZATION]
The 2016 Android Developer Toolbox [MOBILIZATION]
 
Advanced Silverlight
Advanced SilverlightAdvanced Silverlight
Advanced Silverlight
 
20150516 modern web_conf_tw
20150516 modern web_conf_tw20150516 modern web_conf_tw
20150516 modern web_conf_tw
 
Http Communication in Angular 2.0
Http Communication in Angular 2.0Http Communication in Angular 2.0
Http Communication in Angular 2.0
 
Angular2: Quick overview with 2do app example
Angular2: Quick overview with 2do app exampleAngular2: Quick overview with 2do app example
Angular2: Quick overview with 2do app example
 
Introducing Vuex in your project
Introducing Vuex in your projectIntroducing Vuex in your project
Introducing Vuex in your project
 
State manager in Vue.js, from zero to Vuex
State manager in Vue.js, from zero to VuexState manager in Vue.js, from zero to Vuex
State manager in Vue.js, from zero to Vuex
 
Migrating from Flux to Redux. Why and how.
Migrating from Flux to Redux. Why and how.Migrating from Flux to Redux. Why and how.
Migrating from Flux to Redux. Why and how.
 
The Beauty Of Java Script V5a
The Beauty Of Java Script V5aThe Beauty Of Java Script V5a
The Beauty Of Java Script V5a
 
Recoil at Codete Webinars #3
Recoil at Codete Webinars #3Recoil at Codete Webinars #3
Recoil at Codete Webinars #3
 
Single Page Applications in Angular (italiano)
Single Page Applications in Angular (italiano)Single Page Applications in Angular (italiano)
Single Page Applications in Angular (italiano)
 
Frontin like-a-backer
Frontin like-a-backerFrontin like-a-backer
Frontin like-a-backer
 
Apollo. The client we deserve
Apollo. The client we deserveApollo. The client we deserve
Apollo. The client we deserve
 
[FEConf Korea 2017]Angular 컴포넌트 대화법
[FEConf Korea 2017]Angular 컴포넌트 대화법[FEConf Korea 2017]Angular 컴포넌트 대화법
[FEConf Korea 2017]Angular 컴포넌트 대화법
 
Universal JavaScript - Frontend United Athens 2017
Universal JavaScript - Frontend United Athens 2017Universal JavaScript - Frontend United Athens 2017
Universal JavaScript - Frontend United Athens 2017
 

Último

Best VIP Call Girls Noida Sector 75 Call Me: 8448380779
Best VIP Call Girls Noida Sector 75 Call Me: 8448380779Best VIP Call Girls Noida Sector 75 Call Me: 8448380779
Best VIP Call Girls Noida Sector 75 Call Me: 8448380779Delhi Call girls
 
AlbaniaDreamin24 - How to easily use an API with Flows
AlbaniaDreamin24 - How to easily use an API with FlowsAlbaniaDreamin24 - How to easily use an API with Flows
AlbaniaDreamin24 - How to easily use an API with FlowsThierry TROUIN ☁
 
Call Girls Dubai Prolapsed O525547819 Call Girls In Dubai Princes$
Call Girls Dubai Prolapsed O525547819 Call Girls In Dubai Princes$Call Girls Dubai Prolapsed O525547819 Call Girls In Dubai Princes$
Call Girls Dubai Prolapsed O525547819 Call Girls In Dubai Princes$kojalkojal131
 
VIP Kolkata Call Girls Salt Lake 8250192130 Available With Room
VIP Kolkata Call Girls Salt Lake 8250192130 Available With RoomVIP Kolkata Call Girls Salt Lake 8250192130 Available With Room
VIP Kolkata Call Girls Salt Lake 8250192130 Available With Roomgirls4nights
 
Call Girls In Defence Colony Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Defence Colony Delhi 💯Call Us 🔝8264348440🔝Call Girls In Defence Colony Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Defence Colony Delhi 💯Call Us 🔝8264348440🔝soniya singh
 
Delhi Call Girls Rohini 9711199171 ☎✔👌✔ Whatsapp Hard And Sexy Vip Call
Delhi Call Girls Rohini 9711199171 ☎✔👌✔ Whatsapp Hard And Sexy Vip CallDelhi Call Girls Rohini 9711199171 ☎✔👌✔ Whatsapp Hard And Sexy Vip Call
Delhi Call Girls Rohini 9711199171 ☎✔👌✔ Whatsapp Hard And Sexy Vip Callshivangimorya083
 
On Starlink, presented by Geoff Huston at NZNOG 2024
On Starlink, presented by Geoff Huston at NZNOG 2024On Starlink, presented by Geoff Huston at NZNOG 2024
On Starlink, presented by Geoff Huston at NZNOG 2024APNIC
 
VIP Kolkata Call Girl Salt Lake 👉 8250192130 Available With Room
VIP Kolkata Call Girl Salt Lake 👉 8250192130  Available With RoomVIP Kolkata Call Girl Salt Lake 👉 8250192130  Available With Room
VIP Kolkata Call Girl Salt Lake 👉 8250192130 Available With Roomishabajaj13
 
Call Girls In Ashram Chowk Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Ashram Chowk Delhi 💯Call Us 🔝8264348440🔝Call Girls In Ashram Chowk Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Ashram Chowk Delhi 💯Call Us 🔝8264348440🔝soniya singh
 
VIP Call Girls Kolkata Ananya 🤌 8250192130 🚀 Vip Call Girls Kolkata
VIP Call Girls Kolkata Ananya 🤌  8250192130 🚀 Vip Call Girls KolkataVIP Call Girls Kolkata Ananya 🤌  8250192130 🚀 Vip Call Girls Kolkata
VIP Call Girls Kolkata Ananya 🤌 8250192130 🚀 Vip Call Girls Kolkataanamikaraghav4
 
Challengers I Told Ya ShirtChallengers I Told Ya Shirt
Challengers I Told Ya ShirtChallengers I Told Ya ShirtChallengers I Told Ya ShirtChallengers I Told Ya Shirt
Challengers I Told Ya ShirtChallengers I Told Ya Shirtrahman018755
 
Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝soniya singh
 
GDG Cloud Southlake 32: Kyle Hettinger: Demystifying the Dark Web
GDG Cloud Southlake 32: Kyle Hettinger: Demystifying the Dark WebGDG Cloud Southlake 32: Kyle Hettinger: Demystifying the Dark Web
GDG Cloud Southlake 32: Kyle Hettinger: Demystifying the Dark WebJames Anderson
 
Networking in the Penumbra presented by Geoff Huston at NZNOG
Networking in the Penumbra presented by Geoff Huston at NZNOGNetworking in the Penumbra presented by Geoff Huston at NZNOG
Networking in the Penumbra presented by Geoff Huston at NZNOGAPNIC
 
Hot Service (+9316020077 ) Goa Call Girls Real Photos and Genuine Service
Hot Service (+9316020077 ) Goa  Call Girls Real Photos and Genuine ServiceHot Service (+9316020077 ) Goa  Call Girls Real Photos and Genuine Service
Hot Service (+9316020077 ) Goa Call Girls Real Photos and Genuine Servicesexy call girls service in goa
 
AWS Community DAY Albertini-Ellan Cloud Security (1).pptx
AWS Community DAY Albertini-Ellan Cloud Security (1).pptxAWS Community DAY Albertini-Ellan Cloud Security (1).pptx
AWS Community DAY Albertini-Ellan Cloud Security (1).pptxellan12
 
VIP Kolkata Call Girl Kestopur 👉 8250192130 Available With Room
VIP Kolkata Call Girl Kestopur 👉 8250192130  Available With RoomVIP Kolkata Call Girl Kestopur 👉 8250192130  Available With Room
VIP Kolkata Call Girl Kestopur 👉 8250192130 Available With Roomdivyansh0kumar0
 
Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...
Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...
Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...SofiyaSharma5
 
Russian Call Girls in Kolkata Ishita 🤌 8250192130 🚀 Vip Call Girls Kolkata
Russian Call Girls in Kolkata Ishita 🤌  8250192130 🚀 Vip Call Girls KolkataRussian Call Girls in Kolkata Ishita 🤌  8250192130 🚀 Vip Call Girls Kolkata
Russian Call Girls in Kolkata Ishita 🤌 8250192130 🚀 Vip Call Girls Kolkataanamikaraghav4
 

Último (20)

Best VIP Call Girls Noida Sector 75 Call Me: 8448380779
Best VIP Call Girls Noida Sector 75 Call Me: 8448380779Best VIP Call Girls Noida Sector 75 Call Me: 8448380779
Best VIP Call Girls Noida Sector 75 Call Me: 8448380779
 
AlbaniaDreamin24 - How to easily use an API with Flows
AlbaniaDreamin24 - How to easily use an API with FlowsAlbaniaDreamin24 - How to easily use an API with Flows
AlbaniaDreamin24 - How to easily use an API with Flows
 
Call Girls Dubai Prolapsed O525547819 Call Girls In Dubai Princes$
Call Girls Dubai Prolapsed O525547819 Call Girls In Dubai Princes$Call Girls Dubai Prolapsed O525547819 Call Girls In Dubai Princes$
Call Girls Dubai Prolapsed O525547819 Call Girls In Dubai Princes$
 
VIP Kolkata Call Girls Salt Lake 8250192130 Available With Room
VIP Kolkata Call Girls Salt Lake 8250192130 Available With RoomVIP Kolkata Call Girls Salt Lake 8250192130 Available With Room
VIP Kolkata Call Girls Salt Lake 8250192130 Available With Room
 
Call Girls In Defence Colony Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Defence Colony Delhi 💯Call Us 🔝8264348440🔝Call Girls In Defence Colony Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Defence Colony Delhi 💯Call Us 🔝8264348440🔝
 
Delhi Call Girls Rohini 9711199171 ☎✔👌✔ Whatsapp Hard And Sexy Vip Call
Delhi Call Girls Rohini 9711199171 ☎✔👌✔ Whatsapp Hard And Sexy Vip CallDelhi Call Girls Rohini 9711199171 ☎✔👌✔ Whatsapp Hard And Sexy Vip Call
Delhi Call Girls Rohini 9711199171 ☎✔👌✔ Whatsapp Hard And Sexy Vip Call
 
On Starlink, presented by Geoff Huston at NZNOG 2024
On Starlink, presented by Geoff Huston at NZNOG 2024On Starlink, presented by Geoff Huston at NZNOG 2024
On Starlink, presented by Geoff Huston at NZNOG 2024
 
VIP Kolkata Call Girl Salt Lake 👉 8250192130 Available With Room
VIP Kolkata Call Girl Salt Lake 👉 8250192130  Available With RoomVIP Kolkata Call Girl Salt Lake 👉 8250192130  Available With Room
VIP Kolkata Call Girl Salt Lake 👉 8250192130 Available With Room
 
Call Girls In Ashram Chowk Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Ashram Chowk Delhi 💯Call Us 🔝8264348440🔝Call Girls In Ashram Chowk Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Ashram Chowk Delhi 💯Call Us 🔝8264348440🔝
 
VIP Call Girls Kolkata Ananya 🤌 8250192130 🚀 Vip Call Girls Kolkata
VIP Call Girls Kolkata Ananya 🤌  8250192130 🚀 Vip Call Girls KolkataVIP Call Girls Kolkata Ananya 🤌  8250192130 🚀 Vip Call Girls Kolkata
VIP Call Girls Kolkata Ananya 🤌 8250192130 🚀 Vip Call Girls Kolkata
 
Challengers I Told Ya ShirtChallengers I Told Ya Shirt
Challengers I Told Ya ShirtChallengers I Told Ya ShirtChallengers I Told Ya ShirtChallengers I Told Ya Shirt
Challengers I Told Ya ShirtChallengers I Told Ya Shirt
 
Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝
 
GDG Cloud Southlake 32: Kyle Hettinger: Demystifying the Dark Web
GDG Cloud Southlake 32: Kyle Hettinger: Demystifying the Dark WebGDG Cloud Southlake 32: Kyle Hettinger: Demystifying the Dark Web
GDG Cloud Southlake 32: Kyle Hettinger: Demystifying the Dark Web
 
Networking in the Penumbra presented by Geoff Huston at NZNOG
Networking in the Penumbra presented by Geoff Huston at NZNOGNetworking in the Penumbra presented by Geoff Huston at NZNOG
Networking in the Penumbra presented by Geoff Huston at NZNOG
 
Hot Service (+9316020077 ) Goa Call Girls Real Photos and Genuine Service
Hot Service (+9316020077 ) Goa  Call Girls Real Photos and Genuine ServiceHot Service (+9316020077 ) Goa  Call Girls Real Photos and Genuine Service
Hot Service (+9316020077 ) Goa Call Girls Real Photos and Genuine Service
 
AWS Community DAY Albertini-Ellan Cloud Security (1).pptx
AWS Community DAY Albertini-Ellan Cloud Security (1).pptxAWS Community DAY Albertini-Ellan Cloud Security (1).pptx
AWS Community DAY Albertini-Ellan Cloud Security (1).pptx
 
Dwarka Sector 26 Call Girls | Delhi | 9999965857 🫦 Vanshika Verma More Our Se...
Dwarka Sector 26 Call Girls | Delhi | 9999965857 🫦 Vanshika Verma More Our Se...Dwarka Sector 26 Call Girls | Delhi | 9999965857 🫦 Vanshika Verma More Our Se...
Dwarka Sector 26 Call Girls | Delhi | 9999965857 🫦 Vanshika Verma More Our Se...
 
VIP Kolkata Call Girl Kestopur 👉 8250192130 Available With Room
VIP Kolkata Call Girl Kestopur 👉 8250192130  Available With RoomVIP Kolkata Call Girl Kestopur 👉 8250192130  Available With Room
VIP Kolkata Call Girl Kestopur 👉 8250192130 Available With Room
 
Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...
Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...
Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...
 
Russian Call Girls in Kolkata Ishita 🤌 8250192130 🚀 Vip Call Girls Kolkata
Russian Call Girls in Kolkata Ishita 🤌  8250192130 🚀 Vip Call Girls KolkataRussian Call Girls in Kolkata Ishita 🤌  8250192130 🚀 Vip Call Girls Kolkata
Russian Call Girls in Kolkata Ishita 🤌 8250192130 🚀 Vip Call Girls Kolkata
 

MODERN WEB DEV EVOLUTION

  • 2. Evolution of the Web frameworks and libraries
  • 4. Pros Cons Cross browser API Powerful DOM queries OOTB Ajax Plugins system Tight coupling with HTML tags Tracking DOM events is hard Misleading API ("on" might be on or delegate, it depends) Slow
  • 6. Pros Cons Cross browser API Powerful DOM queries OOTB Ajax, PJax, etc. Plugins system Traversing DOM was slow Some of the modules were crappy Tried to provide everything Contributing was hard Loading modules Widgets App framework Designed to serve the old browsers
  • 8. Pros Cons Two way data binding Declarative HTML Complex concepts Slow dirty checking Logic everywhere Client-side framework (rendering on the server is possible, but tricky) They invented Karma :)
  • 10. Pros Cons Auto-synced models via REST API Robust event system Bare-bones features jQuery like views
  • 12. Pros Cons True MVC pattern Templating system based on Handlebars A lot of black magic Context switching Complicated two-way data binding
  • 14. Pros Cons Minimal (view part only) One-way data flow Requires change of mindset Simple concepts Fast (60 fps) Isomorphic applications, client-side applications, native applications Abolishes the rules made of stone REACT
  • 15. React in a nutshell
  • 16. React in a nutshell Library, not a framework Implements one- way reactive data flow Blazingly fast
  • 17. React in a nutshell Virtual DOM JSX JavaScript syntax extension (JSX)
  • 18. React in a nutshell Native applications Isomorphic applications Client-side applications
  • 21. Creating a component Render the component Change the state
  • 22. And rendering is fast Virtual DOM rulez Performance
  • 24. ES6 & 7 main features Classes Modules importing Syntactic sugar over functions Class and properties decorators (annotations) Variables and constants Block scoping
  • 25. Built-in Promises Template strings Default function parameter values Function generators Symbols Proxies … more here ES6 & 7 main features
  • 26. EcmaScript 6 and 7 in action 1 import screwdriver from '/tools/bag'; 2 import pliers from '/tools/bag'; 3 import Visible from '/state/Visible'; 4 import {Attribute as attr} from '/attributes/Attribute'; 5 6 @Visible 7 class Component extends Base { 8 constructor() { 9 super(); 10 } 11 12 helloWorld() { 13 return { 14 myProp: () => { return 'Hello World!';} 15 }; 16 } 17 18 @attr 19 prop1 = 23; 20 } 21 22 export default Some;
  • 27. EcmaScript 6 and 7 in action 1 import screwdriver from '/tools/bag'; 2 import pliers from '/tools/bag'; 3 import Visible from '/state/Visible'; 4 import {Attribute as attr} from '/attributes/Attribute'; 5 6 @Visible 7 class Component extends Base { 8 constructor() { 9 super(); 10 } 11 12 helloWorld() { 13 return { 14 myProp: () => { return 'Hello World!';} 15 }; 16 } 17 18 @attr 19 prop1 = 23; 20 } 21 22 export default Some; Imports
  • 28. EcmaScript 6 and 7 in action 1 import screwdriver from '/tools/bag'; 2 import pliers from '/tools/bag'; 3 import Visible from '/state/Visible'; 4 import {Attribute as attr} from '/attributes/Attribute'; 5 6 @Visible 7 class Component extends Base { 8 constructor() { 9 super(); 10 } 11 12 helloWorld() { 13 return { 14 myProp: () => { return 'Hello World!';} 15 }; 16 } 17 18 @attr 19 prop1 = 23; 20 } 21 22 export default Some; Class annotations
  • 29. EcmaScript 6 and 7 in action 1 import screwdriver from '/tools/bag'; 2 import pliers from '/tools/bag'; 3 import Visible from '/state/Visible'; 4 import {Attribute as attr} from '/attributes/Attribute'; 5 6 @Visible 7 class Component extends Base { 8 constructor() { 9 super(); 10 } 11 12 helloWorld() { 13 return { 14 myProp: () => { return 'Hello World!';} 15 }; 16 } 17 18 @attr 19 prop1 = 23; 20 } 21 22 export default Some; Classes
  • 30. EcmaScript 6 and 7 in action 1 import screwdriver from '/tools/bag'; 2 import pliers from '/tools/bag'; 3 import Visible from '/state/Visible'; 4 import {Attribute as attr} from '/attributes/Attribute'; 5 6 @Visible 7 class Component extends Base { 8 constructor() { 9 super(); 10 } 11 12 helloWorld() { 13 return { 14 myProp: () => { return 'Hello World!';} 15 }; 16 } 17 18 @attr 19 prop1 = 23; 20 } 21 22 export default Some; Inheritance
  • 31. EcmaScript 6 and 7 in action 1 import screwdriver from '/tools/bag'; 2 import pliers from '/tools/bag'; 3 import Visible from '/state/Visible'; 4 import {Attribute as attr} from '/attributes/Attribute'; 5 6 @Visible 7 class Component extends Base { 8 constructor() { 9 super(); 10 } 11 12 helloWorld() { 13 return { 14 myProp: () => { return 'Hello World!';} 15 }; 16 } 17 18 @attr 19 prop1 = 23; 20 } 21 22 export default Some; Functions
  • 32. EcmaScript 6 and 7 in action 1 import screwdriver from '/tools/bag'; 2 import pliers from '/tools/bag'; 3 import Visible from '/state/Visible'; 4 import {Attribute as attr} from '/attributes/Attribute'; 5 6 @Visible 7 class Component extends Base { 8 constructor() { 9 super(); 10 } 11 12 helloWorld() { 13 return { 14 myProp: () => { return 'Hello World!';} 15 }; 16 } 17 18 @attr 19 prop1 = 23; 20 } 21 22 export default Some; Fat arrows
  • 33. EcmaScript 6 and 7 in action 1 import screwdriver from '/tools/bag'; 2 import pliers from '/tools/bag'; 3 import Visible from '/state/Visible'; 4 import {Attribute as attr} from '/attributes/Attribute'; 5 6 @Visible 7 class Component extends Base { 8 constructor() { 9 super(); 10 } 11 12 helloWorld() { 13 return { 14 myProp: () => { return 'Hello World!';} 15 }; 16 } 17 18 @attr 19 prop1 = 23; 20 } 21 22 export default Some; Props annotations
  • 34. EcmaScript 6 and 7 in action 1 import screwdriver from '/tools/bag'; 2 import pliers from '/tools/bag'; 3 import Visible from '/state/Visible'; 4 import {Attribute as attr} from '/attributes/Attribute'; 5 6 @Visible 7 class Component extends Base { 8 constructor() { 9 super(); 10 } 11 12 helloWorld() { 13 return { 14 myProp: () => { return 'Hello World!';} 15 }; 16 } 17 18 @attr 19 prop1 = 23; 20 } 21 22 export default Some; Class properties
  • 35. EcmaScript 6 and 7 in action 1 import screwdriver from '/tools/bag'; 2 import pliers from '/tools/bag'; 3 import Visible from '/state/Visible'; 4 import {Attribute as attr} from '/attributes/Attribute'; 5 6 @Visible 7 class Component extends Base { 8 constructor() { 9 super(); 10 } 11 12 helloWorld() { 13 return { 14 myProp: () => { return 'Hello World!';} 15 }; 16 } 17 18 @attr 19 prop1 = 23; 20 } 21 22 export default Some; Module exports
  • 38. Plenty of React-wanna-be frameworks and libraries Plenty of Flux implementations
  • 41. Plenty of Virtual DOM implementations A lot of on GitHub as part of framework/library or just like a module
  • 42. The other frameworks evolve Ember changes to benefit from React’s ideas Angular too
  • 43. Framework evolution in the wrong way
  • 44. Reactive programming (warning - changes the mindset)
  • 45. Changes the way we think about asynchronous programming
  • 46. Everything is Observable Reactive programming including the events
  • 47. Let’s implement Drag&Drop 1 var dragTarget = document.getElementById('dragTarget'); 2 3 var mousedown = Observable.fromEvent(dragTarget, 'mousedown'); 4 var mousemove = Observable.fromEvent(document, 'mousemove'); 5 var mouseup = Observable.fromEvent(dragTarget, 'mouseup'); 6 7 var mousedrag = mousedown.flatMap(function(mousedown) { 8 var startX = mousedown.offsetX, 9 startY = mousedown.offsetY; 10 11 return mousemove.map(function(mousemove) { 12 mousemove.preventDefault(); 13 14 return { 15 left: mousemove.clientX - startX, 16 top: mousemove.clientY - startY 17 }; 18 }).takeUntil(mouseup); 19 }); 20 21 var subscription = mousedrag.subscribe(function(pos) { 22 dragTarget.style.top = pos.top + 'px'; 23 dragTarget.style.left = pos.left + 'px'; 24 });
  • 48. Let’s implement Drag&Drop 1 var dragTarget = document.getElementById('dragTarget'); 2 3 var mousedown = Observable.fromEvent(dragTarget, 'mousedown'); 4 var mousemove = Observable.fromEvent(document, 'mousemove'); 5 var mouseup = Observable.fromEvent(dragTarget, 'mouseup'); 6 7 var mousedrag = mousedown.flatMap(function(mousedown) { 8 var startX = mousedown.offsetX, 9 startY = mousedown.offsetY; 10 11 return mousemove.map(function(mousemove) { 12 mousemove.preventDefault(); 13 14 return { 15 left: mousemove.clientX - startX, 16 top: mousemove.clientY - startY 17 }; 18 }).takeUntil(mouseup); 19 }); 20 21 var subscription = mousedrag.subscribe(function(pos) { 22 dragTarget.style.top = pos.top + 'px'; 23 dragTarget.style.left = pos.left + 'px'; 24 }); Get the drag target
  • 49. Let’s implement Drag&Drop 1 var dragTarget = document.getElementById('dragTarget'); 2 3 var mousedown = Observable.fromEvent(dragTarget, 'mousedown'); 4 var mousemove = Observable.fromEvent(document, 'mousemove'); 5 var mouseup = Observable.fromEvent(dragTarget, 'mouseup'); 6 7 var mousedrag = mousedown.flatMap(function(mousedown) { 8 var startX = mousedown.offsetX, 9 startY = mousedown.offsetY; 10 11 return mousemove.map(function(mousemove) { 12 mousemove.preventDefault(); 13 14 return { 15 left: mousemove.clientX - startX, 16 top: mousemove.clientY - startY 17 }; 18 }).takeUntil(mouseup); 19 }); 20 21 var subscription = mousedrag.subscribe(function(pos) { 22 dragTarget.style.top = pos.top + 'px'; 23 dragTarget.style.left = pos.left + 'px'; 24 }); Observables from events
  • 50. Let’s implement Drag&Drop 1 var dragTarget = document.getElementById('dragTarget'); 2 3 var mousedown = Observable.fromEvent(dragTarget, 'mousedown'); 4 var mousemove = Observable.fromEvent(document, 'mousemove'); 5 var mouseup = Observable.fromEvent(dragTarget, 'mouseup'); 6 7 var mousedrag = mousedown.flatMap(function(mousedown) { 8 var startX = mousedown.offsetX, 9 startY = mousedown.offsetY; 10 11 return mousemove.map(function(mousemove) { 12 mousemove.preventDefault(); 13 14 return { 15 left: mousemove.clientX - startX, 16 top: mousemove.clientY - startY 17 }; 18 }).takeUntil(mouseup); 19 }); 20 21 var subscription = mousedrag.subscribe(function(pos) { 22 dragTarget.style.top = pos.top + 'px'; 23 dragTarget.style.left = pos.left + 'px'; 24 }); Process these as arrays
  • 51. Let’s implement Drag&Drop 1 var dragTarget = document.getElementById('dragTarget'); 2 3 var mousedown = Observable.fromEvent(dragTarget, 'mousedown'); 4 var mousemove = Observable.fromEvent(document, 'mousemove'); 5 var mouseup = Observable.fromEvent(dragTarget, 'mouseup'); 6 7 var mousedrag = mousedown.flatMap(function(mousedown) { 8 var startX = mousedown.offsetX, 9 startY = mousedown.offsetY; 10 11 return mousemove.map(function(mousemove) { 12 mousemove.preventDefault(); 13 14 return { 15 left: mousemove.clientX - startX, 16 top: mousemove.clientY - startY 17 }; 18 }).takeUntil(mouseup); 19 }); 20 21 var subscription = mousedrag.subscribe(function(pos) { 22 dragTarget.style.top = pos.top + 'px'; 23 dragTarget.style.left = pos.left + 'px'; 24 }); Map mouse move
  • 52. Let’s implement Drag&Drop 1 var dragTarget = document.getElementById('dragTarget'); 2 3 var mousedown = Observable.fromEvent(dragTarget, 'mousedown'); 4 var mousemove = Observable.fromEvent(document, 'mousemove'); 5 var mouseup = Observable.fromEvent(dragTarget, 'mouseup'); 6 7 var mousedrag = mousedown.flatMap(function(mousedown) { 8 var startX = mousedown.offsetX, 9 startY = mousedown.offsetY; 10 11 return mousemove.map(function(mousemove) { 12 mousemove.preventDefault(); 13 14 return { 15 left: mousemove.clientX - startX, 16 top: mousemove.clientY - startY 17 }; 18 }).takeUntil(mouseup); 19 }); 20 21 var subscription = mousedrag.subscribe(function(pos) { 22 dragTarget.style.top = pos.top + 'px'; 23 dragTarget.style.left = pos.left + 'px'; 24 }); Stop on mouse up
  • 53. Let’s implement Drag&Drop 1 var dragTarget = document.getElementById('dragTarget'); 2 3 var mousedown = Observable.fromEvent(dragTarget, 'mousedown'); 4 var mousemove = Observable.fromEvent(document, 'mousemove'); 5 var mouseup = Observable.fromEvent(dragTarget, 'mouseup'); 6 7 var mousedrag = mousedown.flatMap(function(mousedown) { 8 var startX = mousedown.offsetX, 9 startY = mousedown.offsetY; 10 11 return mousemove.map(function(mousemove) { 12 mousemove.preventDefault(); 13 14 return { 15 left: mousemove.clientX - startX, 16 top: mousemove.clientY - startY 17 }; 18 }).takeUntil(mouseup); 19 }); 20 21 var subscription = mousedrag.subscribe(function(pos) { 22 dragTarget.style.top = pos.top + 'px'; 23 dragTarget.style.left = pos.left + 'px'; 24 }); Update position on mousedrag
  • 54.
  • 55. CSS acronym for CSS Seriously Sucks ;)
  • 57. Can be dynamically collapsed or uncollapsed along the main axis while preserving the container’s cross size. Can be laid out in any flow direction (leftwards, rightwards, downwards, upwards) Can have display order reversed or rearranged at the style layer (i.e., visual order can be independent of source and speech order) Can be laid out linearly along a single (main) axis or wrapped into multiple lines along a secondary (cross) axis Can “flex” element’s sizes to respond to the available space Can be aligned with respect to their container or each other Child elements in Flexbox
  • 59. Every time you add CSS rule, Global CSS sucks you risk clashing with something else
  • 61. CSS as modules, local scope by default
  • 62. Webpack’s CSS Modules The CSS for a module is isolated, despite of class names like ‘.main’
  • 63. Webpack’s CSS Modules You can extend and import classes
  • 64. Webpack’s CSS Modules MyComponent.css 1 .main { 2 border-width: 2px; 3 border-style: solid; 4 border-color: #777; 5 padding: 0 20px; 6 margin: 0 6px; 7 max-width: 400px; 8 } 9 10 .text { 11 color: #777; 12 font-size: 24px; 13 font-family: helvetica, arial, sans-serif; 14 font-weight: 600; 15 }
  • 65. Webpack’s CSS Modules MyComponent.js 1 import styles from './MyComponent.css'; 2 import React, {Component} from 'react'; 3 4 export default class MyComponent extends Component { 5 6 render() { 7 return ( 8 <div className={styles.main}> 9 <p className={styles.text}>Scoped Selectors</p> 10 </div> 11 ); 12 } 13 };
  • 66. Webpack’s CSS Modules Webpack will compile the CSS classes prefix and isolate them so they won’t clash
  • 67. Webpack’s CSS Modules Global selectors are available (but please avoid them)
  • 68. 1 .main { 2 border-width: 2px; 3 border-style: solid; 4 border-color: #777; 5 padding: 0 20px; 6 margin: 0 6px; 7 max-width: 400px; 8 } 9 10 .main :global p { 11 color: #777; 12 font-size: 24px; 13 font-family: helvetica, arial, sans-serif; 14 font-weight: 600; 15 } Webpack’s CSS Modules MyComponent.css This will style al `p` inside the component
  • 69. Webpack’s CSS Modules MyComponent.js 1 import styles from './MyComponent.css'; 2 import React, {Component} from 'react'; 3 4 export default class MyComponent extends Component { 5 6 render() { 7 return ( 8 <div className={styles.main}> 9 <p>content</p> 10 </div> 11 ); 12 } 13 }; `p` will be styled b/c of the global selector
  • 70. Webpack’s CSS Modules CSS inheritance from shared modules
  • 71. Webpack’s CSS Modules 1 .container { 2 border-width: 2px; 3 border-style: solid; 4 padding: 0 20px; 5 margin: 0 6px; 6 max-width: 400px; 7 } layout.css
  • 72. Webpack’s CSS Modules 1 .main { 2 extends: container from "layout.css"; 3 border-color: red; 4 } MyComponent.css
  • 73. This is CSS finally fixed
  • 75.
  • 76. Unit tests Karma + Mocha + Chai + Sinon
  • 78. Pioneer.js You write the tests in the English-like Gherkin syntax Cucumber
  • 79. Pioneer.js Feature: TODO MVC Background: Given I am viewing todomvc Scenario: Adding and Completing When I add a new todo And I finish it Then I should see no undone todos
  • 80. Pioneer.js 1 module.exports = function() { 2 this.Given(/^I am viewing todomvc$/, function() { 3 return this.driver.visit('http://todomvc.com/architecture-examples/backbone/'); 4 }); 5 6 this.When(/^I add a new todo$/, function() { 7 return this.Widget.fill({ 8 selector: '#new-todo', 9 value: ['doge', Driver.Key.Enter] 10 }) 11 });
  • 81. Pioneer.js 1 this.When(/^I finish it$/, function() { 2 return this.Widget.click({ 3 selector: '#todo-list .toggle' 4 }); 5 }); 6 return this.Then(/^I should see no undone todos$/, function() { 7 return this.Widget.read({ 8 selector: '#todo-count' 9 }).should.eventually.eql('0 items left'); 10 }); 11 };
  • 83. ?
  • 84. !
  • 85. It is yours, work on it