o babel 7 и немного больше, Артем Яворский

203
Artem Yavorsky hellyeah, Kyiv

Upload: sigma-software

Post on 23-Jan-2018

40 views

Category:

Software


1 download

TRANSCRIPT

Page 1: O Babel 7 и немного больше, Артем Яворский

Artem Yavorskyhellyeah, Kyiv

Page 2: O Babel 7 и немного больше, Артем Яворский

🌞

Page 3: O Babel 7 и немного больше, Артем Яворский

🌞

Page 4: O Babel 7 и немного больше, Артем Яворский

🌘

Page 5: O Babel 7 и немного больше, Артем Яворский

🌘

Page 6: O Babel 7 и немного больше, Артем Яворский

eslint-plugin-compat

Page 7: O Babel 7 и немного больше, Артем Яворский

🌘

Page 8: O Babel 7 и немного больше, Артем Яворский
Page 9: O Babel 7 и немного больше, Артем Яворский

🌘

Page 10: O Babel 7 и немного больше, Артем Яворский

🌘

Page 11: O Babel 7 и немного больше, Артем Яворский

It was October…

Page 12: O Babel 7 и немного больше, Артем Яворский

It was October…

Page 13: O Babel 7 и немного больше, Артем Яворский

It was October…

Page 14: O Babel 7 и немного больше, Артем Яворский

First PR

Page 15: O Babel 7 и немного больше, Артем Яворский
Page 16: O Babel 7 и немного больше, Артем Яворский
Page 17: O Babel 7 и немного больше, Артем Яворский
Page 18: O Babel 7 и немного больше, Артем Яворский
Page 19: O Babel 7 и немного больше, Артем Яворский

И че? Зачем это?

Page 20: O Babel 7 и немного больше, Артем Яворский

- Тратишь от 2 до ∞ часов в неделю

минусы

Тратить время на OSS

Page 21: O Babel 7 и немного больше, Артем Яворский

- Тратишь от 2 до ∞ часов в неделю - Сложно обьяснить девушке

минусы

Тратить время на OSS

Page 22: O Babel 7 и немного больше, Артем Яворский

- Тратишь от 2 до ∞ часов в неделю - Сложно обьяснить девушке

- Сложно обьяснить друзьям

минусы

Тратить время на OSS

Page 23: O Babel 7 и немного больше, Артем Яворский

- Тратишь от 2 до ∞ часов в неделю - Сложно обьяснить девушке

- Сложно обьяснить друзьям - Ведьмак 3 так и не пройден

минусы

Тратить время на OSS

Page 24: O Babel 7 и немного больше, Артем Яворский

- Тратишь от 2 до ∞ часов в неделю - Сложно обьяснить девушке

- Сложно обьяснить друзьям - Ведьмак 3 так и не пройден

- Материальное разочарование

минусы

Тратить время на OSS

Page 25: O Babel 7 и немного больше, Артем Яворский

- Тратишь от 2 до ∞ часов в неделю - Сложно обьяснить девушке

- Сложно обьяснить друзьям - Ведьмак 3 так и не пройден

- Материальное разочарование - Все равно этим занимаешься

минусы

Тратить время на OSS

Page 26: O Babel 7 и немного больше, Артем Яворский

- Тратишь от 2 до ∞ часов в неделю - Сложно обьяснить девушке

- Сложно обьяснить друзьям - Ведьмак 3 так и не пройден

- Материальное разочарование - Все равно этим занимаешься

минусы-

Тратить время на OSS

✓ Получаешь от 2 до ∞ часов опыта

плюсы

Page 27: O Babel 7 и немного больше, Артем Яворский

- Тратишь от 2 до ∞ часов в неделю - Сложно обьяснить девушке

- Сложно обьяснить друзьям - Ведьмак 3 так и не пройден

- Материальное разочарование - Все равно этим занимаешься

минусы

Тратить время на OSS

✓ Получаешь от 2 до ∞ часов опыта ✓ Легко обьяснить интервьюверу

плюсы

Page 28: O Babel 7 и немного больше, Артем Яворский

- Тратишь от 2 до ∞ часов в неделю - Сложно обьяснить девушке

- Сложно обьяснить друзьям - Ведьмак 3 так и не пройден

- Материальное разочарование - Все равно этим занимаешься

минусы

Тратить время на OSS

✓ Получаешь от 2 до ∞ часов опыта ✓ Легко обьяснить интервьюверу

✓ Легко обьяснить новому клиенту

плюсы

Page 29: O Babel 7 и немного больше, Артем Яворский

- Тратишь от 2 до ∞ часов в неделю - Сложно обьяснить девушке

- Сложно обьяснить друзьям - Ведьмак 3 так и не пройден

- Материальное разочарование - Все равно этим занимаешься

минусы

Тратить время на OSS

✓ Получаешь от 2 до ∞ часов опыта ✓ Легко обьяснить интервьюверу

✓ Легко обьяснить новому клиенту ✓ Ведьмак 3 так и не пройден

плюсы

Page 30: O Babel 7 и немного больше, Артем Яворский

- Тратишь от 2 до ∞ часов в неделю - Сложно обьяснить девушке

- Сложно обьяснить друзьям - Ведьмак 3 так и не пройден

- Материальное разочарование - Все равно этим занимаешься

минусы

Тратить время на OSS

✓ Получаешь от 2 до ∞ часов опыта ✓ Легко обьяснить интервьюверу

✓ Легко обьяснить новому клиенту ✓ Ведьмак 3 так и не пройден

✓ Есть шанс выйти на opencollective

плюсы

Page 31: O Babel 7 и немного больше, Артем Яворский

- Тратишь от 2 до ∞ часов в неделю - Сложно обьяснить девушке

- Сложно обьяснить друзьям - Ведьмак 3 так и не пройден

- Материальное разочарование - Все равно этим занимаешься

минусы

Тратить время на OSS

✓ Получаешь от 2 до ∞ часов опыта ✓ Легко обьяснить интервьюверу

✓ Легко обьяснить новому клиенту ✓ Ведьмак 3 так и не пройден

✓ Есть шанс выйти на opencollective ✓ Все равно этим занимаешься

плюсы

Page 32: O Babel 7 и немного больше, Артем Яворский
Page 33: O Babel 7 и немного больше, Артем Яворский
Page 34: O Babel 7 и немного больше, Артем Яворский
Page 35: O Babel 7 и немного больше, Артем Яворский
Page 36: O Babel 7 и немного больше, Артем Яворский
Page 37: O Babel 7 и немного больше, Артем Яворский

JavaScript компилятор

Page 38: O Babel 7 и немного больше, Артем Яворский

class User { async load() { await fetch('user'); } }

es6

Page 39: O Babel 7 и немного больше, Артем Яворский

class User { async load() { await fetch('user'); } }

function _instanceof(left, right) { if (right != null && typeof

Symbol !== "undefined" && right[Symbol.hasInstance]) { return

right[Symbol.hasInstance](left); } else { return left instanceof

right; } }

function _asyncToGenerator(fn) { return function () { var self =

this, args = arguments; return new Promise(function (resolve,

reject) { var gen = fn.apply(self, args); function step(key,

arg) { try { var info = gen[key](arg); var value = info.value; }

catch (error) { reject(error); return; } if (info.done)

{ resolve(value); } else { Promise.resolve(value).then(_next,

_throw); } } function _next(value) { step("next", value); }

function _throw(err) { step("throw", err); } _next(); }); }; }

function _classCallCheck(instance, Constructor) { if (!

_instanceof(instance, Constructor)) { throw new

TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i <

props.length; i++) { var descriptor = props[i];

descriptor.enumerable = descriptor.enumerable || false;

descriptor.configurable = true; if ("value" in descriptor)

descriptor.writable = true; Object.defineProperty(target,

descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if

(protoProps) _defineProperties(Constructor.prototype,

protoProps); if (staticProps) _defineProperties(Constructor,

staticProps); return Constructor; }

var User =

/*#__PURE__*/

function () {

function User() {

_classCallCheck(this, User);

es6

es5

Page 40: O Babel 7 и немного больше, Артем Яворский

40👍

👍

👍

class User { async load() { await fetch('user'); } }

Page 41: O Babel 7 и немного больше, Артем Яворский

Sept 28

Babel Turns Three

🎂

Page 42: O Babel 7 и немного больше, Артем Яворский

110000 websites using transform-classes

Page 43: O Babel 7 и немного больше, Артем Яворский
Page 44: O Babel 7 и немного больше, Артем Яворский

Babel on opencollective!

Page 45: O Babel 7 и немного больше, Артем Яворский
Page 46: O Babel 7 и немного больше, Артем Яворский
Page 47: O Babel 7 и немного больше, Артем Яворский
Page 48: O Babel 7 и немного больше, Артем Яворский
Page 49: O Babel 7 и немного больше, Артем Яворский
Page 50: O Babel 7 и немного больше, Артем Яворский
Page 51: O Babel 7 и немного больше, Артем Яворский
Page 52: O Babel 7 и немного больше, Артем Яворский
Page 53: O Babel 7 и немного больше, Артем Яворский

opencollective.com/babel

Page 54: O Babel 7 и немного больше, Артем Яворский
Page 55: O Babel 7 и немного больше, Артем Яворский

@

Page 56: O Babel 7 и немного больше, Артем Яворский

"@ /core": "7.x"

Page 57: O Babel 7 и немного больше, Артем Яворский
Page 58: O Babel 7 и немного больше, Артем Яворский

Все babel пакеты теперь scoped

Page 59: O Babel 7 и немного больше, Артем Яворский
Page 60: O Babel 7 и немного больше, Артем Яворский

✓ Не надо добавлять каждого участника для каждого пакета ✓ Только команда может паблишить пакеты в определенный scope ✓ Легче отличить “официальные” пакеты от остальных. ✓ Удобно группируются в node_modules

Page 61: O Babel 7 и немного больше, Артем Яворский

✓ Не надо добавлять каждого участника для каждого пакета ✓ Только команда может паблишить пакеты в определенный scope

Page 62: O Babel 7 и немного больше, Артем Яворский

✓ Не надо добавлять каждого участника для каждого пакета ✓ Только команда может паблишить пакеты в определенный scope ✓ Легче отличить “официальные” пакеты от остальных.

Page 63: O Babel 7 и немного больше, Артем Яворский

✓ Не надо добавлять каждого участника для каждого пакета ✓ Только команда может паблишить пакеты в определенный scope ✓ Легче отличить “официальные” пакеты от остальных. ✓ Удобно группируются в node_modules

Page 64: O Babel 7 и немного больше, Артем Яворский
Page 65: O Babel 7 и немного больше, Артем Яворский

babel-core

babel-preset-env

babel-plugin-proposal-class-properties

babel-plugin-transform-typescript

babel-runtime

Page 66: O Babel 7 и немного больше, Артем Яворский

@babel/core

@babel/preset-env

@babel/plugin-proposal-class-properties

@babel/plugin-transform-typescript

@babel/runtime

babel-core

babel-preset-env

babel-plugin-proposal-class-properties

babel-plugin-transform-typescript

babel-runtime

Page 67: O Babel 7 и немного больше, Артем Яворский

npm info @babel/core version

7.0.0-beta.32

Page 68: O Babel 7 и немного больше, Артем Яворский

Остановка поддержки node:

< 6 для разработки< 4 для пользователей

Page 69: O Babel 7 и немного больше, Артем Яворский

ESNext -> ES5

Page 70: O Babel 7 и немного больше, Артем Яворский

github.com/babel/proposals

github.com/tc39/proposals

Page 71: O Babel 7 и немного больше, Артем Яворский

Идея как улучшить javascript

Page 72: O Babel 7 и немного больше, Артем Яворский
Page 73: O Babel 7 и немного больше, Артем Яворский

Stage 0

Page 74: O Babel 7 и немного больше, Артем Яворский

встреча TC39

Page 75: O Babel 7 и немного больше, Артем Яворский

Stage 1: Proposal

Page 76: O Babel 7 и немного больше, Артем Яворский

встреча TC39

Page 77: O Babel 7 и немного больше, Артем Яворский

Stage 2: Draft

Page 78: O Babel 7 и немного больше, Артем Яворский

встреча TC39

Page 79: O Babel 7 и немного больше, Артем Яворский

Stage 3: Candidate

Page 80: O Babel 7 и немного больше, Артем Яворский

встреча TC39

Page 81: O Babel 7 и немного больше, Артем Яворский

Stage 4: Finished

Page 82: O Babel 7 и немного больше, Артем Яворский

Stage 4: Finished

Page 83: O Babel 7 и немного больше, Артем Яворский

Stage 4: Finished

Page 84: O Babel 7 и немного больше, Артем Яворский

github.com/babel/proposals

Babylon PR New babel plugin

@babel/preset-stage[0-3]

Page 85: O Babel 7 и немного больше, Артем Яворский

@babel/preset-stage[0-3]изменения в

Page 86: O Babel 7 и немного больше, Артем Яворский

Class Fields &Static Properties

Private Fields

Class Fields Declarations

Page 87: O Babel 7 и немного больше, Артем Яворский

Class Fields DeclarationsClass Fields DeclarationsClasss Static FieldsClass Instance Fields

Page 88: O Babel 7 и немного больше, Артем Яворский

class A { static b = 'foo'; c = ‘bar'; }

class A { constructor() { this.c = 'bar'; } }; A.b = 'foo';

stage 2: @babel/plugin-proposal-class-properties

Page 89: O Babel 7 и немного больше, Артем Яворский

class A { static b = 'foo'; c = ‘bar'; }

class A { constructor() { this.c = 'bar'; } }; A.b = 'foo';

stage 2: @babel/plugin-proposal-class-properties

Page 90: O Babel 7 и немного больше, Артем Яворский
Page 91: O Babel 7 и немного больше, Артем Яворский

class Point { #x = 0;

getFoo() { return this.#x; } }

var _x;

class Foo { constructor() { _x.set(this, 0); }

getFoo() { return _x.get(this); }

} _x = new WeakMap();

PR #6120

Page 92: O Babel 7 и немного больше, Артем Яворский

class Point { #x = 0;

getFoo() { return this.#x; } }

var _x;

class Foo { constructor() { _x.set(this, 0); }

getFoo() { return _x.get(this); }

} _x = new WeakMap();

PR #6120

Page 93: O Babel 7 и немного больше, Артем Яворский

class Point { #x = 0;

getFoo() { return this.#x; } }

var _x;

class Foo { constructor() { _x.set(this, 0); }

getFoo() { return _x.get(this); }

} _x = new WeakMap();

PR #6120

Page 94: O Babel 7 и немного больше, Артем Яворский

class Point { private x; constructor(x) { this.x = x; } }

const point = new Point(2); b.x = 5; // TypeError ?

Why not `private foo` ?

Page 95: O Babel 7 и немного больше, Артем Яворский

stage 3: @babel/plugin-proposal-object-rest-spread

const symbol = Symbol(1); const obj = { [symbol]: 1, two: 2 };

const {[symbol]: one, ...rest} = obj; console.log(one); // 1 console.log(rest); // { two: 2 }

rest

Page 96: O Babel 7 и немного больше, Артем Яворский

stage 3: @babel/plugin-proposal-unicode-property-regex

var regex = /\p{Emoji}/u;

regex.test('😊') // true regex.test('hi') // false

Page 97: O Babel 7 и немного больше, Артем Яворский

github.com/mathiasbynens/regexpu-core/blob/master/property-escapes.md

Page 98: O Babel 7 и немного больше, Артем Яворский

stage 3: @babel/plugin-proposal-optional-catch-binding

try { throw 0; } catch { doSomething(); }

Page 99: O Babel 7 и немного больше, Артем Яворский

stage 3: @babel/plugin-proposal-optional-catch-binding

try { throw 0; } catch { doSomething(); }

Page 100: O Babel 7 и немного больше, Артем Яворский

stage 3: @babel/plugin-proposal-optional-catch-binding

try { throw 0; } catch { doSomething(); }

try { throw 0; } catch (_unused) { doSomething(); }

Page 101: O Babel 7 и немного больше, Артем Яворский

stage 3: @babel/plugin-syntax-dynamic-import

import('my-script.js').then(data => { console.log(data); });

const data = await import('my-script.js');

Page 102: O Babel 7 и немного больше, Артем Яворский

stage 3: @babel/plugin-proposal-numeric-separator

100_000_000 // digit 0xA0_B0_C0 // hexadecimal 0o_11_55_21 // octal 0b_11_01 // binary

Page 103: O Babel 7 и немного больше, Артем Яворский

stage 3: @babel/plugin-proposal-numeric-separator

100_000_000 // digit 0xA0_B0_C0 // hexadecimal 0o_11_55_21 // octal 0b_11_01 // binary

100000000 // digit 0xA0B0C0 // hexadecimal 0o115521 // octal 0b1101 // binary

Page 104: O Babel 7 и немного больше, Артем Яворский

stage 3: @babel/plugin-proposal-numeric-separator

(0_0) ^0_0/ (0_0)

Page 105: O Babel 7 и немного больше, Артем Яворский

stage 3: @babel/plugin-proposal-numeric-separator

(0_0) ^0_0/ (0_0) 0

Page 106: O Babel 7 и немного больше, Артем Яворский

stage 2: @babel/plugin-proposal-decorators

Page 107: O Babel 7 и немного больше, Артем Яворский

// no parameter decorators (a separate proposal) class Foo { constructor(@foo x) {} }

// no decorators on object methods var o = { @baz foo() {} }

// decorator cannot be attached to the export @foo export default class {}

что теперь нельзя

Page 108: O Babel 7 и немного больше, Артем Яворский

// no parameter decorators (a separate proposal) class Foo { constructor(@foo x) {} }

// no decorators on object methods var o = { @baz foo() {} }

// decorator cannot be attached to the export @foo export default class {}

что теперь нельзя

Page 109: O Babel 7 и немного больше, Артем Яворский

// no parameter decorators (a separate proposal) class Foo { constructor(@foo x) {} }

// no decorators on object methods var o = { @baz foo() {} }

// decorator cannot be attached to the export @foo export default class {}

что теперь нельзя

Page 110: O Babel 7 и немного больше, Артем Яворский

// decorators with a call expression @foo('bar') class A { // decorators on computed methods @autobind [method](arg) {} // decorators on generator functions @deco *gen() {} // decorators with a member expression @a.b.c(e, f) m() {} }

// exported decorator classes export default @foo class {}

что можно

Page 111: O Babel 7 и немного больше, Артем Яворский

// decorators with a call expression @foo('bar') class A { // decorators on computed methods @autobind [method](arg) {} // decorators on generator functions @deco *gen() {} // decorators with a member expression @a.b.c(e, f) m() {} }

// exported decorator classes export default @foo class {}

что можно

Page 112: O Babel 7 и немного больше, Артем Яворский

// decorators with a call expression @foo('bar') class A { // decorators on computed methods @autobind [method](arg) {} // decorators on generator functions @deco *gen() {} // decorators with a member expression @a.b.c(e, f) m() {} }

// exported decorator classes export default @foo class {}

что можно

Page 113: O Babel 7 и немного больше, Артем Яворский

// decorators with a call expression @foo('bar') class A { // decorators on computed methods @autobind [method](arg) {} // decorators on generator functions @deco *gen() {} // decorators with a member expression @a.b.c(e, f) m() {} }

// exported decorator classes export default @foo class {}

что можно

Page 114: O Babel 7 и немного больше, Артем Яворский

// decorators with a call expression @foo('bar') class A { // decorators on computed methods @autobind [method](arg) {} // decorators on generator functions @deco *gen() {} // decorators with a member expression @a.b.c(e, f) m() {} }

// exported decorator classes export default @foo class {}

что можно

Page 115: O Babel 7 и немного больше, Артем Яворский

[WIP] stage 1: @babel/plugin-proposal-block-params

Page 116: O Babel 7 и немного больше, Артем Яворский

[WIP] stage 1: @babel/plugin-proposal-block-params

getSomething('/', () => { // ... })

getSomething('/') { // ... })

Page 117: O Babel 7 и немного больше, Артем Яворский

[WIP] stage 1: @babel/plugin-proposal-block-params

getSomething('/', () => { // ... })

Page 118: O Babel 7 и немного больше, Артем Яворский

[WIP] stage 1: @babel/plugin-proposal-block-params

getSomething('/', () => { // ... })

getSomething('/') { // ... })

Page 119: O Babel 7 и немного больше, Артем Яворский

[WIP] stage 1: @babel/plugin-proposal-block-params

getSomething('/', (err, data) => { // ... })

Page 120: O Babel 7 и немного больше, Артем Яворский

[WIP] stage 1: @babel/plugin-proposal-block-params

getSomething('/', (err, data) => { // ... })

getSomething('/') do (err, data) { // ... })

Page 121: O Babel 7 и немного больше, Артем Яворский

[WIP] stage 1: @babel/plugin-proposal-block-params

unless (expr) { // statements }

Page 122: O Babel 7 и немного больше, Артем Яворский

[WIP] stage 1: @babel/plugin-proposal-block-params

server(app) { ::get('/') do (response) { response.send('hello world'); }

::listen(3000) { console.log('server is running…'); } }

express

Page 123: O Babel 7 и немного больше, Артем Яворский

[WIP] stage 1: @babel/plugin-proposal-block-params

const heroes = hero { ::name ::height ::mass ::friends { ::name ::home { ::name ::climate } } }

graphql

Page 124: O Babel 7 и немного больше, Артем Яворский

[WIP] stage 1: @babel/plugin-proposal-block-params

<Box> { select (this.state.step) { ::when ('Intro') { <Intro /> } ::when ('Submit') { <Submit /> } ::when ('Finish') { <Finish /> } } } </Box>;

jsx

Page 125: O Babel 7 и немного больше, Артем Яворский

stage 1: @babel/plugin-coffeescript-in-js

Page 126: O Babel 7 и немного больше, Артем Яворский

stage 1: @babel/plugin-optional-chaining

Page 127: O Babel 7 и немного больше, Артем Яворский

stage 1: @babel/plugin-poposal-optional-chaining

a?.b?.[value].c?.()

a == null ? void 0 : a.b == null ? void 0 : a.b[value].c == null ? void 0 : a.b[value].c.call(a.b[value].c);

Page 128: O Babel 7 и немного больше, Артем Яворский
Page 129: O Babel 7 и немного больше, Артем Яворский

interface Props { name: any; enthusiasmLevel?: any; } const props: Props = {};

const props = {};

Page 130: O Babel 7 и немного больше, Артем Яворский

awesome-typescript-loader ts-loader

Page 131: O Babel 7 и немного больше, Артем Яворский

awesome-typescript-loader ts-loader

Page 132: O Babel 7 и немного больше, Артем Яворский

awesome-typescript-loader ts-loader

useBabel: true

Page 133: O Babel 7 и немного больше, Артем Яворский

awesome-typescript-loader ts-loader

module: { rules: [{ test: /\.ts(x?)$/, exclude: /node_modules/, use: [ { loader: 'babel-loader', options: babelOptions }, { loader: 'ts-loader' } ] }, { test: /\.js$/, exclude: /node_modules/, use: [ { loader: 'babel-loader', options: babelOptions } ] }] },

useBabel: true

Page 134: O Babel 7 и немного больше, Артем Яворский

@babel/plugin-transform-typescript

awesome-typescript-loader

ts-loader

Page 135: O Babel 7 и немного больше, Артем Яворский
Page 136: O Babel 7 и немного больше, Артем Яворский

{ "plugins": ["@babel/plugin-transform-typescript"] }

{ "presets": [“@babel/preset-typescript"] }

.babelrc

или

Page 137: O Babel 7 и немного больше, Артем Яворский

>babel index.ts index.js

>webpack index.ts index.js

или

Page 138: O Babel 7 и немного больше, Артем Яворский

@babel/preset-env

Page 139: O Babel 7 и немного больше, Артем Яворский

> npm install babel-preset-es2015

Page 140: O Babel 7 и немного больше, Артем Яворский

> npm install babel-preset-es2015 WARN deprecated [email protected]: We're super 😸 excited that you're trying to use ES2017+ syntax, but instead of making more yearly presets 😭 , Babel now has a better preset that we recommend you use instead: npm install babel-preset-env --save-dev. preset-env without options will compile ES2015+ down to ES5 just like using all the presets together and thus is more future proof. It also allows you to target specific browsers so that Babel can do less work and you can ship native ES2015+ to user 😎 ! We are also in the process of releasing v7, so please give http://babeljs.io/blog/2017/09/12/planning-for-7.0 a read and help test it out in beta! Thanks so much for using Babel 🙏, please give us a follow on Twitter @babeljs for news on Babel, join slack.babeljs.io for discussion/development and help support the project at opencollective.com/babel

Page 141: O Babel 7 и немного больше, Артем Яворский

{ presets: [['env', { targets: { browsers: "chrome 63, safari 11" }, }]] }

autoprefixer для Babel

Page 142: O Babel 7 и немного больше, Артем Яворский

class User { async load() { await fetch('user'); } }

function _instanceof(left, right) { if (right != null && typeof Symbol !==

"undefined" && right[Symbol.hasInstance]) { return right[Symbol.hasInstance]

(left); } else { return left instanceof right; } }

function _asyncToGenerator(fn) { return function () { var self = this, args =

arguments; return new Promise(function (resolve, reject) { var gen =

fn.apply(self, args); function step(key, arg) { try { var info = gen[key]

(arg); var value = info.value; } catch (error) { reject(error); return; } if

(info.done) { resolve(value); } else { Promise.resolve(value).then(_next,

_throw); } } function _next(value) { step("next", value); } function

_throw(err) { step("throw", err); } _next(); }); }; }

function _classCallCheck(instance, Constructor) { if (!_instanceof(instance,

Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length;

i++) { var descriptor = props[i]; descriptor.enumerable =

descriptor.enumerable || false; descriptor.configurable = true; if ("value"

in descriptor) descriptor.writable = true; Object.defineProperty(target,

descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps)

_defineProperties(Constructor.prototype, protoProps); if (staticProps)

_defineProperties(Constructor, staticProps); return Constructor; }

var User =

/*#__PURE__*/

function () {

function User() {

_classCallCheck(this, User);

}

Page 143: O Babel 7 и немного больше, Артем Яворский

w3schools.com/browsers

Page 144: O Babel 7 и немного больше, Артем Яворский

92.7% 7.3%

Page 145: O Babel 7 и немного больше, Артем Яворский

function _instanceof(left, right) { if (right != null && typeof Symbol !==

"undefined" && right[Symbol.hasInstance]) { return right[Symbol.hasInstance]

(left); } else { return left instanceof right; } }

function _asyncToGenerator(fn) { return function () { var self = this, args =

arguments; return new Promise(function (resolve, reject) { var gen =

fn.apply(self, args); function step(key, arg) { try { var info = gen[key]

(arg); var value = info.value; } catch (error) { reject(error); return; } if

(info.done) { resolve(value); } else { Promise.resolve(value).then(_next,

_throw); } } function _next(value) { step("next", value); } function

_throw(err) { step("throw", err); } _next(); }); }; }

function _classCallCheck(instance, Constructor) { if (!_instanceof(instance,

Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length;

i++) { var descriptor = props[i]; descriptor.enumerable =

descriptor.enumerable || false; descriptor.configurable = true; if ("value"

in descriptor) descriptor.writable = true; Object.defineProperty(target,

descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps)

_defineProperties(Constructor.prototype, protoProps); if (staticProps)

_defineProperties(Constructor, staticProps); return Constructor; }

var User =

/*#__PURE__*/

function () {

function User() {

_classCallCheck(this, User);

}

В 9 из 10 раз клиенты получают это

Page 146: O Babel 7 и немного больше, Артем Яворский

а было бы неплохо

class User { async load() { await fetch('user'); } }

Page 147: O Babel 7 и немного больше, Артем Яворский

medium.com/dev-channel/the-cost-of-javascript-84009f51e99e

The Cost of JavaScript

Page 148: O Babel 7 и немного больше, Артем Яворский

tl;dr: less code = less parse/compile + less transfer + less to decompress

Page 149: O Babel 7 и немного больше, Артем Яворский
Page 150: O Babel 7 и немного больше, Артем Яворский

stage 3 plugins with `shippedProposals: true`

Page 151: O Babel 7 и немного больше, Артем Яворский

before compilation after compilation

for await 22kb 220kb

object rest spread 21kb 65kb

optional-catch-binding 23kb 26kb

unicode-property-regex 21kb 140kb

Compilation result size

Page 152: O Babel 7 и немного больше, Артем Яворский
Page 153: O Babel 7 и немного больше, Артем Яворский

polyfills based on code analysis

with useBuiltIns: "usage"

Page 154: O Babel 7 и немного больше, Артем Яворский

.babelrc.js

Page 155: O Babel 7 и немного больше, Артем Яворский

const envOptions = { targets: {} };

if (process.env.NODE_ENV === 'development') { envOptions.targets.browsers = 'safari TP'; } else { envOptions.targets.browsers = '>1%'; }

const presets = ['env', envOptions];

export default { presets, }

.babelrc.js

Page 156: O Babel 7 и немного больше, Артем Яворский

const envOptions = { targets: {} };

if (process.env.NODE_ENV === 'development') { envOptions.targets.browsers = 'safari TP'; } else { envOptions.targets.browsers = '>1%'; }

const presets = ['env', envOptions];

export default { presets, }

.babelrc.js

Page 157: O Babel 7 и немного больше, Артем Яворский

const envOptions = { targets: {} };

if (process.env.NODE_ENV === 'development') { envOptions.targets.browsers = 'safari TP'; } else { envOptions.targets.browsers = '>1%'; }

const presets = ['env', envOptions];

export default { presets, }

.babelrc.js

Page 158: O Babel 7 и немного больше, Артем Яворский

const envOptions = { targets: {} };

if (process.env.NODE_ENV === 'development') { envOptions.targets.browsers = 'safari TP'; } else { envOptions.targets.browsers = '>1%'; }

const presets = ['env', envOptions];

export default { presets, }

.babelrc.js

Page 159: O Babel 7 и немного больше, Артем Яворский

const envOptions = { targets: {} };

if (process.env.NODE_ENV === 'development') { envOptions.targets.browsers = 'safari TP'; } else { envOptions.targets.browsers = '>1%'; }

const presets = ['env', envOptions];

export default { presets, }

.babelrc.js

Page 160: O Babel 7 и немного больше, Артем Яворский

> time babel src --out-dir lib 1.21s

> time NODE_ENV=production babel src --out-dir lib 2.31s

Page 161: O Babel 7 и немного больше, Артем Яворский

bundle-utils

Page 162: O Babel 7 и немного больше, Артем Яворский

Static server

Page 163: O Babel 7 и немного больше, Артем Яворский

Static server

Page 164: O Babel 7 и немного больше, Артем Яворский

Static server

useragent

Page 165: O Babel 7 и немного больше, Артем Яворский

useragent

Page 166: O Babel 7 и немного больше, Артем Яворский
Page 167: O Babel 7 и немного больше, Артем Яворский
Page 168: O Babel 7 и немного больше, Артем Яворский

Static server📦ES6

Page 169: O Babel 7 и немного больше, Артем Яворский

Static server

useragent

Page 170: O Babel 7 и немного больше, Артем Яворский
Page 171: O Babel 7 и немного больше, Артем Яворский

Static server📦ES5

useragent

Page 172: O Babel 7 и немного больше, Артем Яворский

👍

Page 173: O Babel 7 и немного больше, Артем Яворский

👍 🤞

Page 174: O Babel 7 и немного больше, Артем Яворский

[ "> 1%", "last 3 chrome versions, last 1 edge version", "last 1 chrome version, last 1 safari version" ]

.browsers

Page 175: O Babel 7 и немного больше, Артем Яворский

export default { entry: [

'app/index.js' ], output: { path: path.join('dist', id), … },

module: {rules: [{ loader: 'babel-loader', query: { "presets": [“env”] } }]}

};

webpack.config.js

Page 176: O Babel 7 и немного больше, Артем Яворский

export default mapConfigToTargets(({ id, browsers }) => { entry: [

‘app/index.js' ], output: { path: path.join('dist', id), … },

module: {rules: [{ loader: 'babel-loader', query: { "presets": [["env", { targets: { browsers }, } } }]}

});

webpack.config.js

Page 177: O Babel 7 и немного больше, Артем Яворский

export default mapConfigToTargets(({ id, browsers }) => { entry: [

‘app/index.js' ], output: { path: path.join(‘dist’, id), … },

module: {rules: [{ loader: 'babel-loader', query: { "presets": [["env", { targets: { browsers }, } } }]}

});

webpack.config.js

Page 178: O Babel 7 и немного больше, Артем Яворский

export default mapConfigToTargets(({ id, browsers }) => { entry: [

‘app/index.js' ], output: { path: path.join(‘dist’, id), … },

module: {rules: [{ loader: 'babel-loader', query: { "presets": [["env", { targets: { browsers }, } } }]}

});

webpack.config.js

Page 179: O Babel 7 и немного больше, Артем Яворский

export default mapConfigToTargets(({ id, browsers }) => { entry: [

‘app/index.js' ], output: { path: path.join(‘dist’, id), … },

module: {rules: [{ loader: 'babel-loader', query: { "presets": [["env", { targets: { browsers }, } } }]}

});

webpack.config.js

Page 180: O Babel 7 и немного больше, Артем Яворский

export default mapConfigToTargets(({ id, browsers }) => { entry: [

‘app/index.js' ], output: { path: path.join(‘dist’, id), … },

module: {rules: [{ loader: 'babel-loader', query: { "presets": [["env", { targets: { browsers }, } } }]}

});

webpack.config.js

Page 181: O Babel 7 и немного больше, Артем Яворский

-.. 1 (> 1%) | /.. main.js -.. 2 (last 3 chrome versions, last 1 edge version) | /.. main.js /.. 3 (last 1 chrome version, last 1 safari version) /.. main.js

Page 182: O Babel 7 и немного больше, Артем Яворский

-.. 1 (> 1%) | /.. main.js 192KB -.. 2 (last 3 chrome versions, last 1 edge version) | /.. main.js 68KB /.. 3 (last 1 chrome version, last 1 safari version) /.. main.js 44KB

Page 183: O Babel 7 и немного больше, Артем Яворский

-.. 1 (> 1%) | /.. main.js 192KB -.. 2 (last 3 chrome versions, last 1 edge version) | /.. main.js 68KB /.. 3 (last 1 chrome version, last 1 safari version) /.. main.js 44KB

Page 184: O Babel 7 и немного больше, Артем Яворский

-.. 1 (> 1%) | /.. main.js 192KB -.. 2 (last 3 chrome versions, last 1 edge version) | /.. main.js 68KB /.. 3 (last 1 chrome version, last 1 safari version) /.. main.js 44KB

Page 185: O Babel 7 и немного больше, Артем Яворский
Page 186: O Babel 7 и немного больше, Артем Яворский

with-targets parcel index.html

Page 187: O Babel 7 и немного больше, Артем Яворский

with-targets parcel index.html

parcel -d $BUNDLE_ID index.html

{ targets: { - browsers: "ie 10, >2%, …” + browsers: CURRENT_BUNDLE_BROWSERS } }

babelrc

Page 188: O Babel 7 и немного больше, Артем Яворский

static server

Page 189: O Babel 7 и немного больше, Артем Яворский

static server

parse webpack.config.js

Page 190: O Babel 7 и немного больше, Артем Яворский

static server

parse webpack.config.js

get bundles

Page 191: O Babel 7 и немного больше, Артем Яворский

static server

parse webpack.config.js

get bundles

generate map with bundle sizes

Page 192: O Babel 7 и немного больше, Артем Яворский

static server

parse webpack.config.js

get bundles

generate map with bundle sizes

read headers['User-Agent']

Page 193: O Babel 7 и немного больше, Артем Яворский

static server

parse webpack.config.js

get bundles

generate map with bundle sizes

read headers['User-Agent']

find & send the smallest bundle for current UA

Page 194: O Babel 7 и немного больше, Артем Яворский

index.js

app.get('*', function response(req, res) {

const bundleId = getBundleIdByUseragent(req.useragent);

const fullPath = path.join(__dirname, 'dist', bundleId, req.url)

res.write(fs.readFileSync(path.join(fullPath))); res.end();

}

Page 195: O Babel 7 и немного больше, Артем Яворский

index.js

app.get('*', function response(req, res) {

const bundleId = getBundleIdByUseragent(req.useragent);

const fullPath = path.join(__dirname, 'dist', bundleId, req.url)

res.write(fs.readFileSync(path.join(fullPath))); res.end();

}

Page 196: O Babel 7 и немного больше, Артем Яворский

index.js

app.get('*', function response(req, res) {

const bundleId = getBundleIdByUseragent(req.useragent);

const fullPath = path.join(__dirname, 'dist', bundleId, req.url)

res.write(fs.readFileSync(path.join(fullPath))); res.end();

}

Page 197: O Babel 7 и немного больше, Артем Яворский

res.header('Vary', 'User-Agent');

не забываем

Page 198: O Babel 7 и немного больше, Артем Яворский

-.. 0 (> 1%) 196K -.. 1 (last 3 chrome versions, last 1 edge version) 72K /.. 2 (last 1 chrome version, last 1 safari version) 48K

Page 199: O Babel 7 и немного больше, Артем Яворский

-.. 0 (> 1%) 196K -.. 1 (last 3 chrome versions, last 1 edge version) 72K /.. 2 (last 1 chrome version, last 1 safari version) 48K

60

Page 200: O Babel 7 и немного больше, Артем Яворский

-.. 0 (> 1%) 196K -.. 1 (last 3 chrome versions, last 1 edge version) 72K /.. 2 (last 1 chrome version, last 1 safari version) 48K

60

🚷

Page 201: O Babel 7 и немного больше, Артем Яворский

📦60

72KB

📦TP

48KB

📦11

196KB

bundle-utils

Page 202: O Babel 7 и немного больше, Артем Яворский

Спасибо

Page 203: O Babel 7 и немного больше, Артем Яворский

Artem Yavorskytwitter.com/yavorsky_github.com/yavorsky