Автор оригинала: Scott Robinson.
JavaScript, несомненно, является одним из самых популярных языков программирования сегодня, и по хорошей причине. Он может легко запускать в вашем браузере на сервере на рабочем столе или даже на вашем телефоне в качестве приложения. Один из самых популярных и простых способов написать JavaScript использует Node.js Отказ
Там есть довольно много ресурсов, чтобы узнать Node.js, но не многие из них действительно дают вам фон, инструменты и ресурсы, которые вам необходимо добиться успеха в записи кода узла.
Итак, что я стремлюсь сделать здесь, предоставляет вам руководство, которое я хотел бы, чтобы я мог только начинать. Я начну с краткого описания того, какой узел на самом деле есть и что он делает за занавесом, то я дам вам некоторые конкретные примеры, которые вы можете попробовать себя прямо в браузере, и, наконец, я дам вам кучу Ресурсы, чтобы проверить вас через несколько полезных и практичных примеров/концепций.
Обратите внимание, что это руководство не научит вам, как кодировать, но вместо этого он проведет вас через основы времени выполнения узла и NPM.
Что такое узел
Узел – это межплатная среда выполнения кроссплатформы для сервера, которая работает на V8 JavaScript Engine , который способствует Chrome Chrome Google. Это действительно сердце узла и является компонентом, который на самом деле разбирается и выполняет код.
Двигатель V8 делает это, составив JavaScript на родной машинный код, который делает его намного быстрее, чем интерпретатор. Чтобы даже ускорить вещи еще больше, скомпилированный код оптимизирован (и оптимизирован) динамически оптимизирован во время выполнения на основе эвристики профиля выполнения кода. Это означает, что в качестве программы запускается, двигатель на самом деле отслеживает его производительность и делает код более быстрым на основе определенных факторов, которые отслеживаются.
В качестве временной среды большой фокус узла состоит в том, чтобы использовать, приводимуваясь от событий, не блокирующая модель IO, чтобы сделать его легким и быстрым. Для некоторого, эта модель программирования может быть сначала немного запутана, но на самом деле она делает отличную работу упрощения разработки для приложений Heavy-IO, таких как сайты.
Этот дизайн идеально подходит для оптимизации пропускной способности и масштабируемости вашего кода, что является большой причиной того, почему она стала настолько популярна. Например, кто-то получил его, чтобы обработать 600 000 одновременных подключений Websocket , что безумно. Теперь ему пришлось сделать немного пользовательской конфигурации, но это не делает его менее впечатляющим. Это именно поэтому компании, такие как IBM, Microsoft и PayPal, используют узел для своих веб-сервисов.
Теперь узел даже не нужно быть быстро, чтобы сделать его привлекательным. Одна из моих любимых функций на самом деле является менеджером пакета, NPM Отказ Много языков не хватает хорошего менеджера по пакетам, как это. NPM – это инструмент командной строки, который вы можете использовать для инициализации модулей, управления зависимостями или прогонственными тестами, среди прочего.
Общественный репозиторий открыт для всех, чтобы загрузить и публиковать код. По состоянию на время этого письма NPM проходит более 210 000 модулей, начиная от веб-сайтов, чтобы командные строки инструменты для упаковщиков API.
Вот пример из пакета, который я создал. Вы можете увидеть, что главная страница – это readme, которая описывает, что делает пакет и как его использовать. Вы также получаете быструю подпись другой информации, например, количество загрузок, местоположение хранилища и использованной лицензии программного обеспечения.
Какой узел хорош для
Среди прочего, узел, вероятно, лучше всего подходит для строительных веб-сайтов и инструментов, которые требуют в режиме реального времени, синхронного взаимодействия. Сайты/приложения чата являются хорошим примером этого, так как они обычно очень тяжелые. Неблокирующая модель, управляемая событием, позволяет ей обрабатывать много запросов одновременно.
Это также очень хорошо для создания интерфейса для веб-API (через отдых). Это связано с тем, что он оптимизирован для IO, управляемой событиями (который я уже затронул) и Он обрабатывает JSON, так что не нужно практически не нужно.
Какой узел не хорош для
На другом конце давайте посмотрим, какой узел не хорош в. В частности, это очень плохо подходит для выполнения тяжелых вычислительных задач. Так что, если вы хотите сделать что-то вроде Машина обучения с узлом У вас, вероятно, не будет лучшего опыта.
Узел также еще довольно молодой, поэтому он все еще находится под быстром развитием. В последние несколько месяцев мы ушли из v0.12.x
к v5.1.x
Отказ Так что, если вам нужно что-то более стабильное, то это, вероятно, не для вас.
И как для асинхронного программирования «проблема», я думаю, что первая часть Эта квора отвечает Хорошая работа объясняет это:
[Его] отсутствие присущей организации кода является огромным недостатком. Он особенно усугубляется, когда команда разработки в целом не знаком с асинхронным программированием или стандартными шаблонами дизайна. Есть слишком много способов для кода, чтобы получить неуправляемую и неодадно.
Хотя асинхронное программирование – это хорошая вещь в целом, он добавляет сложность в ваши программы.
Узел замедляется
Хорошо, на какой-то код. Мы собираемся начать довольно простое и просто запустите несколько команд в REPL (LOOP REAL-PRINT-PRINT), что является просто приложением, которое позволяет вам в интерактивно проводить код узла в оболочке. Программа, написанная здесь, выполнена часть, а не все сразу.
Я предполагаю, что вы уже знакомы с JavaScript, поэтому мы просто пройдемся через некоторые удельные утечки на протяжении всей этой статьи.
Давайте попробуем один из встроенных модулей, которые поставляются с узлом, как Крипто
модуль.
Предполагая, что у вас уже установлен узел, запустите Узел
Команда в вашей оболочке и введите следующий код в строку подсказки по строке:
var crypto = require('crypto'); crypto.createHash('md5').update('hello world').digest('hex');
После ввода последней строки в REPL (или нажав кнопку «Запустить» выше), вы должны увидеть 5eb63bbbe01eeed093cb22bb8f5acdc3 напечатано на консоль.
Крипто
Модуль загружен с помощью требуется ()
Функция, которая обрабатывает разрешение и загрузку кода для вас. Больше информации о том, как это работает здесь Отказ
Как только модуль загружен, вы можете использовать его функции, которые в этом случае мы используем createhash ()
Отказ Поскольку allнов выполняет кусок кода-мудрых, они обычно распечатывают возвращенное значение для каждой строки, как вы видели здесь.
Вы можете использовать READS, как это, чтобы быстро проверить код без необходимости писать его в новый файл и выполнить его. Это почти как общая среда для песочницы общего назначения.
Ваша первая программа
Замена – это весело и все, но они только получат нас. Итак, давайте перейдем и напишу нашу первую реальную программу узла. Мы не будем беспокоиться об использовании сторонних модулей довольно (но не волнуйтесь, мы позже), поэтому давайте посмотрим, какой встроенный код доступен для нас первым. У вас уже есть хорошая сумма кода, в том числе (но не ограничена):
ФС
: Простые обертки предоставлены по стандартным функциям POSIXhttp
: HTTP-сервер нижнего уровня и клиентОС
: Предоставляет некоторые основные методы рассказать вам о базовой операционной системепуть
: Утилиты для обработки и преобразования путей файловURL
: Утилиты для разрешения URL и анализаUtil
: Стандартные функции утилиты, такие как отладка, форматирование и проверка
Количество встроенного кода не на уровне Python, но это будет делать работу. Настоящие льготы приходят, когда вы начинаете попасть в сторонние модули.
Для нашей первой программы мы создадим простую утилиту, которая определяет ваше местоположение с использованием вашего IP-адреса (Kinda Regyy, я знаю):
var http = require('http'); var options = { hostname: 'ipinfo.io', port: 80, path: '/json', method: 'GET' }; var req = http.request(options, function(res) { var body = ''; res.setEncoding('utf8'); res.on('data', function(chunk) { body += chunk; }); res.on('end', function() { var json = JSON.parse(body); console.log('Your location: ' + json.city + ', ' + json.region); }); }); req.end();
Скопируйте код выше и вставьте его в файл с именем «index.js». Затем в командной строке перейдите к каталогу с файлом, который вы только что создали и запустите его:
$ node index.js
Вы должны увидеть «Ваше местоположение: [Город], [регион]», напечатанный в командную строку. Город/регион напечатан, вероятно, будет довольно близко к вам, но не точным. Кроме того, если город/регион не напечатаны, то это просто означает, что ваша IP-информация не была в базе данных.
Поскольку этот код не использует какие-либо 3-й партийные зависимости, это не нужно иметь Package.json
файл или node_modules
Папка, которую мы объясним больше о следующем разделе.
Ваш первый пакет
Обратите внимание, что на протяжении всей этой статьи я использую «пакет» и «модуль» взаимозаменяемо.
Для каждого веб-сайта/инструмента/проекта вы создаете с Node.js, вы также захотите создать модуль вокруг него. Это так, что вы можете указать зависимости, тесты, сценарии, репозитории и т. Д.
Типичный модуль состоит из нескольких важных вещей:
- Package.json : Файл json, содержащий всю информацию модуля
- Node_Modules/: каталог, содержащий все зависимости
- index.js: основной код код
- Readme.md: Документация о модуле
- Тест/: каталог тестов для модуля
Существует тонна других вещей, которые вы можете добавить в модуль (например, файл .npmignore, каталог документов или файлов конфигурации редактора), но перечисленные выше вещей, являются одними из наиболее распространенных, вы увидите.
Чтобы показать, как все это работает, на протяжении всей остальной части этого раздела мы создадим наш собственный пакет, который основывается на предыдущем примере.
Вместо того, чтобы просто рассказать вам ваше местоположение на основе вашего IP-адреса, мы будем использовать некоторые популярные узловые пакеты для создания инструмента, который позволяет найти местоположение любого сервера веб-сайта. Мы назовем это Двадцать
( Посмотрите, почему ).
Инициализация пакета
Во-первых, создайте и перейдите в новый каталог для вашего проекта:
$ mkdir twenty $ cd twenty
Затем используйте NPM для инициализации проекта:
$ npm init This utility will walk you through creating a package.json file. It only covers the most common items, and tries to guess sane defaults. See `npm help json` for definitive documentation on these fields and exactly what they do. Use `npm install--save` afterwards to install a package and save it as a dependency in the package.json file. Press ^C at any time to quit. name: (twenty) version: (0.0.1) description: Locates the city/region of a given URL/IP address entry point: (index.js) test command: git repository: keywords: license: (MIT) About to write to /Users/scott/projects/twenty/package.json: { "name": "twenty", "version": "0.0.1", "description": "Locates the city/region of a given URL/IP address", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "Scott Robinson <[email protected]> (http://stackabuse.com)", "license": "MIT" } Is this ok? (yes) yes
Заполните каждую подсказку (начиная с Имя: (двадцать)
) или не вводите ничего, и просто нажмите RETURN, чтобы использовать настройки по умолчанию. Это создаст правильно настроенный Package.json
Файл, содержащий следующие JSON:
{ "name": "twenty", "version": "0.0.1", "description": "Locates the city/region of a given URL/IP address", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "Scott Robinson <[email protected]> (http://stackabuse.com)", "license": "MIT" }
Этот файл – ваша отправная точка, в которой вся конкретная информация о проекте сохраняется.
Установка зависимостей
Чтобы добавить зависимости к вашему проекту, вы можете использовать NPM установить
Команда из командной строки. Например, добавить нашу первую зависимость, Запрос
Попробуйте запустить это:
$ npm install --save request
Установить
Команда загрузит последние Запрос
Пакет из NPM и сохранить его в node_modules
каталог. Добавление . --save
Флаг сообщает NPM, чтобы сохранить детали пакета в Package.json под раздел «зависимости»:
"dependencies": { "request": "2.67.0" }
Теперь вы сможете использовать Запрос
Модуль в любом месте в вашем проекте.
Улучшение кода
Запрос
Модуль дает вам функции, чтобы легко сделать все виды HTTP-запросов. HTTP-пример, который мы показали выше, было не так уж плохо, но Запрос
делает код еще более компактным и проще прочитать. Эквивалентный код, использующий Запрос
будет выглядеть так:
var request = require('request'); request('http://ipinfo.io/json', function(error, response, body) { var json = JSON.parse(body); console.log('Your location: ' + json.city + ', ' + json.region); });
Было бы интересно, если бы мы могли найти местоположение любой IP-адрес, а не только наша собственная, поэтому давайте позвольте пользователю ввести IP-адрес в качестве аргумента командной строки. Как это:
$ node index.js 8.8.8.8
Чтобы получить доступ к этому аргументу в нашей программе, узел делает его доступным в глобальном Процесс
объект как Process.argv
, который является массивом. Для команды мы только что казняли выше, Process.argv
будет [«Узел», «index.js», 8.8.8.8 ']
Отказ
Чтобы сделать вещи еще проще, мы будем использовать Ярги Пакет, чтобы помочь нам разбирать аргументы командной строки. С простой программой, как это, Ярги
На самом деле не нужно, но я буду улучшаться на Двадцать
В более поздней статье, чтобы мы могли бы также добавить ее сейчас.
Так же, как Запрос
, мы установим его с:
$ npm install --save yargs
Изменение кода для использования Ярги
Чтобы схватить аргумент (или по умолчанию нашего собственного IP, если не дал аргументации), мы окажемся с этим:
var request = require('request'); var argv = require('yargs').argv; var path = 'json'; path = argv._[0] || path; request('http://ipinfo.io/' + path, function(error, response, body) { var json = JSON.parse(body); console.log('Server location: ' + json.city + ', ' + json.region); });
Пока что этот инструмент отлично подходит для использования командной строки, но что, если кто-то хочет использовать его как зависимость в собственном коде? На данный момент код не был экспортирован, поэтому вы не сможете использовать его где-либо еще, кроме командной строки. Чтобы сказать узел, какие функции/переменные, чтобы сделать доступным, мы можем использовать Module.exports
Отказ
var request = require('request'); var argv = require('yargs').argv; var findLocation = function(ip, callback) { var path; if (typeof(ip) === 'function' || !ip) path = 'json'; else path = ip; request('http://ipinfo.io/' + path, function(error, response, body) { var json = JSON.parse(body); callback(null, json.city + ', ' + json.region); }); }; module.exports = findLocation;
Большой! Теперь любой, кто загружает этот пакет, может потребовать его в любом месте в своем коде и использовать Findlocation ()
функция.
Но, возможно, вы заметили, что теперь мы не можем использовать его в качестве инструмента командной строки. Мы Не Хотите поставить оставшуюся часть старого кода, хотя и:
var request = require('request'); var argv = require('yargs').argv; var findLocation = function(ip, callback) { var path; if (typeof(ip) === 'function' || !ip) path = 'json'; else path = ip; request('http://ipinfo.io/' + path, function(error, response, body) { var json = JSON.parse(body); callback(null, json.city + ', ' + json.region); }); }; var arg = argv._[0] || path; // This runs every time the file is loaded findLocation(arg, function(err, location) { console.log('Server location: ' + location); }); module.exports = findLocation;
Это было бы плохо, потому что тогда в любое время кто-то …| требуется () Этот файл для использования
Findlocation () Функция это будет распечатать свое место в командной строке. Нам нужен способ определить, назвал ли этот файл
напрямую с Узел index.js а не по
требуется () Так что, если он был вызван напрямую, мы проверим командную строку для аргументов. Это можно сделать, проверяя
требуется. Main против
модуль Как это:
Если (требуется. MAIN) {…} , что нас оставляет нас:
var request = require('request'); var argv = require('yargs').argv; var findLocation = function(ip, callback) { var path; if (typeof(ip) === 'function' || !ip) path = 'json'; else path = ip; request('http://ipinfo.io/' + path, function(error, response, body) { var json = JSON.parse(body); callback(null, json.city + ', ' + json.region); }); }; if (require.main === module) { findLocation(argv._[0], function(err, location) { console.log('Server location: ' + location); }); } module.exports = findLocation;
Теперь мы можем использовать этот код как в командной строке и как зависимость.
ПРИМЕЧАНИЕ. Есть лучший способ сделать гибрид CLI/библиотеку, но мы будем держать его простым и придерживаться этого метода на данный момент. Видеть двадцать на Github для получения дополнительной информации, специально мусорное ведро каталог и Package.json. настройки.
Публикация вашей пакеты
Наконец, мы захочем сделать его доступным для других на НПМ. Все, что вам нужно сделать, чтобы сделать доступную доступную пакет запустить его в каталоге пакета:
$ npm publish
Вам будет предложено ваше имя пользователя и пароль, а затем код нажимается в реестр.
Имейте в виду, что вам понравится ?| Область Ваш пакет или измените его имя, поскольку имя «двадцать» уже занято.
Куда пойти отсюда
С ростом популярности узла есть тонны ресурсов по всему Интернету. Вот несколько самых популярных книг и курсов, которые я сталкивался, что научит вас намного больше, чем то, что я смог показать здесь:
- Узнайте Node.js WES BOS.
- Node.js Web Development: Разработка на стороне сервера с узлом 10
- Узоры проектирования Node.js: главная практика для создания модульных и масштабируемых веб-приложений для серверов
- Начало Node.js.
Или если вы хотите придерживаться некоторых более коротких учебных пособий, вот несколько из злоупотреблений стека, которые могут быть полезны:
- Избегая обратного вызова ада в Node.js
- Полезные пакеты узлов, о которых вы можете не знать
- Классы ES6
- Запустите периодические задачи в узле с узлом-CRON
Просто имейте в виду, что подавляющее большинство того, что вы учитесь, будут от вашего собственного изучения языка, инструментов и пакетов. Поэтому, в то время как статьи, как это приятные для начала работы, убедитесь, что вы сосредоточены на написании кода, чем Чтение о том, что кто-то еще написал код Отказ Опыт преуменец все остальное.
Заключение
Мы покрывали небольшую долю только в том, какой узел и NPM должны предложить, поэтому проверьте некоторые ресурсы, которые я связанных выше, чтобы узнать больше.
И я не могу подчеркнуть, насколько это важно, чтобы вы получили опыт на самом деле записи кода. NPM делает его действительно легко просматривать пакеты и находить свои репозитории. Так что найдите посылку, которое полезно или интересно, и посмотрите, как он работает под.
Вы новичок узел? Какие другие темы узла вы хотите узнать? Дайте нам знать об этом в комментариях!