eswho, eswhat, eswow -- feducation -- ibm design

113
ESWHO, ESWHAT, ESWOW Josh Black :: General Assembly :: December 2, 2015 . FED@IBM

Upload: joshua-black

Post on 14-Apr-2017

143 views

Category:

Engineering


1 download

TRANSCRIPT

Page 1: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

ESWHO, ESWHAT, ESWOW

Josh Black :: General Assembly :: December 2, 2015

.FED@IBM

Page 2: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

IBM Design

Page 3: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

IBM Design

Hills

Page 4: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

IBM Design

Hills

Page 5: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Hills

Allow Offering Management, Engineering, and Design to collaborate effectively

Describe product development work that we can take on for the next release

Allows global teams to always stay in alignment

Page 6: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

A Front-End Developer can begin using ES2015 in their projects immediately after seeing this talk.

.FED@IBM

General Assembly Hill

Page 7: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

A Front-End Developer can begin using ES2015 in their projects immediately after seeing this talk.

.FED@IBM

Who

Page 8: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

A Front-End Developer can begin using ES2015 in their projects immediately after seeing this talk.

.FED@IBM

What

Page 9: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

A Front-End Developer can begin using ES2015 in their projects immediately after seeing this talk.

.FED@IBM

Wow

Page 10: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Overview

Who What is an ECMAScript, where did it come from? What does ES6 or ES2015 mean?

What What does it mean to use ES2015 in my projects?

Wow How can I begin applying new features available from ES2015 in my projects today?

Page 11: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

0Part 0 Setting the Stage

What is an ECMAScript?

.FED@IBM

Page 12: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

In the beginning, Brendan Eich created JavaScript.

1995

.FED@IBM

Page 13: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

First edition of ECMAScript is published.

1996

.FED@IBM

Page 14: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Fifth edition of ECMAScript is published.

2009

.FED@IBM

Page 15: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Sixth edition of ECMAScript is published.

2015

.FED@IBM

Page 16: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

ES3 core features

.FED@IBM

Page 17: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

ES5 new functions and strict mode

.FED@IBM

Page 18: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

ES2015 new syntax, concepts, etc.

.FED@IBM

Page 19: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

ES2016+ async/await, utility functions, observables?

.FED@IBM

Page 20: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

1Part 1 All About ES6

.FED@IBM

Page 21: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

1Part 1 All About ES6 ES2015

.FED@IBM

Page 22: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Introduction:ECMAScript 2015 is the upcoming version of the ECMAScript standard.

.FED@IBM

Page 23: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Arrow Functions Classes Enhanced Object Literals Template Strings Destructuring Default + Rest + Spread Let + Const Iterators + for…of Generators Comprehensions Unicode Modules Module Loaders Map Set

.FED@IBM

ECMAScript 2015 Features

WeakMap WeakSet Proxies Symbols Subclassable Built-ins Math + Number + String + Object APIs Binary and Octary Literals Promises Reflect API Tail Calls

Page 24: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

ES2015 is big. Like, really big.

.FED@IBM

Page 25: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Disclaimer: This content is dense.

.FED@IBM

Page 26: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Variables

Page 27: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Variables

// ES5 var a = 1;

Page 28: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Variables

for (var i = 0; i < 10; i++) { setTimeout(function () { console.log(i); }, 100 * i); }

Page 29: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Variables

// Outer Scope var i;

for (i = 0; i < 10; i++) { setTimeout(function () { console.log(i); }, 100 * i); }

Page 30: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Variables

// ES6 let a = 1;

Page 31: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Variables

for (let i = 0; i < 10; i++) { setTimeout(function () { console.log(i); }, 100 * i); }

Page 32: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Variables

// Block Scoped let a = 1; const b = 2;

Page 33: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Variables

// Block Scoped let a = 1; const b = 2;

a = 2; // All good! b = 1; // "b" is read-only

Page 34: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Template Literals

Page 35: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Template Literals

const a = 'Hello'; const b = 'World'; const msg = `${a} ${b}!`; // Hello World!

Page 36: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Template Literals

const a = 'Hello'; const b = 'World'; const msg = `${a} ${b}!`; // Hello World!

// ES5 var a = 'Hello'; var b = 'World'; var msg = a + ' ' + b + '!'; // Hello World!

Page 37: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Template Literals

function sayHelloTo(name) { return `Hello ${name}!`; }

sayHelloTo('Jessica'); // Hello Jessica!

Page 38: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Arrow Functions

Page 39: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Arrow Functions

const odds = evens.map(v => v + 1); const nums = evens.map((v, i) => v + i);

Page 40: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Arrow Functions

// ES2015 const odds = evens.map(v => v + 1); const nums = evens.map((v, i) => v + i);

// ES5 var odds = evens.map(function (v) { return v + 1; });

Page 41: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Arrow Functions

// Statement bodies nums.forEach((v) => { if (v % 5 === 0) fives.push(v); });

Page 42: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Arrow Functions

// ES2015 nums.forEach((v) => { if (v % 5 === 0) fives.push(v); });

// ES5 nums.forEach(function (v) { if (v % 5 === 0) fives.push(v); });

Page 43: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Arrow Functions

// Lexical this var sally = { name: 'Sally', friends: ['Jane', 'Robert', 'Dillon'], printFriends() { this.friends.forEach(function (f) { console.log(this.name + ' knows ' + f); }); } }

sally.printFriends(); // Cannot read property 'name' of undefined

Page 44: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Arrow Functions

// Lexical this var sally = { name: 'Sally', friends: ['Jane', 'Robert', 'Dillon'], printFriends() { this.friends.forEach((f) => console.log(this.name + ' knows ' + f)); } }

sally.printFriends(); // Sally knows Jane // Sally knows Robert // Sally knows Dillon

Page 45: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Objects

Page 46: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Objects

const object = { foo: 'bar' };

Page 47: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Shorthand Property

var name = 'Josh'; var age = 22; var person = { name: name, age: age };

Page 48: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Shorthand Property

var name = 'Josh'; var age = 22; var person = { name: name, age: age };

const name = 'Josh'; const age = 22; const person = { name, age };

Page 49: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Shorthand Method Property

var obj = { foo: function foo() {} };

Page 50: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Shorthand Method Property

const obj = { foo() {} };

var obj = { foo: function foo() {} };

Page 51: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Destructuring

Page 52: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Destructuring

function constructor(config) { var id = config.id, name = config.name || ''; // ... }

Page 53: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Destructuring (Objects)

function constructor(config) { const { id, name } = config; // ... }

Page 54: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Destructuring (Objects)

function constructor({ id, name }) { // ... }

Page 55: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Destructuring (Objects)

function constructor({ id, name }) { // ... }

// Usage const o = { id: 1, name: 'Susan' }; constructor(o);

Page 56: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Destructuring (Arrays)

const arr = [1, 2, 3]; const [a, b, c] = arr; // a = 1, b = 2, c = 3

Page 57: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Destructuring (Arrays)

const arr = [1, 2, 3]; const [a, ...b] = arr; // a = 1, b = [2, 3]

Page 58: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Rest

Page 59: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Rest

function f() { var args = [].slice.call(arguments, 0); return args.length; }

f(1, 2, 3); // 3

Page 60: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Rest

function f(...args) { return args.length; }

f(1, 2, 3); // 3

Page 61: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Spread

Page 62: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Spread

function sum(x, y, z) { return x + y + z; }

sum(...[1, 2, 3]); // 6

Page 63: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Spread

function sum(x, y, z) { return x + y + z; }

sum(...[1, 2, 3]); // 6

sum.apply(undefined, [1, 2, 3]);

Page 64: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Spread

function sum(x, y, z) { return x + y + z; }

sum(...[1, 2, 3]); // 6

sum.apply(undefined, [1, 2, 3]);

sum(1, 2, 3); // 6

Page 65: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Spread (for Objects)

const a = { width: 100 }; const b = { height: 100 }; const c = { ...a, ...b }; // { width: 100, height: 100 }

Page 66: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Default Parameters

Page 67: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Default Parameters

function foo(bar) { bar = bar || 1; // ... }

Page 68: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Default Parameters

function foo(bar = 1) { // ... }

Page 69: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Default Parameters

function constructor({ index = 1, hidden = true }) { // ... }

Page 70: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Modules

Page 71: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Modular Composed of a set of highly decoupled, distinct pieces of functionality stored in modules.

.FED@IBM

Page 72: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Imports

// ES5, CommonJS var d3 = require('d3');

// ES2015 import d3 from 'd3';

Page 73: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Named Imports

// ES5, CommonJS var svg = require('d3').svg;

// ES2015 import { svg } from 'd3';

Page 74: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Default Exports

// ES5 module.exports = function () {}

// ES2015 export default function () {}

Page 75: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Named Export

// ES5 exports.foo = 'bar';

// ES2015 export const foo = 'bar';

Page 76: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Collections

Page 77: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Map

var colors = { white: '#FFFFFF', black: '#000000' };

colors.white; // '#FFFFFF' colors.black; // '#000000'

Page 78: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Map

var m = new Map(); m.set('white', '#FFFFFF'); m.set('black', '#000000'); m.get('black') === '#000000';

Page 79: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Map

const m = new Map([ ['white', '#FFFFFF'], ['black', '#000000'] ]);

m.has('purple'); // false m.get('white'); // #FFFFFF m.get('black'); // #000000

Page 80: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Set

var s = new Set(); s.add(1).add(2).add(1); s.size === 2; s.has(1) === true;

Page 81: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

APIs

Page 82: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

.FED@IBM

Array

// Returns a real Array Array.from(document.querySelectorAll("*"))

// Similar to new Array(...), but without // special one-arg behavior Array.of(1, 2, 3)

[0, 0, 0].fill(7) // [7,7,7]

[1, 2, 3].findIndex((x) => x === 2) // 1

Page 83: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Promises

Page 84: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Promises Let you write asynchronous code, synchronously.

.FED@IBM

Page 85: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Promises

.FED@IBM

Pending Hasn't fulfilled or

rejected yet

Rejected The action relating to the promise failed

Fulfilled The action relating to the promise succeeded

Settled

Page 86: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Promise

.FED@IBM

var promise = new Promise((resolve, reject) => { setTimeout(() => { resolve('Hello World'); }, 1000); });

promise .then((data) => console.log(data)); // 'Hello World'

Page 87: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Promise

.FED@IBM

fetch('/api/v1') .then((response) => response.json()) .then((result) => { // ... });

Page 88: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Classes

Page 89: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Classes

function Person(name) { this.name = name; }

Person.prototype.sayName = function sayName() { return `My name is ${this.name}!`; }

const Iheanyi = new Person('Iheanyi'); console.log(Iheanyi.sayName()); // My name is Iheanyi!

.FED@IBM

Page 90: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Classes

class Person { constructor(name) { this.name = name; } sayName() { return `My name is ${this.name}!`; } } const Iheanyi = new Person('Iheanyi'); console.log(Iheanyi.sayName()); // My name is Iheanyi!

.FED@IBM

Page 91: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Classes

// Plugin.js class Plugin { static validateOptions(options) { // ... } constructor(options) { this.options = options; } process(file) { // ... } }

.FED@IBM

// PluginWriter.js Plugin.validateOptions({ foo: 'bar' });

const MyPlugin = new Plugin({ foo: 'bar' }); MyPlugin.process('file.js');

Page 92: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

2Part 2

Transpilation

.FED@IBM

Page 93: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

In an accessible and open web, it seems ridiculous to limit yourself to the latest and greatest browsers.

.FED@IBM

Page 94: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design
Page 95: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Write JavaScript using ES2015 features

Step 1

.FED@IBM

Page 96: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Pass your code into the transpiler

Step 2

.FED@IBM

Page 97: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

The transpiler will parse, transform, and generate new code

Step 3

.FED@IBM

Page 98: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Result is code ready to be used in browsers today

Step 4

.FED@IBM

Page 99: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Usage

Page 100: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design
Page 101: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

babel-core

babel-runtime

babel-polyfill

babel-register

babel-cli

Page 102: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design
Page 103: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design
Page 104: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design
Page 105: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

What happens when all the ES6 features are implemented? Won’t Babel be obsolete then?

.FED@IBM

Page 106: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Babel is more than just an ES2015 compiler.

.FED@IBM

Page 107: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Lifespan Bleeding Edge Goal is to always support the latest and greatest features before they are in any native runtime.

Browser Support Having to support older browsers will most likely remain a necessity as more and more people access the web through their mobile phones.

Optimizations Babel plugins allow you to make assertions about your code, allowing it to make optimizations to make your production code that much faster.

Page 108: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Recap ECMAScript This history of ECMAScript, the different versions of the language

ES2015 What is ES2015, and what features does it offer to you as a developer.

Babel How can we start incorporating these new features into our projects today.

Page 109: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Next Steps ES2015 Overview in 350 Bullet Points This article aims to summarize most syntax changes and features coming in ES2015.

Learn ES2015 A detailed overview of ECMAScript 2015 features.

Configuring Babel 6 Babel 6 is much more configurable than Babel 5, but also more difficult to configure. This blog post gives tips.

https://github.com/bevacqua/es6

https://babeljs.io/docs/learn-­‐es2015/

http://www.2ality.com/2015/11/configuring-­‐babel6.html

Page 110: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Thanks!

Page 111: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

@joshblackfr github.com/joshblack

Page 112: ESWHO, ESWHAT, ESWOW -- FEDucation -- IBM Design

Any Questions?