Статьи

Node.js для начинающих

Программирование на основе событий может быть подавляющим для новичков, что может затруднить начало работы с Node.js. Но не позволяйте этому обескураживать вас; В этой статье я научу вас некоторым основам Node.js и объясню, почему он стал таким популярным.

Если вам нужна помощь, вы всегда можете обратиться к одному из экспертов JavaScript в Envato Studio. Если вам нужно исправить ошибку или добавить новую функцию , вы найдете опытного разработчика JavaScript, который поможет вам.

Мы создали полное руководство, которое поможет вам изучить JavaScript , независимо от того, начинаете ли вы как веб-разработчик или хотите изучать более сложные темы.

Чтобы начать использовать Node.js, вы должны сначала понять различия между Node.js и традиционными сценариями на стороне сервера (например, PHP, Python, Ruby и т. Д.).

Node.js использует модульную архитектуру для упрощения создания сложных приложений.

Скорее всего, вы знакомы с асинхронным программированием; в конце концов, это «А» в Ajax. Каждая функция в Node.js является асинхронной. Следовательно, все, что обычно блокирует поток, выполняется в фоновом режиме. Это самая важная вещь, которую нужно помнить о Node.js. Например, если вы читаете файл в файловой системе, вы должны указать функцию обратного вызова, которая будет выполнена после завершения операции чтения.

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

А вот эквивалент, написанный на PHP:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
$a = null;
$b = null;
$c = null;
$i = null;
$max = 1000000000;
 
$start = microtime(true);
 
for ($i = 0; $i < $max; $i++) {
    $a = 1234 + 5678 + $i;
    $b = 1234 * 5678 + $i;
    $c = 1234 / 2 + $i;
}
 
var_dump(microtime(true) — $start);

Теперь давайте посмотрим на контрольные цифры. В следующей таблице перечислены времена ответа в миллисекундах для этих двух простых приложений:

Количество итераций Node.js PHP
100 2,00 0,14
10’000 3,00 10,53
1’000’000 15.00 1119,24
10’000’000 143,00 10621,46
1’000’000’000 11118,00 1036272,19

Я запустил два приложения из командной строки, чтобы ни один сервер не задерживал выполнение приложений. Я провел каждый тест десять раз и усреднил результаты. PHP заметно быстрее с меньшим количеством итераций, но это преимущество быстро исчезает с увеличением количества итераций. Когда все сказано и сделано, PHP на 93% медленнее, чем Node.js!

Node.js быстрый, но вам нужно изучить несколько вещей, чтобы правильно его использовать.

Node.js использует модульную архитектуру для упрощения создания сложных приложений. Модули сродни библиотекам на С или единицам на Паскале. Каждый модуль содержит набор функций, связанных с «предметом» модуля. Например, модуль http содержит функции, специфичные для HTTP. Node.js предоставляет несколько основных модулей из коробки, чтобы помочь вам получить доступ к файлам в файловой системе, создавать серверы HTTP и TCP / UDP и выполнять другие полезные функции.

Включение модуля легко; просто вызовите функцию require() , вот так:

Node.js — это всего лишь среда; Вы должны сделать все сами.

Функция require() возвращает ссылку на указанный модуль. В случае этого кода ссылка на модуль http сохраняется в переменной http .

В приведенном выше коде мы передали имя модуля в функцию require() . Это заставляет Node искать папку node_modules в каталоге нашего приложения и искать модуль http в этой папке. Если Node не находит папку node_modules (или модуль http внутри нее), он просматривает глобальный кэш модуля. Вы также можете указать фактический файл, передав относительный или абсолютный путь, например так:

Модули представляют собой инкапсулированные фрагменты кода. Код внутри модуля в основном является закрытым — это означает, что функции и переменные, определенные в них, доступны только изнутри модуля. Однако вы можете выставить функции и / или переменные для использования вне модуля. Для этого используйте объект exports и заполните его свойства и методы фрагментами кода, которые вы хотите предоставить. Рассмотрим следующий модуль в качестве примера:

Этот код создает переменную PI которой может получить доступ только код, содержащийся в модуле; он недоступен за пределами модуля. Далее две функции создаются на объекте exports . Эти функции доступны за пределами модуля, поскольку они определены в объекте exports . В результате PI полностью защищен от постороннего вмешательства. Следовательно, вы можете быть уверены, что area() и circumference() всегда будут вести себя так, как должны (при условии, что для параметра r задано значение).

Node — это среда JavaScript, работающая на движке Google V8 JavaScript. Поэтому мы должны следовать лучшим практикам, которые мы используем для разработки на стороне клиента. Например, мы должны избегать попадания чего-либо в глобальную сферу. Это, однако, не всегда возможно. Глобальная область действия в Node — GLOBAL (в отличие от window в браузере), и вы можете легко создать глобальную переменную функции, пропустив ключевое слово var , например:

Еще раз, глобалов следует избегать всякий раз, когда это возможно. Так что будьте осторожны и не забывайте использовать var при объявлении переменной.

Естественно, нам нужно установить Node, прежде чем мы сможем написать и выполнить приложение. Установка проста, если вы используете Windows или OS X; Сайт nodejs.org предлагает установщики для этих операционных систем. Для Linux используйте любой менеджер пакетов. Откройте свой терминал и введите:

или:

Node.js находится в репозиториях sid; вам может понадобиться добавить их в список источников:

Но имейте в виду, что установка пакетов sid на старых системах может привести к поломке вашей системы. Будьте осторожны и удалите /etc/apt/sources.list.d/sid.list после завершения установки Node.

В Node.js есть менеджер пакетов, который называется Node Package Manager (NPM). Он автоматически устанавливается вместе с Node.js, и вы используете NPM для установки новых модулей. Чтобы установить модуль, откройте свой терминал / командную строку, перейдите в нужную папку и выполните следующую команду:

Неважно, какая у вас ОС; Приведенная выше команда установит указанный вами модуль вместо module_name .

Естественно, наш первый скрипт Node.js напечатает текст 'Hello World!' на консоль. Создайте файл с именем hello.js и введите следующий код:

Теперь давайте выполним скрипт. Откройте терминал / командную строку, перейдите в папку, содержащую hello.js , и выполните следующую команду:

Вы должны увидеть 'Hello World!' отображается в консоли.

Давайте перейдем к более сложному приложению; это не так сложно, как вы думаете. Давайте начнем со следующего кода. Прочитайте комментарии, а затем объяснение ниже:

Этот код очень прост. Вы можете отправить больше данных клиенту, используя метод response.write() , но вы должны вызвать его перед вызовом response.end() . Сохраните этот код как http.js и введите его в вашу консоль:

Откройте браузер и перейдите по http://localhost:8080 . Вы должны увидеть текст «Привет HTTP!» на странице.

Как я упоминал ранее, мы должны делать все сами в Node, включая разбор аргументов запроса. Это, однако, довольно просто. Посмотрите на следующий код:

Этот код использует метод parse() модуля url , основного модуля Node.js, для преобразования URL-адреса запроса в объект. Возвращенный объект имеет свойство query , которое извлекает параметры URL. Сохраните этот файл как get.js и выполните его с помощью следующей команды:

Затем перейдите по http://localhost:8080/?data=put_some_text_here в вашем браузере. Естественно, изменение значения параметра data не нарушит работу скрипта.

Для управления файлами в Node мы используем модуль fs (основной модуль). Мы читаем и пишем файлы, используя fs.readFile() и fs.writeFile() соответственно. Я объясню аргументы после следующего кода:

В Node.js есть менеджер пакетов, который называется Node Package Manager (NPM). Он автоматически устанавливается с Node.js

Сохраните это как files.js . Перед запуском этого сценария создайте файл с именем test.txt в том же каталоге, что и files.js .

Этот код демонстрирует fs.readFile() и fs.writeFile() . Каждый раз, когда сервер получает запрос, скрипт считывает число из файла, увеличивает его и записывает новый номер в файл. Метод fs.readFile() принимает три аргумента: имя файла для чтения, ожидаемую кодировку и функцию обратного вызова.

Запись в файл, по крайней мере, в этом случае, намного проще. Нам не нужно ждать каких-либо результатов, хотя вы бы проверили ошибки в реальном приложении. Метод fs.writeFile() принимает имя файла и данные в качестве аргументов. Он также принимает третий и четвертый аргументы (оба являются необязательными) для указания функции кодирования и обратного вызова соответственно.

Теперь давайте запустим этот скрипт с помощью следующей команды:

Откройте его в браузере ( http://localhost:8080 ) и обновите его несколько раз. Теперь вы можете подумать, что в коде есть ошибка, потому что она увеличивается на два. Это не ошибка Каждый раз, когда вы запрашиваете этот URL, на сервер отправляются два запроса. Первый запрос автоматически выполняется браузером, который запрашивает favicon.ico , и, конечно, второй запрос относится к URL ( http://localhost:8080 ).

Хотя это поведение технически не является ошибкой, это поведение, которое мы не хотим. Мы можем легко это исправить, проверив URL запроса. Вот пересмотренный код:

Проверьте это сейчас; это должно работать как ожидалось.

Большинство традиционных серверных технологий имеют встроенные средства подключения к базе данных и запросов к ней. С Node.js вы должны установить библиотеку. Для этого урока я выбрал стабильный и простой в использовании node-mysql . Полное название этого модуля: [email protected] (все, что после @ — это номер версии). Откройте консоль, перейдите в каталог, где вы сохранили свои скрипты, и выполните следующую команду:

Это загружает и устанавливает модуль, а также создает папку node_modules в текущем каталоге. Теперь давайте посмотрим, как мы можем использовать это в нашем коде; см. следующий пример:

Запрос к базе данных с этой библиотекой легко; просто введите строку запроса и функцию обратного вызова. В реальном приложении вы должны проверить, были ли ошибки (параметр error не будет undefined при возникновении ошибок) и отправить коды ответов в зависимости от успеха или неудачи запроса. Также обратите внимание, что мы установили для Content-Type значение x-application/json , которое является допустимым типом MIME для JSON. Параметр rows содержит результат запроса, и мы просто преобразуем данные в rows в структуру JSON с помощью JSON.stringify() .

Сохраните этот файл как mysql.js и выполните его (если у вас установлен MySQL, то есть):

Перейдите по http://localhost:8080 в своем браузере, и вам будет предложено загрузить файл в формате JSON.

Каждая функция в Node.js является асинхронной.

Node.js требует дополнительной работы, но отдача от быстрого и надежного приложения того стоит. Если вы не хотите делать все на самом низком уровне, вы всегда можете выбрать какую-то платформу, например > Express , чтобы упростить разработку приложений.

Node.js — это перспективная технология и отличный выбор для приложений с высокой нагрузкой. Это было доказано корпорациями, такими как Microsoft, eBay и Yahoo. Если вы не уверены в размещении своего веб-сайта / приложения, вы всегда можете использовать дешевое решение VPS или различные облачные службы, такие как Microsoft Azure и Amazon EC2. Обе эти услуги предоставляют масштабируемые среды по разумной цене.

Не забудьте прокомментировать, если у вас есть какие-либо вопросы!