Программирование на основе событий может быть подавляющим для новичков, что может затруднить начало работы с Node.js. Но не позволяйте этому обескураживать вас; В этой статье я научу вас некоторым основам Node.js и объясню, почему он стал таким популярным.
Если вам нужна помощь, вы всегда можете обратиться к одному из экспертов JavaScript в Envato Studio. Если вам нужно исправить ошибку или добавить новую функцию , вы найдете опытного разработчика JavaScript, который поможет вам.
Изучите JavaScript: полное руководство
Мы создали полное руководство, которое поможет вам изучить JavaScript , независимо от того, начинаете ли вы как веб-разработчик или хотите изучать более сложные темы.
Вступление
Чтобы начать использовать Node.js, вы должны сначала понять различия между Node.js и традиционными сценариями на стороне сервера (например, PHP, Python, Ruby и т. Д.).
Асинхронное программирование
Node.js использует модульную архитектуру для упрощения создания сложных приложений.
Скорее всего, вы знакомы с асинхронным программированием; в конце концов, это «А» в Ajax. Каждая функция в Node.js является асинхронной. Следовательно, все, что обычно блокирует поток, выполняется в фоновом режиме. Это самая важная вещь, которую нужно помнить о Node.js. Например, если вы читаете файл в файловой системе, вы должны указать функцию обратного вызова, которая будет выполнена после завершения операции чтения.
Вы делаете все!
Node.js — это всего лишь среда, а это значит, что вы должны делать все самостоятельно. Не существует HTTP-сервера по умолчанию или какого-либо сервера в этом отношении. Это может быть ошеломляющим для новых пользователей, но выигрыш — высокоэффективное веб-приложение. Один скрипт обрабатывает все общение с клиентами. Это значительно уменьшает количество ресурсов, используемых приложением. Например, вот код для простого приложения Node.js:
var i, a, b, c, max; max = 1000000000; var d = Date.now (); для (i = 0; i <max; i ++) { а = 1234 + 5678 + я; b = 1234 * 5678 + i; с = 1234/2 + 1; } console.log (Date.now () - d);
А вот эквивалент, написанный на 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()
, вот так:
var http = require ('http');
Node.js — это всего лишь среда; Вы должны сделать все сами.
Функция require()
возвращает ссылку на указанный модуль. В случае этого кода ссылка на модуль http сохраняется в переменной http
.
В приведенном выше коде мы передали имя модуля в функцию require()
. Это заставляет Node искать папку node_modules в каталоге нашего приложения и искать модуль http в этой папке. Если Node не находит папку node_modules (или модуль http внутри нее), он просматривает глобальный кэш модуля. Вы также можете указать фактический файл, передав относительный или абсолютный путь, например так:
var myModule = require ('./ myModule.js');
Модули представляют собой инкапсулированные фрагменты кода. Код внутри модуля в основном является закрытым — это означает, что функции и переменные, определенные в них, доступны только изнутри модуля. Однако вы можете выставить функции и / или переменные для использования вне модуля. Для этого используйте объект exports
и заполните его свойства и методы фрагментами кода, которые вы хотите предоставить. Рассмотрим следующий модуль в качестве примера:
var PI = Math.PI; exports.area = function (r) { возврат PI * r * r; }; exports.circumference = function (r) { возврат 2 * PI * r; };
Этот код создает переменную PI
которой может получить доступ только код, содержащийся в модуле; он недоступен за пределами модуля. Далее две функции создаются на объекте exports
. Эти функции доступны за пределами модуля, поскольку они определены в объекте exports
. В результате PI
полностью защищен от постороннего вмешательства. Следовательно, вы можете быть уверены, что area()
и circumference()
всегда будут вести себя так, как должны (при условии, что для параметра r
задано значение).
Глобальная сфера
Node — это среда JavaScript, работающая на движке Google V8 JavaScript. Поэтому мы должны следовать лучшим практикам, которые мы используем для разработки на стороне клиента. Например, мы должны избегать попадания чего-либо в глобальную сферу. Это, однако, не всегда возможно. Глобальная область действия в Node — GLOBAL
(в отличие от window
в браузере), и вы можете легко создать глобальную переменную функции, пропустив ключевое слово var
, например:
globalVariable = 1; globalFunction = function () {...};
Еще раз, глобалов следует избегать всякий раз, когда это возможно. Так что будьте осторожны и не забывайте использовать var
при объявлении переменной.
Установка
Естественно, нам нужно установить Node, прежде чем мы сможем написать и выполнить приложение. Установка проста, если вы используете Windows или OS X; Сайт nodejs.org предлагает установщики для этих операционных систем. Для Linux используйте любой менеджер пакетов. Откройте свой терминал и введите:
sudo apt-get update sudo apt-get установить узел
или:
обновление способности sudo sudo aptitude install node
Node.js находится в репозиториях sid; вам может понадобиться добавить их в список источников:
sudo echo deb http://ftp.us.debian.org/debian/ sid main> /etc/apt/sources.list.d/sid.list
Но имейте в виду, что установка пакетов sid на старых системах может привести к поломке вашей системы. Будьте осторожны и удалите /etc/apt/sources.list.d/sid.list
после завершения установки Node.
Установка новых модулей
В Node.js есть менеджер пакетов, который называется Node Package Manager (NPM). Он автоматически устанавливается вместе с Node.js, и вы используете NPM для установки новых модулей. Чтобы установить модуль, откройте свой терминал / командную строку, перейдите в нужную папку и выполните следующую команду:
npm установить имя_модуля
Неважно, какая у вас ОС; Приведенная выше команда установит указанный вами модуль вместо module_name .
Приложение Hello World
Естественно, наш первый скрипт Node.js напечатает текст 'Hello World!'
на консоль. Создайте файл с именем hello.js и введите следующий код:
console.log ('Hello World!');
Теперь давайте выполним скрипт. Откройте терминал / командную строку, перейдите в папку, содержащую hello.js , и выполните следующую команду:
узел hello.js
Вы должны увидеть 'Hello World!'
отображается в консоли.
HTTP-сервер
Давайте перейдем к более сложному приложению; это не так сложно, как вы думаете. Давайте начнем со следующего кода. Прочитайте комментарии, а затем объяснение ниже:
// Включить модуль http. var http = require ("http"); // Создать сервер. Функция, переданная в качестве параметра, вызывается при каждом запросе. // переменная запроса содержит все параметры запроса // переменная response позволяет вам делать что угодно с ответом, отправленным клиенту. http.createServer (функция (запрос, ответ) { // Прикрепить слушатель к конечному событию. // Это событие вызывается, когда клиент отправил все данные и ожидает ответа. request.on ("end", function () { // Записываем заголовки в ответ. // 200 - это код состояния HTTP (этот означает успех) // Второй параметр содержит поля заголовка в объекте // Мы отправляем простой текст, поэтому Content-Type должен быть text / plain response.writeHead (200, { 'Content-Type': 'text / plain' }); // Отправить данные и завершить ответ. response.end ('Привет HTTP!'); }); // Прослушивание порта 8080. .}) Слушать (8080);
Этот код очень прост. Вы можете отправить больше данных клиенту, используя метод response.write()
, но вы должны вызвать его перед вызовом response.end()
. Сохраните этот код как http.js и введите его в вашу консоль:
узел http.js
Откройте браузер и перейдите по http://localhost:8080
. Вы должны увидеть текст «Привет HTTP!» на странице.
Обработка параметров URL
Как я упоминал ранее, мы должны делать все сами в Node, включая разбор аргументов запроса. Это, однако, довольно просто. Посмотрите на следующий код:
// Включить модуль http, var http = require ("http"), // И модуль url, который очень полезен при разборе параметров запроса. url = require ("url"); // Создать сервер. http.createServer (функция (запрос, ответ) { // Прикрепить слушатель к конечному событию. request.on ('end', function () { // Анализируем запрос на аргументы и сохраняем их в переменной _get. // Эта функция анализирует URL из запроса и возвращает представление объекта. var _get = url.parse (request.url, true) .query; // Записываем заголовки в ответ. response.writeHead (200, { 'Content-Type': 'text / plain' }); // Отправить данные и завершить ответ. response.end ('Вот ваши данные:' + _get ['data']); }); // Прослушивание порта 8080. .}) Слушать (8080);
Этот код использует метод parse()
модуля url , основного модуля Node.js, для преобразования URL-адреса запроса в объект. Возвращенный объект имеет свойство query
, которое извлекает параметры URL. Сохраните этот файл как get.js и выполните его с помощью следующей команды:
узел get.js
Затем перейдите по http://localhost:8080/?data=put_some_text_here
в вашем браузере. Естественно, изменение значения параметра data
не нарушит работу скрипта.
Чтение и запись файлов
Для управления файлами в Node мы используем модуль fs (основной модуль). Мы читаем и пишем файлы, используя fs.readFile()
и fs.writeFile()
соответственно. Я объясню аргументы после следующего кода:
// Включить модуль http, var http = require ("http"), // И модуль MySQL, который вы только что установили. fs = require ("fs"); // Создать http-сервер. http.createServer (функция (запрос, ответ) { // Прикрепить слушатель к конечному событию. request.on ("end", function () { // Прочитать файл. fs.readFile ("test.txt", 'utf-8', функция (ошибка, данные) { // Пишем заголовки. response.writeHead (200, { 'Content-Type': 'text / plain' }); // Увеличиваем число полученное из файла. data = parseInt (data) + 1; // Записать увеличенный номер в файл. fs.writeFile ('test.txt', data); // Завершаем ответ каким-нибудь приятным сообщением. response.end ('Эта страница была обновлена' + data + 'times!'); }); }); // Прослушивание порта 8080. .}) Слушать (8080);
В Node.js есть менеджер пакетов, который называется Node Package Manager (NPM). Он автоматически устанавливается с Node.js
Сохраните это как files.js . Перед запуском этого сценария создайте файл с именем test.txt в том же каталоге, что и files.js .
Этот код демонстрирует fs.readFile()
и fs.writeFile()
. Каждый раз, когда сервер получает запрос, скрипт считывает число из файла, увеличивает его и записывает новый номер в файл. Метод fs.readFile()
принимает три аргумента: имя файла для чтения, ожидаемую кодировку и функцию обратного вызова.
Запись в файл, по крайней мере, в этом случае, намного проще. Нам не нужно ждать каких-либо результатов, хотя вы бы проверили ошибки в реальном приложении. Метод fs.writeFile()
принимает имя файла и данные в качестве аргументов. Он также принимает третий и четвертый аргументы (оба являются необязательными) для указания функции кодирования и обратного вызова соответственно.
Теперь давайте запустим этот скрипт с помощью следующей команды:
узел files.js
Откройте его в браузере ( http://localhost:8080
) и обновите его несколько раз. Теперь вы можете подумать, что в коде есть ошибка, потому что она увеличивается на два. Это не ошибка Каждый раз, когда вы запрашиваете этот URL, на сервер отправляются два запроса. Первый запрос автоматически выполняется браузером, который запрашивает favicon.ico , и, конечно, второй запрос относится к URL ( http://localhost:8080
).
Хотя это поведение технически не является ошибкой, это поведение, которое мы не хотим. Мы можем легко это исправить, проверив URL запроса. Вот пересмотренный код:
// Включить модуль http, var http = require ("http"), // И модуль MySQL, который вы только что установили. fs = require ("fs"); // Создать http-сервер. http.createServer (функция (запрос, ответ) { // Прикрепить слушатель к конечному событию. request.on ('end', function () { // Проверьте, запрашивает ли пользователь / if (request.url == '/') { // Прочитать файл. fs.readFile ('test.txt', 'utf-8', функция (ошибка, данные) { // Пишем заголовки. response.writeHead (200, { 'Content-Type': 'text / plain' }); // Увеличиваем число полученное из файла. data = parseInt (data) + 1; // Записать увеличенный номер в файл. fs.writeFile ('test.txt', data); // Завершаем ответ каким-нибудь приятным сообщением. response.end ('Эта страница была обновлена' + data + 'times!'); }); } еще { // Укажите, что запрошенный файл не был найден. response.writeHead (404); // И завершаем запрос без отправки каких-либо данных. response.end (); } }); // Прослушивание порта 8080. .}) Слушать (8080);
Проверьте это сейчас; это должно работать как ожидалось.
Доступ к базам данных MySQL
Большинство традиционных серверных технологий имеют встроенные средства подключения к базе данных и запросов к ней. С Node.js вы должны установить библиотеку. Для этого урока я выбрал стабильный и простой в использовании node-mysql . Полное название этого модуля: [email protected] (все, что после @ — это номер версии). Откройте консоль, перейдите в каталог, где вы сохранили свои скрипты, и выполните следующую команду:
npm установить [email protected]
Это загружает и устанавливает модуль, а также создает папку node_modules в текущем каталоге. Теперь давайте посмотрим, как мы можем использовать это в нашем коде; см. следующий пример:
// Включить модуль http, var http = require ('http'), // И модуль MySQL, который вы только что установили. mysql = require ("mysql"); // Создать соединение. // Данные по умолчанию для новой установки MySQL и должны быть изменены в соответствии с вашей конфигурацией. var connection = mysql.createConnection ({ пользователь: "root", пароль: "", база данных: "db_name" }); // Создать http-сервер. http.createServer (функция (запрос, ответ) { // Прикрепить слушатель к конечному событию. request.on ('end', function () { // Запрос к базе данных. connection.query ('SELECT * FROM your_table;', функция (ошибка, строки, поля) { response.writeHead (200, { 'Content-Type': 'x-application / json' }); // Отправляем данные в виде строки JSON. // Переменная Rows содержит результат запроса. response.end (JSON.stringify (строки)); }); }); // Прослушивание порта 8080. .}) Слушать (8080);
Запрос к базе данных с этой библиотекой легко; просто введите строку запроса и функцию обратного вызова. В реальном приложении вы должны проверить, были ли ошибки (параметр error
не будет undefined
при возникновении ошибок) и отправить коды ответов в зависимости от успеха или неудачи запроса. Также обратите внимание, что мы установили для Content-Type
значение x-application/json
, которое является допустимым типом MIME для JSON. Параметр rows
содержит результат запроса, и мы просто преобразуем данные в rows
в структуру JSON с помощью JSON.stringify()
.
Сохраните этот файл как mysql.js и выполните его (если у вас установлен MySQL, то есть):
узел mysql.js
Перейдите по http://localhost:8080
в своем браузере, и вам будет предложено загрузить файл в формате JSON.
Вывод
Каждая функция в Node.js является асинхронной.
Node.js требует дополнительной работы, но отдача от быстрого и надежного приложения того стоит. Если вы не хотите делать все на самом низком уровне, вы всегда можете выбрать какую-то платформу, например > Express , чтобы упростить разработку приложений.
Node.js — это перспективная технология и отличный выбор для приложений с высокой нагрузкой. Это было доказано корпорациями, такими как Microsoft, eBay и Yahoo. Если вы не уверены в размещении своего веб-сайта / приложения, вы всегда можете использовать дешевое решение VPS или различные облачные службы, такие как Microsoft Azure и Amazon EC2. Обе эти услуги предоставляют масштабируемые среды по разумной цене.
Не забудьте прокомментировать, если у вас есть какие-либо вопросы!