Главная страница
Навигация по странице:

  • Часть 1: общие сведения и начало работы Обзор Node.js

  • Асинхронность

  • Установка Node.js

  • Первое Node.js-приложение

  • Фреймворки и вспомогательные инструменты для Node.js

  • Краткая история Node.js

  • 2009 ● Появление Node.js ● Создание первого варианта ​npm​2010 ● Появление ​Express​● Появление ​Socket.io​2011

  • 2012 ● Быстрый рост популярности Node.js. 2013

  • 2016 ● Инцидент с пакетом ​left-pad​● Появление ​Yarn​● Выход Node.js 6. 2017

  • Протоколы http и WebSocket Часть 9 работа с файловой системой Часть 10 стандартные модули, потоки, базы данных, node env


    Скачать 1.79 Mb.
    НазваниеПротоколы http и WebSocket Часть 9 работа с файловой системой Часть 10 стандартные модули, потоки, базы данных, node env
    Дата03.03.2019
    Размер1.79 Mb.
    Формат файлаpdf
    Имя файлаee86eb4f-db9f-48d3-8094-c76e14414678.pdf
    ТипПротокол
    #69437
    страница1 из 9
      1   2   3   4   5   6   7   8   9

    Руководство



    по Node.js
    Перевод опубликован в ​
    блоге​
    компании RUVDS. ​
    Оригинал​
    статей.
    Читать онлайн (много полезных комментариев):
    Часть 1: ​
    Общие сведения и начало работы
    Часть 2: ​
    JavaScript, V8, некоторые приёмы разработки
    Часть 3: ​
    Хостинг, REPL, работа с консолью, модули
    Часть 4: ​
    npm, файлы package.json и package-lock.json
    Часть 5: ​
    npm и npx
    Часть 6: ​
    цикл событий, стек вызовов, таймеры
    Часть 7: ​
    асинхронное программирование
    Часть 8: ​
    протоколы HTTP и WebSocket
    Часть 9: ​
    работа с файловой системой
    Часть 10: ​
    стандартные модули, потоки, базы данных, NODE_ENV

    Оглавление
    Часть 1: общие сведения и начало работы
    Обзор Node.js
    Скорость
    Простота
    JavaScript
    Движок V8
    Асинхронность
    Библиотеки
    Установка Node.js
    Первое Node.js-приложение
    Фреймворки и вспомогательные инструменты для Node.js
    Краткая история Node.js
    2009 2010 2011 2012 2013 2014 2015 2016 2017 2018
    Часть 2: JavaScript, V8, некоторые приёмы разработки
    Какими JS-знаниями нужно обладать для Node.js-разработки?
    Различия между платформой Node.js и браузером
    V8 и другие JavaScript-движки
    Разработка JS-движков и стремление к производительности
    Интерпретация и компиляция
    Выход из Node.js-приложения
    Чтение переменных окружения из Node.js
    Часть 3: хостинг, REPL, работа с консолью, модули
    Хостинг для Node.js-приложений
    Самый простой вариант хостинга: локальный туннель
    Среды для развёртывания Node.js-проектов, не требующие настройки
    Glitch
    Codepen
    Бессерверные среды
    PAAS-решения
    Zeit Now
    Nanobox
    Heroku
    Microsoft Azure
    Платформа Google Cloud
    VPS-хостинг

    Обычный сервер
    Использование Node.js в режиме REPL
    Автозавершение команд с помощью клавиши Tab
    Исследование объектов JavaScript
    Исследование глобальных объектов
    Специальная переменная _
    Команды, начинающиеся с точки
    Работа с аргументами командной строки в Node.js-скриптах
    Вывод данных в консоль с использованием модуля console
    Очистка консоли
    Подсчёт элементов
    Вывод в консоль результатов трассировки стека
    Измерение времени, затраченного на выполнение некоего действия
    Работа с stdout и stderr
    Использование цвета при выводе данных в консоль
    Создание индикатора выполнения операции
    Приём пользовательского ввода из командной строки
    Система модулей Node.js, использование команды exports
    Часть 4: npm, файлы package.json и package-lock.json
    Основы npm
    Загрузка пакетов
    Установка всех зависимостей проекта
    Установка отдельного пакета
    Обновление пакетов
    Загрузка пакетов определённых версий
    Запуск скриптов
    Куда npm устанавливает пакеты?
    Использование и выполнение пакетов, установленных с помощью npm
    Файл package.json
    Структура файла
    Свойства, используемые в package.json
    Свойство name
    Свойство author
    Свойство contributors
    Свойство bugs
    Свойство homepage
    Свойство version
    Свойство license
    Свойство keywords
    Свойство description
    Свойство repository
    Свойство main
    Свойство private
    Свойство scripts
    Свойство dependencies
    Свойство devDependencies
    Свойство engines

    Свойство browserlist
    Хранение в package.json настроек для различных программных инструментов
    О версиях пакетов и семантическом версионировании
    Файл package-lock.json
    Пример файла package-lock.json
    Часть 5: npm и npx
    Выяснение версий установленных npm-пакетов
    Установка старых версий npm-пакетов
    Обновление зависимостей проекта до их самых свежих версий
    Локальная или глобальная деинсталляция пакетов
    О выборе между глобальной и локальной установкой пакетов
    О зависимостях проектов
    Утилита npx
    Использование npx для упрощения запуска локальных команд
    Выполнение утилит без необходимости их установки
    Запуск JavaScript-кода с использованием различных версий Node.js
    Запуск произвольных фрагментов кода, доступных по некоему адресу
    Часть 6: цикл событий, стек вызовов, таймеры
    Цикл событий
    Блокировка цикла событий
    Стек вызовов
    Цикл событий и стек вызовов
    Постановка функции в очередь на выполнение
    Очередь событий
    Очередь заданий ES6 process.nextTick() setImmediate()
    Таймеры
    Функция setTimeout()
    Нулевая задержка
    Функция setInterval()
    Рекурсивная установка setTimeout()
    Часть 7: асинхронное программирование
    Асинхронность в языках программирования
    Асинхронность в JavaScript
    Коллбэки
    Обработка ошибок в коллбэках
    Проблема коллбэков
    Промисы и async/await
    Промисы
    Знакомство с промисами
    Как работают промисы
    Создание промисов
    Работа с промисами
    Объединение промисов в цепочки
    Обработка ошибок

    Каскадная обработка ошибок
    Promise.all()
    Promise.race()
    Об ошибке Uncaught TypeError, которая встречается при работе с промисами
    Конструкция async/await
    Как работает конструкция async/await
    О промисах и асинхронных функциях
    Сильные стороны async/await
    Использование последовательностей из асинхронных функций
    Упрощённая отладка
    Генерирование событий в Node.js
    Часть 8: протоколы HTTP и WebSocket
    Что происходит при выполнении HTTP-запросов?
    Протокол HTTP
    Фаза DNS-поиска
    Функция gethostbyname
    Установление TCP-соединения
    Отправка запроса
    Строка запроса
    Заголовок запроса
    Тело запроса
    Ответ
    Разбор HTML-кода
    О создании простого сервера средствами Node.js
    Выполнение HTTP-запросов средствами Node.js
    Выполнение GET-запросов
    Выполнение POST-запроса
    Выполнение PUT-запросов и DELETE-запросов
    Выполнение HTTP-запросов в Node.js с использованием библиотеки Axios
    Установка
    API Axios
    Запросы GET
    Использование параметров в GET-запросах
    Запросы POST
    Использование протокола WebSocket в Node.js
    Отличия от HTTP
    Защищённая версия протокола WebSocket
    Создание WebSocket-соединения
    Отправка данных на сервер
    Получение данных с сервера
    Реализация WebSocket-сервера в среде Node.js
    Часть 9: работа с файловой системой
    Работа с файловыми дескрипторами в Node.js
    Данные о файлах
    Пути к файлам в Node.js и модуль path
    Получение информации о пути к файлу

    Работа с путями к файлам
    Чтение файлов в Node.js
    Запись файлов в Node.js
    Присоединение данных к файлу
    Об использовании потоков
    Работа с директориями в Node.js
    Проверка существования папки
    Создание новой папки
    Чтение содержимого папки
    Переименование папки
    Удаление папки
    Модуль fs
    Модуль path path.basename() path.dirname() path.extname() path.isAbsolute() path.join() path.normalize() path.parse() path.relative() path.resolve()
    Часть 10: стандартные модули, потоки, базы данных, NODE_ENV
    Модуль Node.js os os.arch() os.cpus() os.endianness() os.freemem() os.homedir() os.hostname() os.loadavg() os.networkInterfaces() os.platform() os.release() os.tmpdir() os.totalmem() os.type() os.uptime()
    Модуль Node.js events emitter.addListener() emitter.emit() emitter.eventNames() emitter.getMaxListeners() emitter.listenerCount() emitter.listeners() emitter.off() emitter.on()
    emitter.once() emitter.prependListener() emitter.prependOnceListener() emitter.removeAllListeners() emitter.removeListener() emitter.setMaxListeners()
    Модуль Node.js http
    Свойства http.METHODS http.STATUS_CODES http.globalAgent
    Методы http.createServer() http.request() http.get()
    Классы http.Agent http.ClientRequest http.Server http.ServerResponse http.IncomingMessage
    Работа с потоками в Node.js
    О сильных сторонах использования потоков
    Пример работы с потоками
    Метод pipe()
    API Node.js, в которых используются потоки
    Разные типы потоков
    Создание потока для чтения
    Создание потока для записи
    Получение данных из потока для чтения
    Отправка данных в поток для записи
    Сообщение потоку для записи о том, что запись данных завершена
    Основы работы с MySQL в Node.js
    Установка пакета
    Инициализация подключения к базе данных
    Параметры соединения
    Выполнение запроса SELECT
    Выполнение запроса INSERT
    Закрытие соединения с базой данных
    О разнице между средой разработки и продакшн-средой
    Часть 1: общие сведения и начало работы
    Обзор Node.js
    Node.js — это опенсорсная кроссплатформенная среда выполнения для JavaScript, которая работает на серверах. С момента выпуска этой платформы в 2009 году она стала чрезвычайно популярной и в наши дни играет весьма важную роль в области веб-разработки. Если считать показателем
    популярности число звёзд, которые собрал некий проект на GitHub, то ​
    Node.js​
    , у которого более 50000 звёзд, это очень и очень популярный проект.
    Платформа Node.js построена на базе JavaScript движка V8 от Google, который используется в браузере Google Chrome. Данная платформа, в основном, используется для создания веб-серверов, однако сфера её применения этим не ограничивается.
    Рассмотрим основные особенности Node.js.
    Скорость
    Одной из основных привлекательных особенностей Node.js является скорость. JavaScript-код, выполняемый в среде Node.js, может быть в два раза быстрее, чем код, написанный на компилируемых языках, вроде C или Java, и на порядки быстрее интерпретируемых языков наподобие Python или Ruby.
    Причиной подобного является неблокирующая архитектура платформы, а конкретные результаты зависят от используемых тестов производительности, но, в целом, Node.js — это очень быстрая платформа.
    Простота
    Платформа Node.js проста в освоении и использовании. На самом деле, она прямо-таки очень проста, особенно это заметно в сравнении с некоторыми другими серверными платформами.
    JavaScript
    В среде Node.js выполняется код, написанный на JavaScript. Это означает, что миллионы фронтенд-разработчиков, которые уже пользуются JavaScript в браузере, могут писать и серверный, и клиентский код на одном и том же языке программирования без необходимости изучать совершенно новый инструмент для перехода к серверной разработке.
    В браузере и на сервере используются одинаковые концепции языка. Кроме того, в Node.js можно оперативно переходить на использование новых стандартов ECMAScript по мере их реализации на платформе. Для этого не нужно ждать до тех пор, пока пользователи обновят браузеры, так как Node.js
    — это серверная среда, которую полностью контролирует разработчик. В результате новые возможности языка оказываются доступными при установке поддерживающей их версии Node.js.
    Движок V8
    В основе Node.js, помимо других решений, лежит опенсорсный JavaScript-движок V8 от Google, применяемый в браузере Google Chrome и в других браузерах. Это означает, что Node.js пользуется наработками тысяч инженеров, которые сделали среду выполнения JavaScript Chrome невероятно быстрой и продолжают работать в направлении совершенствования V8.
    Асинхронность
    В традиционных языках программирования (C, Java, Python, PHP) все инструкции, по умолчанию, являются блокирующими, если только разработчик явным образом не позаботится об асинхронном выполнении кода. В результате если, например, в такой среде, произвести сетевой запрос для загрузки некоего JSON-кода, выполнение потока, из которого сделан запрос, будет приостановлено до тех пор, пока не завершится получение и обработка ответа.
    JavaScript значительно упрощает написание асинхронного и неблокирующего кода с использованием единственного потока, функций обратного вызова (коллбэков) и подхода к разработке, основанной на событиях. Каждый раз, когда нам нужно выполнить тяжёлую операцию, мы передаём соответствующему механизму коллбэк, который будет вызван сразу после завершения этой операции.
    В результате, для того чтобы программа продолжила работу, ждать результатов выполнения подобных операций не нужно.
    Подобный механизм возник в браузерах. Мы не можем позволить себе ждать, скажем, окончания выполнения AJAX-запроса, не имея при этом возможности реагировать на действия пользователя,
    например, на щелчки по кнопкам. Для того чтобы пользователям было удобно работать с веб-страницами, всё, и загрузка данных из сети, и обработка нажатия на кнопки, должно происходить одновременно, в режиме реального времени.
    Если вы создавали когда-нибудь обработчик события нажатия на кнопку, то вы уже пользовались методиками асинхронного программирования.
    Асинхронные механизмы позволяют единственному Node.js-серверу одновременно обрабатывать тысячи подключений, не нагружая при этом программиста задачами по управлению потоками и по организации параллельного выполнения кода. Подобные вещи часто являются источниками ошибок.
    Node.js предоставляет разработчику неблокирующие базовые механизмы ввода вывода, и, в целом, библиотеки, использующиеся в среде Node.js, написаны с использованием неблокирующих парадигм.
    Это делает блокирующее поведение кода скорее исключением, чем нормой.
    Когда Node.js нужно выполнить операцию ввода-вывода, вроде загрузки данных из сети, доступа к базе данных или к файловой системе, вместо того, чтобы заблокировать ожиданием результатов такой операции главный поток, Node.js инициирует её выполнение и продолжает заниматься другими делами до тех пор, пока результаты выполнения этой операции не будут получены.
    Библиотеки
    Благодаря простоте и удобству работы с менеджером пакетов для Node.js, который называется ​
    npm​
    , экосистема Node.js прямо-таки процветает. Сейчас в ​
    реестре npm​
    имеется более полумиллиона опенсорсных пакетов, которые может свободно использовать любой Node.js-разработчик.
    Рассмотрев некоторые основные особенности платформы Node.js, опробуем её в действии. Начнём с установки.
    Установка Node.js
    Node.js можно устанавливать различными способами, которые мы сейчас рассмотрим.
    Так, официальные установочные пакеты для всех основных платформ можно найти ​
    здесь​
    Существует ещё один весьма удобный способ установки Node.js, который заключается в использовании менеджера пакетов, имеющегося в операционной системе. Например, менеджер пакетов macOS, который является фактическим стандартом в этой области, называется ​
    Homebrew​
    Если он в вашей системе есть, вы можете установить Node.js, выполнив эту команду в командной строке: brew install node
    Список менеджеров пакетов для других операционных систем, в том числе — для Linux и Windows, можно найти ​
    здесь​
    Популярным менеджером версий Node.js является ​
    nvm​
    . Это средство позволяет удобно переключаться между различными версиями Node.js, с его помощью можно, например, установить и попробовать новую версию Node.js, после чего, при необходимости, вернуться на старую. Nvm пригодится и в ситуации, когда нужно испытать какой-нибудь код на старой версии Node.js.
    Я посоветовал бы начинающим пользоваться официальными установщиками Node.js. Пользователям macOS я порекомендовал бы устанавливать Node.js с помощью Homebrew.
    Теперь, после того, как вы установили Node.js, пришло время написать «Hello World».

    Первое Node.js-приложение
    Самым распространённым примером первого приложения для Node.js можно назвать простой веб-сервер. Вот его код: const http = require('http') const hostname = '127.0.0.1' const port = 3000 const server = http.createServer((req, res) => { res.statusCode = 200 res.setHeader('Content-Type', 'text/plain') res.end('Hello World\n')
    }) server.listen(port, hostname, () => { console.log(`Server running at http://${hostname}:${port}/`)
    })
    Для того чтобы запустить этот код, сохраните его в файле ​server.js​ и выполните в терминале такую команду: node server.js
    Для проверки сервера откройте какой-нибудь браузер и введите в адресной строке http://127.0.0.1:3000​, то есть — тот адрес сервера, который будет выведен в консоли после его успешного запуска. Если всё работает как надо — на странице будет выведено «Hello World».
    Разберём этот пример.
    Для начала, обратите внимание на то, что код содержит команду подключения модуля ​
    http​
    Платформа Node.js является обладателем замечательного ​
    стандартного набора модулей​
    , в который входят отлично проработанные механизмы для работы с сетью.
    Метод ​createServer()​ объекта ​http​ создаёт новый HTTP-сервер и возвращает его.
    Сервер настроен на прослушивание определённого порта на заданном хосте. Когда сервер будет готов, вызывается соответствующий коллбэк, сообщающий нам о том, что сервер работает.
    Когда сервер получает запрос, вызывается событие ​request​, предоставляющее два объекта. Первый
    — это запрос (​req​, объект ​
    http.IncomingMessage​
    ), второй — ответ (​res​, объект ​
    http.ServerResponse​
    ).
    Они представляют собой важнейшие механизмы обработки HTTP-запросов.
    Первый предоставляет в наше распоряжение сведения о запросе. В нашем простом примере этими данными мы не пользуемся, но, при необходимости, с помощью объекта ​req​ можно получить доступ к заголовкам запроса и к переданным в нём данным.
    Второй нужен для формирования и отправки ответа на запрос.

    В данном случае ответ на запрос мы формируем следующим образом. Сначала устанавливаем свойство ​statusCode​ в значение ​200​, что указывает на успешное выполнение операции: res.statusCode = 200
    Далее, мы устанавливаем заголовок ​Content-Type​: res.setHeader('Content-Type', 'text/plain')
    После этого мы завершаем подготовку ответа, добавляя его содержимое в качестве аргумента метода end()​: res.end('Hello World\n')
    Мы уже говорили о том, что вокруг платформы Node.js сформировалась мощная экосистема. Обсудим теперь некоторые популярные фреймворки и вспомогательные инструменты для Node.js.
    Фреймворки и вспомогательные инструменты для Node.js
    Node.js — это низкоуровневая платформа. Для того чтобы упростить разработку для неё и облегчить жизнь программистам, было создано огромное количество библиотек. Некоторые из них со временем стали весьма популярными. Вот небольшой список библиотек, которые я считаю отлично сделанными и достойными изучения:

    Express​
    . Эта библиотека предоставляет разработчику предельно простой, но мощный инструмент для создания веб-серверов. Ключом к успеху Express стал минималистический подход и ориентация на базовые серверные механизмы без попытки навязать некое видение
    «единственно правильной» серверной архитектуры.

    Meteor​
    . Это — мощный фулстек-фреймворк, реализующий изоморфный подход к разработке приложений на JavaScript и к использованию кода и на клиенте, и на сервере. Когда-то Meteor представлял собой самостоятельный инструмент, включающий в себя всё, что только может понадобиться разработчику. Теперь он, кроме того, интегрирован с фронтенд-библиотеками, такими, как ​
    React​
    , ​
    Vue​
    и ​
    Angular​
    . Meteor, помимо разработки обычных веб-приложений, можно использовать и в мобильной разработке.

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

    Next.js​
    . Этот фреймворк предназначен для организации серверного рендеринга
    React​
    -приложений.

    Micro​
    . Это — весьма компактная библиотека для создания асинхронных HTTP-микросервисов.

    Socket.io​
    . Это библиотека для разработки сетевых приложений реального времени.
    На самом деле, в экосистеме Node.js можно найти вспомогательную библиотеку для решения практически любой задачи. Как вы понимаете, на строительство подобной экосистемы нужно немало времени. Платформа Node.js появилась в 2009 году. За время её существования случилось много всего такого, о чём стоит знать программисту, который хочет изучить эту платформу.
    Краткая история Node.js
    В этом году Node.js исполнилось уже 9 лет. Это, конечно, не так уж и много, если сравнить этот возраст с возрастом JavaScript, которому уже 23 года, или с 25-летним возрастом веба, существующем в таком виде, в котором мы его знаем, если считать от появления браузера Mosaic.

    9 лет — это маленький срок для технологии, но сейчас возникает такое ощущение, что платформа
    Node.js существовала всегда.
    Я начал работу с Node.js с ранних версий платформы, когда ей было ещё только 2 года. Даже тогда, несмотря на то, что информации о Node.js было не так уж и много, уже можно было почувствовать, что
    Node.js — это очень серьёзно.
    Теперь поговорим о технологиях, лежащих в основе Node.js и кратко рассмотрим основные события, связанные с этой платформой.
    Итак, JavaScript — это язык программирования, который был создан в Netscape как скриптовый язык, предназначенный для управления веб-страницами в браузере ​
    Netscape Navigator​
    Частью бизнеса Netscape была продажа веб-серверов, которые включали в себя среду, называемую
    Netscape LiveWire. Она позволяла создавать динамические веб-страницы, используя серверный
    JavaScript. Как видите, идея использования JS для серверной разработки гораздо старше чем Node.js.
    Этой идее почти столько же лет, сколько и самому JavaScript, но во времена, о которых идёт речь, популярности серверный JS не снискал.
    Одним из ключевых факторов, благодаря которому платформа Node.js стала столь распространённой и популярной, является время её появления. Так, за несколько лет до этого JavaScript начали считать серьёзным языком. Случилось это благодаря приложениям Web 2.0, вроде Google Maps или Gmail, которые продемонстрировали миру возможности современных веб-технологий.
    Благодаря конкурентной войне браузеров, которая продолжается и по сей день, серьёзно возросла производительность JavaScript-движков. Команды разработчиков, стоящих за основными браузерами, каждый день работают над повышением производительности их решений, что благотворно влияет на
    JavaScript в целом. Один из таких движков — это уже упомянутый V8, используемый в браузере Chrome и применяемый в Node.js. Он является одним из результатов стремления разработчиков браузеров к высокой производительности JS-кода.
    Конечно же, популярность Node.js основана не только на удачном стечении обстоятельств и на том, что эта платформа появилась в правильное время. Она представила миру инновационный подход к серверной разработке на JavaScript. Рассмотрим основные вехи истории Node.js.
    2009
    ● Появление Node.js
    ● Создание первого варианта ​
    npm​
    2010
    ● Появление ​
    Express​
    ● Появление ​
    Socket.io​
    2011
    ● Выход npm 1.0.
    ● Большие компании, такие, как ​
    LinkedIn​
    и ​
    Uber​
    , начали пользоваться Node.js.
    2012
    ● Быстрый рост популярности Node.js.
    2013
    ● Появление ​
    Ghost​
    , первой крупной платформы для публикаций, использующей Node.js.
    ● Выпуск ​
    Koa​

    2014
    ● В этом году произошли драматические события. Появился проект ​
    IO.js​
    , являющийся форком
    Node.js, целью создания которого, кроме прочего, было внедрение поддержки ES6 и ускорение развития платформы.
    2015
    ● Основание организации ​
    Node.js Foundation​
    ● Слияние IO.js и Node.js.
    ● В npm появляется возможность работать с приватными модулями.
    ● Выход ​
    Node.js 4​
    (надо отметить, что версий 1, 2 и 3 у этой платформы не было).
    2016
    ● Инцидент с пакетом ​
    left-pad​
    ● Появление ​
    Yarn​
    ● Выход Node.js 6.
    2017
    ● В npm начинают больше внимания уделять безопасности.
    ● Выход Node.j8
    ● Появление поддержки ​
    HTTP/2​

    V8​
    официально признают в качестве JS-движка, предназначенного не только для Chrome, но и для Node.
    ● Еженедельно осуществляется 3 миллиарда загрузок из npm.
    2018
    ● Выход Node.js 10.
    ● Поддержка ​
    ES-модулей​
    ● Экспериментальная поддержка ​
    mjs​
      1   2   3   4   5   6   7   8   9


    написать администратору сайта