- PVSM.RU - https://www.pvsm.ru -
TL;DR
Эта обзорная статья. Такое себе "краткое содержание предыдущих серий". Она будет полезна для новичков, или тех, кто не следил за отраслью в последнее время. Для новичков это будет первый шаг во "Вселенную JavaScript", бывалые смогут освежить свои знания.
У JavaScript очень удивительная судьба. Он преодолел путь от самого не понимаемого до самого удивительного языка. У него было тяжелое детство:
Изначально Автор [1] хотел написать функциональный язык. Но менеджеры хотели получить, «обычный» объектно-ориентированный. И чтобы было легко искать разработчиков для новоиспеченного языка синтаксис решили сделать похожим на Java и даже название сделали похожим.
Но на этом история не заканчивается. Java, JavaScript это торговые марки Sun (а теперь Oracle). Microsoft не мог воспользоваться именем JavaScript (Netcape и Sun дружили против Microsoft). В результате Microsoft решил сделать реверс инжиниринг JavaScript и назвал его JScript. Сделали реверс инжиниринг, и сделали его настолько хорошо, что даже содрали все баги в реализации. Позже решили сделать стандарт и назвали его ECMAScript.
Из-за того, что язык писался чуть ли не за две недели (это очень мало), в нем был допущен ряд багов. А позже, когда язык вышел и был содран Майкрософтом, уже было поздно что-то менять. Некоторые идеи — это тяжелое наследие Java, от которого взяли синтаксис языка.
Язык программирования со слабой типизацией, с ошибками в реализации, с тяжелым наследием, с особенностями функционального языка вызывает только одно ощущение — «КАК? НУ КАК?» [2]. Постоянно пополняемый список «перлов» можно почитать здесь [3].
Чтобы не сойти с ума при работе с JavaScript, надо понимать, как работает слабая типизация, как работает область видимости переменных (глобальные переменные зло), как работает this, prototype и конструкторы. Также поможет jshint [4], чтобы избегать «плохие части» языка.
Вся эта история более подробно рассказана во второй лекции [5] Дугласа Крокфорда [6]. А лучше посмотреть все 8-серий [7]. Там есть титры ;).
Стоит отметить, что, несмотря на все минусы, у автора получилось сделать первый функциональный язык, c таким широким распространением. У Крокфорда есть вводная статья про функциональную природу JavaScript [8].
Базовые вещи, которые нужно понять (следующие из функциональной/асинхронной природы языка) это: что такое control flow [9] и как он помогает при работе с асинхронным языком и как работает обработка ошибок (try/catch не всегда помогают [10]).
Следующим этапом в развитии JS были JSON [11], AJAX и кроссбраузерная разработка [12]. Огромный скачок в этом этапе сделан благодаря jQuery. Очень рекомендую ознакомиться с туториалом [13] от Джона Резига [14] (автор jQuery). В туториале показаны некоторые приемы, использованные при создании jQuery. Или можно посмотреть интересные идеи непосредственно в исходниках jQuery [15]. Также интересные приемы рассмотрены в JavaScript patterns [16] и в essential js design patterns [17]. Если для вас это все еще сложно, то можно ознакомиться с более базовыми вещами здесь: JavaScript Garden [18], eloquentjavascript [19]
HTML5 [20] (html5rocks [21], diveintohtml5 [22]) и CSS3 [23] вытеснили Flash из браузеров (ну еще не до конца, но это только вопрос времени [24]). Отдельное спасибо за это Стиву Джобсу [25]. Теперь в распоряжении у JS есть: Canvas, WebGL, WebSockets, WebWorkers, Audio, Video и т.п. [26]
Гугл разродился браузером. И ускорил JavaScript до нельзя, подарив всему миру V8. Из которого в свою очередь родился NodeJS [27] (by Ryan Dahl [28]). Так JS попал и на сервер. Казалось бы куда дальше, и так заняли весь веб-стек технологий. Но и это не конец, JavaScript умудрился вытеснить еще и SQL [29]. Спасибо парням из 10gen за MongoDB [30]. Еще по теме: SQL to MongoDB [31], sql comparison [32].
Все уже и сами могут сделать этот вывод, но я это скажу вслух напишу: теперь разработать веб приложение от начала и до конца можно, зная только JavaScript (html и css не в счет).
Скорее всего это «подростковые прыщи», которые со временем пройдут. Но пока это еще актуально.
Наконец-то фронтенд разработка выбралась из каменного века, когда все делалось вручную. Появились инструменты для автоматизации [38] (инструмент написанный на js специально для этих целей) и менеджер пакетов [39] (я знаю, что это не первый менеджер, но будем надеяться, что этим будут пользоваться все). Все это собрано в кучу в проекте yeoman [40]. Если говорить про yeoman, нельзя не упомянуть: html5-boilerplate [41] и bootstrap [42]
Вместе с Ajax появились и первые «тяжеловесные» библиотеки/фреймворки: ExtJS, YUI и т. п. Но они громоздкие и неудобные. JQuery c другой стороны более легковесный и привычный, но так как это библиотека, а не фреймворк, он и не предлагает метод структуризации кода. На помощь пришел Backbone [43]. Следом за Backbone появилось много MV* фреймвокров. О них уже рассказывали: статья на Хабре [44], продолжение [45] и статья на английском [46]. А также можно сравнить фреймворки «на практике», почитав исходники на todomvc [47].
Этот фреймворк примечателен тем, что он пытается принести DataBinding [49] в JavaScript. Это не единственный фреймворк который это делает. Но авторы на этом не останавливаются и хотят принести нативную поддержку DataBinding в браузеры. Они разрабатывают спецификацию «model driven views» [50] вместе с командой Chrome. Ну еще он хорош, потому что есть хорошая документация, видео, заложено тестирование [51]. Он довольно легкий и хорошо интегрируется с другими библиотеками.
Именно за этим фреймворком (и ему подобными) будующее NodeJS. И вот почему, сам по себе JavaScript на сервере это еще то «удовольствие». Мы то с вами понимаем, что все эти рассказы про бешеную производительность [53] из-за асинхронности — это только маркетинг. Скорость, отказоустойчивость, способность выдержать нагрузку определяется не ЯП, а архитектурой. От того, как организованы хранение данных (шардинг), кеширование, очередь задач, распределенные вычисления и от отсутствия узких мест (bottleneck) и т. п. Понимая это, я бы лучше выбрал ЯП, на котором легко писать и легко поддерживать большую базу кода, для которого есть много готовых решений (намекаю на RoR). Узкие места, требующие огромной производительности, распределенные вычисления и т. п. можно написать на Erlang [54], Java или С.
Но то, что может Meteor, не может предложить ни одна другая технология: полное повторное использование кода с сервера на клиенте (или наоборот), ну и еще маленькая тележка магии (датабиндинг, клиентский хот релоад...).
Его единственное преимущество является и его минусом. Клиентский и серверный код не разрывны. Meteor не очень подходит для тех случаев, когда клиент делается с использованием другой технологии. Например, нативный мобильный или десктопный клиент.
Кстати в ближайшем конкуренте Meteor [55] derby этот вопрос решаем. Так как они используют Express и гораздо меньше магии, то к нему можно прикрутить REST API.
Если подумать, это не первая попытка уйти от классического клиент-северного подхода. До этого был, например, GWT. Но все предыдущие попытки были менее эффектны и это был не JavaScript.
Мало того, что JS добрался до мобильных браузеров [56] и выжил Flash, он еще претендует и на место нативных приложений. Это стало возможно благодаря Adobe Phonegap [57] (ядро проекта было отдано в open-source под названием Appache Cordova [58]).
Если добавить библиотеки для мобильных устройств, например: jQtouch, Sencha Touch, zepto. То получаться приложения с «нативным интерфейсом». Вот как смешать angular и jqtouch под PhoneGap [59]
Если добавить движки для игр [60], то получатся мобильные игры и т. п.
Давно уже существовали попытки сделать написание десктопных приложений таким же простым, как написание веб приложений. Вот один из последних претендентов — tidesdk [61].
Есть другие подобные проекты, о которых ранее рассказывали на Хабре: AppJS [62], Node Webkit [63].
После того, как все сообразили, насколько важное место занимает JavaScript, решили придумать что-то более удачное, чем JavaScript. Есть куча ЯП, которые могут быть скомпилированы в JS [64]. Среди этих проектов особенно можно выделить:
Конечно при таком подходе с языками «посредниками» проблема с дебагом на лицо. Она решается с помощью Source Maps [72].
JavaScript очень своеобразный язык, с родовыми травмами, которые в разные времена пытались решить по разному: jslint, заменители JavaScript, es6 [73]. Но не смотря на все проблемы, JavaScript активно развивается и набирает обороты: сообщество растет, инвестиции вливаются [74]. Все интересное еще впереди!
Автор: kotiara
Источник [75]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/24695
Ссылки в тексте:
[1] Автор: http://brendaneich.com/
[2] «КАК? НУ КАК?»: http://habrahabr.ru/post/137188/
[3] можно почитать здесь: http://wtfjs.com/
[4] jshint: http://www.jshint.com/
[5] второй лекции: http://www.youtube.com/watch?v=RO1Wnu-xKoY&list=PL7664379246A246CB
[6] Дугласа Крокфорда: http://javascript.crockford.com/
[7] все 8-серий: http://www.youtube.com/playlist?list=PL7664379246A246CB
[8] функциональную природу JavaScript: http://www.crockford.com/javascript/little.html
[9] control flow: http://dailyjs.com/2011/11/14/popular-control-flow/
[10] try/catch не всегда помогают: http://snmaynard.com/2012/12/21/node-error-handling/
[11] JSON: http://www.json.org/
[12] кроссбраузерная разработка: http://www.quirksmode.org/compatibility.html
[13] туториалом: http://ejohn.org/apps/learn/
[14] Джона Резига: http://ejohn.org/
[15] исходниках jQuery: http://www.keyframesandcode.com/resources/javascript/deconstructed/jquery/
[16] JavaScript patterns: http://shichuan.github.com/javascript-patterns/
[17] essential js design patterns: http://addyosmani.com/resources/essentialjsdesignpatterns/book/
[18] JavaScript Garden: http://shamansir.github.com/JavaScript-Garden/
[19] eloquentjavascript: http://eloquentjavascript.net/
[20] HTML5: http://www.whatwg.org/specs/web-apps/current-work/multipage/
[21] html5rocks: http://www.html5rocks.com/en/
[22] diveintohtml5: http://diveintohtml5.info/
[23] CSS3: http://www.css3.info/
[24] но это только вопрос времени: http://html5please.com/
[25] Отдельное спасибо за это Стиву Джобсу: http://www.apple.com/hotnews/thoughts-on-flash/
[26] Canvas, WebGL, WebSockets, WebWorkers, Audio, Video и т.п.: https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-Browser-Polyfills
[27] NodeJS: http://habrahabr.ru/hub/nodejs/
[28] Ryan Dahl: http://shitryandahlsays.tumblr.com/
[29] JavaScript умудрился вытеснить еще и SQL: http://www.querymongo.com/
[30] MongoDB: http://jsman.ru/mongo-book/
[31] SQL to MongoDB: http://rickosborne.org/download/SQL-to-MongoDB.pdf
[32] sql comparison: http://docs.mongodb.org/manual/reference/sql-comparison/
[33] мнение: http://habrahabr.ru/post/141295/
[34] CoC: http://en.wikipedia.org/wiki/Convention_over_configuration
[35] дефакто веб-фреймворк: http://habrahabr.ru/post/165017/#habracut
[36] config.js: https://github.com/baryshev/configjs
[37] синтаксический сахар для автозагрузки модулей: http://habrahabr.ru/post/164665/
[38] автоматизации: http://habrahabr.ru/post/148274/
[39] менеджер пакетов: http://twitter.github.com/bower/
[40] yeoman: http://habrahabr.ru/post/146829/
[41] html5-boilerplate: http://html5boilerplate.com/
[42] bootstrap: http://www.bootstraphero.com/the-big-badass-list-of-twitter-bootstrap-resources
[43] Backbone: http://habrahabr.ru/search/?q=%5Bbackbone%5D&target_type=posts
[44] статья на Хабре: http://habrahabr.ru/post/149594/
[45] продолжение: http://habrahabr.ru/post/149872/
[46] статья на английском: http://blog.stevensanderson.com/2012/08/01/rich-javascript-applications-the-seven-frameworks-throne-of-js-2012/
[47] todomvc: http://todomvc.com/
[48] Angular: http://angularjs.org/
[49] DataBinding: http://stackoverflow.com/questions/9682092/databinding-in-angularjs
[50] «model driven views»: http://lists.w3.org/Archives/Public/public-webapps/2011AprJun/thread.html#msg309
[51] тестирование: http://vojtajina.github.com/testacular/
[52] Meteor: http://meteor.com/
[53] бешеную производительность: http://habrahabr.ru/post/123154/
[54] Erlang: http://mr-aleph.livejournal.com/322682.html
[55] ближайшем конкуренте Meteor: http://blog.derbyjs.com/2012/04/14/our-take-on-derby-vs-meteor/
[56] мобильных браузеров: https://github.com/h5bp/mobile-boilerplate/wiki/Mobile-Emulators-%26-Simulators
[57] Adobe Phonegap: http://phonegap.com/
[58] Appache Cordova: http://cordova.apache.org/
[59] как смешать angular и jqtouch под PhoneGap: https://github.com/rafaelmachado/angular-sink/tree/jqtouch
[60] движки для игр: http://jster.net/category/game-engines
[61] tidesdk: http://www.tidesdk.org/
[62] AppJS: http://habrahabr.ru/post/153013/
[63] Node Webkit: http://habrahabr.ru/post/163045/
[64] Есть куча ЯП, которые могут быть скомпилированы в JS: https://github.com/jashkenas/coffee-script/wiki/List-of-languages-that-compile-to-JS
[65] coffeescript: http://coffeescript.org/
[66] книжка: http://arcturo.github.com/library/coffeescript/
[67] emscripten: https://github.com/kripken/emscripten
[68] dartlang: http://www.dartlang.org/
[69] Читайте о нем на Хабре: http://habrahabr.ru/search/?q=%5BDart%5D&target_type=posts
[70] typescriptlang: http://www.typescriptlang.org/
[71] Анонс на Хабре: http://habrahabr.ru/post/153077/
[72] Source Maps: http://habrahabr.ru/post/148098/
[73] es6: http://addyosmani.com/blog/ecmascript-6-resources-for-the-curious-javascripter/
[74] инвестиции вливаются: http://habrahabr.ru/post/148648/
[75] Источник: http://habrahabr.ru/post/165649/
Нажмите здесь для печати.