Node.js Шаг за шагом: введение

15 января 2018

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


Введение в Node.js


Screencast Transcript

Привет, ребята, меня зовут Кристофер Роуч, и я буду вашим проводником в этой серии сериалов на Node.js. В этой серии мы будем использовать Node, чтобы создать простой движок блога, например, тот, который прославился в популярном видеоролике Ruby on Rails. Цель этой серии - дать вам, зрителю, реальное ощущение того, как работает Node, так что даже при работе с любой из популярных инфраструктур веб-разработки, таких как Express или Getty, вы будете чувствовать себя достаточно комфортно с внутренняя работа Узла, чтобы иметь возможность опускаться в его источник и вносить изменения в соответствии с вашими потребностями по мере необходимости.


Установка

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

Узел все еще очень молод и находится в активной разработке, поэтому лучше всего установить его из источника.

Узел все еще очень молод и находится в активной разработке, поэтому лучше всего установить его из источника. Тем не менее, у Узла очень мало зависимостей, и поэтому компиляция не так сложна, как другие проекты, с которыми вы, возможно, сражались в прошлом. Чтобы получить код, зайдите на сайт Node.js. Если вы прокрутите страницу вниз до раздела загрузки, вы найдете несколько вариантов. Если у вас установлен Git, вы можете сделать клон репозитория и установить оттуда. В противном случае есть ссылка на tarball, который вы можете скачать вместо этого. В этом видео, я буду держать вещи простыми и установить из tarball.

Пока это загрузка, сейчас самое время упомянуть, что прилагаются усилия для предоставления порта узла для Windows, и есть инструкции по установке в Windows для Cygwin или MinGW. Я считаю, что есть даже некоторые бинарные пакеты, которые вы можете установить, но на момент написания этой статьи основной областью являются платформы на основе Unix и Linux. Если вы находитесь на компьютере под управлением Windows, вы можете щелкнуть ссылку для инструкций по сборке и выполнить набор инструкций для установки Windows, или вы можете установить версию Linux, такую ​​как Ubuntu, и установить там узел.

Когда вы закончите загрузку, просто распакуйте и распакуйте пакет с tar -xvf и cd в каталог, который он создал. Сначала нам нужно сделать. настроить, затем сделать и, наконец, сделать установку. Это займет немного времени, чтобы построить, поэтому я позволю этому запуститься в фоновом режиме и воспользуюсь этой возможностью, чтобы немного поговорить об узле, и почему это вызывает такое беспокойство в сообществе веб-разработчиков.


Введение в узел

Узел - это JavaScript на сервере.

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

О, я знаю, о чем вы думаете: «Итак, Node - это JavaScript на сервере, хорошо, что это здорово, но в прошлом были попытки использовать еще один JavaScript на сервере, которые в основном просто сбиты с толку».

Что делает Узел чем-то другим?

Ну, короткий ответ: Node - это серверный JavaScript, наконец, законченный. Где другие попытки в основном были портами традиционных веб-фреймворков MVC для языка JavaScript, Node - это нечто совершенно другое. Согласно его веб-сайту, Node имеет значение I O для JavaScript V8, но что именно это означает? Начнем с V8.

V8 - сверхбыстрая реализация JavaScript в JavaScript, которая используется в браузере Chrome.

Благодаря некоторому действительно изобретательному приложению компиляции «Just in Time» V8 может создавать скорости для JavaScript, которые делают пользователей других динамических языков, таких как Python и Ruby, зелеными с завистью. Взгляните на некоторые из тестов, и я считаю, что вы будете поражены. V8 JavaScript работает со многими языками на основе JVM, такими как Clojure и Java, и скомпилированными языками, такими как Go во многих случаях.

Способность JavaScript пропускать замыкания делает программирование на основе событий мертвым простым.

Другая ключевая фраза в этом заявлении имеет значение I O. Это один из самых больших. Когда дело доходит до создания веб-сервера, у вас в основном есть два варианта, которые можно сделать при работе с несколькими параллельными запросами на соединение. Первым, который является более традиционным маршрутом, используемым веб-серверами, такими как Apache, является использование потоков для обработки входящих запросов на соединение. Другой метод, который принимает узел и некоторые чрезвычайно быстрые современные серверы, такие как Nginx и Thin, заключается в использовании одного неблокирующего потока с циклом событий. В этом случае решение использовать JavaScript действительно сияет, поскольку JavaScript был разработан для использования в среде с одним потоковым контуром событий: браузером. Возможность JavaScript пропускать закрытие делает программирование на основе событий мертвым простым. Вы в основном просто вызываете функцию для выполнения некоторого типа I O и передаете ей функцию обратного вызова, и JavaScript автоматически создает закрытие, следя за тем, чтобы правильное состояние сохранялось даже после того, как вызывающая функция уже давно вышла из области видимости. Но это всего лишь технический жаргон, и я уверен, что вы умираете, чтобы увидеть какой-то код в действии. Я собираюсь немного ускориться до конца этой установки, поэтому мы можем начать играть с нашей совершенно новой, недавно отчеканенной копией Node.


Подтверждение установки

Итак, похоже, что моя сборка завершена; Я хочу быстро проверить и убедиться, что с установкой все пошло хорошо. Для этого просто запустите node -version из командной строки, и вы увидите некоторое указание на то, что вы используете последнюю версию Node, которая в настоящее время является версией 0.4.5. Если вы увидите распечатку версии, вы можете быть уверены, что все пошло плавно, и вы готовы написать свое первое приложение Node. Итак, давайте вернемся к нашему домашнему каталогу и создадим новую папку для хранения всей нашей работы в ходе этой серии скринкастов. Здесь я просто собираюсь назвать свой «блог» и дам cd, чтобы начать.


Node - Server Framework

В отличие от других фреймворков, Node не является строго для веб-разработки. Фактически, вы можете думать о Node как о структуре для развития сервера любого рода. С помощью узла вы можете создать IRC-сервер, чат-сервер или, как мы увидим в этом наборе руководств, http-сервер. Поэтому, поскольку мы не можем иметь вводный учебник без обязательного приложения Hello World, мы начнем с этого.


Hello World

Давайте создадим новый файл под названием app.js. Теперь Node поставляется с несколькими библиотеками, чтобы упростить разработку серверов на основе событий. Чтобы использовать одну из доступных библиотек, вы просто включаете ее модуль с помощью функции require. Функция require возвращает объект, представляющий модуль, который вы передаете в него, и вы можете захватить этот объект в переменной. Это фактически создает пространство имен для функциональности любого требуемого модуля. Для создания HTTP-сервера Node предоставляет http-библиотеку. Итак, давайте продолжим и потребуем, чтобы теперь и назначили возвращаемый объект переменной http.

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

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

Всякий раз, когда выполняется HTTP-запрос, вызывается функция слушателя, а объекты, представляющие HTTP-запрос и ответ, будут передаются в функцию. Затем мы можем использовать объект ответа внутри нашей функции прослушивателя, чтобы отправить ответ обратно в браузер. Для этого сначала нужно написать соответствующие заголовки HTTP, поэтому давайте назовем функцию writeHead в нашем объекте ответа.

Функция writeHead принимает пару аргументов. Первый представляет собой целочисленное значение, представляющее код состояния запроса, который для нас будет 200, другими словами, ОК. Второе значение - это объект, содержащий все заголовки ответов, которые мы хотели бы установить. В этом примере мы просто настроим Content-type на «text plain», чтобы отправить обычный текст.

Как только мы установим заголовки, мы можем отправить данные. Для этого вы вызовете функцию записи и передадите данные, которые вы хотите отправить. Здесь давайте назовем функцию записи в нашем объекте ответа и передадим в строке «Hello World».

Чтобы действительно отправить ответ, нам нужно сообщить серверу, что мы закончили писать текст нашего ответа; мы можем сделать это, вызвав response.end. Конечная функция также позволяет нам передавать данные, поэтому мы можем сократить наш код сервера, избавившись от вызова функции записи, которую мы сделали ранее, и вместо этого передаем в строку «Hello World» конечную функцию, вот так.

Теперь, когда мы создали наш сервер, нам нужно настроить его для прослушивания новых запросов. Это достаточно легко сделать: вызвать функцию прослушивания на нашем сервере и передать номер порта для его прослушивания; в этом случае я буду использовать порт 8000. Функция прослушивания также принимает необязательный второй параметр, который является URL-адресом хоста, но поскольку мы просто запускаем это локально, мы можем смело пропустить этот параметр на данный момент.

Наконец, давайте напечатаем сообщение, чтобы сообщить нам, что наш сервер запущен, и на каком порту он прослушивает новые запросы. Вы можете сделать это, вызвав console.log, как и в браузере, и передав строку «Listening on http: 127.0.0.1:8000». Там мы идем, теперь давайте запустим наше приложение, вызвав узел и передав ему имя файла, который мы хотим выполнить.


REPL

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

REPL, для тех, кто не знаком с аббревиатурой, означает Read-Eval-Print-Loop, который представляет собой не что иное, как простую программу, которая принимает команды, оценивает их и печатает их результаты.

Это, по сути, интерактивное приглашение, которое позволяет делать практически все, что вы можете делать с обычным узлом, но без всех накладных расходов на создание отдельного файла, и это отлично подходит для экспериментов, поэтому давайте немного поиграем с REPL и узнайте немного больше об узле.

Сначала нам нужно остановить наше серверное приложение, нажав Ctrl-C. Затем запустите узел снова, но на этот раз без имени файла. Запуск узла без каких-либо аргументов вызовет REPL, как мы увидим здесь в результате изменения приглашения. REPL очень прост: в основном вы можете написать код JavaScript и посмотреть оценку этого кода. Несмотря на свою простоту, REPL действительно имеет несколько команд, которые могут пригодиться, и вы можете взглянуть на каждый из них, вызвав команду.help в приглашении. Здесь (см. Screencast) мы видим список из четырех команд, первой из которых является команда.break. Если вы пишете какой-то код, который охватывает несколько строк, и вы обнаружите, что совершили какую-то ошибку, и вам нужно пробиться по какой-либо причине, для этого может быть использована команда.break. Давайте попробуем это сейчас...

Я собираюсь создать здесь функцию, и я просто позвоню ей и откройте тело функции, а затем нажмите enter. Обратите внимание, что на следующей строке вместо того, чтобы видеть типичное большее, чем символ, теперь мы видим набор из трех точек или многоточия. Это способ Node указывать нам, что мы еще не закончили команду в предыдущей строке и что Node все еще ожидает от нас большего, прежде чем он оценит код, который мы ввели. Итак, давайте продолжим и добавим строку кода: сделаем console.log, и мы напечатаем имя функции. Давайте теперь нажмем enter и снова заметим, что символ многоточия отображается еще раз. Узел все еще ожидает, что мы закончим функцию в какой-то момент. Теперь давайте предположим, что я допустил ошибку, и я просто хочу вернуться к обычной подсказке. Если, я продолжаю нажимать enter, Node продолжает отображать символ многоточия. Но, если я вызову команду.break, Node выломит нас из текущей команды и вернет нас в обычное приглашение.

Затем мы получаем команду.clear. Это очистит наш нынешний контекст. Поэтому, если вы загромождали среду с созданием нескольких переменных и функций, и вам нужен чистый сланец, просто запустите команду.clear и Voila, все волшебное исчезнет.

.exit и.help

Наконец, есть команды.exit и.help. Команда.help довольно очевидна, так как это команда, которую мы использовали, чтобы увидеть список команд в первую очередь. Команда.exit одинаково очевидна: вы просто просто вызываете ее, чтобы выйти из REPL, например.

Таким образом, это в значительной степени охватывает все функции, которые REPL предоставляет вне оценки введенного вами кода. Но прежде чем мы полностью покинем REPL, я хотел бы воспользоваться этой возможностью, чтобы обсудить некоторые различия и сходства между JavaScript в браузере и вкусом JavaScript в JavaScript. Итак, давайте снова запускаем узел и возвращаемся обратно в REPL.

Первое различие между клиентским JavaScript и узлом заключается в том, что в браузере любая функция или переменная, созданная вне функции или объекта, привязана к глобальной области и доступна везде. В узле, однако, это неверно. Каждый файл и даже REPL имеют собственную область уровня модуля, к которой относятся все глобальные объявления. Мы увидим, что это будет использоваться позже в серии, когда мы обсудим модули и создадим несколько наших собственных. Но пока вы можете увидеть фактический объект модуля для REPL, набрав модуль в командной строке. Обратите внимание, что является подсказкой атрибута, скрытого на несколько уровней в нашем модульном объекте? Это управляет подсказкой, которую мы видим, когда в REPL. Давайте просто изменим это на что-то немного другое и посмотрим, что произойдет. Теперь у нас есть новая подсказка.

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

В узле нет браузера и, следовательно, нет такой вещи, как оконный объект. Однако у узла есть аналог, который перехватывает вас в рабочую среду, которая является объектом процесса, которую мы можем видеть, просто набрав процесс в REPL. Здесь вы найдете несколько полезных функций и информации, таких как список переменных окружения.

Одно сходство, которое важно здесь упомянуть, это функция setTimeout. Если вы знакомы с клиентским JavaScript, вы не сомневаетесь, что эта функция используется некоторое время или два. Это в основном позволит вам настроить функцию, которая будет вызываться позднее. Давайте продолжим и попробуем это сейчас.

> function sayHello(seconds) {
...	console.log('Hello ');
...	  setTimeout(function() {
...     console.log('World');
...   }, seconds * 1000);
... }

Это создаст функцию, которая при вызове распечатывает строку «Hello», а затем через несколько секунд печатает строку «World». Давайте теперь выполним функцию, чтобы увидеть ее в действии.

> sayHello(2);

Здесь есть несколько важных идей. Во-первых, Ryan Dahl, создатель Node, сделал все возможное, чтобы сделать среду настолько знакомой, насколько это возможно, любому, у кого есть клиентский интерфейс JavaScript. Таким образом, использование имен, таких как setTimeout и setInterval, а не спать и повторять, например, было сознательным решением сделать окружение на стороне сервера, где бы оно ни было, в среде браузера.

Вторая концепция, которую я хочу, чтобы вы знали, действительно важна. Обратите внимание, что, когда мы вызываем sayHello, сразу после печати первой строки, управление немедленно возвращается к REPL. В промежутке времени, когда печатается первая строка и выполняется функция обратного вызова, вы можете продолжать делать все, что захотите, в приглашении REPL. Это связано с основанием событий на основе узла. В узле почти невозможно вызвать любую функцию, которая блокируется по любой причине, и это справедливо для функции setTimeout. Давайте снова назовем нашу функцию sayHello, однако на этот раз давайте пройдем немного более длинный интервал времени, чтобы дать нам достаточно времени, чтобы немного поиграть и доказать свою точку зрения. Я считаю, что 10 секунд должны сделать трюк.

Там мы видим первую строку. Пойдемте вперед и запустите собственный код, как насчет 2 + 2. Отлично, мы видим, что ответ 4 и... есть вторая строка, которую печатают сейчас.


Заключение

Итак, это приближает нас к концу первого эпизода в этой серии. Надеюсь, это было довольно информативное введение в Node для вас, и я надеюсь, что я сделал достаточно приличную работу, объясняя, почему это так интересно, что он может предложить, и насколько весело и просто использовать. В следующем эпизоде ​​мы фактически начнем писать код для нашего движка блога; поэтому я надеюсь, что вы все присоединитесь ко мне снова, когда все будет в порядке. Тогда увидимся!