🔥

Тред (Мышов Саша)


Сегодня будет тред про мою любимую тему — историю JS и JS-экосистемы. Один лайк — один факт.

Начну с наиболее известного факта. JavaScript был разработан Бренданом Айком в течение 10 дней.

JavaScript успел поменять два названия: сначала он назывался Mocha, потом LiveScript. Процесс смены имён происходил во время внедрения движка в браузер Netscape Communicator 2, который вышел в декабре 1995 года.

Брендан Айк изначально разрабатывал Scheme-like язык, но из-за маркетинговых соображений новый язык стал напоминать Java.

На тот момент Java была очень горячей технологией. И Netscape боролся за то, чтобы Sun (владелец Java) выпустила виртуальную машину для Netscape, а не для Internet Explorer.

Netscape заполучила Java, а JavaScript начал потихоньку набирать популярность и уже год спустя Netscape выпустила пресс-релиз, в котором говорила о 300000 JavaScript-enabled страницах.

Microsoft не хотела оставаться в стороне и не хотела терять долю web'а из-за того, что страницы с JavaScript в IE не работали. Поэтому спустя год был представлен JScript.

Было выбрано такое название, потому что торговая марка "JavaScript" принадлежала Sun.

Чтобы не допустить фрагментацию web'а, был сформирован комитет TC-39, который начал работать над спецификацией JavaScript.

Из-за проблем с торговой маркой для спецификации был выбрано новое название — ECMAScript.

В 1997 году была выпущена первая версия стандарта ECMAScript, который курируется ECMA — ассоциацией по стандартизации информации и коммуникационных систем.

В 1998 году вышла вторая версия стандарта, которая практически не отличалась от первой. Все изменения состояли в том, чтобы стандарт прошёл одобрение как международный стандарт ISO/IEC 16262.

У JavaScript в то время не было многих фич: регулярные выражения, try/catch, in, instanceof, do/while и т.п. В самой первой версии движка не было поддержки ключевой фичи JS — объявления объектов в качестве литералов: var obj = {a: 1}.

Все эти фичи были стандартизированы в третьей версии ECMAScript в декабре 1999 года.

В 2000 году вышел первый браузер Netscape Communicator 6 с поддержкой третьей версии стандарта.

Но до этого в марте 1998 Netscape сделала анонс, что новый браузер будет бесплатным (да, тогда браузер надо было покупать) и что будет открыт его исходный код.

Для воплощения этих планов была учреждена организация Mozilla, в которой по факту работали инженеры компании Netscape.

Тем самым Mozilla унаследовала код html-движка Gecko и js-движка SpiderMonkey, которые стали использоваться в наследнике Netscape — Firefox.

SpiderMonkey — это второе название движка. Самое первое название, вернее его кодовое имя, было Mocha. Да, именно то первое название языка JavaScript.

Из-за переписывания кодовой базы Netscape потерял основную долю рынка. И когда в 2000 году вышел релиз 6-ой версии, Internet Explorer уже полтора года предлагал новые фичи. en.wikipedia.org/wiki/Browser_w…

В начале 2000-ых, когда Internet Explorer задавал тренды в web'е, началась работа над ECMAScript 4. Над стандартом работали Microsoft, Adobe, Mozilla, Opera, Yahoo.

Объём работ был огромный. В стандарт хотели добавить неймспейсы, интерфейсы, классы, опцианальную статическую типизацию, пакеты, генераторы, деструктуризацию, интроспекцию и многое другое.

На тот момент комитет поделился на две части. Одни хотели революционного развития JS, другие эволюционного.

Дуглас Крокфорд, который выступал от Yahoo, убедил участника из Microsoft в том, что огромное количество новых фич в рамках одного стандарта могут нести губительные проблемы для языка.

Тем самым доминирующий на рынке браузер (Internet Explorer) отказывался поддерживать фичи из нового стандарта.

Adobe, наоборот, выступала за новый стандарт. ActionScript, который разрабатывался сначала в недрах Macromedia, а потом Adobe, был разработан на базе черновика ECMAScript 4.

То есть если вы посмотрите на код ActionScript, то примерно так же бы выглядел и ECMAScript 4, если бы он был утверждён. Например, вот так github.com/DaVikingCode/C…

Прошло 8 лет, в комитете до сих пор не было консенсуса. Было решено, что так продолжаться не может.

Дуглас Крокфорд призвал остановить споры и исправить проблемы в существующей версии стандарта.

Исправления были запланированы как часть спецификации ECMAScript 3.1, в которую должны были попасть части из четвёртой спеки, которые не влияли на синтаксис, а исправляли проблемы в языке.

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

В 2009 году работа над 3.1 была закончена. Но стандарт решили переименовать в пятую версию, чтобы избежать путаницы (в 3.1 входили части из четвёртого стандарта).

Параллельно с четвёртым стандартом языка разрабатывалось новое расширение ECMAScript - E4X, которое позволило бы упростить работу с XML в JS.

Поддержка E4X появилась в SpiderMonkey, но потом была удалена. На mdn до сих пор можно найти этот артефакт — developer.mozilla.org/en-US/docs/Arc….

После выпуска пятой версии комитет решил продолжить над эволюционным развитием языка — проект новой спецификации получил название Harmony.

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

От многих идей отказались, например, от статической типизации, другие идеи были переосмыслены, например, классы в новой редакции — синтаксический сахар над прототипами.

Работа над ECMAScript 6 продолжалась 6 лет.

К моменту, когда стандарт был закончен, браузеры уже начинали реализовывать новые фичи.

ECMAScript 6 в итоге был переименован в ECMAScript 2015. Использование года ознамевало переход к новому процессу стандартизации фич.

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

После того как набирается достаточный набор фич в stage 4, формируется новый стандарт, который обозначается текущим годом.

На данный момент вышли версии 2016, 2017, 2018 и 2019.

В 1999 году разработчики из команды Outlook добавили новую фичу в IE5, с помощью которой страница могла получать данные с сервера без перезагрузки страницы.

Фича смогла попасть в браузер только благодаря тому, что в её названии была горячая на тот момент технология — XML.

> Which is the real explanation of where the name XMLHTTP comes from- the thing is mostly about HTTP and doesn't have any specific tie to XML other than that was the easiest excuse for shipping web.archive.org/web/2007022719…

Эта фича оставалась вне видимости разработчиков, пока Google не выпустил новые сервисы Gmail и Google Maps, которые были похожи на десктопные приложения в браузере, что на тот момент было чудом.

У такого подхода создания приложений не было названия, пока Джесси Джеймса Гарретта не придумал термин AJAX. Впервые он появился в 2005 году в статье "Ajax: a New Approach to Web Applications" web.archive.org/web/2005022203…

Распространение информации о новом подходе к разработке web-приложений очень сильно повлияло на то, как разработчики стали относится к JavaScript.

Раньше JS был просто неизбежным злом, который пытались подменить с помощью Flash, Java, Silverlight. После появления AJAX, web-платформу (DOM, JS, CSS и HTML) стали воспринимать как платформу для построения полноценных и удобных приложений.

Примерно в это время (2004-2006) стали появляться js-библиотеки, которые сглаживали различия между браузерами и позволяли без боли писать клиентский JavaSript — Dojo, jQuery.

В это время же время стали появляться большие монолитные фреймворки, с помощью которых можно было писать GUI-приложения в вебе — YUI, ExtJS.

В конце 2004 года Тим О'Рейли популяризирует термин "Web 2.0", которыми стали называть современные web-приложения.

В 2005 году появился яркий представитель Web 2.0 — первая операционная системаx, полностью работающая в браузере — eyeOS (ru.wikipedia.org/wiki/EyeOS).

В 2008 году выходит знаменитая книга Дугласа Крокфорда "JavaScript: The Good Parts", которая стала важной вехой в истории становления JavaScript как полноценного языка.

Как говорил Дуглас: "JavaScript — это наиболее неправильно понимаемый язык".

Работа Дугласа, появление хороших js-библиотек и фреймворков, может считаться первой волной, привлёкших большое количество новых разработчиков.

В 2008 году балом правил Internet Explorer c ECMAScript 3. Но на это время у Firefox уже была солидная пользовательская база — 30%, в котором были хорошие инструменты для разработки.

В то время как для отладки кода в IE программисты использовали alert'ы, а особенно продвинутые скачивали специальный плагин для дебага страниц с MSDN. Также были служебные скрипты, которые позволяли имитировать console.log().

Из-за того что IE был очень сильно интегрирован в операционную систему, Microsoft не могла оперативно делать обновления под увеличивающиеся требования разработчиков.

IE стал превращаться в аутсайдера. Дошло до того, что разработчики огромных проектов настолько устали от IE6, что стали призывать пользователей к переходу на современные браузеры blog.chriszacharias.com/a-conspiracy-t…

Internet Explorer начал терять рынок. Ситуация для IE стала ещё неблагоприятнее, после того как в 2008 году Google представил новый браузер Chrome. Основная фишка, которого была в производительном выполнении JavaScript.

В это время была выпущена пятая версия спецификации ECMAScript, которая была реализована во всех браузерах к 2013 году. С 2009 по 2013 разработчики стали с бо́льшим энтузиазмом относится к JavaScript.

Приложения, написанные на JavaScript становились всё больше и больше, что привело к появлению целого вороха MVC-фреймворков: Angular, Ember, Backbone, Knockout и т.п. Было ощущение, что каждый день выходит какой-то новый фреймворк или инструмент.

Основным фактором, который привёл к бурному развитию новых инструментов, можно считать появление Node.js, который был представлен Райаном Далом в октябре 2009, и npm в 2010 году.

Node.js был построен на базе JavaScript-движка v8, который был позаимствовал у Chrome, и библиотеки libuv, созданной Райаном, для кроссплатформенной работы с асинхронным I/O.

Node.js изначально разрабатывался под эгидой CommonJS, — инициативой, цель которой заключалась в создании набора общих API для взаимодействия с операционной системой из JavaScript напрямую, вне браузера.

Создание CommonJS было вдохновлено Кевином Дангуром, который описал текущие проблемы в статье "What Server Side JavaScript needs" (январь 2009). blueskyonmars.com/2009/01/29/wha…

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

После публикации статьи Кевина и призыва подключиться к работе над CommonJS, появился стандарт, описывающий модульную систему, который была впоследствии реализован в Node.js (exports, require).

Node.js набирал обороты, работа, которая шла в рамках CommonJS, не удовлетворяла разработчиков Node.js и в итоге от его адаптации решили отказаться.

Айзек Шлютер (автор npm) в 2013 написал: "One evening at Joyent, when I mentioned being a bit frustrated [...] a feature that I knew to be a terrible idea, he [Ryan Dahl] said to me, 'Forget CommonJS. It's dead. We are server side JavaScript'". github.com/nodejs/node-v0…

В 2019 году команда Node.js анонсировала поддержку официального стандарта ECMAScript Modules, что фактически означает, что модульная система CommonJS потихоньку исчезнет из мира современной Node.js разработки.

Самым важным результатом работы CommonJS помимо модулей можно считать разработку стандарта промисов Promises/A, которые перекочевали в спеку ECMAScript 2015 в виде доработанного стандарта Promises/A+.

Поддержка промисов в качестве работы с асинхронщиной была добавлена в одну из ранних версий Node.js, но была удалена. В последствии Райан Дал признал это ошибкой. youtu.be/M3BM9TB-8yA?t=…

В 2012 году Райан оставляет разработку Node.js и передаёт все права компании работодателю Joyent и Айзеку Шлютеру в частности.

Разработка Node.js начала стагнировать, Joyent не торопилась обновлять проект на новую версию v8, тем самым набор js-фич в ноде начал сильно отставать от набора фич в браузере.

Сообщество пошло на радикальный шаг и в декабре 2014 года 5 из 7 ключевых разработчиков создали независимый форк ноды — io.js ru.wikipedia.org/wiki/Io.js

Спустя всего полгода стало очевидно, что у Node.js проблемы — фокус коммьюнити переключился на io.js.

Компания Joyent выразила свою готовность перенести разработку Node.js на независимую площадку и передать права на интеллектуальную собственность. И 13 мая 2015 года Node.js и io.js объединились под эгидой новой некоммерческой организации Node.js Foundation.

12 марта 2019 года Node.js Foundation и JS Foundation объявили о слиянии с образованием новой некоммерческой организации OpenJS Foundation, поддерживающей разработку популярных JavaSctipt-проектов с открытым исходным кодом. linuxfoundation.org/press-release/…

Благодаря работе Microsoft в Node.js появился уровень абстракции, который сделал возможным использование альтернативных JavaScript-движков.

Microsoft адаптировала свой js-движок Chakra для Node.js в 2016 году github.com/nodejs/node-ch…

Самая интересная фича node-chakracore — time travel debugging, который поддерживается в VSCode github.com/nodejs/node-ch…

Mozilla тоже работала над внедрением SpiderMonkey в Node.js, но проект был заморожен github.com/mozilla/spider…

Благодаря Node.js стало возможным использовать один и тот же код и на сервере, и на клиенте. Такие приложения стали называть "изоморфными".

Изоморфные приложения позволили создавать полноценные Single Page Application (SPA) приложения, которые могли быть проиндексированы поисковыми роботами.

Термин "изоморфное приложение" ввёл в обиход Чарли Роббинс в 2011 году в статье "Scaling Isomorphic Javascript Code" web.archive.org/web/2019062210…

В 2015 году Майкл Джексон (другой Майкл Джексон) поделился своим мнением, почему "изоморфное приложение" неподходящее название, и предложил альтернативный термин "универсальное приложение".

Поэтому если вы читаете статьи и видите как в одном месте пишут про "изоморфные", а в другом "универсальные" приложения, знайте, что по сути это одно и то же.

С 2012 года начали появляться изоморфные фреймворки. Первопроходцем стал Meteor, который был выпущен в январе 2012 года.

Затем Yahoo в апреле 2012 года открыла код своего фреймворка Mojito, но из-за сильной привязки к YUI не получил большого распространения в сообществе github.com/YahooArchive/m…

В середине 2012 года 2GIS начал работу над своим изоморфным фреймворком — Slot — который лёг в основу обновлённой онлайн-версии. Первый прототип сделал Влад Семёнов (@Semenov). Затем работу над фреймворком подхватил Андрей Рублёв (@anrublev).