Автор оригинала: Matt Goldspink.
Node.js стал одним из Самые популярные платформы За последние пару лет. Это уверенно легко начать на этих проектах Node.js, но после того, как вы преодолеете Basic Здравствуйте, мир
Приложение, зная, как наилучшим образом структурировать свой код и как разобраться с ошибками, иногда может стать кошмаром (как с большинством языков и рамки).
И, к сожалению, этот кошмар имеет всю разницу между приложением по производству рок-твердых пород и запуском катастрофа.
С этим сказанным, давайте посмотрим на несколько лучших практик Node.js, которые будут держать вас в безопасности от самых распространенных ловушек Node.js.
1. Начните все проекты с NPM init
Большинство людей знакомы с NPM в качестве способа установки зависимостей, но это намного больше, чем это. Во-первых, я настоятельно рекомендую создать новый проект, используя NPM init
, вот так:
$ mkdir my-new-project $ cd my-new-project $ npm init
Это создаст новый Package.json
Для вас, который позволяет добавить кучу метаданных, чтобы помочь другим, работающим над проектом, имеют такую же настройку, как вы.
Например, я обычно открываю Package.json
И добавьте определенную версию Node.js Я планирую работать, добавив:
"engines": { "node": "6.2.0" }
2. Настройка .npmrc.
Если вы использовали NPM раньше, вы можете столкнуться с - -save
Флаг, который обновляет Package.json
с зависимостью. Когда другие разработчики клонируют проект, они могут быть обязаны иметь правильные зависимости из-за этого. К сожалению, вспомнить, чтобы добавить флаг может быть проблемой.
Кроме того, NPM добавляет ведущую карету ^
ко всем версиям. Следовательно, когда кто-то работает NPM установить
, они могут получить разные версии модулей, чем то, что у вас есть. При обновлении модули Всегда является хорошей практикой, наличие команды разработчиков, все бегущие против слегка разных версий зависимостей, могут привести к различиям в поведении или наличии API.
Поэтому это хорошая идея, чтобы у всех в одной и той же версии. Чтобы сделать это легче для всех, .npmrc
Файл имеет некоторые полезные свойства, которые могут убедиться, что NPM установить
Всегда обновляет Package.json
И включите версию установленной зависимости быть точным совпадением.
Просто запустите следующие строки в вашем терминале:
$ npm config set save=true $ npm config set save-exact=true
Теперь, когда вы запускаете NPM установить
Вы можете быть уверены, что зависимость сохраняется и будет заблокирована до установленной вами версии.
3. Добавить сценарии в свой Package.json
Если есть одна вещь, которую нужно все приложения, это сценарий запуска. Зная, какой файл позвонит первым и с какими аргументами может быть эпическое приключение к открытию на некоторых проектах. Хорошая вещь NPM имеет стандартный способ запуска всех приложений узла.
Просто добавьте Сценарии
Собственность и объект к вашему Package.json
с Начать
ключ. Это значение должно быть команда для запуска вашего приложения. Например:
"scripts": { "start": "node myapp.js" }
Как только кто-то пройдет NPM начать
NPM будет работать Узел myapp.js
со всеми зависимостями node_modules/.bin
на вашем $ Путь
Отказ Это означает, что вы можете избежать необходимости делать глобальные установки модулей NPM.
Стоит знать пару других скриптов, которые стоит знать:
"scripts": { "postinstall": "bower install && grunt build", "start": "node myapp.js", "test": "node ./node_modules/jasmine/bin/jasmine.js" }
Postinstall
Сценарий бежит после NPM установить
бежит Есть также Preinstall
Если вам нужно запускать что-то, прежде чем все зависимости NPM установлены.
Тест
Сценарий работает, когда кто-то работает NPM Test
Отказ Это хороший простой способ для того, чтобы кто-то смог запустить ваши тесты без выяснения, если вы решили использовать Жасмин , Моча , Селен , так далее.
Вы можете добавить свои собственные пользовательские сценарии здесь. Затем они могут быть запущены, используя NPM Run-Script {имя}
– Простой способ вам дать вашу команду центральным набором запуска сценариев.
4. Используйте переменные среды
Управление конфигурацией всегда является большой темой на любом языке. Как вы отделяете свой код из баз данных, сервисов и т. Д., Что он должен использовать во время разработки, QA и производства?
Рекомендуемый путь в Node.js – использовать переменные среды и посмотреть значения из Process.env
в вашем коде. Например, чтобы выяснить, какую среду вы работаете, проверьте Node_env
Переменные среды:
console.log("Running in :" + process.env.NODE_ENV);
Это теперь стандартное имя переменной, используемое для большинства поставщиков облачных хостинга.
Если вам нужно загрузить дальнейшие конфигурации, вы можете использовать модуль, похожий на https://github.com/indexzero/nconf Отказ
Другой популярный вариант для загрузки переменных среды – https://github.com/motdotla/dotenv (Благодаря @szabi)
5. Используйте гид стиля
Я знаю, что у нас у всех были эти моменты, где мы открываем новый файл из другого проекта в первый раз или файл пришел от другого разработчика, мы затем проводим в следующем часе, переформатируя брекеты, чтобы быть на разных линиях, изменяя пробелы к вкладки и наоборот. Проблема здесь представляет собой смесь самоуверенных разработчиков и руководства по стандарту команды/компании.
Гораздо проще понять код на кодовой базе, если он все написан в согласованном стиле. Это также уменьшает познавательный надклад о том, следует ли писать с вкладками или пробелами. Если стиль продиктован (и принудительно используя jshint, eslint или jscs), то все вдруг, кодовая база становится намного более управляемой.
Вам также не нужно выходить со своими собственными правилами, иногда лучше выбрать существующий набор руководящих принципов и следовать за ними. Вот несколько хороших примеров:
- Airbnb – https://github.com/airbnb/javascript.
- Google – https://google.github.io/styleguide/javascriptguide.xml.
- jQuery – https://contribute.jquery.org/style-guide/js/
- Стандарт JS – http://ststradardjs.com/ – благодаря @szabi за указываю этот
Просто выберите один и придерживайтесь его!
6. ОБЛУЧИТЬ ASYNC.
Я уверен, что вы слышали всю шумиху о Обещания Может, даже немного услышал о Async/await и Генераторы в ES2016. Основная идея всех этих методов делает ваш код async Отказ
Проблема с синхронными функциями в JavaScript заключается в том, что они блокируют любой другой код, пока они не завершит. Тем не менее, синхронный код позволяет легко понять поток вашей прикладной логики. С другой стороны, асинхронные структуры, такие как Обещания На самом деле верните много этого рассуждения, сохраняя свой код бесплатно от блокировки.
Итак, во-первых, я настоятельно рекомендую запустить ваше приложение (только во время разработки) с ITRACE-SYNC-IO
флаг. Это распечатает предупреждение и трассировку стека всякий раз, когда ваше приложение использует синхронный API.
Есть много замечательных статей о том, как использовать Обещания , Генераторы и Async/await Отказ Мне не нужно дублировать другую большую работу, которая уже доступна, поэтому вот несколько ссылок, чтобы начать работу:
- Обещания – http://www.html5rocks.com/en/tutorials/es6/promises/
- Async/a ждать – https://www.twilio.com/blog/2015/10/asyncawait-the-hero-javascript-deserved.html.
- Генераторы – https://developer.mozilla.org/en/docs/web/javascript/guide/irectors_and_generators.
7. Обработка ошибок
Имея ошибку открывать все ваше приложение в производстве, никогда не является большим опытом. Хорошее управление исключением важно для любого приложения, и наилучший способ борьбы с ошибками – использовать асинхронные структуры выше. Например, Обещания обеспечить .catch ()
Обработчик, который распространят все ошибки, которые будут иметь дело, чисто.
Давайте скажем, у вас есть цепочка обещаний, и любой из которых может вдруг не удавать, вы можете легко справиться с такой ошибкой:
doSomething() .then(doNextStage) .then(recordTheWorkSoFar) .then(updateAnyInterestedParties) .then(tidyUp) .catch(errorHandler);
В приведенном выше примере, не имеет значения, какая из более ранних функций может не удалось, какая-либо ошибка в конечном итоге вступит в ErrorHandler
Отказ
8. Убедитесь, что ваше приложение автоматически перезапускается
Ладно, так что вы следили за лучшим практикой, чтобы обрабатывать ошибки. К сожалению, некоторая ошибка из зависимости еще, как-то, сбила ваше приложение
Вот где важно убедиться, что вы используете Менеджер процесса Чтобы убедиться, что приложение изящно восстанавливается из ошибки времени выполнения. Другой сценарий, где вам нужно, чтобы перезапустить, это если весь сервер, на котором вы работаете. В этой ситуации вы хотите минимальное время простоя и для вас приложение для перезапуска, как только сервер снова будет жив!
Я бы порекомендовал использовать Keymetric’s PM2 http://pm2.keymetrics.io/ управлять своим процессом. Хотя другие варианты включают (Nodemon) [http://nodemon.io/] (спасибо @szabi) и (навсегда) [https://github.com/foreverjs/forever].
Сначала установите его как глобальный модуль:
$ npm install pm2 -g
Затем, чтобы запустить ваш процесс, вы должны запустить:
$ pm2 start myApp.js
Чтобы обработать перезапуск после сбоев сервера, вы можете следить за руководством PM2 для вашей платформы:
9. Кластерное приложение для повышения производительности и надежности
По умолчанию Node.js работает в одном процессе. В идеале вы хотите, чтобы один процесс для каждого ядра CPU, чтобы вы могли распространять рабочую нагрузку по всему сердечкам. Это улучшает масштабируемость веб-приложений, обрабатывающих HTTP-запросы и производительность в целом. В дополнение к этому, если один работник вылетает, другие все еще доступны для обработки запросов.
Одна из других преимуществ использования менеджера процесса, как PM2, заключается в том, что он поддерживает кластеризацию из коробки:
Чтобы запустить несколько экземпляров вашего приложения для каждого ядра на машине, вы просто запустите:
$ pm2 start myApp.js -i max
Одно дело в том, что каждый процесс является автономным – они не разделяют память или ресурсы. Каждый процесс откроет его собственные соединения с базами данных. Всегда держите это в виду, когда вы код. Полезный инструмент, которые люди используют для совместного использования состояния сеанса, например, является Redis , Это обеспечивает хранение данных в памяти, которое можно быстро получить доступ всеми процессами для хранения данных, связанных с сеансом.
10. Требуются все ваши зависимости передней
Я видел много разработчиков, как это написает код:
app.get("/my-service", function(request, response) { var datastore = require("myDataStoreDep")(someConfig); datastore.get(req.query.someKey) // etc, ... });
Проблема с кодом выше состоит в том, что когда кто-то делает запрос на /my-service
Код теперь будет загружать все файлы, необходимые для MyDataSatorep
– любой из которых может бросить исключение. Кроме того, когда передается конфигурация, в этой точке также может быть ошибка, которая может снизить весь процесс. Кроме того, мы не знаем, как долго …| Синхронный Настройка ресурса возьмет. На данный момент в коде мы по сути блокируем Все Другие запросы от обращения!
Таким образом, вы всегда должны загружать все свои зависимости и настроить их заранее. Таким образом, вы узнаете от запуска, если возникнут проблема, не три-четыре часа после того, как ваше приложение пошло в жизнь в производстве!
11. Используйте библиотеку регистрации для увеличения видимости ошибок
console.log
Хорошо, но он имеет ограничения в производственном применении. Пытаясь просеять на тысячи строк журналов, чтобы найти причину ошибки … Что я гарантирую вам Будет ли должны сделать в какой-то момент, болезненнее!
Зрелая библиотека регистрации может помочь с этим. Во-первых, они позволяют вам установить уровни для каждого сообщения журнала – будь то Отладка
, Информация
, Предупреждение
или Ошибка
. Отказ Кроме того, они обычно позволяют входить в разные файлы или даже удаленный файл данных.
Например, в моих приложениях я обычно регистрируюсь в https://www.loggly.com/ Отказ Loggly позволяет мне быстро искать все мои журнальные сообщения, используя шаблоны. Кроме того, он может предупредить меня, если порог достигнут – например, если мое веб-приложение начинает возвращать 500 Ошибка сервера
Сообщения для моих пользователей на период дольше 30 секунд, логика может прислать мне сообщение, и я могу выяснить, что происходит.
Так какая библиотека должна использовать? Опять же, это всегда до мнений. Я лично люблю использовать Уинстон
– https://github.com/winstonjs/winston Отказ
12. Используйте шлем, если вы пишете веб-приложение
Если вы пишете веб-приложение, есть много распространенных лучших практик, которые вы должны следовать за безопасным приложением:
- XSS защита
- Предотвратить клики, используя
X-кадр-варианты
- Принуждение всех подключений к HTTPS
- Установка
Политика контекста-Безопасности
заголовок - Отключение
X-Powered-by
заголовок, чтобы злоумышленники не могут сузить свои атаки на определенное программное обеспечение
Вместо того, чтобы вспомнить, чтобы настроить все эти заголовки, шлем установит их все для разумных элементов по умолчанию для вас, и позволит вам настроить те, которые вам нужны.
Это невероятно просто настроить на приложение Express.js:
$ npm install helmet
А затем в вашем коде при настройке Express Добавить:
var helmet = require('helmet'); app.use(helmet());
13. Следите за своими приложениями
Получение уведомления, когда что-то идет не так с вашей заявкой, имеет решающее значение для производственных приложений. Вы не хотите проверять ваш Twitter Feed и увидите, что тысячи злых пользователей, рассказывающих вам, что ваши серверы Down Down или ваше приложение сломано и было за последние несколько часов. Таким образом, наличие чего-то мониторинга и предупреждения вас к критическим вопросам или ненормальным поведению.
Мы уже обсуждали PM2 для управления процессами. Кроме того, это разработчики Keymetrics.io Запустите мониторинг процесса SAAS с интеграцией с PM2, запеченный. Очень просто включить, и у них есть бесплатный план, который является отличной отправной точкой для многих разработчиков. Как только вы зарегистрировались для Keymetrics, вы можете просто запустить:
$ pm2 interact [public_key] [private_key] [machine_name]
Это начнет отправлять данные использования памяти и процессора, а также отчеты об исключениях ключевых метрических серверов для просмотра с их приборной панели. Вы также можете просматривать задержку ваших HTTP-запросов или настроить события, когда возникают проблемы (например, время ожидания в зависимости от времени).
Кроме того, Loggly (что мы упоминали ранее) также обеспечивают мониторинг на основе журналов. Оба инструмента в комбинации могут предоставить вам способ быстро реагировать на проблемы, прежде чем они выйдут из рук.
14. Проверьте свой код
Да, да, да, я знаю, что я должен быть тестированием. TDD и все, что джаз!
Серьезно, тем не менее, тестирование спасет вашу задницу во многих случаях. Как создать любую новую привычку, это больно начать и продолжать в том же духе. Это мешает вашей скорости развития. Тем не менее, я могу поговорить с опытом, что после первых нескольких продуктивных проблем происходит в проекте без тестов, вы пожелаете, чтобы вы имели в первую очередь.
Независимо от того, какой этап вы находитесь в проекте, никогда не поздно ввести тестирование. Мой совет начинается маленький, начать просто. Я также очень рекомендую написать тест на каждую ошибку, которая сообщается. Таким образом, вы знаете:
- Как воспроизвести ошибку (убедитесь, что ваш тест терпит неудачу первым!)
- Что ошибка исправлена (убедитесь, что вы тестируете пропуски после того, как вы исправите проблему)
- Что ошибка никогда не произойдет снова (убедитесь, что вы запускаете свои тесты на каждом новом развертывании)
Есть много библиотек тестирования. Я лично придерживаюсь Жасмин потому что я уже давно использовал, но Моча
, Чай
Или любые другие библиотеки тоже великолепны. Если вы пишете веб-приложение, я бы также очень рекомендую Супертест к черной коробке проверить ваши конечные точки.
Обертывание
И с этим, дамы и господа, это мои номиналы для «лучших лучших практик» Node.js.
Если вы хотите назначить дополнительные лучшие практики Node.js, пожалуйста, сделайте это в комментариях. Давайте сохраним мир проектов Node.js вместе!