Что такое node js server side javascript
Что такое Node.js и где он пригодится
Рассказываем, зачем нужен Node.js и почему его стоит выучить прямо сейчас.
Что такое Node.js?
Node.js (или просто Node) — это серверная платформа для работы с JavaScript через движок V8. JavaScript выполняет действие на стороне клиента, а Node — на сервере. С помощью Node можно писать полноценные приложения. Node умеет работать с внешними библиотеками, вызывать команды из кода на JavaScript и выполнять роль веб-сервера.
В чём преимущество Node?
C Node проще масштабироваться. При одновременном подключении к серверу тысяч пользователей Node работает асинхронно, то есть ставит приоритеты и распределяет ресурсы грамотнее. Java же, например, выделяет на каждое подключение отдельный поток.
Откуда Node вообще взялся?
Node появился в 2009 году благодаря Райану Далу. До этого в серверах царил подход «один поток на каждое соединение», а Дал придумал использовать систему, которая ориентирована на события. То есть реагирует на действие или бездействие и выделяет под это ресурс. Главная цель Node — построение масштабируемых сетевых серверов.
Кто-то из крупных компаний использует Node?
Конечно, вот неполный список:
eBay постепенно переходит на Node, как и веб-версия PayPal. В LinkedIn ещё в 2012 году переехали с Ruby On Rails на Node и сразу ощутили преимущества этой платформы: 27 серверов показали 20-кратное увеличение скорости работы.
Что я могу написать на Node?
Полноценную программу для веба, Linux, OS X и Windows.
А если подробнее?
Не вопрос. Node удобен для создания API — уже существуют удобные библиотеки вроде Loopback.
На этом языке можно писать кроссплатформенные приложения — в связке мобильный + десктоп Node помогает достигать синхронности. Например, когда вы пишете сообщение с телефона, оно сразу же появляется и на ноутбуке, и в вебе.
А что-нибудь модное Node умеет?
Конечно. Node — это родной дом всего «интернета вещей» (Internet of Things, IoT). Термостаты, фитнес-трекеры — всё это можно запрограммировать через Node.
Node случайно не теряет популярность?
Совсем наоборот. Вот график интереса к Node с 2009 года в поиске Google:
Изучаем серверное программирование на JavaScript с Node.js
Russian (Pусский) translation by Anton L (you can also view the original English article)
Что такое Node.js?
Чаще всего JavaScript выполняется исключительно на стороне клиента, веб-браузера, но с недавних пор разработчики заинтересовались использование его на сервере, во многом благодаря проекту CommonJS. Из других заметных серверных JavaScript сред стоить отметить Jaxer и Narwhal. Однако Node.js отличается от подобных решений, так как в своей основе он работает следуея концепции событий, нежели потоков. Веб-сервер Apache к примеру, который обрабатывает PHP и другие CGI скрипты, основан на потоках, он создает отдельный поток для каждого запроса. Конечно этот подход работает для большинства приложений, однако модель основанная на потоках не подходит для приложений с продолжительным подключение в реальном времени, на подобии приложений как Friendfeed и Google Wave.
Шаг 1 установка
Node.js работает на Unix подобных системах, к примеру Mac OS X, Linux b FreeBSD. К сожалению Windows не поддерживается на данный момент времени, так что если вы пользователь Windows, можно воспользоваться установленной на Virtualbox Ubuntu. Чтобы это сделать, ознакомтесь со следующим туториалом. Вы должны воспользоваться терминалом для установки и запуска Node.js.
Много сообщений будет показано в терминале во время установки и компиляции Node.js.
Шаг 2 Hello World!
Любое знакомство с новой технологией начинается с туториала «Hello World!», мы создадим простой HTTP сервер, который будет отправлять данное сообщение. Однако для начала, вы должны понять систему модулей Node.js. В Node функционал инкапсулирован в модули и для того, чтобы он работал нам предварительно следует загрузить интересующий нас модуль. Существует множество модулей, со списком можно ознакомиться в Node.js документации. Загрузить модуль можно с помощью функции require :
Запуск этих двух строчек кода также прост, как запуск команды node с именем javascript файла в качестве аргумента.
Этот пример выведет «Hello World!» в терминал, после того, как будет запущен.
Для создания HTTP сервера, нам нужно будет вызвать require для http модуля.
Шаг 3 простой статичный файловый сервер
Хорошо, мы создали HTTP сервер, но кроме «Hello World» ничего не посылается, не важно какой адрес мы введём. Любой HTTP должен быть способен посылать статичные файлы, такие как HTML, изображение и другие файлы. Код ниже делает следующее:
Шаг 4 стриминг твитов в реальном времени
Наконец мы должны создать HTTP сервер для обработки запросов.
Следующие шаги
Надеюсь вам понравился данный туториал. Если у вас есть какие-либо комментарии, можно их оставить здесь, либо отправить сообщение на Twitter. Всего доброго!
Руководство для начинающих по серверной веб-разработке с Node.js
Большую часть своей веб-карьеры я работал исключительно на стороне клиента. Проектирование адаптивных макетов, создание визуализаций из больших объемов данных, создание инструментальных панелей приложений и т. Д. Но мне никогда не приходилось иметь дело с маршрутизацией или HTTP-запросами напрямую. До не давнего времени.
Этот пост представляет собой описание того, как я узнал больше о веб-разработке на стороне сервера с помощью Node.js, и краткое сравнение написания простого HTTP-сервера с использованием 3 разных сред, Express, Koa.js и Hapi.js.
Примечание: если вы опытный разработчик Node.js, вы, вероятно, подумаете о том, что это все элементарно/просто. ¯\_(ツ)_/¯.
Некоторые основы сети
Когда я начал работать в веб-индустрии пару лет назад, я наткнулся на курс по компьютерным сетям профессора Дэвида Ветерала на Coursera. К сожалению, он больше не доступен, но лекции по-прежнему доступны на веб-сайте Pearson.
Мне очень понравился этот курс, потому что он объяснял, что происходило под капотом, в понятной форме, поэтому, если вы можете взять в руки учебник «Компьютерные сети», прочитайте все подробности о чудесах сети.
Здесь, однако, я собираюсь лишь кратко рассказать о контексте. HTTP (Hypertext Transfer Protocol) — это протокол связи, используемый в компьютерных сетях. В Интернете их много, таких как SMTP (простой протокол передачи почты), FTP (протокол передачи файлов), POP3 (протокол почтового отделения 3) и так далее.
Эти протоколы позволяют устройствам с совершенно разным аппаратным / программным обеспечением связываться друг с другом, поскольку они предоставляют четко определенные форматы сообщений, правила, синтаксис и семантику и т.д. Это означает, что, пока устройство поддерживает определенный протокол, оно может связываться с любым другим устройством. в сети.
От TCP / IP против OSI: в чем разница между двумя моделями?
Операционные системы обычно поставляются с поддержкой сетевых протоколов, таких как HTTP, из коробки, что объясняет, почему нам не нужно явно устанавливать какое-либо дополнительное программное обеспечение для доступа в Интернет. Большинство сетевых протоколов поддерживают открытое соединение между двумя устройствами, что позволяет им передавать данные туда и обратно.
HTTP, на котором работает сеть, отличается. Он известен как протокол без установления соединения, потому что он основан на режиме работы запрос / ответ. Веб-браузеры отправляют на сервер запросы на изображения, шрифты, контент и т.д., но после выполнения запроса соединение между браузером и сервером разрывается.
Servers and Clients
Термин сервер может слегка сбивать с толку людей, впервые знакомых с отраслью, поскольку он может относиться как к аппаратному обеспечению (физические компьютеры, на которых размещены все файлы и программное обеспечение, требуемое веб-сайтами), так и к программному обеспечению (программе, которая позволяет пользователям получать доступ к этим файлам в Интернете).
Сегодня мы поговорим о программной стороне вещей. Но сначала несколько определений. URL обозначает Universal Resource Locator и состоит из 3 частей: протокола, сервера и запрашиваемого файла.
Структура URL адреса
Протокол HTTP определяет несколько методов, которые браузер может использовать, чтобы попросить сервер выполнить кучу различных действий, наиболее распространенными из которых являются GET и POST. Когда пользователь щелкает ссылку или вводит URL-адрес в адресную строку, браузер отправляет GET-запрос на сервер для получения ресурса, определенного в URL-адресе.
Сервер должен знать, как обрабатывать этот HTTP-запрос, чтобы получить правильный файл, а затем отправить его обратно браузеру, который его запросил. Наиболее популярное программное обеспечение веб-сервера, которое обрабатывает это Apache и NGINX.
Веб-серверы обрабатывают входящие запросы и отвечают на них соответственно
Оба представляют собой полнофункциональные пакеты программного обеспечения с открытым исходным кодом, которые включают в себя такие функции, как схемы аутентификации, перезапись URL-адресов, ведение журнала и проксирование, и это лишь некоторые из них. Apache и NGINX написаны на C. Технически, вы можете написать веб-сервер на любом языке. Python, golang.org/pkg/net/http, Ruby, этот список может продолжаться довольно долго. Просто некоторые языки лучше выполняют определенные вещи, чем другие.
Создание HTTP сервера с Node.js
Node.js — это среда выполнения Javascript, построенная на движке Chrome V8 Javascript. Он поставляется с модулем http, который предоставляет набор функций и классов для построения HTTP-сервера.
Для этого базового HTTP-сервера мы также будем использовать файловую систему, путь и URL-адрес, которые являются собственными модулями Node.js.
Начните с импорта необходимых модулей.
Мы также создадим словарь типов MIME, чтобы мы могли назначить соответствующий тип MIME запрашиваемому ресурсу на основе его расширения. Полный список типов MIME можно найти в Internet Assigned Numbers Authority (интернет-центре назначенных номеров).
Мы передадим функцию-обработчик запроса в createServer() с объектами запроса и ответа. Эта функция вызывается один раз каждый раз, когда к серверу поступает HTTP-запрос.
Объект request является экземпляром IncomingMessage и позволяет нам получать доступ ко всей информации о запросе, такой как статус ответа, заголовки и данные.
Объект response является экземпляром ServerResponse, который является записываемым потоком и предоставляет множество методов для отправки данных обратно клиенту.
В обработчике запросов мы хотим сделать следующее:
Весь код размещен на Glitch, и вы можете сделать ремикс на проект, если хотите.
Создание HTTP-сервера с фреймворками Node.js
Фреймворки Node.js, такие как Express, Koa.js и Hapi.js, поставляются с различными полезными функциями промежуточного программного обеспечения, в дополнение к множеству других удобных функций, которые избавляют разработчиков от необходимости писать самим.
Лично я чувствую, что лучше сначала изучать основы без фреймворков, просто для понимания того, что происходит под капотом, а затем после этого сходить с ума с любым фреймворком, который вам нравится.
В Express имеется собственный встроенный плагин для обслуживания статических файлов, поэтому код, необходимый для выполнения тех же действий, что и в собственном Node.js, значительно короче.
У каждой из этих платформ есть свои плюсы и минусы, и они будут более очевидными для более крупных приложений, а не просто для обслуживания одной HTML-страницы. Выбор структуры будет сильно зависеть от реальных требований проекта, над которым вы работаете.
Платформа Node.js: руководство по эксплуатации для начинающих
Приглашаем вас на небольшую обзорную экскурсию. Место действия – платформа Node.js. Польза и новые впечатления гарантированы.
Введение в Node.js
Node.js – это среда для серверной разработки на языке JavaScript. Она кроссплатформенная и имеет открытый исходный код. Используется большей частью для написания веб-серверов, но имеет и массу других возможностей.
Появившись в далеком 2009 году, когда JavaScript уже начал считаться серьезным языком, Node завоевала огромную популярность и фактически стала лидером в сфере веб-разработки. Если звезды GitHub что-то значат, то судите сами – их больше 46 тысяч. Почему такой успех? Все просто.
Она простая
Платформа Node.js действительно очень проста для освоения, но все же сначала следует разобраться в самом JavaScript, особенно в его асинхронных концепциях.
Она асинхронная
JavaScript работает в одном потоке, используя события и функции обратного вызова для его разгрузки. Это было классно на фронтенде, это по-прежнему классно на сервере!
Практически все объекты в Node.js наследуют от класса EventEmitter, то есть способны работать с событиями. Подробнее об этом вы можете прочитать здесь.
Если вы плохо понимаете саму концепцию асинхронности, загляните сюда.
Огромное количество модулей и библиотек
Пакетный менеджер npm обеспечивает стремительное развитие экосистемы Node.js. Сейчас в нем более 500 тысяч опенсорсных пакетов, и каждый день появляются новые. Кроме того, у Node.js шикарная стандартная библиотека.
Старый-добрый JavaScript
Тот же самый, который уже используют миллионы разработчиков на фронтенде. Теперь они могут смело переходить на server-side, не изучая принципиально другой инструмент.
Отличия, конечно, есть. Прежде всего, в Node.js нет DOM, cookie и прочих браузерных API. Зато есть множество собственных полезных методов и полный контроль над средой выполнения кода. Здесь можно без страха и Babel использовать самые современные возможности языка, не озираясь на ограничения.
Отличается также система импорта. Браузеры начинают внедрять модули ES6, а платформа Node.js использует CommonJS с его require.
Движок V8
Это опенсорсный проект, написанный на C++, который активно развивается и совершенствуется усилиями тысяч разработчиков.
Хотя JavaScript считается интерпретируемым языком, на деле процесс его обработки не так уж прост. Это уже давно взрослый серьезный язык, который может работать на протяжении нескольких часов подряд, поэтому имеет смысл создавать готовый откомпилированный код. Современные движки сочетают интерпретацию и JIT-компиляцию (just in time), что делает их очень быстрыми.
Платформа Node.js под капотом
Не углубляясь в тонкости функционирования платформы, взглянем на ее основные части:
Установка
Платформа Node.js может быть установлена несколькими способами:
Также есть несколько вариантов развертывания приложений:
Обычно с помощью Node.js мы запускаем на выполнение файлы скриптов, но ее также можно использовать в REPL-режиме.
Установка и обновление пакетов
Пакетный менеджер Node.js берет на себя всю работу по загрузке и установке внешних зависимостей проекта. Все файлы при этом загружаются в папку node_modules.
Команду можно запускать с различными опциями:
Также можно указать конкретную версию:
package.json
Файл package.json – ключевой элемент Node.js-приложений. Это своего рода манифест проекта, включающий множество важных данных о нем:
Программирование на Node.js
Hello world
В качестве традиционного helloworld-приложения послужит простой веб-сервер.
Модуль http обеспечивает работу с сетью.
Сохраните этот файл под именем server.js и вызовите его:
После запуска сервера отработает коллбэк метода listen и в консоли появится сообщение.
Если вы отправите серверу запрос (открыв в браузере страницу http://127.0.0.1:3000), сгенерируется событие request и сработает коллбэк, установленный при создании. Функция получит объект запроса с заголовками и прочими данными и объект ответа, который будет возвращен клиенту после установки нужных параметров.
Импорт и экспорт
Платформа Node.js позволяет разбивать функциональность приложения на модули и подключать их при необходимости. Для импорта модуля используется конструкция require:
Здесь адрес указывается относительно текущей директории.
Все, что находится в файле модуля, по умолчанию скрыто для внешнего кода, поэтому нужно специально указать, какая функциональность будет доступна с помощью module.exports :
Импорт будет выглядеть так:
Переменные окружения и аргументы командной строки
Ввод и вывод данных
С основным потоком вывода работает объект console, сходный с браузерной консолью.
Другие полезные методы объекта console :
Доступ к потоку ввода process.stdin дает модуль readline.
После того как пользователь введет свое имя, программа отправит ему приветствие и завершится.
Продвинутую работу с пользовательским вводом обеспечивает пакет Inquirer.js.
Выход из программы
HTTP-запросы и веб-сокеты
За обычные запросы HTTP отвечает уже знакомый нам из helloworld-примера модуль http, который умеет не только серверы создавать. У него есть масса полезных свойств и методов, которые можно найти в документации.
Альтернативной HTTP являются веб-сокеты, которые реализованы в Node-библиотеке ws.
Живой пример можно посмотреть на Glitch.
Работа с файлами
За взаимодействие с файловой системой отвечает встроенный модуль fs. Он предоставляет огромное количество методов для получения информации, чтения, записи и перезаписи и множества других операций. Полный список доступных действий вы можете найти в официальной документации. Практически все методы асинхронные, но имеют синхронный аналог.
При работе с файловой системой приходится оперировать путями к файлам и папкам. Этим заведует модуль path.
Модуль os
Платформа Node.js может взаимодействовать с операционной системой компьютера – это сфера ответственности модуля os.
Потоки
Потоки в Node.js – это эффективный способ обработки больших объемов данных «по частям» без сохранения в памяти. Основу для всех потоковых API обеспечивает модуль stream.
Потоки бывают нескольких видов:
Метод pipe позволяет соединять несколько потоков.
Пример использования потока для чтения данных из файла:
Вместо того, чтобы ждать, пока файл будет полностью прочитан, мы начинаем его потоковую передачу HTTP-клиенту.
Чем на самом деле является Node.js?
Node.js это — среда выполнения JavaScript. Что же это значит, и как работает?
Окружение Node.js включает все, что вам нужно для выполнения программы, написанной на JavaScript.
Раньше вы могли запустить JavaScript только в браузере, но однажды разработчики расширили его, и теперь вы можете запускать JS на своем компьютере в качестве отдельного приложения. Так появился Node.js.
Теперь вы можете сделать гораздо больше с JavaScript, чем просто интерактивные веб-сайты.
Теперь у JavaScript есть возможность делать то, что могут делать другие скриптовые языки программирования, такие как Python.
Оба — браузерный JavaScript и Node.js запускаются в среде выполнения V8. Этот движок использует ваш JS код, и преобразует его в более быстрый машинный код. Машинный – низкоуровневый код, который компьютер может запускать без необходимости сначала его интерпретировать.
Почему Node.js?
— Node.js — среда выполнения JavaScript, основанная на JavaScript движке V8 из Chrome.
— Node.js использует управляемую событиями, неблокирующую модель ввода-вывода, которая делает ее легкой и эффективной.
— Пакетная экосистема Node.js, npm, является самой большой экосистемой библиотек с открытым исходным кодом в мире.
Мы уже обсуждали первую строку этого определения: «Node.js — среда выполнения JavaScript, основанная на JavaScript движке V8 из Chrome». Теперь давайте разбираться в двух других строках, так мы сможем понять, почему Node.js так популярен.
I/O означает ввод/вывод. Это может быть что угодно: от чтения/записи локальных файлов до HTTP-запроса в API. I/O занимает время и, следовательно, блокирует другие функции.
Рассмотрим сценарий, в котором мы запрашиваем user1 и user2 из бекенда, а затем печатаем их на экране / в консоли. Ответ на этот запрос требует времени, но оба запроса пользовательских данных могут выполняться независимо и в одно и то же время.
Блокирование ввода-вывода
В методе блокировки запрос данных user2 не запускается до тех пор, пока данные user1 не будут напечатаны на экране.
Если это был веб-сервер, нам нужно было бы начать новый поток для каждого нового пользователя. Но JavaScript однопоточен (но он имеет однопоточный цикл событий, о котором мы поговорим чуть позже). Таким образом, это сделает JavaScript не очень подходящим для многопоточных задач.
Неблокирующий ввод-вывод
С другой стороны, используя неблокирующий запрос, вы можете инициировать запрос данных для user2, не дожидаясь ответа на запрос user1. Вы можете инициировать оба запроса параллельно.
Неблокирующий ввод-вывод устраняет необходимость многопоточности, поскольку сервер может обрабатывать несколько запросов одновременно.
Цикл событий JavaScript
Если у вас есть 26 минут, посмотрите отличное видео-объяснение Node Event Loop:
Если нету, вот пошаговое объяснение того, как работает Event Loop в JavaScript:
1. Посылаете main() в стек вызовов.
2. Посылаете console.log() в стек вызовов. Он запускается сразу и появляется.
3. Посылаете setTimeout(2000) в стек. setTimeout(2000) это — Node API. Когда мы его вызываем, мы регистрируем пару событие-коллбек. Событие будет ждать 2000 миллисекунд, а потом вызовет коллбек.
4. После регистрации, setTimeout(2000) появляется в стеке вызовов.
5. Теперь второй setTimeout(0) регистрируется таким же образом. Теперь у нас есть два API-интерфейса Node, ожидающих выполнения.
6. После ожидания 0 секунд setTimeout(0) перемещается в очередь выполнения коллбеков (callback queue), и то же самое происходит с setTimeout(2000).
7. В очереди выполнения коллбеков функции ждут, когда стек вызовов будет пустым, потому что только одна функция может выполняться одновременно. Это обеспечивает event loop.
8. Вызывается последняя console.log(), а main() вызывается из стека вызовов.
9. Цикл событий видит, что стек вызовов пуст, а очередь обратного вызова — нет. Таким образом, он перемещает обратные вызовы (по порядку) в стек вызовов для выполнения.
Это библиотеки, построенные сообществом. Они решат большинство часто встречающихся проблем. npm (менеджер пакетов Node) содержит пакеты, которые вы можете использовать в своих приложениях, чтобы сделать вашу разработку более быстрой и эффективной.
Require
Require исполняет три функции:
Загружает модули, поставляемые в комплекте с Node.js, например из файловой системы или HTTP, из API Node.js.
Загружает сторонние библиотеки, такие как Express и Mongoose, которые вы устанавливаете из npm.
Позволяет создавать собственные файлы и делить проект на модули.
Require — это функция, и она принимает параметр «путь» и возвращает module.exports.
Node модули
Node модули это — многоразово используемые блоки кода, существование которых не случайно не влияет на другой код.
Вы можете написать свои собственные модули и использовать их в различных приложениях. Node.js имеет набор встроенных модулей, которые вы можете использовать без специальной установки.
V8 ускоряет JavaScript, используя C ++
V8 – движок с открытым исходным кодом, написанный на C ++.
V8 реализует сценарий ECMAScript, как указано в ECMA-262. ECMAScript был создан Ecma International для стандартизации JavaScript.
V8 может работать автономно или может быть встроен в любое приложение C ++. Благодаря этому, вы можете написать свой собственный код на C ++, и сделать его доступным для JavaScript.
События
События – это все, что произошло в нашем приложении, и на что мы можем ответить.
В Node есть два типа событий: