Вопрос

Я не совсем понимаю, что Node.js это все о чем.Может быть, это потому, что я в основном разработчик веб-бизнес-приложений.Что это такое и какая от этого польза?

Мое понимание до сих пор таково, что:

  1. Модель программирования управляется событиями, особенно тем, как она обрабатывает I/O.
  2. Он использует JavaScript и синтаксический анализатор является V8.
  3. Его можно легко использовать для создания параллельных серверных приложений.

Правильно ли я понимаю?Если да, то каковы преимущества событийного ввода-вывода, это просто больше для работы с параллелизмом?Кроме того, является ли направление Node.js стать фреймворком, подобным модели программирования на основе JavaScript (на основе V8)?

Это было полезно?

Решение

Я думаю, что преимущества заключаются в следующем:

  1. Веб-разработка на динамическом языке (JavaScript) на невероятно быстрой виртуальной машине (V8).Это намного быстрее, чем Ruby, Python или Perl.

  2. Способность обрабатывать тысячи одновременных подключений с минимальными накладными расходами на один процесс.

  3. JavaScript идеально подходит для циклов событий с первоклассными функциональными объектами и замыканиями.Люди уже знают, как использовать его таким образом, использовав в браузере для реагирования на события, инициированные пользователем.

  4. Многие люди уже знают JavaScript, даже те, кто не называет себя программистами.Это, пожалуй, самый популярный язык программирования.

  5. Использование JavaScript на веб-сервере, а также в браузере уменьшает несоответствие импеданса между двумя средами программирования, которые могут передавать структуры данных через JSON, которые работают одинаково с обеих сторон уравнения.Дублирующийся код проверки формы может быть общим для сервера и клиента и т.д.

Другие советы

Я использую Node.js на работе и нахожу это очень мощным.Вынужден выбрать одно слово для описания Node.js Я бы сказал "интересный" (что не является чисто положительным прилагательным).Сообщество динамично развивается.JavaScript, несмотря на его странности, может быть отличным языком для программирования.И вы будете ежедневно переосмысливать свое собственное понимание "наилучшей практики" и шаблонов хорошо структурированного кода.Огромная энергия идей вливается в Node.js прямо сейчас, и работа в нем дает вам возможность подумать обо всем этом - отличная ментальная тренировка.

Node.js в производстве это, безусловно, возможно, но далеко от развертывания "под ключ", казалось бы, обещанного документацией.С Node.js версией 0.6.x "cluster" был интегрирован в платформу, предоставляя один из важнейших строительных блоков, но мой "production.js " скрипт по-прежнему содержит ~ 150 строк логики для обработки таких вещей, как создание каталога журналов, утилизация мертвых работников и т.д.Для "серьезного" производственного сервиса вам также нужно быть готовым ограничивать входящие соединения и выполнять все то, что Apache делает для PHP.Чтобы быть справедливым, Ruby на рельсах имеет этот точный проблема.Она решается с помощью двух взаимодополняющих механизмов:1) Включение Ruby Rails/Node.js за выделенным веб-сервером (написанным на C и протестированным до чертиков и обратно), например Nginx (или Апач / Lighttd ( Световой поток )).Веб-сервер может эффективно обслуживать статический контент, вести журнал доступа, переписывать URL-адреса, завершать SSL, применять правила доступа и управлять несколькими вспомогательными службами.Для запросов, которые попадают в фактическую службу узла, веб-сервер передает запрос через прокси.2) Использование фреймворка, подобного Единорог это позволит управлять рабочими процессами, периодически перерабатывать их и т.д.Мне еще предстоит найти Node.js обслуживающий фреймворк, который кажется полностью готовым;возможно, оно существует, но я его еще не нашел и все еще использую ~ 150 строк в своем рукописном "production.js".

Чтение фреймворков, таких как Выражать создается впечатление, что стандартная практика - просто обслуживать все с помощью одного мастера на все руки Node.js сервис..."app.use(express.static(__dirname + '/public'))".Для сервисов и разработки с меньшей нагрузкой это, вероятно, нормально.Но как только вы попытаетесь увеличить временную нагрузку на свой сервис и заставить его работать 24/7, вы быстро обнаружите мотивы, которые побуждают крупные сайты использовать хорошо проработанный C-код, такой как Nginx открывая их сайт и обрабатывая все запросы на статический контент (... пока вы не настроите CDN, как Облачный фронт Amazon)).Несколько юмористический и беззастенчиво негативный взгляд на это см. этот парень.

Node.js также находит все больше и больше неслужебных применений.Даже если вы используете что-то другое для обслуживания веб-контента, вы все равно можете использовать Node.js в качестве инструмента сборки, используя нпм модули для организации вашего кода, Просмотрить в браузере чтобы объединить это в единый актив, и уродовать-js чтобы минимизировать его для развертывания.Для работы с Интернетом JavaScript является идеальным соответствие импедансу и часто это делает его самым простым путем атаки.Например, если вы хотите пресмыкаться перед кучей JSON полезные нагрузки для реагирования, вы должны использовать мой подчеркивание-CLI модуль, утилита-пояс структурированных данных.

Плюсы / Минусы:

  • Профессиональный:Для серверного специалиста написание JavaScript на серверной части стало "лекарством шлюза" к изучению современных шаблонов пользовательского интерфейса.Я больше не боюсь писать клиентский код.
  • Профессиональный:Как правило, поощряет правильную проверку ошибок (err возвращается практически всеми обратными вызовами, заставляя программиста справиться с этим;кроме того, async.js и другие библиотеки обрабатывают парадигму "сбой при сбое любой из этих подзадач" намного лучше, чем типичный синхронный код)
  • Профессиональный:Некоторые интересные и обычно сложные задачи становятся тривиальными - например, получение статуса задач в полете, общение между рабочими или совместное использование состояния кэша
  • Профессиональный:Огромное сообщество и тонны отличных библиотек, основанных на надежном менеджере пакетов (npm)
  • Con:JavaScript не имеет стандартной библиотеки.Вы настолько привыкаете к импортированию функциональности, что это кажется странным, когда вы используете JSON.parse или какой-либо другой встроенный метод, который не требует добавления модуля npm.Это означает, что существует пять версий всего.Даже модули, включенные в Node.js у "ядра" есть еще пять вариантов, если вы будете недовольны реализацией по умолчанию.Это приводит к быстрой эволюции, но также и к некоторому уровню путаницы.

По сравнению с простой моделью, состоящей из одного процесса для каждого запроса (ЛАМПА):

  • Профессиональный:Масштабируемый до тысяч активных подключений.Очень быстро и очень эффективно.Для веб-парка это может означать 10-кратное сокращение количества требуемых блоков по сравнению с PHP или Ruby
  • Профессиональный:Писать параллельные шаблоны несложно.Представьте, что вам нужно извлечь три (или N) больших двоичных объекта из Кэшированный в памяти.Сделайте это в PHP ...вы только что написали код, который извлекает первый большой двоичный объект, затем второй, затем третий?Ух ты, как медленно.Есть специальный ПЕКЛ модуль для устранения этой конкретной проблемы для Memcached, но что, если вы хотите получить некоторые данные Memcached параллельно с вашим запросом к базе данных?В Node.js , поскольку парадигма асинхронна, очень естественно, что веб-запрос выполняет несколько действий параллельно.
  • Con:Асинхронный код принципиально сложнее синхронного кода, и начальная кривая обучения может быть трудной для разработчиков без четкого понимания того, что на самом деле означает параллельное выполнение.Тем не менее, это гораздо менее сложно, чем писать любой многопоточный код с блокировкой.
  • Con:Если запрос, требующий больших вычислительных ресурсов, выполняется, например, в течение 100 мс, это приведет к остановке обработки других запросов, которые обрабатываются в том же процессе Node.js ...АКА, кооператив-многозадачность.Это может быть смягчено с помощью шаблона Web Workers (выделение подпроцесса для решения дорогостоящей задачи).В качестве альтернативы, вы могли бы использовать большое количество Node.js workers и позволить каждому из них обрабатывать только один запрос одновременно (все еще довольно эффективно, потому что процесс не перерабатывается).
  • Con:Запуск производственной системы намного сложнее, чем CGI модель, подобная Apache + PHP, Perl - язык программирования, Рубин, и т.д.Необработанные исключения приведут к остановке всего процесса, требуя логического перезапуска отказавших рабочих (см. кластер).Модули с ошибочным машинным кодом могут привести к серьезному сбою процесса.Всякий раз, когда рабочий умирает, все запросы, которые он обрабатывал, отбрасываются, поэтому один глючный API может легко ухудшить качество обслуживания других совместно размещенных API.

По сравнению с написанием "реального" сервиса на Java / C # / C (C?неужели?)

  • Профессиональный:Выполнение асинхронного в Node.js проще, чем выполнение потокобезопасности где-либо еще, и, возможно, обеспечивает большую выгоду.Node.js это, безусловно, наименее болезненная асинхронная парадигма, в которой я когда-либо работал.С хорошими библиотеками это лишь немного сложнее, чем писать синхронный код.
  • Профессиональный:Никаких ошибок в многопоточности / блокировке.Правда, вы заранее вкладываете средства в написание более подробного кода, который выражает надлежащий асинхронный рабочий процесс без блокирующих операций.И вам нужно написать несколько тестов и заставить эту штуку работать (это скриптовый язык, и жирное перебирание имен переменных фиксируется только во время модульного тестирования).НО, как только вы заставите это работать, площадь поверхности для heisenbugs -- странные проблемы, которые проявляются только один раз на миллион запусков - эта площадь поверхности просто намного, намного меньше.Написание налогов Node.js код сильно загружается на этапе кодирования.Тогда вы, как правило, получаете стабильный код.
  • Профессиональный:JavaScript гораздо более легкий для выражения функциональности.Трудно доказать это словами, но JSON, динамическая типизация, лямбда-нотация, прототипное наследование, облегченные модули, что угодно...просто, как правило, требуется меньше кода для выражения одних и тех же идей.
  • Con:Может быть, вам действительно, очень нравятся сервисы кодирования на Java?

Для получения другого взгляда на JavaScript и Node.js ознакомьтесь С Java на Node.js, сообщение в блоге о впечатлениях разработчика Java и опыте обучения Node.js.


Модули При рассмотрении node имейте в виду, что выбранные вами библиотеки JavaScript будут ОПРЕДЕЛИТЬ ваш опыт.Большинство людей используют по крайней мере два: вспомогательный асинхронный шаблон (Step, Futures, Async) и модуль JavaScript sugar (Underscore.js).

Помощник / JavaScript Sugar:

  • Underscore.js - используй это.Просто сделай это.Это делает ваш код приятным и читаемым с помощью таких элементов, как _.isString() и _.isArray().Я не совсем уверен, как в противном случае вы могли бы написать безопасный код.Кроме того, для расширенного использования командной строки ознакомьтесь с моим собственным Подчеркивание-CLI.

Модули Асинхронного шаблона:

  • Шаг - очень элегантный способ выразить комбинации последовательных и параллельных действий.Моя личная рекомендация.Видишь мой пост о том, как выглядит код шага.
  • Будущее - гораздо более гибкий (это действительно хорошо?) способ выразить порядок с помощью требований.Может выражать такие вещи, как "запустите a, b, c параллельно.Когда A и B закончат, запустите AB.Когда A и C завершат работу, запустите AC ". Такая гибкость требует большей осторожности, чтобы избежать ошибок в вашем рабочем процессе (например, никогда не вызывать обратный вызов или вызывать его несколько раз).Видишь Сообщение Райноса об использовании фьючерсов (это пост, который заставил меня "получить" фьючерсы).
  • Асинхронный - более традиционная библиотека с одним методом для каждого шаблона.Я начал с этого до моего религиозного обращения в step и последующего осознания того, что все паттерны в Async могут быть выражены в Step с помощью единой более читаемой парадигмы.
  • Тамеджс - Написанный OkCupid, это предварительный компилятор, который добавляет новый языковой примат "await" для элегантного написания последовательных и параллельных рабочих процессов.Шаблон выглядит потрясающе, но он требует предварительной компиляции.Я все еще принимаю решение по этому поводу.
  • StreamlineJS ( Потоковые линии ) - конкурент TameJS.Я склоняюсь к Ручному, но ты можешь принять свое собственное решение.

Или, чтобы прочитать все об асинхронных библиотеках, см. эта дискуссионная группа-интервью с авторами.

Веб -фреймворк:

  • Выражать Отличный Ruby on Rails-эск фреймворк для организации веб-сайтов.Он использует НЕФРИТ как движок для создания шаблонов XML / HTML, который делает создание HTML гораздо менее болезненным, даже почти элегантным.
  • jQuery - jQuery - запрос Технически jQuery не является узловым модулем, но быстро становится стандартом де-факто для пользовательского интерфейса на стороне клиента.jQuery предоставляет CSS-подобные селекторы для "запроса" наборов элементов DOM, с которыми затем можно работать (устанавливать обработчики, свойства, стили и т.д.).В том же духе Твиттер Загрузочный ремень CSS - фреймворк, Backbone.js для MVC шаблон, и Browserify.js чтобы объединить все ваши файлы JavaScript в один файл.Все эти модули становятся стандартами де-факто, поэтому вам следует хотя бы ознакомиться с ними, если вы о них не слышали.

Тестирование:

  • JSHint (Шинт ) - Необходимо использовать;Сначала я не использовал это, что сейчас кажется непонятным.JSLint добавляет обратно набор базовых проверок, которые вы получаете с помощью скомпилированного языка, такого как Java.Несовпадающие скобки, необъявленные переменные, типы различных форм и размеров.Вы также можете включить различные формы того, что я называю "анальным режимом", где вы проверяете стиль пробелов и еще много чего, что нормально, если это вам по вкусу, но реальная ценность заключается в получении мгновенной обратной связи по точному номеру строки, где вы забыли закрывающее ")" ...без необходимости запускать ваш код и нажимать на оскорбительную строку."JSHint" - это более настраиваемый вариант Дуглас Крокфорд's JSLint.
  • Мокко конкурент Клятвам, которые я начинаю предпочитать.Оба фреймворка достаточно хорошо справляются с основами, но сложные шаблоны, как правило, легче выразить в Mocha.
  • Клятвы Клятвы действительно довольно элегантны.И он выводит прекрасный отчет (--spec), показывающий вам, какие тестовые случаи пройдены / завершены с ошибкой.Потратьте на его изучение 30 минут, и вы сможете создавать базовые тесты для своих модулей с минимальными усилиями.
  • Зомби - Безголовое тестирование HTML и JavaScript с использованием Джсдом как виртуальный "браузер".Очень мощная штука.Объедините это с Повтор чтобы получить молниеносные детерминированные тесты кода в браузере.
  • Комментарий о том, как "думать о" тестировании:
    • Тестирование не является необязательным.С помощью динамического языка, такого как JavaScript, существуют очень несколько статических проверок.Например, передача двух параметров методу, который ожидает 4, не прервется до тех пор, пока код не будет выполнен.Довольно низкая планка для создания ошибок в JavaScript.Базовые тесты необходимы для восполнения пробела в проверке с помощью скомпилированных языков.
    • Забудьте о проверке, просто заставьте свой код выполняться.Для каждого метода мой первый случай проверки - "ничего не ломается", и это тот случай, который срабатывает чаще всего.Доказательство того, что ваш код выполняется без ошибок, выявляет 80% ошибок и сделает так много для повышения надежности вашего кода, что вы обнаружите, что возвращаетесь назад и добавляете нюансы проверки, которые вы пропустили.
    • Начните с малого и преодолейте инерционный барьер.Мы все ленивы, у нас мало времени, и легко рассматривать тестирование как "дополнительную работу".Так что начните с малого.Напишите тестовый пример 0 - загрузите свой модуль и сообщите об успехе.Если вы заставите себя делать именно это, то инерционный барьер для тестирования будет преодолен.Это <30 минут, чтобы сделать это в первый раз, включая чтение документации.Теперь напишите тестовый пример 1 - вызовите один из ваших методов и убедитесь, что "ничего не ломается", то есть что вы не получаете ошибку обратно.Тестовый пример 1 должен занять у вас менее одной минуты.Когда инерция исчезла, становится легко постепенно расширять тестовое покрытие.
    • Теперь развивайте свои тесты с помощью вашего кода.Не пугайтесь того, как будет выглядеть "правильный" сквозной тест с макетными серверами и все такое.Код начинается просто и развивается для обработки новых случаев;тесты тоже должны быть.По мере добавления новых случаев и усложнения вашего кода добавляйте тестовые случаи для отработки нового кода.По мере обнаружения ошибок добавляйте проверки и / или новые обращения, чтобы покрыть дефектный код.Когда вы отлаживаете и теряете уверенность в каком-то фрагменте кода, вернитесь назад и добавьте тесты, чтобы доказать, что он делает то, что вы думаете.Захватывайте строки примеров данных (из других служб, которые вы вызываете, веб-сайтов, которые вы очищаете, чего угодно) и добавляйте их в свой код синтаксического анализа.Несколько примеров здесь, улучшенная проверка там, и в итоге вы получите высоконадежный код.

Кроме того, ознакомьтесь с официальный список рекомендуемых Node.js модулей.Однако, GitHub's Узловые Модули Wiki это гораздо более полный и хороший ресурс.


Чтобы понять Node, полезно рассмотреть несколько ключевых вариантов дизайна:

Node.js является ОСНОВАННЫЙ НА СОБЫТИИ и АСИНХРОННЫЙ / НЕБЛОКИРУЮЩИЙ.События, такие как входящее HTTP-соединение, запускают функцию JavaScript, которая выполняет небольшую работу и запускает другие асинхронные задачи, такие как подключение к базе данных или извлечение содержимого с другого сервера.Как только эти задачи будут запущены, функция события завершится и Node.js снова перейдет в спящий режим.Как только происходит что-то еще, например, устанавливается соединение с базой данных или внешний сервер отвечает содержимым, запускаются функции обратного вызова и выполняется больше кода JavaScript, что потенциально запускает еще больше асинхронных задач (например, запрос к базе данных).Таким образом, Node.js будет успешно чередовать действия для нескольких параллельных рабочих процессов, выполняя любые действия, которые разблокированы в любой момент времени.Вот почему Node.js отлично справляется с управлением тысячами одновременных подключений.

Почему бы просто не использовать один процесс / поток для каждого соединения, как все остальные? В Node.js новое соединение - это просто очень маленькое выделение кучи.Запуск нового процесса занимает значительно больше памяти, мегабайт на некоторых платформах.Но реальная стоимость - это накладные расходы, связанные с переключением контекста.Когда у вас есть 10 ^ 6 потоков ядра, ядру приходится проделывать большую работу, выясняя, кто должен выполняться следующим.Много работы ушло на создание планировщика O (1) для Linux, но, в конце концов, гораздо эффективнее иметь один процесс, управляемый событиями, чем 10 ^ 6 процессов, конкурирующих за процессорное время.Кроме того, в условиях перегрузки многопроцессорная модель ведет себя очень плохо, приводя к нехватке критически важных служб администрирования, особенно SSHD (это означает, что вы даже не можете войти в систему, чтобы выяснить, насколько она испорчена на самом деле).

Node.js является ОДИНАРНАЯ РЕЗЬБА и ЗАМОК СВОБОДЕН.Node.js , поскольку очень продуманный выбор дизайна имеет только один поток для каждого процесса.Из-за этого для нескольких потоков принципиально невозможно получить доступ к данным одновременно.Таким образом, никаких блокировок не требуется.Нити жесткие.Действительно, очень тяжело.Если вы в это не верите, значит, вы недостаточно занимались многопоточным программированием.Получить правильную блокировку сложно, и это приводит к появлению ошибок, которые действительно трудно отследить.Устранение блокировок и многопоточности позволяет одному из самых неприятных классов ошибок просто исчезнуть.Это может быть единственным самым большим преимуществом node.

Но как мне воспользоваться преимуществами моей 16-ядерной коробки?

Два способа:

  1. Для больших вычислительных задач, таких как кодирование изображений, Node.js может запускать дочерние процессы или отправлять сообщения дополнительным рабочим процессам.В этом проекте у вас будет один поток, управляющий потоком событий и N процессами, выполняющими тяжелые вычислительные задачи и перегружающими остальные 15 процессоров.
  2. Для увеличения пропускной способности веб-сервиса вам следует запустить несколько Node.js серверов в одном блоке, по одному на ядро, используя кластер (С Node.js версией 0.6.x официальный модуль "cluster", связанный здесь, заменяет версию learnboost, которая имеет другой API).Эти локальные Node.js затем серверы могут конкурировать на сокете за прием новых подключений, распределяя нагрузку между ними.Как только соединение принято, оно становится тесно привязанным к одному из этих общих процессов.В теории это звучит плохо, но на практике это работает довольно хорошо и позволяет избежать головной боли при написании потокобезопасного кода.Кроме того, это означает, что Node.js получает отличную привязку к кэшу процессора, более эффективно используя пропускную способность памяти.

Node.js позволяет вам делать некоторые действительно мощные вещи, не потея. Предположим, у вас есть Node.js программа, которая выполняет множество задач, прослушивает TCP порт для команд, кодирует какие-то изображения, что угодно.С помощью пяти строк кода вы можете добавить веб-портал управления на основе HTTP, который показывает текущее состояние активных задач.Это ЛЕГКО сделать:

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end(myJavascriptObject.getSomeStatusInfo());
}).listen(1337, "127.0.0.1");

Теперь вы можете перейти по URL-адресу и проверить статус вашего запущенного процесса.Добавьте несколько кнопок, и у вас получится "портал управления".Если у вас есть запущенный скрипт на Perl / Python / Ruby, просто "запустить портал управления" не совсем просто.

Но разве JavaScript не медленный / плохой / злой / порождение дьявола? У JavaScript есть некоторые странности, но с "хорошими частями" там есть очень мощный язык, и в любом случае JavaScript - это язык клиента (браузера).JavaScript здесь надолго;другие языки ориентируются на него как на IL, и таланты мирового класса соревнуются за создание самых передовых движков JavaScript.Из-за роли JavaScript в браузере огромное количество инженерных усилий затрачивается на то, чтобы сделать JavaScript невероятно быстрым. V8 это новейший и самый мощный движок javascript, по крайней мере, на этот месяц.Это превосходит другие языки сценариев как по эффективности, так И по стабильности (глядя на тебя, Ruby).И это будет только улучшаться с огромными командами, работающими над проблемой в Microsoft, Google и Mozilla, соревнующимися за создание лучшего движка JavaScript (это больше не "интерпретатор" JavaScript, поскольку все современные движки выполняют тонны ДЖИТ компиляция под капотом с интерпретацией только в качестве запасного варианта для кода, выполняемого один раз).Да, мы все хотели бы исправить несколько более странных вариантов языка JavaScript, но на самом деле это не так уж плохо.И язык настолько чертовски гибкий, что вы на самом деле кодируете не JavaScript, вы кодируете Step или jQuery - в JavaScript библиотеки определяют взаимодействие больше, чем в любом другом языке.Чтобы создавать веб-приложения, вам в любом случае в значительной степени нужно знать JavaScript, поэтому кодирование с его помощью на сервере имеет своего рода синергию навыков.Это заставило меня не бояться написания клиентского кода.

Кроме того, если вы ДЕЙСТВИТЕЛЬНО ненавидите JavaScript, вы можете использовать синтаксический сахар, такой как Кофейный скрипт.Или что-нибудь еще, что создает код JavaScript, например Веб-инструментарий Google (GWT).

Говоря о JavaScript, что такое "закрытие"? - Довольно причудливый способ сказать, что вы сохраняете переменные с лексической областью действия во всех цепочках вызовов.;) Вот так:

var myData = "foo";
database.connect( 'user:pass', function myCallback( result ) {
    database.query("SELECT * from Foo where id = " + myData);
} );
// Note that doSomethingElse() executes _BEFORE_ "database.query" which is inside a callback
doSomethingElse();

Видите, как вы можете просто использовать "myData", не делая ничего неудобного, например, помещая его в объект?И в отличие от Java, переменная "myData" не обязательно должна быть доступна только для чтения.Эта мощная языковая функция делает асинхронное программирование гораздо менее подробным и менее болезненным.

Написание асинхронного кода всегда будет более сложным делом, чем написание простого однопоточного скрипта, но с Node.js , это не намного сложнее, и вы получаете массу преимуществ в дополнение к эффективности и масштабируемости до тысяч одновременных подключений...

V8 является реализацией JavaScript.Это позволяет вам запускать автономные приложения JavaScript (среди прочего).

Node.js это просто библиотека, написанная для V8, которая выполняет событийный ввод-вывод.Эту концепцию немного сложнее объяснить, и я уверен, что кто-нибудь ответит лучшим объяснением, чем я...Суть в том, что вместо того, чтобы выполнять какой-то ввод или вывод и ждать, пока это произойдет, вы просто не надо подождите, пока это закончится.Так, например, запросите время последнего редактирования файла:

// Pseudo code
stat( 'somefile' )

Это может занять пару миллисекунд, а может и секунды.С событийным I/O вы просто запускаете запрос и вместо ожидания подключаете обратный вызов, который запускается по завершении запроса:

// Pseudo code
stat( 'somefile', function( result ) {
  // Use the result here
} );
// ...more code here

Это делает его очень похожим на код JavaScript в браузере (например, с Аякс функциональность стиля).

Для получения дополнительной информации вам следует ознакомиться со статьей Node.js это по-настоящему захватывающе это было мое знакомство с библиотекой / платформой...Я нашел это довольно хорошим.

Node.js это инструмент командной строки с открытым исходным кодом, созданный для серверного JavaScript-кода.Вы можете скачать тарболл, скомпилируйте и установите исходный код.Это позволяет вам запускать программы на JavaScript.

JavaScript выполняется с помощью V8, движок JavaScript , разработанный Google , который используется в Хром браузер.Он использует JavaScript API для доступа к сети и файловой системе.

Он популярен благодаря своей производительности и способности выполнять параллельные операции.

Понимание node.js является лучшим объяснением node.js Я нашел до сих пор.

Ниже приведено несколько хороших статей на эту тему.

Замыкания - это способ выполнения кода в контексте, в котором он был создан.

Что это означает для одновременности, так это то, что вы можете определить переменные, а затем инициировать неблокирующее I/O функцию и отправьте ей анонимную функцию для ее обратного вызова.

Когда задача будет завершена, функция обратного вызова будет выполняться в контексте с переменными, это и есть закрытие.

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

Два хороших примера касаются того, как вы управляете шаблонами и используете с ними прогрессивные усовершенствования.Вам просто нужно несколько легких фрагментов кода JavaScript, чтобы он работал идеально.

Я настоятельно рекомендую вам посмотреть и прочитать эти статьи:

Выберите любой язык и попытайтесь вспомнить, как вы управляли бы своими шаблонами HTML-файлов и что вам нужно было сделать, чтобы обновить один CSS - файл название класса в вашем ДОМ структура (например, пользователь нажал на пункт меню, и вы хотите, чтобы он был помечен как "выбранный" и обновил содержимое страницы).

С помощью 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" и отправлять ее обратно в ваш веб-браузер ".

Что ж, Я понимаю, что

  • Цель Node - предоставить простой способ создавать масштабируемые сетевые программы.
  • Node похож по дизайну на такие системы, как Event Machine от Ruby или Twisted от Python, и находится под их влиянием.
  • Событийный ввод-вывод для javascript версии 8.

Для меня это означает, что вы были правы во всех трех предположениях.Библиотека, несомненно, выглядит многообещающе!

Кроме того, не забудьте упомянуть, что Google V8 работает ОЧЕНЬ быстро.Он фактически преобразует код JavaScript в машинный код с аналогичной производительностью скомпилированного двоичного файла.Так что, наряду со всеми другими замечательными вещами, это БЕЗУМНО быстро.

Q:Модель программирования управляется событиями, особенно тем, как она обрабатывает I/O.

Правильно.Он использует обратные вызовы, поэтому любой запрос на доступ к файловой системе приведет к отправке запроса в файловую систему, а затем Node.js начнет обработку следующего запроса.Он будет беспокоиться о запросе ввода-вывода только после того, как получит ответ от файловой системы, и в это время он запустит код обратного вызова.Однако можно выполнять синхронные запросы ввода-вывода (то есть блокировать запросы).Разработчик должен выбирать между асинхронным (обратные вызовы) или синхронным (ожидание).

Q:Он использует JavaScript, а синтаксический анализатор - V8.

ДА

Q:Его можно легко использовать для создания параллельных серверных приложений.

Да, хотя вам пришлось бы вручную закодировать довольно много JavaScript.Возможно, было бы лучше взглянуть на фреймворк, такой как http://www.easynodejs.com/ - который поставляется с полной онлайн-документацией и образцом приложения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top