«Node.js не подходит для серьезных сайтов и веб-приложений, а только для написания небольших API».
This is bull*hit. I have to say it.
От переводчика: недавно на coderwall.com появилась интересная статья от Ionut-Cristian Florescu об использовании Node.js для создания обычных («типовых») веб-проектов. До ее прочтения я был полностью согласен с заголовком статьи, но сейчас мое мнение несколько поменялось. Позиция автора может быть спорной во многих моментах, но его аргументы достаточно интересны. Если у вас есть собственное мнение по этому поводу, оставляйте его в комментариях.
Я слышал эти слова так много раз, что они уже надоели мне до смерти. В основном они исходят от людей, которые никогда не использовали Node.js ни для чего кроме воспроизведения базового todo-туториала, от «псевдо-разработчиков» или «умников», которые любят читать о том, что сейчас в тренде, но сами не разработали ничего серьезного.
Но кроме них есть дивный новый мир, где судя по всему считают иначе. Такие ребята, как Klout, Geeklist, Transloadit, Cloud9, и многие другие, представленные на этой странице.
Неужели все они ошибаются?
Но все же, откуда взялся этот необоснованный миф?
Устаревшие данные
Прежде всего, несмотря на быстрые темпы внедрения, Node.js все еще остается молодой технологией. Она больше не является незрелой, но все еще развивается быстро, достаточно быстро, чтобы маркетинговая шумиха и технические статьи, посвященные Node.js, не успевали за ней. На самом деле большинство статей и тем на форумах, посвященных обсуждению того, для чего Node.js хорош, а для чего нет, очень сильно устарели.
Язычники против неверных
Во-вторых, веб-разработка и языки программирования — это почти всегда объекты религиозного поклонения, и множество людей в этих областях не считают JavaScript «настоящим» языком программирования. Что ж, возможно он не идеален, однако достаточно хорош для того, чтобы быть самым распространенным языком в Интернете на данный момент.
«Callback hell»
Большинство Node.js-разработчиков должны знать, что из-за событийно-ориентированной природы довольно сложно на Node.js делать вещи, требующие последовательного выполнения. По моему мнению, это, возможно, является самой большой слабостью и в то же время самой сильной стороной Node.js. Сильной, потому что, если вы знаете свой инструмент, это закладывает основу для обработки невероятного количества одновременных подключений, возможно на порядок больше, чем вы могли бы получить, используя PHP, .NET или RoR. Слабостью, потому что большинство людей по праву стремятся избавиться от подобного кода:
Каждая фоновая операция возвращает свой результат (или ошибку) в обратном вызове. Положительная сторона этого в том, что ваш сервер приложения не блокируется в ожидании выполнения операции, а может в это время выполнять другие действия, такие как обслуживание другого запроса, что сохраняет ваше приложение быстрым, а пользователей довольными. Отрицательная сторона состоит в том, что если у вас много фоновых операций (например для доступа к каким-либо данным), ваш код становится уродливым и непонятным.
Хорошей новостью является то, что есть достаточное количество весьма элегантных способов сгладить эту проблему: Async.js вероятно наиболее известен, но если вы используете CoffeeScript вы определенно должны рассмотреть следующий шаг к «простой и мощной оптимизации управления асинхронными потоками» с IcedCoffeeScript. Я не уделил ему много внимания, когда впервые обратился к Node.js некоторое время назад, но сейчас, после использования в нескольких проектах, я действительно могу себе представить код без await и defer. Я считаю это идеальным решением для большинства наиболее распространенных сценариев использования, когда у вас есть либо ряд последовательных операций, либо комбинация последовательных и параллельных задач:
Экосистеме Node.js не хватает такого фреймворка, как Rails
Оставив позади проблемы языка/платформы, скажу что это также ложный миф. Лично я люблю Ruby и Rails, но я нахожу их несколько избыточными для небольших и средних веб-проектов, и мне нравится быть настоящим хозяином моего кода. Я предпочитаю начинать с маленькой управляемой кодовой базой и расширять ее, добавлять модули если они мне нужны и когда они мне нужны. Поэтому я считаю, что Express.js предоставляет идеальный баланс между легковесностью и расширяемостью. А Connect, (на котором Express построен) предоставляет вам все возможности Rack, с, осмелюсь сказать, даже более богатой экосистемой. Я знаю, что большинство сравнит Express с Sinatra, но я думаю, что Express — это нечто большее, кроме того, я слышал, что даже хардкорные рубисты признают, что Rails временами слишком избыточна.
Но если вы применяете Node.js и вам импонирует Rails, возможно вам стоит обратить внимание на Tower.js или Geddy.
Пакеты, управление подключаемыми файлами
Конечно же, в мире Node.js нет ничего сравнимого со Sprockets? Вообще-то есть. И не одно. Node.js это место где появляются и такие вещи. Bower, Brewer.js, Piler, — вот имена только некоторых из них.
UglifyJS Mihai Bazon'а также работает на Node.js.
Trevor Burnham, автор «CoffeeScript: Accelerated JavaScript Development» написал connect-assets, который сейчас поддерживается Andrew Dunkman'ом.
Для разработчиков, которым нужна простая, но не менее мощная альтренатива, я несколько месяцев назад выложил в open-source ASPA и ASPA-Express.
Таким образом, здесь есть из чего выбрать.
Как обстоят дела с шаблонизаторами? Их также достаточно, лучшие по моему мнению Jade и Stylus.
Скорость и параллелизм это еще не все
Нет, скорость и параллелизм это не все, но они чертовски важны. Я слышал, что многие говорят: «Я пока буду использовать PHP / .NET / Ruby, а если посещаемость моего сайта вырастет до тысяч посетителей в день, я просто увеличу количество серверов».
Но, по-видимому, это проще сказать, чем сделать. Даже GitHub порой имеет проблемы — уверен, что многие время от времени видели раздражающую страницу с ошибкой unicorn’а.
И никто не может гарантировать, что у вас появится много денег до того, как вы получите тысячи посетителей на вашем сайте. Обычно это происходит в обратном порядке, если происходит вообще.
Также, мне доводилось, слышать о сайтах, которые просто «положили» поисковые роботы Google. И вы конечно же не хотите, чтобы подобное случилось с вами, потому что на данный момент в онлайн-бизнесе, если Google не является «вашим другом», то вас просто не существует.
Таким образом, возможность обрабатывать большие объемы траффика без потери скорости сайта никогда не будет лишней. Особенно, если вы при этом не должны платить большие суммы за инфраструктуру и поддержку (никто не будет писать это на чистом C).
Нехватка хороших Node.js-разработчиков
Т.к. Node.js основан на JavaScript, он привлек много веб-разработчиков с «отсутствием надлежащего опыта серверной разработки»(т.е. не знакомых даже с основными шаблонами проектирования). Хотя это и верно в некоторой степени, но я думаю, что большинство новичков все же будут держаться подальше от Node.js.
Кроме того, то же самое относится и к любой другой платформе, фреймворку или языку. Разработчиков много, но хороших разработчиков гораздо меньше. Кроме того, в большинстве случаев, хорошая доля здравого смысла будет компенсировать отсутствие совершенства.
Большие корпорации пока не используют Node.js
Отлично. Большие корпорации используют .NET и J2EE, по крайней мере в моем мире. Если вы хотите оказаться там, придерживайтесь .NET и J2EE, регулярно посещайте семинары Microsoft и Oracle, и возможно даже вам стоит присмотреться к Scala.
Это всего лишь мое мнение. Оно не является неизменным, но я по крайней мере могу сказать, что оно обосновано; на протяжении моей карьеры я писал код на C#, Java, PHP, Ruby, JavaScript и не только. Я работал над «серьезными» бизнес-приложениями и мне также удалось выжить как частному предпринимателю не в сфере информационных технологий, так что я научился смотреть на мир не через призму IT. Но процесс кодинга определенно стал приносить гораздо больше удовольствия, когда я открыл для себя Node.js.
Исходя из всего этого, у меня не возникло сомнений при выборе Node.js, когда я заново переделывал LeasingSH.ro, известный в Румынии сайт по продаже автомобилей. Это не большой проект, но это как раз тот самый типовой веб-проект, о котором мы говорим:
Одним из преимуществ использования Node.js является то, что мы вероятно можем обрабатывать больше траффика, чем мы когда-либо получим. Кроме того заметно уменьшилось время отклика, несмотря на то, что мы по-прежнему используем единственный веб-сервер:
Код также стал более читаемым и поддерживаемым, т.к. использование новой технологии косвенно привносит и новые особенности (в противоположность старому PHP), такие как использование BitBucket для управления исходным кодом, более четкое разделение задач — в основном за счет использования шаблонов Jade, эффективного сжатия и управления подключаемых файлов с ASPA.
И в заключение, хотелось бы видеть больше типовых веб-проектов, выполненных на Node.js. Слишком многие из них по-прежнему реализованы на PHP. Не поймите меня неправильно, я использовал PHP несколько лет и я не против него, но иногда нам нужно смотреть в будущее.