Всем привет. Я Серёжка Рубанов. Панк-разработчик из города Орла, двукратный чемпион вселенной по покеру на костях, digital nomad, член команды Babel, участник WebAssembly Community Group, нетипичный ботан, контрибьютор в разный хипстерский (и не очень) опенсорс, WebAssembly-проповедник (заходите в @webassembly_ru), JavaScript камикадзе, организатор @BeerJS Moscow и прочих спонтанных (и не очень) BeerJS в различных местах, которым приходится терпеть мое присутствие. Я буду тут рассказывать о всяких нёрдских вещах типа стандартов и спецификаций. Иногда буду рассказывать о конференциях, которых посещаю over9000 в год.
Сегодня пятница, а значит что-то первое из интересного будет скорее всего уже в понедельник. На прошлой неделе был митинг TC39 — комитета, который занимается разработкой JavaScript и около-JavaScript стандартов. Официальных записей с митинга пока еще нет, но благодаря моей ботанической (но это не точно) натуре и возможности выхватывать различные инсайды, вы узнаете об изменених в стандарте ECMAScript раньше. А пока хороших выходных и с международным днем пива! 🍻
P.S. Можете полистать мой твиттер https://twitter.com/chicoxyzzy. Может быть найдете что-то интересное.
Сегодня пятница, а значит что-то первое из интересного будет скорее всего уже в понедельник. На прошлой неделе был митинг TC39 — комитета, который занимается разработкой JavaScript и около-JavaScript стандартов. Официальных записей с митинга пока еще нет, но благодаря моей ботанической (но это не точно) натуре и возможности выхватывать различные инсайды, вы узнаете об изменених в стандарте ECMAScript раньше. А пока хороших выходных и с международным днем пива! 🍻
P.S. Можете полистать мой твиттер https://twitter.com/chicoxyzzy. Может быть найдете что-то интересное.
Короткая новость: как я уже успел упомянуть в одном из жс чатов (t.me/js_ru/91979), вышла последняя бета Babel 7 под номером 56. После нее будет релиз кандидат и потом релиз. В седьмой версии бабеля ооочень много внутренних изменений и улучшений, но они не должны затронуть большинство разработчиков. Для более простой миграции с шестой на седьмую версию существует https://github.com/babel/babel-upgrade. Большинство новых пакетов бабеля теперь будет опубликовано в npm namespace @babel. Пресетов preset-stage-x больше не существует. Если хотите усложнить себе жизнь добавлением нестандартизированных фич, то можете добавить нужные proposal плагины или даже сделать себе такие пресеты самостоятельно. Также в Babel 7 будут добавлены реализации новых пропозалов, парсер Babylon будет переименован в @babel/parser (который, кстати, научится понимать TypeScript), и много-много других изменений. Так что если все пойдет хорошо, то ждем релиза и официального анонса в конце этого месяца.
С 24 по 26 июля в Редмонде, в офисе Microsoft прошла регулярная встреча (https://github.com/tc39/agendas/blob/master/2018/07.md) технического комитета 39. Официальных записей пока нет, но я вкратце расскажу что вообще там происходило.
ArrayBuffer.prototype.transfer (https://github.com/domenic/proposal-arraybuffer-transfer/) — это довольно старый пропозал. Какое-то время он находился в списке неактивных предложений, но недавно Доменик Деникола взялся за него в качестве чемпиона и продвинул его из stage 0 сразу в stage 2.
Временное выключение SharedArrayBuffer в браузерах (из-за Spectre и Meltdown) позволило провести изменение API — переименовать Atomics.await в Atomics.notify. Слайды прилагаю https://docs.google.com/presentation/d/1iiGJyVwy6YM3p8T0hfaDuj4fQ4tT0b4Oz24OzzCetAg/edit#slide=id.g397b9d4010_0_78.
Temporal Proposal (https://github.com/tc39/proposal-temporal) (замена не слишком хорошего Date) очень сильно обновился и пока остается на stage 1. Вот слайды http://htmlpreview.github.io/?https://github.com/tc39/proposal-temporal/blob/master/July2018Updates.html.
Также обсудили Realms shim security review https://github.com/tc39/agendas/blob/master/2018/realms-sec-review.pdf.
Intl.DateTimeFormat.prototype.formatRange и Intl.DateTimeFormat.prototype.formatRangeToParts (https://github.com/fabalbon/proposal-intl-DateTimeFormat-formatRange) передвинулись со stage 0 на stage 2. Слайды тут https://docs.google.com/presentation/d/e/2PACX-1vQXuKpkf-kHF4Ue-35PAez79EL2bTU-s3dGbQvj0zwOzbqnF1zJJif_RT8wV9v8VkI4agEzvBPbKOoi/pub?slide=id.p.
Explicit resource management (https://github.com/rbuckton/proposal-using-statement) — ушел на stage 1. Слайды здесь https://docs.google.com/presentation/d/1OmkXFMizf5iYME9ClERZ3C1dwUAhh7-r2YMD-rTzY-Y/edit?usp=sharing.
Do expressions немного обновились — https://github.com/tc39/agendas/blob/master/2018/do-expressions-update.pdf.
Пропозал Dynamic Modules (https://github.com/guybedford/proposal-dynamic-modules) передвинулся на stage 1. Вот слайды https://docs.google.com/presentation/d/1sqlvsiIOO0MgU6bW4TjB4RXZkjMAlEzuING_qMF1fYo/view#slide=id.p.
Object.fromEntries (https://github.com/tc39/proposal-object-from-entries) переместился со stage 2 на stage 3.
Обсудили менеджмент и инфраструктуру TC39 (https://docs.google.com/presentation/d/1eTBTMZzylhZR4v7Hgfd3UJYwLBgQZgX8q8fGvsvcNDE/edit#slide=id.p).
Оптимизировали await (https://github.com/tc39/agendas/blob/master/2018/await-change.pdf).
Еще обсудили подгруппы в TC39 (https://docs.google.com/presentation/d/1x2t8ggcpFlZ2zl1RjVgO5fmGjqXRxlkoqcGDKY5ksVg/edit#slide=id.p).
С первого на второй stage перешел пропозал RegExp Match array offsets https://github.com/rbuckton/proposal-regexp-match-offsets.
Пропозал по декораторам обновился (https://docs.google.com/presentation/d/1issTHgP5bf_FsbCSDfKAHjjoNnFa9nI0bEeCZtbh1oM/edit#slide=id.p), но остается на втором stage.
Cancellation (https://github.com/tc39/proposal-cancellation) остается на stage 1. Слайды с презентации прилагаю https://docs.google.com/presentation/d/19M7OkW8fr-HBYzgQRDSX77Pn4WmGh_5gPnBV38N3x08/edit?usp=sharing.
First-Class Protocols (https://github.com/michaelficarra/proposal-first-class-protocols) остаются на стейдже 1. Вот слайды https://docs.google.com/presentation/d/1HnxJl4Iodf3I23e-ZDkw4F1LEkMRGUBFq6xxR0a9a_k/edit?usp=sharing.
Partial Application Syntax (https://github.com/tc39/proposal-partial-application) также остаются на первом стейдже. Картинки тут https://github.com/tc39/proposal-partial-application.
Пропозал JavaScript Standard Library (https://github.com/msaboff/JavaScript-Standard-Library) переместился на stage 1.
Intl.NumberFormat (https://github.com/sffc/proposal-unified-intl-numberformat) — этот пропозал я пока так и не понял передвинулся ли на стейдж 2. Вроде бы нет. Вот слайды https://docs.google.com/presentation/d/1_1D15PWniTlbLu1BOU9aDf5H87Ecq85i0CuLl5KA4DE/edit#slide=id.g3db4b37152_0_0.
ArrayBuffer.prototype.transfer (https://github.com/domenic/proposal-arraybuffer-transfer/) — это довольно старый пропозал. Какое-то время он находился в списке неактивных предложений, но недавно Доменик Деникола взялся за него в качестве чемпиона и продвинул его из stage 0 сразу в stage 2.
Временное выключение SharedArrayBuffer в браузерах (из-за Spectre и Meltdown) позволило провести изменение API — переименовать Atomics.await в Atomics.notify. Слайды прилагаю https://docs.google.com/presentation/d/1iiGJyVwy6YM3p8T0hfaDuj4fQ4tT0b4Oz24OzzCetAg/edit#slide=id.g397b9d4010_0_78.
Temporal Proposal (https://github.com/tc39/proposal-temporal) (замена не слишком хорошего Date) очень сильно обновился и пока остается на stage 1. Вот слайды http://htmlpreview.github.io/?https://github.com/tc39/proposal-temporal/blob/master/July2018Updates.html.
Также обсудили Realms shim security review https://github.com/tc39/agendas/blob/master/2018/realms-sec-review.pdf.
Intl.DateTimeFormat.prototype.formatRange и Intl.DateTimeFormat.prototype.formatRangeToParts (https://github.com/fabalbon/proposal-intl-DateTimeFormat-formatRange) передвинулись со stage 0 на stage 2. Слайды тут https://docs.google.com/presentation/d/e/2PACX-1vQXuKpkf-kHF4Ue-35PAez79EL2bTU-s3dGbQvj0zwOzbqnF1zJJif_RT8wV9v8VkI4agEzvBPbKOoi/pub?slide=id.p.
Explicit resource management (https://github.com/rbuckton/proposal-using-statement) — ушел на stage 1. Слайды здесь https://docs.google.com/presentation/d/1OmkXFMizf5iYME9ClERZ3C1dwUAhh7-r2YMD-rTzY-Y/edit?usp=sharing.
Do expressions немного обновились — https://github.com/tc39/agendas/blob/master/2018/do-expressions-update.pdf.
Пропозал Dynamic Modules (https://github.com/guybedford/proposal-dynamic-modules) передвинулся на stage 1. Вот слайды https://docs.google.com/presentation/d/1sqlvsiIOO0MgU6bW4TjB4RXZkjMAlEzuING_qMF1fYo/view#slide=id.p.
Object.fromEntries (https://github.com/tc39/proposal-object-from-entries) переместился со stage 2 на stage 3.
Обсудили менеджмент и инфраструктуру TC39 (https://docs.google.com/presentation/d/1eTBTMZzylhZR4v7Hgfd3UJYwLBgQZgX8q8fGvsvcNDE/edit#slide=id.p).
Оптимизировали await (https://github.com/tc39/agendas/blob/master/2018/await-change.pdf).
Еще обсудили подгруппы в TC39 (https://docs.google.com/presentation/d/1x2t8ggcpFlZ2zl1RjVgO5fmGjqXRxlkoqcGDKY5ksVg/edit#slide=id.p).
С первого на второй stage перешел пропозал RegExp Match array offsets https://github.com/rbuckton/proposal-regexp-match-offsets.
Пропозал по декораторам обновился (https://docs.google.com/presentation/d/1issTHgP5bf_FsbCSDfKAHjjoNnFa9nI0bEeCZtbh1oM/edit#slide=id.p), но остается на втором stage.
Cancellation (https://github.com/tc39/proposal-cancellation) остается на stage 1. Слайды с презентации прилагаю https://docs.google.com/presentation/d/19M7OkW8fr-HBYzgQRDSX77Pn4WmGh_5gPnBV38N3x08/edit?usp=sharing.
First-Class Protocols (https://github.com/michaelficarra/proposal-first-class-protocols) остаются на стейдже 1. Вот слайды https://docs.google.com/presentation/d/1HnxJl4Iodf3I23e-ZDkw4F1LEkMRGUBFq6xxR0a9a_k/edit?usp=sharing.
Partial Application Syntax (https://github.com/tc39/proposal-partial-application) также остаются на первом стейдже. Картинки тут https://github.com/tc39/proposal-partial-application.
Пропозал JavaScript Standard Library (https://github.com/msaboff/JavaScript-Standard-Library) переместился на stage 1.
Intl.NumberFormat (https://github.com/sffc/proposal-unified-intl-numberformat) — этот пропозал я пока так и не понял передвинулся ли на стейдж 2. Вроде бы нет. Вот слайды https://docs.google.com/presentation/d/1_1D15PWniTlbLu1BOU9aDf5H87Ecq85i0CuLl5KA4DE/edit#slide=id.g3db4b37152_0_0.
Обсудили проблемы добавления нового синтаксиса в JavaScript https://docs.google.com/presentation/d/179v41LMaEXDxaD-piSgYVi6btFJoNoeYVncXe0172GM/edit#slide=id.p. На 4 слайде внезапно мой патч в спецификацию. Вот ссылка на него на гитхабе https://github.com/tc39/ecma262/pull/1126. Может быть расскажу о нем подробнее позже.
Вроде ничего не забыл.
Вроде ничего не забыл.
Хочется поблагодарить Сашу Майорова за промоушн канала и сделать ответочку. Саша ведет канал про собеседования, задачки по программированию и просто про веб-технологии. Также он сейчас главный по RadioJS. Обязательно подписывайтесь на его канал.
https://news.1rj.ru/str/prowebit
https://news.1rj.ru/str/prowebit
Telegram
Pro WEB & IT
Про IT в целом, WEB технологии, программирование и не только. Разбираю вопросы с собеседований и IT головоломки. Для тех, кто хочет найти работу по душе: https://news.1rj.ru/str/geekjobs
Кстати, насчет временного отключения SharedArrayBuffer в браузерах. Google без каких-либо анонсов включил его в Chrome 68. Я заметил это совершенно случайно, написав “sha” в консоли и увидев его в списке автодополнения. Включить SAB вновь позволила изоляция сайтов, которая была добавлена еще в Chrome 67. Мозилла также работает над изоляцией сайтов. Про Safari и Edge информацию найти не удалось. Если вы знаете что-то об этом, то обязательно расскажите мне.
https://twitter.com/chicoxyzzy/status/1025519923496407045
https://twitter.com/chicoxyzzy/status/1025519923496407045
Twitter
Sergey Rubanov
Good news: Mozilla is also working on site isolation (Project Fission) which will make it possible to re-enable SharedArrayBuffer in @Firefox. https://t.co/sb7EH5YilQ https://t.co/JFmJr2Ix9a
Неделю назад в ChakraCore вмержили поддержку Object rest / spread. По дефолту поддержка выключена и включается флагом ES2018ObjectRestSpread. Интересно, успеют ли зашипить эту фичу включенной подефолту к осеннему обновлению Windows, в котором приедет Edge 18? В данный момент Edge — единственный браузер, который не умеет Object rest / spread.
https://github.com/Microsoft/ChakraCore/pull/5498
https://github.com/Microsoft/ChakraCore/pull/5498
GitHub
Implement Object Rest by huaiyudavid · Pull Request #5498 · Microsoft/ChakraCore
Currently defaults to off under the ES2018ObjectRestSpread flag.
Parser changes:
Added ParseNodeObjLit as new type of node used to store info for Rest
Bytecode changes:
Added 3 new bytecodes: R...
Parser changes:
Added ParseNodeObjLit as new type of node used to store info for Rest
Bytecode changes:
Added 3 new bytecodes: R...
Еще интересный факт о spread operator: никакого спред оператора не существует. Вот так. Бум 🤯
По спецификации спред относится к пунктуаторам и является просто синтаксисом. Забавно, но даже Jordan Harband, один из активных участников TC39 и чемпион нескольких предложений в спецификацию, кажется не знал об этом.
https://github.com/kangax/compat-table/pull/1331#discussion_r206703275
Там же по ссылке мои пояснения на эту тему, а также ссылка на SO, где также это все объясняется.
По спецификации спред относится к пунктуаторам и является просто синтаксисом. Забавно, но даже Jordan Harband, один из активных участников TC39 и чемпион нескольких предложений в спецификацию, кажется не знал об этом.
https://github.com/kangax/compat-table/pull/1331#discussion_r206703275
Там же по ссылке мои пояснения на эту тему, а также ссылка на SO, где также это все объясняется.
Пример того, как можно заинлайнить вебассембли прямо в JS коде.
https://github.com/dcodeIO/long.js/blob/master/src/long.js#L9-L11
long.js — библиотека, которая позволяет работать с 64-битными целыми числами. WebAssembly умеет работать с int64/uint64 из коробки, поэтому если WebAssembly доступен в браузере (или nodejs), то он будет использоваться для математических операций.
Кстати, в ECMAScript есть пропозал BigInt (https://github.com/tc39/proposal-bigint), который находится на stage 3 и уже заимплеменчен в хроме, начиная с версии 67.
https://github.com/dcodeIO/long.js/blob/master/src/long.js#L9-L11
long.js — библиотека, которая позволяет работать с 64-битными целыми числами. WebAssembly умеет работать с int64/uint64 из коробки, поэтому если WebAssembly доступен в браузере (или nodejs), то он будет использоваться для математических операций.
Кстати, в ECMAScript есть пропозал BigInt (https://github.com/tc39/proposal-bigint), который находится на stage 3 и уже заимплеменчен в хроме, начиная с версии 67.
Меня тут попросили рассказать о том, как создать и продвигать свой пропозал в ECMAScript. У меня как раз есть один, но надо еще найти время оформить. Пропозал довольно простой, но требует погружения в семантику. Посмотрим что из этого выйдет.