Почему Node.js — это гуд

Пред­ставь­те:

  1. Вы напи­са­ли про­стое при­ло­же­ние в бра­у­зе­ре — напри­мер, ана­ли­за­тор тек­ста или ипо­теч­ный каль­ку­ля­тор. Так как всё было в бра­у­зе­ре, вы сра­зу напи­са­ли всё на JavaScript. Софт рабо­та­ет, при­но­сит поль­зу.
  2. Со вре­ме­нем вы раз­ви­ва­е­те про­ект. Появ­ля­ют­ся новые функ­ции. Одна­жды появи­лась потреб­ность в пере­но­се про­грам­мы на мощ­ный сер­вер. Напри­мер, вы реши­ли доба­вить к сво­е­му соф­ту инте­гра­цию с Теле­гра­мом, а для это­го нужен сер­вер.
  3. В обыч­ной ситу­а­ции вам бы при­шлось выбрать какой-нибудь сер­вер­ный язык и напи­сать свой софт зано­во — напри­мер, на Python или PHP. Но бла­го­да­ря NodeJS мож­но ско­пи­па­стить суще­ству­ю­щий код, пере­пи­сав лишь ввод-вывод, и ваша про­грам­ма про­дол­жит поко­рять мир.

Это и есть Node.js.

Что такое Node.js

Node.js — это систе­ма, кото­рая испол­ня­ет JavaScript отдель­но от ваше­го бра­у­зе­ра. Мож­но ска­зать, что это само­сто­я­тель­ная сре­да для выпол­не­ния JavaScript.

Node.js мож­но уста­но­вить на сер­вер (так же, как Python) и испол­нять на нём ваш код, отда­вая резуль­тат испол­не­ния поль­зо­ва­те­лям. На нём же мож­но делать отдель­ные при­ло­же­ния, исполь­зуя допол­ни­тель­ные фрейм­вор­ки.

Чем хорош Node.js

Если вы начи­на­ли изу­чать про­грам­ми­ро­ва­ние, вам будет понят­на кон­цеп­ция после­до­ва­тель­но­го испол­не­ния про­грам­мы. Сна­ча­ла испол­ня­ет­ся пер­вая строч­ка, потом вто­рая, потом тре­тья и так далее. Может быть, где-то про­грам­ма прыг­нет вперёд-назад, где-то заколь­цу­ет­ся, но в целом она испол­ня­ет­ся линей­но.

У JS есть фиш­ка — он уме­ет испол­нять код парал­лель­но (услов­но гово­ря). Про­грам­ми­сты назы­ва­ют это обра­бот­кой собы­тий. Про­грам­ме мож­но ска­зать: «Если когда-нибудь про­изой­дёт вот это — выпол­ни­те вон ту функ­цию, она зна­ет, что делать». Таких собы­тий мож­но преду­смот­реть мно­го — полу­ча­ет­ся, про­цес­сы как буд­то парал­лель­ны. Про­грам­ма может про­сто сидеть и ждать, когда что-то про­изой­дёт.

Боль­ше того, про­цес­сы асин­хрон­ны: про­грам­ма может что-то запро­сить в самом нача­ле рабо­ты — напри­мер, спро­сить что-то у базы дан­ных. И пока база дан­ных чешет­ся, про­грам­ма на Node.js будет зани­мать­ся даль­ше сво­и­ми дела­ми. А как при­дёт ответ — возь­мёт его и обра­бо­та­ет.

При раз­ра­бот­ке любой про­грам­мы на Node.js могут воз­ник­нуть сот­ни таких парал­лель­ных собы­тий и обра­бот­чи­ков. Что­бы никто из них не пере­тя­ги­вал оде­я­ло на себя, Node.js дела­ет бес­ко­неч­ный цикл, в кото­ром по кру­гу предо­став­ля­ет про­цес­сор­ное вре­мя каж­дой функ­ции. В резуль­та­те созда­ёт­ся иллю­зия, что они рабо­та­ют парал­лель­но и не меша­ют друг дру­гу, но на самом деле ими жёст­ко управ­ля­ет сама плат­фор­ма.

Имен­но такое рав­но­мер­ное рас­пре­де­ле­ние все­го в цик­ле собы­тий и даёт Node.js пре­иму­ще­ство при созда­нии сер­вер­ных при­ло­же­ний.

Пример: веб-сервер на Node.js

Как рабо­та­ет обыч­ный веб-сервер

Рань­ше была такая про­бле­ма:

  1. На стра­ни­це нуж­но, напри­мер, пока­зать ава­тар­ку и ник­нейм поль­зо­ва­те­ля.
  2. Для это­го сер­вер делал запрос к базе дан­ных, что­бы полу­чить отту­да эту инфор­ма­цию.
  3. Пока база не отве­тит, сер­вер ниче­го не может сде­лать — он тер­пе­ли­во ждёт.
  4. Сер­вер ждёт.
  5. Когда от базы при­хо­дит ответ с кар­тин­кой и ник­ней­мом, сер­вер сно­ва ожи­ва­ет, про­дол­жа­ет загру­жать стра­ни­цу и в самом кон­це запра­ши­ва­ет у базы фоно­вую кар­тин­ку для сай­та.
  6. Сер­вер ждёт
  7. Стра­ни­ца тоже пока не рабо­та­ет, пото­му что не загру­зи­лась до кон­ца. Поло­ви­на скрип­тов тоже не рабо­та­ют, пото­му что они ждут пол­ной загруз­ки стра­ни­цы. Все ждут, пока база отве­тит.
  8. На каж­дый такой запрос нуж­ны ресур­сы, что­бы дер­жать соеди­не­ние с базой.
  9. Если таких запро­сов мно­го, ресур­сы на сер­ве­ре быст­ро закан­чи­ва­ют­ся, и тогда сайт начи­на­ет тор­мо­зить у всех сра­зу.
  10. Сер­вер начи­на­ет тупить и ино­гда выва­ли­ва­ет­ся с ошиб­кой. Стра­ни­цы пада­ют, поль­зо­ва­те­ли психу­ют и ухо­дят на дру­гой сайт.

Как работает сервер на Node.js

  1. На стра­ни­це нуж­но, напри­мер, пока­зать ава­тар­ку и ник­нейм поль­зо­ва­те­ля.
  2. Для это­го сер­вер дела­ет запрос к базе дан­ных, что­бы полу­чить отту­да эту инфор­ма­цию, а сам про­дол­жа­ет фор­ми­ро­вать стра­ни­цу даль­ше.
  3. Пока не при­шла ава­тар­ка, сер­вер уже сде­лал всё осталь­ное и уви­дел, что нуж­на фоно­вая кар­тин­ка.
  4. Сер­вер запра­ши­ва­ет кар­тин­ку, а в это вре­мя ему при­шла ава­тар­ка из про­шло­го запро­са. Раз ава­тар­ка при­шла, сер­вер встав­ля­ет её на нуж­ное место. Пока он это делал — при­шла фоно­вая кар­тин­ка.
  5. Все мате­ри­а­лы на месте, мож­но пока­зы­вать стра­ни­цу поль­зо­ва­те­лю. Стра­ни­ца загру­жа­ет­ся быст­рее, пото­му что сбор­ка про­изо­шла парал­лель­но.

Для чего ещё нужен Node.js

Кро­ме веб-приложений этот язык исполь­зу­ют для созда­ния любых сер­ви­сов, где нужен посто­ян­ный обмен инфор­ма­ци­ей с поль­зо­ва­те­лем:

  • чаты,
  • соци­аль­ные сети,
  • систе­мы сов­мест­ной рабо­ты над про­ек­том,
  • онлайн-редакторы тек­ста.

А ещё на нём мож­но напи­сать прак­ти­че­ски любое при­ло­же­ние и запу­стить его под Windows, MacOs или Linux. Это мож­но исполь­зо­вать для раз­ра­бот­ки уни­вер­саль­ных при­ло­же­ний, напри­мер, спис­ка задач, кото­рый дол­жен рабо­тать на всех плат­фор­мах, син­хро­ни­зи­ро­вать дан­ные в реаль­ном вре­ме­ни и уметь отправ­лять всё на мобиль­ное устрой­ство.

Послед­нее вре­мя боль­шую попу­ляр­ность наби­ра­ет исполь­зо­ва­ние Node.js для «интер­не­та вещей» — умных чай­ни­ков, весов и про­чей быто­вой тех­ни­ки. Здесь Node.js помо­га­ет управ­лять эти­ми при­бо­ра­ми и делать сер­ве­ры, кото­рые могут обра­ба­ты­вать мно­го запро­сов одно­вре­мен­но.

Кто это использует

Node.js в каче­стве осно­вы для сво­ей плат­фор­мы выбра­ли мно­го извест­ных ком­па­ний:

  • Walmart — круп­ней­шая сеть аме­ри­кан­ских роз­нич­ных мага­зи­нов,
  • LinkedIn — соци­аль­ная сеть дело­вых кон­так­тов,
  • Uber — так­си,
  • E-bay — аукцион-платформа для про­да­жи това­ров по все­му миру,
  • GitHub — репо­зи­то­рий про­ек­тов для про­грам­ми­стов,
  • Netflix — про­из­вод­ство и съём­ка сери­а­лов,
  • Trello — сер­вис для управ­ле­ни­я­ми про­ек­та­ми.

С чего начать

Если хоти­те попро­бо­вать Node.js уже сей­час, нач­ни­те с этих ресур­сов — там доста­точ­но инфор­ма­ции для быст­ро­го стар­та.

Меди­ум — очень крат­ко, но всё по делу.

RuVDS (.pdf) — отлич­ное руко­вод­ство по Node.js. Мно­го, объ­ём­но, но инте­рес­но.

Node.js — это бэкенд
От бэкен­да зави­сит мно­гое: ско­рость загруз­ки стра­ниц, надёж­ность сай­тов и без­опас­ность пере­да­чи дан­ных. Хоти­те во всём этом раз­би­рать­ся и полу­чить новую про­фес­сию — мы толь­ко за.