Я не в полной мере получить то , что Node.js это все о. Может быть, это потому, что я в основном разработчик веб-приложений для бизнеса. Что это такое и какая польза от этого?
Мое понимание до сих пор таково:
- Модель программирования основана на событиях, особенно на способах ввода-вывода .
- Он использует JavaScript и парсер V8 .
- Он может быть легко использован для создания параллельных серверных приложений.
Правильно ли мое понимание? Если да, то каковы преимущества четного ввода-вывода, это просто больше для параллелизма? Кроме того, является ли направление Node.js стать фреймворком, подобным модели программирования на основе JavaScript (на основе V8)?
источник
Я использую Node.js на работе и считаю его очень мощным. Вынужденный выбрать одно слово для описания Node.js, я бы сказал «интересный» (что не является чисто положительным прилагательным). Сообщество является ярким и растущим. JavaScript, несмотря на его странности, может быть отличным языком для написания кода. И вы будете ежедневно переосмысливать свое собственное понимание «наилучшей практики» и шаблонов хорошо структурированного кода. В Node.js прямо сейчас течет огромная энергия идей, и работа в ней подвергает вас всему этому мышлению - великому умственному поднятию тяжестей.
Node.js в производстве определенно возможен, но далеко от «под ключ» развертывания, казалось бы, обещанного документацией. С Node.js v0.6.x «кластер» был интегрирован в платформу, предоставляя один из основных строительных блоков, но мой сценарий «production.js» все еще ~ 150 строк логики для обработки таких вещей, как создание журнала каталог, утилизация мертвых рабочих и т. д. Для «серьезной» производственной службы вам также необходимо быть готовым регулировать входящие соединения и делать все то, что Apache делает для PHP . Чтобы быть справедливым, Рубин на Rails имеет эту точную проблему. Это решается с помощью двух дополнительных механизмов: 1) Установка Ruby на Rails / Node.Apache / Lighttd ). Веб-сервер может эффективно обслуживать статический контент, осуществлять доступ к ведению журналов, перезаписывать URL-адреса, прерывать SSL , применять правила доступа и управлять несколькими вспомогательными службами. Для запросов, которые попадают в реальную службу узла, веб-сервер передает запрос через. 2) Использование фреймворка, такого как Unicorn, который будет управлять рабочими процессами, периодически их перерабатывать и т. Д. Мне еще предстоит найти обслуживающую фреймворк Node.js, который кажется полностью запеченным; он может существовать, но я еще не нашел его и до сих пор использую ~ 150 строк в моем ручном свернутом файле «production.js».
При чтении таких фреймворков, как Express, создается впечатление, что стандартная практика состоит в том, чтобы просто обслуживать все через один сервис Node.js "на все руки" ... "app.use (express.static (__ dirname + '/ public'))" , Для менее загруженных сервисов и разработки это, вероятно, хорошо. Но как только вы попытаетесь увеличить нагрузку на свой сервис и запустить его в режиме 24/7, вы быстро обнаружите мотивы, побуждающие большие сайты получать хорошо запеченный и надежный C-код, такой как Nginx, выходящий на их сайт и обрабатывающий все запросов статического содержимого (... пока вы не настроите CDN , например Amazon CloudFront )). Для несколько юмористического и откровенно негативного взгляда на это, посмотрите на этого парня .
Node.js также находит все больше и больше необслуживаемых применений. Даже если вы используете что-то другое для обслуживания веб-контента, вы все равно можете использовать Node.js в качестве инструмента сборки, используя модули npm для организации вашего кода, Browserify для сшивания его в единый ресурс и uglify-js для минимизации его для развертывания. , Для работы с Интернетом JavaScript является идеальным соответствием импеданса и часто делает его наиболее простым способом атаки. Например, если вы хотите разбираться с кучей полезных нагрузок ответов JSON , вы должны использовать мой модуль подчеркивания-CLI , служебный пояс структурированных данных.
За и против:
По сравнению с простой моделью «один процесс на запрос» ( LAMP ):
По сравнению с написанием «реального» сервиса в Java / C # / C (C? Действительно?)
Еще один взгляд на JavaScript и Node.js можно найти в блоге « От Java до Node.js» , где рассказывается о впечатлениях и опыте Java-разработчика по изучению Node.js.
Модули При рассмотрении узла, имейте в виду, что ваш выбор библиотек JavaScript определит ваш опыт. Большинство людей используют как минимум два, асинхронный помощник по шаблонам (Step, Futures, Async) и модуль сахара JavaScript ( Underscore.js ).
Помощник / JavaScript Сахар:
Модули асинхронной структуры:
Или чтобы прочитать все об асинхронных библиотеках, посмотрите это интервью с авторами.
Веб-фреймворк:
Тестирование:
Также ознакомьтесь с официальным списком рекомендуемых модулей Node.js. Тем не менее, GitHub's Node Modules Wiki является гораздо более полным и хорошим ресурсом.
Чтобы понять Node, полезно рассмотреть несколько ключевых вариантов дизайна:
Node.js является EVENT ОСНОВАНИЯ и ASYNCHRONOUS / неблокируемому, События, такие как входящее HTTP-соединение, запускают функцию JavaScript, которая выполняет небольшую работу и запускает другие асинхронные задачи, такие как подключение к базе данных или получение контента с другого сервера. После запуска этих задач функция события завершается, и Node.js возвращается в спящий режим. Как только происходит что-то еще, например, когда устанавливается соединение с базой данных или внешний сервер отвечает содержимым, функции обратного вызова запускаются, и выполняется больше кода JavaScript, что может привести к запуску еще более асинхронных задач (например, запроса к базе данных). Таким образом, Node.js успешно чередует действия для нескольких параллельных рабочих процессов, выполняя любые операции, разблокированные в любой момент времени. Вот почему Node.js отлично справляется с управлением тысячами одновременных подключений.
Почему бы просто не использовать один процесс / поток на соединение, как все остальные?В Node.js новое соединение - это всего лишь очень маленькое выделение кучи. Для раскрутки нового процесса на некоторых платформах требуется значительно больше памяти, мегабайт. Но реальная стоимость - это накладные расходы, связанные с переключением контекста. Когда у вас есть 10 ^ 6 потоков ядра, ядро должно проделать большую работу, чтобы выяснить, кто должен выполнять следующее. Большая часть работы была посвящена созданию планировщика O (1) для Linux, но, в конце концов, гораздо эффективнее иметь один управляемый событиями процесс, чем 10 ^ 6 процессов, конкурирующих за время процессора. Кроме того, в условиях перегрузки многопроцессорная модель ведет себя очень плохо, из-за чего не хватает критически важных служб администрирования и управления, особенно SSHD (это означает, что вы даже не можете войти в окно, чтобы выяснить, насколько он на самом деле ввернут).
Node.js ЕДИНСТВЕННАЯ РЕЗЬБА и БЕСПЛАТНО . Node.js, как очень обдуманный выбор дизайна, имеет только один поток на процесс. Из-за этого для нескольких потоков принципиально невозможно получить доступ к данным одновременно. Таким образом, замки не нужны. Нити тяжелые. Действительно очень сложно. Если вы в это не верите, значит, вы не сделали достаточно многопоточного программирования. Правильно установить блокировку сложно, и это приводит к ошибкам, которые действительно трудно отследить. Устранение блокировок и многопоточности делает один из самых отвратительных классов ошибок просто исчезающим. Это может быть единственным большим преимуществом узла.
Но как мне воспользоваться преимуществами моего 16-ядерного блока?
Два пути:
Node.js позволяет вам делать действительно мощные вещи, не потревожив. Предположим, у вас есть программа Node.js, которая выполняет различные задачи, прослушивает команды на TCP- порту, кодирует некоторые изображения, что угодно. С помощью пяти строк кода вы можете добавить портал HTTP на основе веб-управления, который показывает текущее состояние активных задач. Это легко сделать:
Теперь вы можете нажать на URL и проверить состояние вашего запущенного процесса. Добавьте несколько кнопок, и у вас появится «портал управления». Если у вас запущен скрипт Perl / Python / Ruby, просто «добавить портал управления» не совсем просто.
Но разве JavaScript не медленный / плохой / злой / порождение дьявола? У JavaScript есть некоторые странные странности, но с «хорошими частями» есть очень мощный язык, и в любом случае, JavaScript - это язык клиента (браузера). JavaScript здесь, чтобы остаться; другие языки нацелены на него как на IL, и талант мирового класса конкурирует за создание самых продвинутых движков JavaScript. Из-за роли JavaScript в браузере огромные усилия инженеров направлены на то, чтобы сделать JavaScript быстрым. V8является последним и лучшим движком javascript, по крайней мере, на этот месяц. Он поражает другие языки сценариев как эффективностью, так и стабильностью (глядя на вас, Руби). И это будет только лучше с огромными командами, работающими над проблемой в Microsoft, Google и Mozilla, конкурирующими за создание лучшего движка JavaScript (Это больше не «интерпретатор» JavaScript, поскольку все современные движки делают тонны JITкомпиляция под капотом с интерпретацией только как запасной вариант для кода, выполняемого один раз). Да, мы все хотели бы исправить некоторые странные варианты языка JavaScript, но это на самом деле не так уж и плохо. А язык настолько чертовски гибок, что вы действительно не кодируете JavaScript, вы кодируете Step или jQuery - больше, чем любой другой язык, в JavaScript библиотеки определяют опыт. Чтобы создавать веб-приложения, вам все равно нужно знать JavaScript, поэтому кодирование с ним на сервере имеет своего рода синергию с набором навыков. Это заставило меня не бояться писать код клиента.
Кроме того, если вы ДЕЙСТВИТЕЛЬНО ненавидите JavaScript, вы можете использовать синтаксический сахар, такой как CoffeeScript . Или что-нибудь еще, что создает код JavaScript, например, Google Web Toolkit (GWT).
Говоря о JavaScript, что такое «закрытие»? - Довольно причудливый способ сказать, что вы сохраняете переменные лексической области в цепочках вызовов. ;) Нравится:
Видите, как вы можете просто использовать «myData», не делая ничего неловкого, например, спрятать его в объект? И в отличие от Java, переменная "myData" не обязательно должна быть доступна только для чтения. Эта мощная языковая функция делает асинхронное программирование гораздо менее многословным и менее болезненным.
Написание асинхронного кода всегда будет сложнее, чем написание простого однопоточного скрипта, но с Node.js это не намного сложнее, и вы получаете много преимуществ в дополнение к эффективности и масштабируемости для тысяч одновременных соединений. ..
источник
V8 - это реализация JavaScript. Это позволяет вам запускать автономные приложения JavaScript (среди прочего).
Node.js - это просто библиотека, написанная для V8, которая выполняет четные операции ввода-вывода. Эту концепцию немного сложнее объяснить, и я уверен, что кто-то ответит лучше, чем я ... Суть в том, что вместо того, чтобы делать ввод или вывод и ждать, пока это произойдет, вы просто не ждите чтобы это закончилось. Например, запросите время последнего редактирования файла:
Это может занять пару миллисекунд или несколько секунд. С помощью Evented I / O вы просто запускаете запрос и вместо ожидания добавляете обратный вызов, который запускается после завершения запроса:
Это очень похоже на код JavaScript в браузере (например, с функциональностью в стиле Ajax ).
Для получения дополнительной информации, вы должны проверить статью Node.js, которая является действительно захватывающей, которая была моим знакомством с библиотекой / платформой ... Я нашел ее довольно хорошей.
источник
Node.js - это инструмент командной строки с открытым исходным кодом, созданный для кода JavaScript на стороне сервера. Вы можете скачать tarball , скомпилировать и установить исходный код. Это позволяет вам запускать программы JavaScript.
JavaScript выполняется V8 , движком JavaScript, разработанным Google, который используется в браузере Chrome . Он использует JavaScript API для доступа к сети и файловой системе.
Он популярен благодаря своей производительности и способности выполнять параллельные операции.
Ниже приведены несколько хороших статей на эту тему.
источник
Замыкания - это способ выполнить код в контексте, в котором он был создан.
Это означает, что вы можете определить переменные, затем инициировать неблокирующую функцию ввода-вывода и отправить ей анонимную функцию для обратного вызова.
Когда задача завершена, функция обратного вызова будет выполняться в контексте с переменными, это закрытие.
Причина, по которой замыкания так хороши для написания приложений с неблокирующим вводом-выводом, заключается в том, что очень легко управлять контекстом функций, выполняющихся асинхронно.
источник
Два хороших примера касаются того, как вы управляете шаблонами и используете с ними прогрессивные улучшения. Вам просто нужно несколько легких кусочков кода JavaScript, чтобы он работал идеально.
Я настоятельно рекомендую вам посмотреть и прочитать эти статьи:
Выберите любой язык и постарайтесь вспомнить, как вы будете управлять шаблонами HTML-файлов и что нужно было сделать, чтобы обновить одно имя класса CSS в структуре DOM (например, пользователь щелкнул элемент меню, и вы хотите, чтобы он был помечен как «выбрано» и обновлено содержимое страницы).
С Node.js это так же просто, как делать это в клиентском JavaScript-коде. Получите ваш DOM-узел и примените к нему свой CSS-класс. Получите ваш DOM-узел и innerHTML-контент (для этого вам понадобится дополнительный код JavaScript. Прочтите статью, чтобы узнать больше).
Другим хорошим примером является то, что вы можете сделать свою веб-страницу совместимой как с включенным, так и выключенным JavaScript с помощью одного и того же куска кода. Представьте, что у вас есть выбор даты, сделанный в JavaScript, который позволит вашим пользователям выбрать любую дату с помощью календаря. Вы можете написать (или использовать) один и тот же кусок кода JavaScript, чтобы он работал при включенном или выключенном JavaScript.
источник
Существует очень хорошая аналогия с фаст-фудом, которая лучше всего объясняет управляемую событиями модель Node.js, см. Полную статью, Node.js, Врачебные кабинеты и рестораны быстрого питания - Понимание событийно-ориентированного программирования
Вот резюме:
Node.js управляется событиями, но большинство веб-серверов основаны на потоках. Йорк объясняет, как работает Node.js:
Вы используете свой веб-браузер, чтобы сделать запрос для "/about.html" на веб-сервере Node.js.
Сервер Node.js принимает ваш запрос и вызывает функцию для извлечения этого файла с диска.
Пока сервер Node.js ожидает получения файла, он обслуживает следующий веб-запрос.
Когда файл извлекается, в очередь серверов Node.js вставляется функция обратного вызова.
Сервер Node.js выполняет эту функцию, которая в этом случае отображает страницу «/about.html» и отправляет ее обратно в веб-браузер ».
источник
Ну я так понимаю
Для меня это означает, что вы были правы во всех трех предположениях. Библиотека, безусловно, выглядит многообещающе!
источник
Кроме того, не забудьте упомянуть, что Google V8 очень быстрый. Он на самом деле преобразует код JavaScript в машинный код с соответствующей производительностью скомпилированного двоичного файла. Таким образом, наряду со всеми другими замечательными вещами, это безумно быстро.
источник
В: Модель программирования основана на событиях, особенно в том, как она обрабатывает ввод / вывод .
Правильный. Он использует обратные вызовы, поэтому любой запрос на доступ к файловой системе приведет к отправке запроса в файловую систему, а затем Node.js начнет обрабатывать свой следующий запрос. Он будет беспокоиться о запросе ввода-вывода только после того, как получит ответ от файловой системы, когда он выполнит код обратного вызова. Однако возможно выполнять синхронные запросы ввода-вывода (то есть блокировать запросы). Разработчик должен выбирать между асинхронным (обратные вызовы) или синхронным (ожидание).
Q: Он использует JavaScript и парсер V8.
да
Q: Его можно легко использовать для создания параллельных серверных приложений.
Да, хотя вам нужно было бы написать много кода JavaScript. Возможно, было бы лучше взглянуть на платформу, такую как http://www.easynodejs.com/, которая поставляется с полной онлайн-документацией и примером приложения.
источник