company_banner

23 полезнейших Node.js-библиотеки, о которых стоит знать в 2020 году

Original author: Lokender Singh
  • Translation
Профессиональному Node.js-разработчику нужно быть в курсе того, что происходит в сфере пакетов, предназначенных для этой платформы. Ему нужно знать о том, что вышло свежего, и о том, какие пакеты, используемые для решения различных задач, пользуются популярностью. Дело тут в том, что разработка ПО в наши дни зависит от библиотек. Знание хороших библиотек способствует повышению производительности труда программиста и помогает ему разрабатывать качественные приложения. Сегодня мы поговорим о 23 полезных пакетах для Node.js.



1. Express



Express — это быстрый и минималистичный веб-фреймворк для Node.js, который даёт разработчику достаточно большой уровень свободы в деле создания веб-серверов.

2. Socket.io



Socket.io позволяет организовывать в приложениях двусторонние системы обмена данными, работающие в реальном времени и основанные на событиях.

3. Body-parser



Body-parser — это пакет, который позволяет разбирать тела запросов, хранящиеся в req.body, выступая в роли ПО промежуточного слоя для серверов, основанных на Express. Он обрабатывает запросы до их попадания в соответствующие обработчики.

4. Cors



Cors — это пакет, содержащий реализацию ПО промежуточного слоя для Connect/Express, которое позволяет настраивать и использовать CORS.

5. Passport



Passport — это система аутентификации для Node.js, совместимая с Express.

Единственная задача, на решение которой нацелен пакет passport, заключается в аутентификации запросов. Обработка запросов выполняется с использованием настраиваемого набора плагинов, известных как «стратегии».

6. Multer



Multer — это ПО промежуточного слоя для Express, предназначенное для обработки данных типа multipart/form-data. Такие данные, в основном, поступают на сервер при выгрузке файлов. Обратите внимание на то, что эта библиотека не обрабатывает данные, тип которых отличается от multipart/form-data.

7. Axios



Axios — это HTTP-клиент, основанный на промисах и предназначенный для браузеров и для платформы Node.js.

8. Morgan



Morgan — это система логирования HTTP-запросов.

9. Http-errors



Http-errors — это библиотека, позволяющая генерировать HTTP-ошибки. Её можно использовать с различными веб-фреймворками, например — с Express, Koa, Connect.

10. Dotenv



Dotenv — это модуль, у которого нет зависимостей. Он предназначен для загрузки переменных окружения из .env-файла в process.env. Использование этого механизма позволяет хранить настройки приложений отдельно от их кода.

11. Faker



Faker — это библиотека, позволяющая генерировать большие объёмы фиктивных данных. Она подходит для браузеров и для Node.js.

12. Nodemailer



Nodemailer позволяет отправлять из среды Node.js электронные письма. Пользоваться этой библиотекой очень просто.

13. Sequelize



Sequelize — это ORM для СУБД Postgres, MySQL, MariaDB, SQLite и Microsoft SQL Server. Библиотека основана на промисах. При её использовании в распоряжении разработчика оказывается множество надёжных механизмов, упрощающих работу с базами данных.

14. Mongoose



Mongoose — это библиотека, упрощающая работу с СУБД MongoDB. Она поддерживает и промисы, и коллбэки.

15. Jest



Jest — это популярный и хорошо поддерживаемый фреймворк для тестирования JavaScript-проектов, созданный компанией Facebook.

16. Moment



Moment — это компактная JavaScript-библиотека, предназначенная для работы со значениями, представляющими даты. Она позволяет создавать, разбирать, проверять, форматировать подобные значения.

17. Lodash



Lodash — это библиотека, дающая в распоряжение разработчика множество вспомогательных методов, упрощающих работу с массивами, числами, объектами, строками. Эта библиотека имеет модульную структуру. Lodash можно, в частности, использовать для решения следующих задач:

  • Обход массивов, объектов, строк.
  • Манипулирование значениями различных типов и выяснение типов значений.
  • Работа с функциями (например — каррирование и мемоизация).

18. Chalk



Chalk — это пакет, который позволяет стилизовать тексты, выводимые в консоль. Он обладает удобным API.

19. Validator



Validator — это библиотека, предназначенная для проверки и очистки строковых данных.

20. Cheerio



Cheerio позволяет разбирать материалы, представляющие собой HTML- и XML-разметку. Эта библиотека даёт разработчику API для работы с тем, что получилось в результате разбора таких материалов.

21. JSDoc



JSDoc — это система, которая предназначенная для автоматизации создания документации к JavaScript-коду.

22. Helmet



Helmet позволяет программистам защищать Express-приложения, помогая в деле настройки различных HTTP-заголовков.

23. Crypto-js



Crypto-js — это JavaScript-библиотека, содержащая реализации различных криптографических механизмов.

Какие библиотеки для Node.js вы считаете самыми полезными?

RUVDS.com
VDS/VPS-хостинг. Скидка 10% по коду HABR

Comments 32

    +2
    На замену moment автор написал luxon. moment имеет свойство мутировать объекта там где этого совсем не ждёшь
      +1

      Если потратить 15 минут на чтение документации, поведение сразу становится ожидаемым и мутирует он именно там где это описано https://momentjs.com/docs/

        0

        Но никакое чтение документации не упростит использование библиотеки там, где требуются неизменяемые объекты. А это Knockout, React, Mobx, Svelte, возможно даже Angular, даже $mol...

          +2
          Упростит, если вы прочитаете про метод clone и будете его использовать там, где необходима иммутабельность при вызове изменяющих объект методов
          momentjscom.readthedocs.io/en/latest/moment/01-parsing/12-moment-clone
            0

            В том-то и дело, что при работе с moment в перечисленных мною фреймворках и библиотеках писать clone приходится каждый раз, и если забыть это сделать — будет трудноуловимая ошибка. А в luxon получается на один clone меньше.

              –1
              Не благодарите

              const mutableMethods = ['startOf', 'endOf', 'add', 'subtract'] 
              const immutableMethods = ['clone']
                 
              const ignore = Symbol('ignore')
              const immutableAPI = [
                ...mutableMethods.map(name => 
                  [name, function (...args) {
                     this[name + '_ORIGINAL_'](...args)
                     return this.clone()
                  }]
                ),
                
                ...immutableMethods.map(name => 
                  [name, function (...args) { 
                     return immuteMe(this[name + '_ORIGINAL_'](...args))
                  }]
                ),
              ]
              
              const immuteMe = object => {
                 for (const [name, fn] of immutableAPI) {
                   object[name + '_ORIGINAL_'] = object[name]
                   object[name] = fn.bind(object)   
                 }
                 return object
              }
              
              // Вызываем вместо moment
              export const immutableMoment = param => immuteMe(moment(param))  
              
              // Тесты
              let today = moment()
              console.log('normal: ', today === today.startOf('day')) // true
              
              today = immutableMoment()
              console.log('immutable: ', today === today.startOf('day')) // false
                0

                И в итоге получаем нечто, что работает не так как написано в документации, зато медленно? Не проще ли luxon взять?

                  0
                  Ну естественно копирование объектов будет работать медленнее, чем мутабельные объекты. Это же просто априори.

                  Ну мне например не проще взять luxon, поскольку к методам moment я привык, мне проще было написать несколько строк кода. Но я почитаю про luxon, спасибо.
                    0

                    Тут проблема не в самом копировании, а в том как вы переопределяете у объекта все методы. Хоть бы прототип подменяли! (хотя эта операция тоже не самая быстрая)

                      0
                      То есть вы считаете, что подмена нескольких методов дороже по производительности чем копирование всего объекта? Интересный и очень оригинальный взгляд на вещи. Я вас удивлю: код где мы создаем объект и вызываем startOf будет работать примерно в два раза дольше (что по правде говоря не критично, на 100 000 вызовов это полсекунды на каком нибудь среднем компьютере). Из них 30% увеличения будет на совести копирования методов и 70% на совести иммутабельности.

                      Прототипом у создаваемого через moment() объекта является класс, используемый moment-ом, подмена в нем методов крайне не рекомендуется методологически. По хорошему можно унаследовать класс и делать на нем, но если проигрыш во времени копеечный (2 десятых секунды на 100 000 созданий и вызовов метода) — можно и так оставить.
                        0

                        "Весь объект" — это всего-то 11 приватных свойств. А подменить вам надо около 30 методов. Плюс вы зачем-то сохраняете оригинальные методы в объекте, а не в замыкании, отсюда ещё двухкратное увеличение их числа. 60 значительно больше 11, так что да — затраты на подмену методов, по моей оценке, превосходят затраты на клонирование объекта.


                        Кстати, в luxon используется всего 6 приватных свойств.

                          0
                          Тем более если копирование написано неоптимально, значит его можно переписать так, чтобы потеря производительности была еще незаметней. Про подмену 30 методов я не очень понял. Зачем вам мутабельность при каждом методе? Понимаю те 4 что я упомянул плюс clone, остальные то зачем подменять? Окей, спасибо за беседу.
                            0

                            Ну а что ещё делать с setXXX-методами? Оставлять как есть что ли? Запрещать использовать?

                              0
                              moment().hours(20).minutes(0).seconds(0)


                              Возможен же такой код? Если при вызове каждого метода объект будет копироваться, это будет странно. Я бы подменил только сам set, но это все дело вкуса. Смысл был показать, что приспособить moment под иммутабельность недолго и не критичные потери производительности. 100% полагаю для программирования ничто.
        +1
        Тогда я бы рекомендовал date-fns
          0
          Лично я считаю что экспортирование отдельных функций вместо полноценных классов это не удачный дизайн для большинства библиотек и соответственно date-fns не рекомендую.
            0

            В погоне за уменьшением размеров бандла библиотека с набором отдельных функций выглядит привлекательней монолитного класса. Особенно, когда в проекте просто необходимо форматнуть пару дат, пришедших с бэкенда. Именно размер заставил меня отвернуться от moment в сторону date-fns

              0
              date-fns — это функциональный подход. Классы не наше всё.
          +3
          Скриншоты, конечно, супер-информативны. Впрочем, как и описание.
            +6
            <s>Вау, Express, даже и не знал, что такое есть...</s>
              0
              Начал изучать Express и отталкивает простота создание серверной части. У меня вечно такое чуство что я пишу максимально глупо и неправильно, может кто посоветовать где можно почитать про лучшие техники в создании api с использованием node.js + express.js. Вот серьезно, после ангуляра это кажется слишком просто. В своё время изучал Laravel и там не было так просто, как в node.js, тоже свои сложности и нюансы, хорошая документация, которая показывает как лучше сделать то или иную фичу
                +2

                Посмотрите в сторону nest.js.

                  0
                  Просто Express не сравнить по функциональности с php-шными фреймворками, поэтому все проще
                  +1
                  Moment — это компактная JavaScript-библиотека

                  Ha-ha


                  Добавьте в следующий такой же обзор luxon и date-fns.

                    0
                    Почему хаха? Типа не компактная?
                      +2
                      Я бы написал как ha-Ha… с намеком на все локали в momentjs, которые не вырезать и все они упаковываются в итоговый бандл
                        0

                        Локали можно вырезать, это не сложно

                    +2

                    Заходил в ожидании новых, свежих, набирающих популярность библиотек. Получил список того что и 5 лет назад было, про Express так вообще.

                      0

                      может и не в тему, но: typescript, ts-node, webpack, mocha

                        +1

                        Что тут есть из 2020? Всё это было и в 2017.

                          0

                          Встроенный мидлвар express.json() базируется на body-parser, его не нужно ставить отдельно

                            0

                            Интересное наблюдение. Если в 2008 русские ребята писали сами качественные статьи и ревьювили код индусских программистов, то в 2020 переводят статьи с английского языка, написанные индусами.

                            Only users with full accounts can post comments. Log in, please.