Сергей Константинов — Что интересного готовит нам w3c

48
Что интересного нам готовит W3C Сергей Константинов Web Standards Days, 7 декабря 2013

Upload: yandex

Post on 28-Nov-2014

2.370 views

Category:

Technology


1 download

DESCRIPTION

2014 год обещает нам множество интересных нововведений. Помимо новинок в HTML5, нас ждут глобальные изменения в самой веб-платформе. Promises и модули — революция в стандартах разработки стандартов. Service Workers — новый подход к решению проблемы офлайновых веб-приложений. @@create — отнаследуйся от HTMLElement! Обо всём этом и пойдёт речь в докладе.

TRANSCRIPT

Page 1: Сергей Константинов — Что интересного готовит нам W3C

Что интересного нам готовит W3C

Сергей Константинов Web Standards Days, 7 декабря 2013

Page 2: Сергей Константинов — Что интересного готовит нам W3C

Обо мне – В Яндексе с 2008 года – Руковожу разработкой API Яндекс.Карт – С июля 2013 года являюсь участником Технической архитектурной группы W3C www.w3.org/2001/tag/ – @blogovodoved

Page 3: Сергей Константинов — Что интересного готовит нам W3C

В последние годы появилось много разных стандартов

Page 4: Сергей Константинов — Что интересного готовит нам W3C

Но ядро JavaScript ECMAScript практически не затронуто

Page 5: Сергей Константинов — Что интересного готовит нам W3C

* Если успеем, конечно В 2014 всё изменится*

Page 6: Сергей Константинов — Что интересного готовит нам W3C

Тема дня

– Promises – Modules – Service Workers – @@create

Page 7: Сергей Константинов — Что интересного готовит нам W3C

Promises

Page 8: Сергей Константинов — Что интересного готовит нам W3C

8

Promises

Promises (aka Futures) в вебе уже давно На всякий случай, напомню: someOperation.then( successCallback,

errorCalback

);

Page 9: Сергей Константинов — Что интересного готовит нам W3C

9

Promises

Существует несколько стандартов Promises: A, A+, B, KISS, C, D, … И множество реалиазаций: Q, jQuery Deferred, Vow, … (см. http://wiki.commonjs.org/wiki/Promises)

Page 10: Сергей Константинов — Что интересного готовит нам W3C

10

Promises

Черновик стандарта DOM Level 4 включает в себя Promises как примитив языка: http://dom.spec.whatwg.org/#promises https://github.com/domenic/promises-unwrapping/blob/master/README.md

Page 11: Сергей Константинов — Что интересного готовит нам W3C

11

Promise with resolver

В отличие от большинства существующих реализаций, в DOM Promises функции подтверждения и отклонения промиса отделены от самого промиса и сам промис неизменяем.

Page 12: Сергей Константинов — Что интересного готовит нам W3C

12

Promise with resolver

Vow: function asyncOperation () { var p = vow.promise(); …

return p; }

asyncOperation().fulfill('some value');

Page 13: Сергей Константинов — Что интересного готовит нам W3C

13

Promise with resolver

Теперь будет так: function asyncOperation () { var p = new Promise( function (resolve, reject) { …

resolve('some value');

});

return p; }

Page 14: Сергей Константинов — Что интересного готовит нам W3C

14

Promises

Используйте промисы для: – возврата статуса асинхронной операции file.open('path').then(

function (handle) { // do something valueable

},

function (error) { // handle error }

);

Page 15: Сергей Константинов — Что интересного готовит нам W3C

15

Promises

Не используйте промисы для: – передачи больших объёмов данных, – как замену событиям.

Page 16: Сергей Константинов — Что интересного готовит нам W3C

Модули

Page 17: Сергей Константинов — Что интересного готовит нам W3C

17

Модули

Долгое время в JavaScript/ECMAScript не было никакой модульности. Это привело к бардаку в global и десяткам имплементаций (псевдо)модульных систем. http://wiki.ecmascript.org/doku.php?id=harmony:modules

Page 18: Сергей Константинов — Что интересного готовит нам W3C

18

Модули

Теперь вы можете объявлять модули: module 'math' { export function sum(x, y) { return x + y;

}

export var pi = 3.141593; }

Page 19: Сергей Константинов — Что интересного готовит нам W3C

19

Модули

… импортировать модули: import foo from "foo"; import {sum, pi} from 'math'; import "fs" as fs; import { draw as drawShape } from 'shape'; import { draw as drawGun } from 'cowboy'; module YUI from 'http://developer.yahoo.com/modules/yui3.js';

Page 20: Сергей Константинов — Что интересного готовит нам W3C

20

Конвейер компиляции модулей

– normalize – resolve – fetch – translate – link

Page 21: Сергей Константинов — Что интересного готовит нам W3C

21

Этап resolve

Вы можете задавать свои правила резолва имён модулей: System.ondemand({

"https://yandex.st/jquery/2.4/jquery.module.js": "jquery", "backbone.js": ["backbone/events", "backbone/model"]

});

Page 22: Сергей Константинов — Что интересного готовит нам W3C

22

Этап translate

Вы можете совершать операции над кодом модуля до его исполнения. Например, проверить jshint-ом: import { JSHINT } from "jshint"; import { options } from "app/jshintrc"; System.translate = function (source, options) { var errors = JSHINT(source, options), messages = [options.actualAddress];

if (errors) { throw new SyntaxError(errors); } return source; };

Page 23: Сергей Константинов — Что интересного готовит нам W3C

23

Этап translate

Вы можете совершать операции над кодом модуля до его исполнения. Например, транслировать CoffeeScript System.translate = function (source, options) { if (!options.path.match(/\.coffee$/)) { return; }

return CoffeeScript.translate(source); };

Page 24: Сергей Константинов — Что интересного готовит нам W3C

24

Этап link

Можно контролировать, что попадёт в модуль в качестве global, и можно выбрать, что экспортировать из модуля.

https://gist.github.com/wycats/51c96e3adcdb3a68cbc3

Page 25: Сергей Константинов — Что интересного готовит нам W3C

25

Конвейер компиляции модулей

В итоге, мы можем: – писать и использовать модули; – написать хук для текущих реализаций модулей (requirejs, amd); – написать вообще свой кастомный Loader и/или отнаследоваться от системного.

Page 26: Сергей Константинов — Что интересного готовит нам W3C

26

Конвейер компиляции модулей

Мы не можем из коробки: – грузить код on demand L

Page 27: Сергей Константинов — Что интересного готовит нам W3C

Service Workers (nee Navigation Controllers)

Page 28: Сергей Константинов — Что интересного готовит нам W3C

28

Service Workers – что это?

– Это возможность для определённого набора URL домена установить "контроллер", который будет обрабатывать все запросы с открытых браузером страниц, матчащихся на этот набор URL-ов https://github.com/slightlyoff/ServiceWorker/blob/master/explainer.md

Page 29: Сергей Константинов — Что интересного готовит нам W3C

29

Service Worker

Инсталлируем: navigator.registerServiceWorker(

"/*", "/v1/ctrl.js"

).then(function (serviceWorker) { console.log("success!");

// Чтобы использовать Service Worker сразу,

// можно выполнить window.location.reload()

});

Page 30: Сергей Константинов — Что интересного готовит нам W3C

30

Service Worker – зачем?

Service Worker умеет: – перехватывать запросы за сетевыми ресурсами и отвечать на них this.addEventListener("fetch", callback);

– кэшировать ресурсы var resources = new Cache( base + "/assets/v1/base.css"

);

– редиректить запросы – версионироваться.

Page 31: Сергей Константинов — Что интересного готовит нам W3C

31

Service Worker – зачем?

Service Worker имеет доступ: – ко всем открытым в браузере страницам, на которые матчится this.windows.forEach(function (w) { …

});

– ко всем разедляемым ресурсам: WebStorage, IndexedDB, cookies, …

Page 32: Сергей Константинов — Что интересного готовит нам W3C

32

Service Worker – зачем?

Service Worker научится (?): – получать push уведомления; – открывать новые страницы.

Page 33: Сергей Константинов — Что интересного готовит нам W3C

Магический символ @@create

Page 34: Сергей Константинов — Что интересного готовит нам W3C

34

Наследование в JS

Как выглядит наследование в JS? function ChildClass () { ParentClass.call(this); }

ChildClass.prototype = new ParentClass(); // На самом деле не так, обычно делают магию

// чтобы не вызывать конструктор ParentClass

Page 35: Сергей Константинов — Что интересного готовит нам W3C

35

Наследование в JS

Что происходит при вызове new ChildClass()? – создаётся пустой объект, – записывается скрытая ссылка на ChildClass.prototype, если он есть, – передаётся в качестве this в функцию-конструктор.

Page 36: Сергей Константинов — Что интересного готовит нам W3C

36

Наследование в JS

Но этот метод не работает, если в this должен быть не Object, а другой примитив языка, например, Array, Date, RegExp, … // Так не работает

function ChildArray () {

Array.call(this);

}

ChildArray.prototype = new Array();

Page 37: Сергей Константинов — Что интересного готовит нам W3C

37

Наследование в JS

Разрешение наследоваться от встроенных объектов приводит к неразрешимым противоречиям. function ChildArray () { Array.call(this); Date.call(this); this.length = 100500; // И что мы получим в итоге? о_О

}

Page 38: Сергей Константинов — Что интересного готовит нам W3C

38

Наследование в JS

К тому же, в большинстве случаев внутренняя логика встроенных типов реализованы на C++ из соображений производительности.

Page 39: Сергей Константинов — Что интересного готовит нам W3C

39

Наследование в JS

Решение: отделить создание объекта (allocation) от его инициализации (initialization). Функция-конструктор инициализирует созданный объект, а вот само создание спрятано за другой функцией.

Page 40: Сергей Константинов — Что интересного готовит нам W3C

40

Наследование в JS

Функция-аллокатор прячется за специальным символом @@create ("эт-эт-криэйт", ага). // именно так, без кавычек // возвращает инстанцию объекта // для передачи в инициализирующий конструктор Function[@@create]()

@@create – не единственный специальный символ, есть ещё несколько полезных штук. http://people.mozilla.org/~jorendorff/es6-draft.html#sec-ecmascript-language-types-symbol-type

Page 41: Сергей Константинов — Что интересного готовит нам W3C

41

Наследование в JS

new ChildClass() теперь эквивалентен вот такой конструкции: ChildClass.call(

typeof ChildClass[@@create] != 'undefined' ? ChildClass[@@create]() :

// Это некоторое упрощение ;)

ObjectCreate(ChildClass.prototype)

);

http://people.mozilla.org/~jorendorff/es6-draft.html#sec-construct-argumentslist

Page 42: Сергей Константинов — Что интересного готовит нам W3C

42

Наследование в JS

Обещают поддержку наследования от: – стандартных типов Array, Date, RegExp; – TypedArray; – новых ES6-типов Set, WeakSet, Map, WeakMap; – и даже HTMLElement!

Page 43: Сергей Константинов — Что интересного готовит нам W3C

43

Наследование в JS

Вот так: function ChildClass () { Array.call(this); }

ChildClass[@@create] = Array[@@create];

ChildClass.prototype = new Array();

Page 44: Сергей Константинов — Что интересного готовит нам W3C

Главный вопрос: – Когда?

Page 45: Сергей Константинов — Что интересного готовит нам W3C

Обещают весной

Page 46: Сергей Константинов — Что интересного готовит нам W3C

Обещают весной (год не уточняют)

Page 47: Сергей Константинов — Что интересного готовит нам W3C

Обещают весной (год не уточняют) (но хотя бы при нашей жизни)

Page 48: Сергей Константинов — Что интересного готовит нам W3C

Сергей Константинов

Руководитель группы разработки API Карт W3C TAG Member

[email protected]

Спасибо!