- PVSM.RU - https://www.pvsm.ru -
В 2009-м платформа Node.js сделала свои скромные первые шаги в бескрайнем мире разработки бэкендов. Это была была первая состоявшаяся попытка использования JavaScript в серверных приложениях. Сегодня будет крайне затруднительно найти веб-разработчика, который не слышал о Node. Но нельзя сказать, что существование Node было безоблачным. Эта платформа пережила раскол сообщества, была предметом форумных войн и многих довела до отчаяния.
[1]
Возможно, вы думаете, что подобные заявления звучат слишком уж напыщенно. Однако, попробуйте поискать в Google, и вы столкнётесь с неистощимым источником бесконечных споров [2]. Среди рассуждений не в пользу Node, которые могут вам встретиться, есть, например, такие, которые, вопрошая о том, что случилось с аксиомой об использовании лучшего из имеющихся инструментов для решения некоей задачи, указывают, что JS и рядом не стоял с правильным серверным инструментарием. Другие [3] критические замечания о JS, вроде «Callback hell is real», призывающие поверить в реальность ада коллбэков, звучат как строчки из стихотворения. Некоторые [4] из критиков Node выражаются более прямо и однозначно: «Node — это раковая опухоль».
Полагаю, настало время восстановить истинное положение вещей, расставить все точки над «i» в том, что касается платформы Node.js и JavaScript в роли языка серверной разработки. Сегодня мы поговорим о современном состоянии и развитии Node.js, о наиболее удачных вариантах использования этой платформы, о её ограничениях, и о технологиях, созданных на её основе.
Прежде чем говорить о том, как выглядит сегодня серверная платформа Node [5], вспомним о том, что это такое.
А именно, это среда выполнения JavaScript, построенная на базе JS-движка V8 [6], разработанного Google и применяемого в Google Chrome. Node.js использует неблокирующую модель ввода-вывода, управляемую событиями, которая делает эту платформу простой и эффективной.
В начале этого материала Node показан как прямо-таки кошмар программиста. Однако, эта платформа не случайно стала весьма популярной. Тут мы не станем опираться на голословные утверждения. Лучше взглянем на факты. А именно, свежее исследование [7] Stack Overflow показывает, что Node.js — это, на сегодняшний момент, самая популярная среди разработчиков технология.
Кроме того, JS — это язык, популярность которого за последние пять лет растёт быстрее, чем у других языков, при том, что C# и PHP теряют позиции. Распространённость JavaScript, если даже не говорить исключительно о Node, идёт вверх.
Как можно объяснить то, что JavaScript, в роли серверного языка, был столь быстро и широко принят сообществом разработчиков? Проще говоря, Node пережил стадию, в которой воспринимался как некая забава, и вошёл в фазу стабильности и зрелости. Вокруг него сформировалось мощное сообщество, размер которого неуклонно растёт. Экосистема Node также достойна упоминания, так как, например, менеджер пакетов Node, npm [8], в настоящий момент представлен самым большим реестром ПО в интернете.
Node.js не только совершил революцию в серверной разработке, но благодаря ему сделан вклад и в производительность клиентских приложений, так как к развитию V8 были привлечены серьёзные силы. Кроме того, он играет заметную роль в расширении всей экосистемы JavaScript и в совершенствовании современных JS-фреймворков, таких, как Angular [9], React [10] или Vue [11].
С течением времени Node смог опровергнуть предрассудки ранних дней. Вот некоторые из них.
JavaScript-код для Node.js печально известен сложностью отладки.
Для отладки серверных JS-приложений можно использовать те же самые методики, которые применяются для отладки клиентского кода, применяя node-inspector [12], где собраны средства инструментов разработчика Chrome.
Далее, например, разработчики из Joyent, которые кое-что понимают в деле отладки и профилирования Node-приложений, уже давно выпустили универсальный отладчик DTrace [13].
Node нельзя использовать для разработки серверных приложений корпоративного класса.
Это утверждение тоже не соответствует действительности. На базе Node можно создавать корпоративные системы. Сложность заключается лишь в том, что в нём имеется не особенно много встроенных средств, упрощающих создание подобных систем. Однако, заметные игроки IT-рынка используют Node в качестве корпоративной веб-платформы. Среди них — Netflix. PayPal, Yahoo!, Walmart.
JavaScript — это динамический язык, поэтому, работая на нём, нельзя использовать нечто вроде статической проверки типов при компиляции.
Это правда. Однако, в экосистеме JS появились средства вроде TypeScript и Flow, которые нацелены на работу с типами в JS, что позволяет повысить стабильность и предсказуемость программ, упростить отладку. В этой сфере можно воспользоваться и возможностями Closure Compiler [14] от Google.
JavaScript не создавался как язык для серверной разработки.
Тут можно лишь сказать, что JS уже мог работать на серверах [15], тогда же, когда Netscape встроила поддержку этого языка в свой браузер. А было это аж в 1995-м. JS обычно называют языком клиентской веб-разработки лишь потому, что он полностью захватил эту сферу.
На самом деле, этот список можно продолжать и продолжать.
Теперь поговорим о сценариях использования Node.js и о его ограничениях для того, чтобы лучше понять место этой технологии в современном мире.
Итак, зачем вообще рассматривать Node.js как средство серверной разработки в применяемом вами стеке технологий?
Позвольте мне в двух словах обозначить самое важное:
Некоторые видят в сближении кодовой базы клиента и сервера минус Node.js, говоря о том, что он принуждает разработчика к использованию JavaScript. Однако, это не совсем так. При необходимости из Node-приложений можно обращаться к сторонним специализированным библиотекам.
Скажем, вам нужны инструменты для кодирования видео. Для того, чтобы оснастить ими свой проект, написанный на JavaScript, вам не придётся искать какие-то малораспространённые таинственные библиотеки для Node. Вы вполне сможете воспользоваться проверенными инструментами, наладив взаимодействие с ними из Node. Или, например, если имеется некая библиотека на Python, выполняющая необходимые вам сложные вычисления, специально для работы с ней можно запустить микросервис и обращаться к соответствующим функциям этой библиотеки через REST API.
Учитывая всё вышесказанное, можно выделить следующие варианты использования Node.js, в которых он в полной мере раскрывает свои сильные стороны.
Приложения для совместной работы (такие, как Trello и Google Docs), интерактивные чаты, системы мгновенного обмена сообщениями и онлайн-игры — это примеры приложений реального времени, при разработке которых особенности архитектуры Node.js могут сослужить вам хорошую службу.
Время, необходимое этим приложениям для выполнения тех или иных действий, можно охарактеризовать, с точки зрения пользователя, словами «немедленно» и «сейчас» [22]. Для нормальной работы таких приложений система, на которой они основаны, должна обеспечивать очень высокую скорость отклика на действия пользователя и низкий уровень задержек. Node отвечает этим требованиям.
Node облегчает обработку множества запросов от клиентов, его архитектура способствует эффективному использованию библиотек, он обеспечивает очень быструю синхронизацию данных между клиентом и сервером.
Одностраничное приложение — это приложение, которое представлено единственной загружаемой в браузер веб-страницей, содержимое которой динамически обновляется в ходе взаимодействия с ней пользователя. Большая часть нагрузки при работе таких приложений ложится на клиентскую часть системы, написанную на JavaScript.
Даже хотя одностраничные приложения — это значительный шаг в эволюции веб-разработки, есть у них и проблемы, которые, например, касаются рендеринга. В частности, это может плохо повлиять на поисковую оптимизацию [23] страниц. Популярное решение этих проблем заключается в серверном рендеринге средствами Node.js.
Сервер на Node никогда не окажется гораздо мощнее, чем нужно. Красота архитектуры Node заключается в её минималистичности, в том, что серверную часть приложений можно масштабировать в зависимости от потребностей проекта. Секрет тут кроется в правильном отношении к производительности.
Даже название предмета нашего разговора, «node» акцентирует внимание [24] на возможности построения систем из множества небольших распределённых вычислительных узлов, которые могут обмениваться друг с другом данными.
Модульность Node позволяет создавать маленькие приложения, не сталкиваясь при этом с необходимостью поддержки огромной инфраструктуры, многие части которой в некоем конкретном случае окажутся незадействованными. При разработке Node-приложений программист выбирает именно то, что ему нужно, и, при необходимости, расширяет решение.
Однако, надо отметить, что подобным возможностям масштабирования сопутствуют и определённые сложности. И, если потерять бдительность, Node.js может стать… опасным.
Если говорить честно, то Node позволяет разработчику, что называется, «выстрелить себе в ногу». В этом мире за всё надо платить, в том числе — и за широкие возможности по настройке системы и по подгонке её под свои нужды. Если работать с Node, не имея достаточного опыта или регулярно пуская дело на самотёк — можно столкнуться с серьёзными проблемами вроде потери клиентов.
В противовес более традиционным подходам, жёстко регламентирующим те или иные архитектурные особенности систем, структуру, которая поддерживает серверную часть вашего приложения, создаёте именно вы. В результате, тут приходится принимать множество решений, то есть, разработчику необходимо точно знать — чем именно он занимается, и что будет с проектом, если его потребуется расширить.
В случае с другими языками, вроде Ruby, и широко известного фреймворка Ruby on Rails, например, в ходу идея, которая заключается в преимуществе соглашений над конфигурированием системы. Эти традиционные фреймворки буквально ведут разработчика за руку, показывая ему правильный, безопасный путь решения типичных задач.
Node переворачивает всё, так сказать, с ног на голову. Разработчику даётся больше свободы, но путь к реализации задуманного может оказаться полным опасностей, если в ходе работы будут приняты неверные решения. Тут уместно будет вспомнить о пресловутом «аде коллбэков», который вдруг окажется совершенно реальным.
Это не означает, что на Node нельзя создавать большие серверные приложения, но вышесказанное стоит постоянно держать в голове.
Даже создатель Node.js, Райан Даль [25], в итоге, перед переходом к другим проектам, осознал ограничения системы. Он высказался на этот счёт весьма однозначно:
«Думаю, Node — это не лучшая система для создания крупномасштабных серверных проектов. Я бы использовал для этого GO [26]. И, честно говоря, именно поэтому я и оставляю работу над Node. Я однажды понял, что, на самом деле, это вовсе не самая лучшая система для серверной разработки».
Ранее упомянутые предубеждения, касающиеся Node, были справедливы до определённого момента не такого уж и длинного жизненного пути Node, и они, до некоторой степени, всё ещё — не пустой звук. Node достаточно повзрослел и вырос, его слабые стороны, при необходимости и наличии времени, вполне можно обойти. А инструменты, разработанные сообществом, позволяют создать на базе Node.js практически всё, что угодно.
Не слишком давно, если некто задумывался о том, чтобы создавать все части своей системы на JS, в голову тут же приходила мысль о стеке MEAN [27] (MongoDB, Express, Angular и Node).
Этот набор инструментов и в наши дни не потерял актуальности, однако, в настоящее время в экосистеме JS имеется гораздо больше интересных инструментов как для клиентской, так и для серверной разработки, поэтому не стоит ограничиваться MEAN.
Вот несколько популярных современных серверных JS-фреймворков:
Конечно, этот короткий список содержит далеко не всё, что создано для серверной разработки на базе Node. Вот ещё несколько интересных проектов: Nest.js [33], Hapi.js [34], Socket.io [35], Mean.js [36], Total.js [37], Derby.js [38] и Keystone.js [39].
Задача этой статьи не в том, чтобы сделать некий итоговый вывод о том, предлагает ли экосистема Node.js самые лучшие средства для серверной разработки. Здесь не идёт речь и о том, чтобы склонить кого-либо к использованию Node. Я, к тому же, не собираюсь говорить, что Node значительно превосходит другие популярные серверные среды, разработка в которых ведётся с использованием Java, C#, C++, PHP, Python, Go или Ruby.
Полагаю, самое главное, что мне хотелось сделать — так это показать, что между безапеляционными «да» и «нет», которые можно встретить во многих рассуждениях о Node и о JS как о серверном языке, если обширная область «может быть».
И, нравится это кому-нибудь или нет, интерес к Node постоянно растёт.
В завершение этого материала мне хотелось бы сказать, что не стоит относиться к любому фреймворку как к палочке-выручалочке, которая волшебным образом решит все проблемы. Node.js — это просто один из инструментов в колоссальной вселенной веб-разработки. В некоторых ситуациях он решает поставленные перед ним задачи исключительно хорошо, а в других работа с ним может превратиться в кошмар.
В задачи каждого разработчика входит тщательный подбор технологий [40], подходящих для реализации любого нового проекта. При этом важно учитывать все возможности и не отбрасывать сходу имеющиеся альтернативы.
Например, в компании Snipcart, где я работаю, используется архитектура .NET, о которой можно наговорить много всего нелицеприятного. Почему выбрана именно она? Да просто потому, что в конкретный момент она оказалась наилучшим инструментом [41] для решения поставленной перед нами задачи.
Надеюсь, мой рассказ о Node поможет вам принять правильное решение при выборе серверной платформы для вашего очередного проекта.
Уважаемые читатели! Что вы думаете о серверном применении JavaScript и о Node.js? Можете ли поделиться примерами удачного (или неудачного) использования Node в реальных проектах?
Автор: ru_vds
Источник [42]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/271189
Ссылки в тексте:
[1] Image: https://habrahabr.ru/company/ruvds/blog/345164/
[2] бесконечных споров: https://medium.com/javascript-non-grata/the-fall-of-the-house-of-node-43697fd56a6
[3] Другие: https://kaushalsubedi.com/blog/2014/10/15/node-js-sucks-heres-why/
[4] Некоторые: http://pages.citebite.com/b2x0j8q1megb
[5] Node: https://nodejs.org/en/
[6] JS-движка V8: https://developers.google.com/v8/
[7] исследование: https://insights.stackoverflow.com/survey/2017#technology
[8] npm: https://www.npmjs.com/
[9] Angular: https://snipcart.com/blog/angularjs-ecommerce
[10] React: https://snipcart.com/blog/snipcart-reactjs-static-ecommerce-gatsby
[11] Vue: https://snipcart.com/blog/vuejs-blog-demo
[12] node-inspector: https://github.com/node-inspector/node-inspector
[13] DTrace: http://dtrace.org/blogs/dap/2012/01/05/where-does-your-node-program-spend-its-time/
[14] Closure Compiler: https://developers.google.com/closure/compiler/
[15] уже мог работать на серверах: https://en.wikipedia.org/wiki/JavaScript#Server-side_JavaScript
[16] webpack: https://snipcart.com/blog/webpack-static-site-tutorial-spike
[17] на клиенте и на сервере: https://www.toptal.com/javascript/guide-to-full-stack-javascript-initjs
[18] и в браузере, и на сервере: https://thefullstack.xyz/full-stack-javascript-developer/
[19] async/await: https://hackernoon.com/6-reasons-why-javascripts-async-await-blows-promises-away-tutorial-c7ec10518dd9
[20] начиная с версии 7.6: https://medium.com/@Abazhenov/using-async-await-in-express-with-node-8-b8af872c0016
[21] ада коллбэков: http://callbackhell.com/
[22] словами «немедленно» и «сейчас»: http://searchunifiedcommunications.techtarget.com/definition/real-time-application-RTA
[23] поисковую оптимизацию: https://snipcart.com/blog/vuejs-tutorial-seo-example
[24] акцентирует внимание: https://medium.freecodecamp.org/scaling-node-js-applications-8492bd8afadc
[25] Райан Даль: https://www.mappingthejourney.com/single-post/2017/08/31/episode-8-interview-with-ryan-dahl-creator-of-nodejs/
[26] GO: https://en.wikipedia.org/wiki/Go_(programming_language)
[27] MEAN: https://en.wikipedia.org/wiki/MEAN_(software_bundle)
[28] Express.js: https://expressjs.com/
[29] Node.js-фреймворком: https://snipcart.com/blog/graphql-nodejs-express-tutorial
[30] Meteor: https://www.meteor.com/
[31] Sails.js: https://sailsjs.com/
[32] Koa.js: http://koajs.com/
[33] Nest.js: https://nestjs.com/
[34] Hapi.js: https://hapijs.com/
[35] Socket.io: https://socket.io/
[36] Mean.js: http://meanjs.org/
[37] Total.js: https://www.totaljs.com/
[38] Derby.js: http://derbyjs.com/
[39] Keystone.js: http://keystonejs.com/
[40] тщательный подбор технологий: https://snipcart.com/blog/startup-tech-stack
[41] наилучшим инструментом: https://snipcart.com/blog/why-dot-net-technologies
[42] Источник: https://habrahabr.ru/post/345164/?utm_campaign=345164
Нажмите здесь для печати.