Take your web development skills from the browser to the web server with Node, the programming framework that enables you to write data-driven applications with a language you already know: JavaScript. This guide offers a friendly way to master Node fundamentals with clear and concise information you can use right away.
Built on Google’s V8 JavaScript engine, Node offers high performance and easy scalability for server-side applications. Learning Node walks you through the differences and parallels between client-side and server-side programming, with practical examples of programming and deployment.
* Quickly learn how to install and deploy Node * Understand how to use Node and related components to build sites and applications efficiently * Manage Node modules with npm * Create pages easily with template systems * Apply client-side skills, tools, and techniques on the server * Maintain a connection between browser and server with web sockets
“Версию Node можно проверить следующей командой: node -v”
“Объект process предоставляет доступ к информации как о среде Node, так и о среде выполнения программы. Для получения информации мы воспользуемся параметром командной строки -p, который выполняет сценарий и возвращает полученный результат”
“Node поддерживает чтение и запись 8-, 16- и 32-разрядных целых чисел со знаком и без, а также вещественных чисел одинарной и двойной точности. Для всех типов, кроме 8-разрядных целых чисел, также можно выбрать формат с прямым (little-endian) или обратным (big-endian) порядком байтов. Несколько примеров поддерживаемых функций: 1) buffer.readUIntLE(): чтение значения с заданным смещением и прямым порядком байтов. 2) buffer.writeUInt16BE(): запись 16-разрядного целого без знака с заданным смещением и обратным порядком байтов. 3) buffer.readFloatLE(): чтение вещественного числа одинарной точности с заданным смещением и прямым порядком байтов. 4) buffer.writeDoubleBE(): запись 64-разрядного вещественного числа двойной точности с заданным смещением и обратным порядком байтов.”
“Но если вы интересуетесь разработкой дополнений для Node, вам придется очень близко познакомиться с libuv. Начать можно с введения в libuv (https://nikhilm.github.io/uvbook/basi...).”
“Стоит немного поскрести многие базовые объекты Node, и под оболочкой обнаружится EventEmitter. Каждый раз, когда вы видите объект, генерирующий событие, которое обрабатывается функцией on, знайте: перед вами EventEmitter. Понимание того, как работает класс EventEmitter, и умение его использовать — две важнейшие составляющие программирования для Node… Класс EventEmitter обеспечивает асинхронную обработку событий в Node.”
“В браузере для работы с таймерами существуют setTimeout() и setInterval(); эти функции также доступны и в Node. Они не совсем равноценны, потому что браузер использует цикл событий, реализуемый на уровне ядра браузера, а цикл событий Node реализуется библиотекой C++, libuv, но в основном различия между ними несущественны.”
“Функция setImmediate() создает событие, но это событие имеет более высокий приоритет, чем события, созданные setTimeout() и setInterval(). Однако при этом оно не превосходит по приоритету события ввода/вывода и с ним не связывается собственный таймер. Событие setImmediate() генерируется после всех событий ввода/вывода, до событий таймера, и в текущей очереди событий. Если вызвать его из функции обратного вызова, то оно помещается в следующий цикл событий после завершения того цикла, в котором оно было вызвано. Фактически эти функции позволяют добавить событие в текущий или в следующий цикл событий без лишних таймеров. Этот способ эффективнее setTimeout(callback, 0), потому что он превосходит по приоритету другие события таймеров. Он похож на другую функцию — process.nextTick(), не считая того, что функция обратного вызова process.nextTick() активизируется после завершения текущего цикла событий, но до добавления каких-либо новых событий ввода/ вывода”
“REPL — удобный интерактивный инструмент, который облегчает разработчику жизнь. REPL позволяет не только опробовать код JavaScript перед включением его в файлы, но и создавать приложения в интерактивном режиме, с сохранением результатов после завершения работы. Другая полезная особенность REPL — возможность создания специализированной версии REPL, способной исключать нежелательные ответы undefined, осуществлять предварительную загрузку модулей, изменять приглашение или используемую функцию eval и делать многое другое.”
“Так как многие объекты в Node реализуют потоковый интерфейс, все потоки в Node обладают базовой функциональностью: 1) Изменение кодировки потоковых данных вызовом setEncoding. 2) Проверка возможности чтения и (или) записи данных в поток. 3) Перехват событий потоков (например, получения данных или закрытия подключения) с назначением функций обратного вызова для каждого события. 4) Приостановка и возобновление потока. 5) Перенаправление данных из потока для чтения в поток для записи.”
“Модуль Node File System (fs) предоставляет всю функциональность, необходимую для работы с файловой системой независимо от операционной системы.”
“Кроме многочисленных функций, модуль File System поддерживает четыре класса: 1) fs.FSWatcher — поддержка событий для отслеживания изменений в файле. 2) fs.ReadStream — поток для чтения. 3) fs.WriteStream — поток для записи. 4) fs.Stats — информация, возвращаемая функциями *stat.”
“Объект fs.Stats возвращается при использовании функций fs.stat(), fs.lstat() и fs.fstat(). Он может использоваться для проверки существования файла (или каталога), но также возвращает информацию о том, является ли объект файловой системы файлом/каталогом/сокетом домена UNIX, какие разрешения связаны с файлом, время последнего обращения или модификации объекта и т. д”
“fs.readFile() или fs.writeFile() (или их синхронные аналоги). Эти функции открывают файл, выполняют чтение или запись, после чего закрывают файл”
“Поток для чтения создается вызовом fs.createReadStream() с передачей пути и объекта options или же с включением описания файла в options без указания пути. То же можно сказать о потоках для записи, создаваемых вызовом fs.createWriteStream(). В обоих случаях поддерживается объект options.”
“Сокет (socket) представляет собой конечную точку обмена данными, а сетевой сокет — конечную точку обмена данными между приложениями, работающими на двух разных компьютерах в сети. Данные, передаваемые между сокетами, образуют поток (stream). Данные в потоке могут передаваться либо в виде двоичных данных в буфере, либо в виде строки в кодировке Юникод. Оба типа данных передаются в форме пакетов: частей данных, разделенных на блоки сходного размера. Также существует специальная разновидность пакетов — завершающий пакет (FIN), отправляемый сокетом как сигнал о завершении передачи.”
“TCP требует выделенного соединения между двумя конечными точками. UDP — протокол, не требующий соединения; это означает, что соединение между двумя конечными точками не гарантировано. По этой причине протокол UDP по надежности и степени защиты от ошибок уступает TCP. С другой стороны, UDP обычно работает быстрее TCP, что делает его более популярным для задач реального времени и таких технологий, как VoIP (Voice over Internet Protocol), в которых требования к соединению TCP могут отрицательно повлиять на качество сигнала.”
“Безопасный, защищенный от несанкционированного вмешательства обмен данными между клиентом и сервером осуществляется через протокол SSL (Secure Sockets Layer) и его обновленный вариант TLS (Transport Layer Security). Уровень TLS/SSL реализует шифрование данных для протокола HTTPS, который будет рассмотрен в следующем разделе. Но прежде чем браться за программирование для HTTPS, необходимо подготовить среду разработки”
“Node предоставляет криптографический модуль Crypto, открывающий интерфейс к функциональности OpenSSL. В него включены обертки для функций хеширования OpenSSL, HMAC, шифрования, дешифрования, подписи и верификации. Этот компонент Node достаточно прост в использовании, но он основан на предположении, что разработчик Node хорошо знает OpenSSL и все используемые функции”
“В самом распространенном используется метод spawn. Он запускает команду в новом процессе, передавая ей любые аргументы. Между родительским приложением и дочерним процессом создаются каналы (pipes) для stdin, stdout и stderr”
“Кроме порождения дочернего процесса функцией child_process.spawn(), для выполнения команды также можно воспользоваться функциями child_ process.exec() и child_process.execFile(). Метод child_process.exec() похож на child_process.spawn(), не считая того, что spawn() начинает возвращать поток сразу же после запуска программы, как видно из листинга 8.1. Функция child_process.exec(), как и child_process. execFile(), буферизирует результаты. Однако exec() порождает командный интерпретатор для управления приложением, тогда как child_process. execFile() запускает процесс напрямую. Это делает функцию child_process. execFile() более эффективной по сравнению как с child_process.spawn() с включенным режимом shell, так и с child_process.exec(). В первом параметре child_process.exec() или child_process.execFile() передается либо команда (для exec()), либо файл и его местоположение (execFile()); второй параметр содержит объект options для команды; в третьем параметре передается функция обратного вызова. Функция обратного вызова получает три аргумента: error, stdout и stderr. При отсутствии ошибок данные буферизируются в stdout.”
“Последний метод дочерних процессов — child_process.fork(). Эта разновидность spawn() предназначена для порождения процессов Node. Вызов child_process.fork() отличается от других тем, что он создает реальный канал передачи данных дочернему процессу. Однако обратите внимание на то, что каждому процессу требуется новый экземпляр V8, а это приводит к дополнительным затратам времени и памяти.”
“Строгий режим сильно влияет на работу кода. В частности, он выдает ошибки, если переменная не определяется перед использованием; параметр функции может объявляться только единожды; переменная не может использоваться в eval-выражении на одном уровне с вызовом eval, и т. д”
“MongoDB — самая популярная база данных, используемая в приложениях Node. Эта система относится к категории документных баз данных. Документы кодируются в формате BSON — двоичной разновидности JSON (что, вероятно, объясняет его популярность среди разработчиков JavaScript). В MongoDB место записи таблицы занимает документ BSON, а место таблицы — коллекция.”
“Объект MongoClient — тот объект, который вы будете использовать чаще всего для подключения к базе данных. Обратите внимание на заданный номер порта (27017): это порт по умолчанию для системы MongoDB”
“Memcached в основном используется для кэширования запросов к данным, чтобы ускорить последующие обращения к ним. Система также хорошо справляется с распределенным кэшированием, но поддержка более сложных данных в ней ограничена. Она хорошо работает в приложениях, выдающих большое количество запросов на выборку, но не столь эффективно проявляет себя в приложениях с многочисленными операциями чтения и записи. Redis — отличный вариант для приложения второго типа. Кроме того, данные Redis могут сохраняться, и система обладает большей гибкостью, чем Memcached, — особенно в поддержке различных типов данных. Однако, в отличие от Memcached, Redis работает только на одной машине.”
“Те же факторы следует учитывать при сравнении Redis с Cassandra. В Cassandra, как и в Memcached, реализована поддержка кластеров. С другой стороны, как и в Memcached, поддержка структур данных в Cassandra ограничена. Система хорошо подходит для выдачи ситуативных запросов — сценарий использования, плохо подходящий для Redis. С другой стороны, система Redis проста в использовании, незатейлива и обычно работает быстрее Cassandra. По этим и другим причинам система Redis пользуется большей популярностью среди разработчиков Node.”
“Чтобы установить точку прерывания в коде, вставьте команду debugger прямо в код”
“Чтобы приступить к отладке приложения, укажите параметр debug при запуске приложения: node debug application”
“Модульное тестирование — метод изоляции компонентов приложения для тестирования. Многие тесты, содержащиеся в подкаталоге tests модулей Node, являются модульными. Все тесты в подкаталоге test установки Node тоже являются модульными. Многие из этих тестов были построены с использованием модуля Assert”
“Тестовые утверждения проверяют значение некоторых выражений; конечным результатом такой проверки является логическое значение true или false.”
“Nodeunit предоставляет способ сценарного программирования тестов. Все запрограммированные тесты выполняются последовательно, а вывод результатов координируется. Чтобы использовать модуль Nodeunit, установите его глобально с использованием npm: [sudo] npm install nodeunit -g”
This book could have been done better. Although there were scattered examples all over, I would have preferred if the book was divided into bigger projects. Also details were missing which would go into building a big application. All in all, a nice introduction, but would need more to build an actual application. That's where Developing Backbone.js Application By Addy Osmani shined.
The actual introduction to Node.js is IMO quite well written, but the author wastes white a lot of space introducing for instance technologies like MongoDB and Redis when one example for a datastore would be enough to show the point of persistent storage. This and some other aspects made me skim through whole chapters :-/ There is also a multi-page appendix on how to use Git and Github ... Quite a WTF moment.
There are some things written here which I have figured out easily by googling a year ago. But thankfully, it's not entirely true.
I was looking for a book that teaches you how to build one simple and fairly complex application. There's no cohesive story here. The author simply introduced Node libraries and somehow reading the last 9 chapters felt like reading a documentation page.
Nice book to start learn Node.js and the best features that comes with it, Although most are inherited from JavaScript and some of us already know them, but how you can harness those feature using Nodejs are well explained. Some content gets outdated, but you can surf and update yourself. Overall a very nice read.
Nothing really wrong with this book, it just wasn't really what I wanted. Turns out, I needed to read the first couple of chapters and the last three or four. The big chunk in the middle really wasn't interesting to me.
Really good book! Provides a lot of comprehensive usage examples and covers a wide range of Node's functionality including such rarely mentioned topics as IoT and microcomputers.