Десятилетие влияния: как наши пакеты npm достигли 1 миллиарда загрузок и сформировали JavaScript

Предисловие

В мире JavaScript и Node.js некоторые пакеты просто необходимы: их скачивают миллионы раз ежедневно и они обеспечивают работу приложений по всему миру. За этими инструментами стоят разработчики, ориентированные на качество открытого исходного кода. Сегодня мы расскажем, как наша команда помогает создавать и поддерживать пакеты npm, которые стали ключевыми элементами экосистемы JavaScript.

Пионеры, которые нам доверяют: Исаак З. Шлютер и пересылающее письмо

Мы гордимся тем, что у нас есть пользователь Исаак З. Шлютер (GitHub: isaacs). Айзек создал [нпм](https://en.wikipedia.org/wiki/Npm_\(software\) и помог создать Node.js. Его доверие к Forward Email свидетельствует о нашем стремлении к качеству и безопасности. Айзек использует Forward Email для нескольких доменов, включая izs.me.

Влияние Айзека на JavaScript огромно. В 2009 году он был одним из первых, кто увидел потенциал Node.js, работая с Райан Даль, создателем этой платформы. Как сказал Айзек в интервью журналу Increment: «В разгар этого очень небольшого сообщества, состоящего из группы людей, пытающихся понять, как реализовать серверный JavaScript, Райан Даль представил Node, что, безусловно, было правильным подходом. Я вложил в это свои силы и включился в разработку примерно в середине 2009 года».

Note

Для тех, кто интересуется историей Node.js, доступны отличные документальные фильмы, рассказывающие о его развитии, включая История Node.js и 10 вещей, о которых я сожалею в Node.js — Райан Даль. личный сайт Райана Даля также содержит ценную информацию о его работе.

От создания npm до лидерства в Node.js

Айзек создал npm в сентябре 2009 года, а первая рабочая версия была выпущена в начале 2010 года. Этот менеджер пакетов удовлетворил ключевую потребность Node.js, позволив разработчикам легко обмениваться и повторно использовать код. Согласно Страница Node.js в Википедии, «в январе 2010 года для среды Node.js был представлен менеджер пакетов npm. Менеджер пакетов позволяет программистам публиковать и обмениваться пакетами Node.js вместе с исходным кодом и предназначен для упрощения установки, обновления и удаления пакетов».

Когда Райан Даль покинул Node.js в январе 2012 года, Айзек занял пост руководителя проекта. Как отмечено в его резюме, он «руководил разработкой нескольких фундаментальных API Node.js, включая модульную систему CommonJS, API файловой системы и потоки» и «выступал в качестве пожизненного благожелательного диктатора проекта в течение двух лет, обеспечивая постоянное повышение качества и надёжность процесса сборки для версий Node.js v0.6 – v0.10».

Айзек руководил Node.js в ключевой период роста, задавая стандарты, которые и по сей день определяют платформу. Позже, в 2014 году, он основал компанию npm, Inc. для поддержки реестра npm, которым ранее занимался самостоятельно.

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

Архитектор кода: путешествие Ника Бо

В основе нашего успеха в области открытого исходного кода лежит Ник Бо, основатель и владелец Forward Email. Его работа с JavaScript длится почти 20 лет и повлияла на то, как бесчисленное множество разработчиков создают приложения. Его опыт работы с открытым исходным кодом демонстрирует как технические навыки, так и лидерские качества в сообществе.

Экспресс-технический комитет и основные вклады

Благодаря своему опыту в веб-фреймворках Ник получил место в Экспресс Технический Комитет, где он помогал с одним из самых популярных фреймворков Node.js. Сейчас Ник числится неактивным участником в Страница сообщества Экспресс.

Important

Express изначально был создан Т. Дж. Головайчуком, активным участником проектов с открытым исходным кодом, который во многом сформировал экосистему Node.js. Мы благодарны Т. Дж. за его основополагающую работу и уважаем его вклад в разработку проектов с открытым исходным кодом.

Будучи членом Экспресс Технический Комитет, Ник уделял большое внимание деталям в таких вопросах, как уточнение документации req.originalUrl и устранение проблем с обработкой многокомпонентных форм.

Вклад в фреймворк Koa

Работа Ника с Фреймворк Koa — современной и облегчённой альтернативой Express, также созданной Т. Дж. Головайчуком, — ещё раз демонстрирует его стремление к совершенствованию инструментов веб-разработки. Его вклад в Koa включает в себя как решение проблем, так и код, предоставляемый через запросы на извлечение, обработку ошибок, управление типами контента и улучшение документации.

Его работа в Express и Koa дает ему уникальный взгляд на веб-разработку Node.js, помогая нашей команде создавать пакеты, которые хорошо работают с различными экосистемами фреймворков.

От индивидуального участника к руководителю организации

То, что начиналось как помощь существующим проектам, переросло в создание и поддержку целых экосистем пакетов. Ник основал несколько организаций на GitHub, включая Кабина, Спам-сканер, Переслать электронное письмо, Парень и Бри, каждая из которых решает конкретные задачи сообщества JavaScript.

Этот переход от роли участника к роли лидера демонстрирует видение Ника в отношении качественного программного обеспечения, решающего реальные проблемы. Организуя связанные пакеты в рамках специализированных организаций GitHub, он создал экосистемы инструментов, которые работают вместе, сохраняя при этом модульность и гибкость для более широкого сообщества разработчиков.

Наши организации GitHub: Экосистемы инноваций

Мы организуем нашу работу над открытым исходным кодом вокруг специализированных организаций на GitHub, каждая из которых решает конкретные задачи в JavaScript. Такая структура создаёт сплочённые семейства пакетов, которые хорошо взаимодействуют друг с другом, сохраняя при этом модульность.

Cabin: Структурированное ведение журнала для современных приложений

Организация каюты — это наш подход к простому и эффективному ведению журналов приложений. Основной пакет cabin имеет почти 900 звёзд на GitHub и более 100 000 еженедельных загрузок[1]. Cabin обеспечивает структурированное ведение журналов, работающее с такими популярными сервисами, как Sentry, LogDNA и Papertrail.

Cabin выделяется продуманным API и системой плагинов. Поддержка таких пакетов, как axe для промежуточного ПО Express и parse-request для анализа HTTP-запросов, демонстрирует нашу приверженность комплексным решениям, а не изолированным инструментам.

Особого упоминания заслуживает пакет bson-objectid, который всего за два месяца скачали более 1,7 миллиона раз[2]. Эта лёгкая реализация ObjectID в MongoDB стала незаменимым инструментом для разработчиков, которым нужны идентификаторы без полноценной зависимости от MongoDB.

Спам-сканер: борьба со злоупотреблением электронной почтой

Пакет Организация спам-сканера демонстрирует нашу приверженность решению реальных проблем. Основной пакет spamscanner обеспечивает расширенное обнаружение спама в электронной почте, но именно пакет url-regex-safe получил впечатляющее распространение.

url-regex-safe, получивший более 1,2 миллиона загрузок за два месяца[3], устраняет критические проблемы безопасности в других регулярных выражениях обнаружения URL-адресов. Этот пакет демонстрирует наш подход к открытому исходному коду: поиск распространённой проблемы (в данном случае уязвимостей RedoS в проверке URL-адресов), создание надёжного решения и его тщательная поддержка.

Бри: Современное планирование заданий с рабочими потоками

Организация Бри — наш ответ на распространённую проблему Node.js: надёжное планирование заданий. Основной пакет bree, набравший более 3100 звёзд на GitHub, представляет собой современный планировщик заданий, использующий рабочие потоки Node.js для повышения производительности и надёжности.

Note

Бри была создана после того, как мы помогли поддерживать Повестка дня, применяя полученный опыт для создания более эффективного планировщика заданий. Наш вклад в Agenda помог нам найти способы улучшить планирование заданий.

Что отличает Bree от других планировщиков, таких как Agenda:

  • Отсутствие внешних зависимостей: В отличие от Agenda, которому требуется MongoDB, Bree не требует Redis или MongoDB для управления состоянием заданий.
  • Рабочие потоки: Bree использует рабочие потоки Node.js для изолированных процессов, обеспечивая лучшую изоляцию и производительность.
  • Простой API: Bree предлагает детальный контроль и простоту, упрощая реализацию сложных задач планирования.
  • Встроенная поддержка: Такие функции, как плавная перезагрузка, задания cron, даты и удобное для пользователя время, включены по умолчанию.

Бри — ключевой компонент forwardemail.net, выполняющий критически важные фоновые задачи, такие как обработка электронной почты, очистка и плановое обслуживание. Использование Бри для пересылки электронной почты демонстрирует нашу приверженность использованию собственных инструментов в производстве, гарантируя их соответствие высоким стандартам надежности.

Мы также используем и высоко ценим другие замечательные пакеты рабочих потоков, такие как бассейн, и HTTP-клиенты, такие как одиннадцать. Piscina, как и Бри, использует рабочие потоки Node.js для эффективной обработки задач. Мы благодарим Мэтью Хилл, который поддерживает undici и piscina, за его значительный вклад в Node.js. Маттео входит в Технический руководящий комитет Node.js и значительно улучшил возможности HTTP-клиента в Node.js.

Пересылка электронной почты: инфраструктура электронной почты с открытым исходным кодом

Наш самый амбициозный проект — Переслать электронное письмо, почтовый сервис с открытым исходным кодом, предоставляющий услуги пересылки, хранения и API электронной почты. Основной репозиторий имеет более 1100 звёзд на GitHub[4], что свидетельствует о высокой оценке сообществом этой альтернативы проприетарным почтовым сервисам.

Пакет preview-email от этой организации, скачанный более 2,5 миллионов раз за два месяца[5], стал незаменимым инструментом для разработчиков, работающих с шаблонами электронных писем. Предоставляя простой способ предварительного просмотра писем во время разработки, он решает распространённую проблему при создании приложений с поддержкой электронной почты.

Парень: Основные утилиты и инструменты Koa

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

koa-better-error-handler: Улучшенная обработка ошибок для Koa

koa-better-error-handler предлагает улучшенное решение для обработки ошибок в приложениях Koa. Этот пакет, получивший более 50 звёзд на GitHub, позволяет ctx.throw выдавать понятные сообщения об ошибках, одновременно устраняя ряд ограничений встроенного обработчика ошибок Koa:

  • Обнаруживает и корректно обрабатывает ошибки DNS Node.js, ошибки Mongoose и ошибки Redis
  • Использует Бум для создания согласованных, хорошо отформатированных ответов об ошибках
  • Сохраняет заголовки (в отличие от встроенного обработчика Koa)
  • Поддерживает корректные коды состояния, а не код по умолчанию 500
  • Поддерживает флэш-сообщения и сохранение сеанса
  • Предоставляет списки ошибок HTML для ошибок валидации
  • Поддерживает несколько типов ответов (HTML, JSON и простой текст)

Этот пакет особенно ценен при использовании вместе с koa-404-handler для комплексного управления ошибками в приложениях Koa.

Паспорт ####: Аутентификация для парня

@ladjs/passport расширяет возможности популярного промежуточного ПО аутентификации Passport.js, добавляя специальные улучшения для современных веб-приложений. Этот пакет поддерживает несколько стратегий аутентификации «из коробки»:

  • Локальная аутентификация с помощью электронной почты
  • Вход через Apple
  • Аутентификация GitHub
  • Аутентификация Google
  • Аутентификация с помощью одноразового пароля (OTP)

Пакет обладает широкими возможностями настройки, позволяя разработчикам корректировать названия полей и фразы в соответствии с требованиями своего приложения. Он легко интегрируется с Mongoose для управления пользователями, что делает его идеальным решением для приложений на базе Koa, которым требуется надежная аутентификация.

graceful: элегантное завершение работы приложения

@ladjs/graceful решает важнейшую задачу корректного завершения работы приложений Node.js. Этот пакет, получивший более 70 звёзд на GitHub, гарантирует корректное завершение работы вашего приложения без потери данных и зависания подключений. Ключевые особенности:

  • Поддержка корректного закрытия HTTP-серверов (Express/Koa/Fastify)
  • Корректное завершение подключений к базе данных (MongoDB/Mongoose)
  • Корректное закрытие клиентов Redis
  • Обработка планировщиков заданий Bree
  • Поддержка настраиваемых обработчиков завершения
  • Настраиваемые параметры тайм-аута
  • Интеграция с системами журналирования

Этот пакет необходим для производственных приложений, где непредвиденные отключения могут привести к потере или повреждению данных. Реализуя правильные процедуры отключения, @ladjs/graceful помогает обеспечить надежность и стабильность вашего приложения.

Upptime: Мониторинг времени бесперебойной работы с открытым исходным кодом

Организация бесперебойной работы отражает нашу приверженность прозрачному мониторингу с открытым исходным кодом. Основной репозиторий upptime имеет более 13 000 звёзд на GitHub, что делает его одним из самых популярных проектов, в которые мы вносим свой вклад. Upptime предоставляет мониторинг работоспособности и страницу состояния на базе GitHub, работающую без сервера.

Мы используем Upptime для нашей собственной страницы статуса по адресу https://status.forwardemail.net с исходным кодом, доступным по адресу https://github.com/forwardemail/status.forwardemail.net.

Особенным Upptime делает его архитектура:

  • 100% открытый исходный код: Каждый компонент имеет полностью открытый исходный код и может быть настроен.
  • Работает на GitHub: Использует GitHub Actions, Issues и Pages для бессерверного мониторинга.
  • Не требует сервера: В отличие от традиционных инструментов мониторинга, Upptime не требует запуска или обслуживания сервера.
  • Автоматическая страница состояния: Создаёт красивую страницу состояния, которую можно разместить на GitHub Pages.
  • Мощные уведомления: Интегрируется с различными каналами уведомлений, включая электронную почту, SMS и Slack.

Для улучшения пользовательского опыта мы интегрировали @octokit/core в кодовую базу forwardemail.net, чтобы отображать обновления статуса и информацию об инцидентах в режиме реального времени непосредственно на нашем сайте. Эта интеграция обеспечивает пользователям полную прозрачность в случае возникновения проблем во всех наших системах (сайт, API, MongoDB, Redis, SQLite, SMTP, POP3, IMAP, Bree и т. д.) благодаря мгновенным всплывающим уведомлениям, изменению значков, цветов предупреждений и другим функциям.

Библиотека @octokit/core позволяет нам получать данные в режиме реального времени из нашего репозитория Upptime GitHub, обрабатывать их и отображать в удобном для пользователя виде. В случае сбоя или снижения производительности какого-либо сервиса пользователи мгновенно получают визуальные уведомления, не выходя из основного приложения. Эта бесшовная интеграция гарантирует, что наши пользователи всегда будут иметь актуальную информацию о состоянии нашей системы, что повышает прозрачность и доверие.

Сотни организаций, которым нужен прозрачный и надёжный способ мониторинга своих сервисов и информирования пользователей о состоянии сервисов, уже внедрили Upptime. Успех проекта демонстрирует эффективность создания инструментов, использующих существующую инфраструктуру (в данном случае GitHub) для решения распространённых задач новыми способами.

Наш вклад в экосистему пересылки электронной почты

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

Из пакетов в производство

Переход от отдельных пакетов к целостной производственной системе требует тщательной интеграции и расширения. Для пересылки электронных писем этот процесс включает:

  • Пользовательские расширения: Разработка расширений Forward Email для наших пакетов с открытым исходным кодом, отвечающих нашим уникальным требованиям.
  • Шаблоны интеграции: Разработка шаблонов взаимодействия этих пакетов в производственной среде.
  • Оптимизация производительности: Выявление и устранение узких мест производительности, возникающих только при масштабировании.
  • Усиление безопасности: Добавление дополнительных уровней безопасности, специфичных для обработки электронной почты и защиты пользовательских данных.

Эта работа потребовала тысяч часов разработки, выходящих за рамки основных пакетов, что привело к созданию надежной и безопасной службы электронной почты, которая использует все лучшее из наших вкладов в области ПО с открытым исходным кодом.

Цикл обратной связи

Возможно, самый ценный аспект использования наших собственных пакетов в рабочей среде — это создаваемый ими цикл обратной связи. Когда мы сталкиваемся с ограничениями или особыми ситуациями в пересылке электронной почты, мы не просто устраняем их локально, а улучшаем базовые пакеты, что приносит пользу как нашему сервису, так и всему сообществу.

Такой подход привел к многочисленным улучшениям:

  • Мягкое завершение работы Bree: Необходимость развертывания Forward Email без простоев привела к расширению возможностей постепенного завершения работы Bree.
  • Распознавание шаблонов в Spam Scanner: Реальные шаблоны спама, обнаруженные в Forward Email, легли в основу алгоритмов обнаружения Spam Scanner.
  • Оптимизация производительности Cabin: Высокообъемное журналирование в рабочей среде выявило возможности оптимизации Cabin, которые выгодны всем пользователям.

Поддерживая этот эффективный цикл между нашей работой с открытым исходным кодом и производственным сервисом, мы гарантируем, что наши пакеты остаются практичными, проверенными на практике решениями, а не теоретическими реализациями.

Основные принципы пересылки электронных писем: основа совершенства

Система пересылки электронных писем разработана в соответствии с набором основных принципов, которыми мы руководствуемся при принятии всех решений в области разработки. Эти принципы, подробно описанные в документе веб-сайт, гарантируют, что наш сервис остаётся удобным для разработчиков, безопасным и ориентированным на конфиденциальность пользователей.

Всегда удобный для разработчиков, ориентированный на безопасность и прозрачный

Наш главный принцип — создавать программное обеспечение, удобное для разработчиков, при этом соблюдая высочайшие стандарты безопасности и конфиденциальности. Мы считаем, что техническое совершенство никогда не должно идти в ущерб удобству использования, а прозрачность укрепляет доверие к нашему сообществу.

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

Соблюдение проверенных временем принципов разработки программного обеспечения

Мы следуем нескольким устоявшимся принципам разработки программного обеспечения, которые доказали свою ценность за десятилетия:

  • MVC: Разделение задач с помощью шаблона «Модель-Представление-Контроллер»
  • Философия Unix: Создание модульных компонентов, которые хорошо выполняют одну задачу
  • KISS: Простота и понятность
  • DRY: Не повторяйтесь, способствуя повторному использованию кода
  • YAGNI: Вам это не понадобится, избегая преждевременной оптимизации
  • Двенадцать факторов: Следование лучшим практикам для создания современных масштабируемых приложений
  • Бритва Оккама: Выбор наиболее простого решения, отвечающего требованиям
  • Догфудинг: Широкое использование собственных продуктов

Эти принципы — не просто теоретические концепции, они внедрены в нашу повседневную практику разработки. Например, наша приверженность философии Unix очевидна в том, как мы структурировали наши пакеты npm: небольшие, узкоспециализированные модули, которые можно объединять для решения сложных задач.

Ориентирован на инициативных разработчиков

Мы ориентированы на разработчиков, которые не спешат разрабатывать собственные продукты, и на разработчиков, которые находятся в состоянии рамен-прибыльный. Этот подход определяет всё: от нашей модели ценообразования до технических решений. Мы понимаем сложности разработки продуктов в условиях ограниченных ресурсов, потому что сами прошли через это.

Этот принцип особенно важен в нашем подходе к открытому исходному коду. Мы создаём и поддерживаем пакеты, которые решают реальные проблемы разработчиков без корпоративного бюджета, делая мощные инструменты доступными для всех, независимо от их ресурсов.

Принципы на практике: Кодовая база пересылки электронной почты

Эти принципы чётко прослеживаются в кодовой базе Forward Email. Наш файл package.json демонстрирует продуманный набор зависимостей, каждая из которых соответствует нашим основным ценностям:

  • Пакеты, ориентированные на безопасность, такие как mailauth для аутентификации электронной почты
  • Удобные для разработчиков инструменты, такие как preview-email, для упрощения отладки
  • Модульные компоненты, такие как различные утилиты p-* от Синдре Сорхуса

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

Конфиденциальность по замыслу

Конфиденциальность — это не второстепенная задача или маркетинговая функция для пересылки электронной почты, а основополагающий принцип проектирования, который определяет каждый аспект нашего сервиса и кода:

  • Шифрование с нулевым доступом: Мы внедрили системы, которые делают чтение электронных писем пользователей технически невозможным.
  • Минимальный сбор данных: Мы собираем только те данные, которые необходимы для предоставления наших услуг, и ничего лишнего.
  • Прозрачные политики: Наша политика конфиденциальности написана понятным языком без использования юридических терминов.
  • Проверка открытого исходного кода: Наша база открытого исходного кода позволяет специалистам по безопасности проверять наши заявления о конфиденциальности.

Это обязательство распространяется и на наши пакеты с открытым исходным кодом, которые изначально разрабатываются с учетом лучших практик обеспечения безопасности и конфиденциальности.

Устойчивый открытый исходный код

Мы считаем, что для долгосрочного процветания программного обеспечения с открытым исходным кодом необходимы устойчивые модели. Наш подход включает в себя:

  • Коммерческая поддержка: Премиум-поддержка и услуги, связанные с нашими инструментами с открытым исходным кодом.
  • Сбалансированное лицензирование: Использование лицензий, защищающих как свободы пользователей, так и устойчивость проекта.
  • Взаимодействие с сообществом: Активное взаимодействие с участниками для создания поддерживающего сообщества.
  • Прозрачные дорожные карты: Предоставление доступа к нашим планам разработки, чтобы пользователи могли планировать соответствующим образом.

Сосредоточившись на устойчивом развитии, мы гарантируем, что наши вклады в разработку ПО с открытым исходным кодом будут продолжать расти и совершенствоваться с течением времени, а не будут заброшены.

Цифры не лгут: наша ошеломляющая статистика загрузок npm

Когда мы говорим о влиянии программного обеспечения с открытым исходным кодом, статистика загрузок служит ощутимым показателем уровня принятия и доверия. Многие пакеты, которые мы поддерживаем, достигли масштабов, которых редко достигают проекты с открытым исходным кодом: общее количество загрузок исчисляется миллиардами.

Лучшие пакеты npm по количеству загрузок

Important

Мы гордимся тем, что помогаем поддерживать несколько популярных пакетов в экосистеме JavaScript, но хотим отметить, что многие из них изначально были созданы другими талантливыми разработчиками. Такие пакеты, как superagent и supertest, изначально были созданы TJ Holowaychuk, чей плодотворный вклад в развитие открытого исходного кода сыграл решающую роль в формировании экосистемы Node.js.

Вид с высоты птичьего полета на наше влияние

Всего за два месяца с февраля по март 2025 года ведущие пакеты, в разработке и поддержке которых мы принимали участие, зафиксировали ошеломляющие показатели загрузок:

Note

Несколько других пакетов, которые мы поддерживаем, но не создавали, имеют ещё большее количество загрузок, включая form-data (более 738 млн загрузок), toidentifier (более 309 млн загрузок), stackframe (более 116 млн загрузок) и error-stack-parser (более 113 млн загрузок). Для нас большая честь вносить свой вклад в эти пакеты, уважая при этом труд их авторов.

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

Распределение категорий пакетов

Ежедневное воздействие в масштабе

Ежедневные тенденции загрузок демонстрируют стабильно высокий уровень использования, достигающий миллионов загрузок в день[22]. Эта стабильность говорит о стабильности и надежности этих пакетов — разработчики не просто тестируют их, а интегрируют в свои основные рабочие процессы и используют их изо дня в день.

Еженедельные тенденции загрузок демонстрируют ещё более впечатляющие цифры, стабильно колеблясь около десятков миллионов загрузок в неделю[23]. Это свидетельствует о колоссальном влиянии на экосистему JavaScript, поскольку эти пакеты работают в производственных средах по всему миру.

За пределами сырых цифр

Хотя статистика загрузок сама по себе впечатляет, она красноречивее говорит о доверии сообщества к этим пакетам. Поддержание такого масштаба пакетов требует неукоснительного соблюдения следующих принципов:

  • Обратная совместимость: Изменения должны быть тщательно продуманы, чтобы избежать нарушения существующих реализаций.
  • Безопасность: Поскольку от этих пакетов зависят миллионы приложений, уязвимости безопасности могут иметь далеко идущие последствия.
  • Производительность: В таком масштабе даже незначительное улучшение производительности может дать значительный совокупный эффект.
  • Документация: Понятная и исчерпывающая документация необходима для пакетов, используемых разработчиками любого уровня опыта.

Постоянный рост числа загрузок с течением времени отражает успешное выполнение этих обязательств и укрепление доверия со стороны сообщества разработчиков посредством надежных, хорошо поддерживаемых пакетов.

Поддержка экосистемы: наше спонсорство открытого исходного кода

Tip

Устойчивое развитие открытого исходного кода — это не только предоставление кода, но и поддержка разработчиков, которые обслуживают критически важную инфраструктуру.

Помимо нашего прямого вклада в экосистему JavaScript, мы гордимся тем, что поддерживаем выдающихся разработчиков Node.js, чьи работы легли в основу многих современных приложений. Мы спонсорствуем:

Андрис Рейнман: пионер инфраструктуры электронной почты

Андрис Рейнман — создатель Nodemailer, самой популярной библиотеки для отправки электронной почты на Node.js, скачанной более чем 14 миллионов раз в неделю[24]. Его работа распространяется и на другие критически важные компоненты инфраструктуры электронной почты, такие как SMTP-сервер, Mailparser и WildDuck.

Наша спонсорская поддержка помогает обеспечить постоянную поддержку и развитие этих важных инструментов, которые обеспечивают работу электронной почты для бесчисленных приложений Node.js, включая нашу собственную службу пересылки электронной почты.

Синдре Сорхус: вдохновитель пакета служебных программ

Синдре Сорхус — один из самых активных разработчиков открытого кода в экосистеме JavaScript, создавший более 1000 npm-пакетов. Его утилиты, такие как p-карта, p-повтор и is-stream, являются основополагающими строительными блоками, используемыми во всей экосистеме Node.js.

Спонсируя работу Синдре, мы помогаем поддерживать разработку этих важнейших утилит, которые делают разработку JavaScript более эффективной и надежной.

Эти спонсорские контракты отражают нашу приверженность более широкой экосистеме открытого исходного кода. Мы осознаём, что наш успех основан на фундаменте, заложенном этими и другими участниками, и стремимся обеспечить устойчивость всей экосистемы.

Выявление уязвимостей безопасности в экосистеме JavaScript

Наша приверженность принципам открытого исходного кода выходит за рамки разработки функций и включает в себя выявление и устранение уязвимостей безопасности, которые могут повлиять на миллионы разработчиков. Некоторые из наших наиболее значимых вкладов в экосистему JavaScript связаны с безопасностью.

Спасение Koa-Router

В феврале 2019 года Ник обнаружил критическую проблему с поддержкой популярного пакета koa-router. Поскольку он имел статус сообщил на Hacker News, пакет был заброшен первоначальным разработчиком, что оставило уязвимости безопасности неустранёнными, а сообщество — без обновлений.

Warning

Заброшенные пакеты с уязвимостями безопасности представляют значительную угрозу для всей экосистемы, особенно если их загружают миллионы раз в неделю.

В ответ на это Ник создал @koa/router и помог оповестить сообщество о ситуации. С тех пор он поддерживает этот критически важный пакет, обеспечивая пользователям Koa безопасное и хорошо поддерживаемое решение для маршрутизации.

Устранение уязвимостей ReDoS

В 2020 году Ник обнаружил и устранил критическую уязвимость Отказ в обслуживании с использованием регулярных выражений (ReDoS) в широко используемом пакете url-regex. Эта уязвимость (SNYK-JS-URLREGEX-569472) позволяла злоумышленникам вызвать отказ в обслуживании, предоставляя специально созданные входные данные, которые вызывали катастрофический возврат в регулярном выражении.

Вместо того, чтобы просто исправить существующий пакет, Ник создал url-regex-safe — полностью переписанную реализацию, которая устраняет уязвимость, сохраняя совместимость с исходным API. Он также опубликовал подробный пост в блоге с описанием уязвимости и способами её устранения.

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

Пропаганда безопасности Node.js и Chromium

Ник также активно выступал за повышение безопасности в экосистеме в целом. В августе 2020 года он обнаружил серьёзную проблему безопасности в Node.js, связанную с обработкой HTTP-заголовков, о которой сообщалось в Регистр.

Эта проблема, возникшая из-за патча в Chromium, потенциально могла позволить злоумышленникам обойти меры безопасности. Благодаря поддержке Ника проблема была оперативно решена, что позволило защитить миллионы приложений Node.js от потенциальной эксплуатации.

Обеспечение безопасности инфраструктуры npm

Позже в том же месяце Ник обнаружил ещё одну критическую уязвимость безопасности, на этот раз в инфраструктуре электронной почты npm. Как сообщалось в Регистр, npm некорректно реализовывал протоколы аутентификации электронной почты DMARC, SPF и DKIM, что потенциально позволяло злоумышленникам отправлять фишинговые письма, выдаваемые за письма от npm.

Отчет Ника привел к улучшению состояния безопасности электронной почты npm, защитив миллионы разработчиков, которые полагаются на npm для управления пакетами, от потенциальных фишинговых атак.

Наш вклад в экосистему пересылки электронной почты

Forward Email создан на основе нескольких важных проектов с открытым исходным кодом, включая Nodemailer, WildDuck и mailauth. Наша команда внесла значительный вклад в эти проекты, помогая выявлять и устранять серьёзные проблемы, влияющие на доставку и безопасность электронной почты.

Расширение основных функций Nodemailer

Nodemailer — это основа отправки электронной почты в Node.js, и наш вклад помог сделать ее более надежной:

  • Улучшения SMTP-сервера: Мы исправили ошибки парсинга, проблемы с обработкой потоков и проблемы с настройкой TLS в компоненте SMTP-сервера[25][26].
  • Улучшения парсера почты: Мы исправили ошибки декодирования последовательности символов и проблемы парсера, которые могли приводить к сбоям в обработке электронной почты[27][28].

Благодаря этим вкладам Nodemailer по-прежнему остается надежной основой для обработки электронной почты в приложениях Node.js, включая пересылку электронной почты.

Расширенная аутентификация электронной почты с помощью Mailauth

Майлаут обеспечивает критически важную функциональность аутентификации электронной почты, и наши предложения значительно улучшили ее возможности:

  • Улучшения проверки DKIM: Мы обнаружили и сообщили о проблемах с кэшем DNS в X/Twitter, приводящих к сбоям DKIM для исходящих сообщений, и сообщили об этом на Hacker One[29].

  • Улучшения DMARC и ARC: Мы исправили проблемы с проверкой DMARC и ARC, которые могли приводить к неверным результатам аутентификации[30][31].

  • Оптимизация производительности: Мы внесли улучшения, повышающие производительность процессов аутентификации электронной почты[32][33][34][35].

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

Ключевые улучшения времени бесперебойной работы

Наш вклад в Upptime включает:

  • Мониторинг SSL-сертификатов: Мы добавили функцию отслеживания истечения срока действия SSL-сертификатов, предотвращая непредвиденные простои из-за просроченных сертификатов[36].
  • Поддержка нескольких SMS-номеров: Мы реализовали поддержку оповещения нескольких членов команды по SMS при возникновении инцидентов, что сокращает время реагирования[37].
  • Исправления проверки IPv6: Мы исправили проблемы с проверкой подключения IPv6, обеспечив более точный мониторинг в современных сетевых средах[38].
  • Поддержка темного/светлого режимов: Мы добавили поддержку тем для улучшения пользовательского опыта на страницах состояния[39].
  • Улучшенная поддержка TCP-Ping: Мы улучшили функцию TCP-Ping для более надежного тестирования соединения[40].

Эти улучшения не только улучшают мониторинг статуса Forward Email, но и доступны всему сообществу пользователей Upptime, демонстрируя нашу приверженность совершенствованию инструментов, от которых мы зависим.

Клей, который держит все вместе: масштабируемый пользовательский код

Хотя наши пакеты npm и вклад в существующие проекты весьма значительны, именно собственный код, интегрирующий эти компоненты, по-настоящему демонстрирует наш технический опыт. Кодовая база Forward Email представляет собой десятилетие разработки, начиная с 2017 года, когда проект начинался под именем бесплатная пересылка электронной почты, а затем был объединён в монорепозиторий.

Масштабные усилия по разработке

Масштаб этого кода пользовательской интеграции впечатляет:

  • Общий вклад: Более 3217 коммитов
  • Размер кодовой базы: Более 421 545 строк кода в файлах JavaScript, Pug, CSS и JSON[^33]

Это тысячи часов разработки, отладки и оптимизации производительности. Это тот самый «секретный ингредиент», который превращает отдельные пакеты в целостный и надёжный сервис, которым ежедневно пользуются тысячи клиентов.

Интеграция основных зависимостей

Кодовая база Forward Email объединяет многочисленные зависимости в единое целое:

  • Обработка электронной почты: Интеграция Nodemailer для отправки, SMTP-сервера для получения и Mailparser для анализа.
  • Аутентификация: Использование Mailauth для проверки DKIM, SPF, DMARC и ARC.
  • Разрешение DNS: Использование Tangerine для DNS-over-HTTPS с глобальным кэшированием.
  • MX-подключение: Использование mx-connect с интеграцией Tangerine для надежного подключения к почтовому серверу.
  • Планирование заданий: Использование Bree для надежной обработки фоновых задач с рабочими потоками.
  • Шаблоны: Использование шаблонов электронной почты для повторного использования таблиц стилей с веб-сайта в коммуникациях с клиентами.
  • Хранилище электронной почты: Реализация индивидуально зашифрованных почтовых ящиков SQLite с использованием алгоритма better-sqlite3-multiple-ciphers и шифрования ChaCha20-Poly1305 для квантово-безопасной конфиденциальности, обеспечивающей полную изоляцию между пользователями и доступ к их данным только у пользователя. почтовый ящик

Каждая из этих интеграций требует тщательного анализа пограничных случаев, влияния на производительность и вопросов безопасности. Результатом является надёжная система, надёжно обрабатывающая миллионы почтовых транзакций. Наша реализация SQLite также использует msgpackr для эффективной двоичной сериализации и WebSockets (через ws) для обновления статуса в режиме реального времени в рамках всей нашей инфраструктуры.

DNS-инфраструктура с Tangerine и mx-connect

Важнейшим компонентом инфраструктуры Forward Email является наша система разрешения DNS, построенная на двух ключевых пакетах:

  • мандарин: Наша реализация Node.js DNS-over-HTTPS обеспечивает замену стандартного DNS-преобразователя со встроенными повторными попытками, тайм-аутами, интеллектуальной ротацией серверов и поддержкой кэширования.

  • mx-connect: Этот пакет устанавливает TCP-подключения к серверам MX, принимая целевой домен или адрес электронной почты, разрешая соответствующие серверы MX и подключаясь к ним в порядке приоритета.

Мы интегрировали Tangerine с mx-connect через Запрос на включение (#4, обеспечивающий DNS-запросы на уровне приложений по HTTP для всех запросов Forward Email. Это обеспечивает глобальное кэширование DNS в масштабе с согласованностью 1:1 для любого региона, приложения или процесса, что критически важно для надежной доставки электронной почты в распределенной системе.

Влияние на предприятие: от открытого исходного кода до критически важных решений

Кульминацией нашего десятилетнего пути в разработке ПО с открытым исходным кодом стала возможность Forward Email обслуживать не только отдельных разработчиков, но и крупные предприятия и образовательные учреждения, составляющие основу движения открытого исходного кода.

Примеры использования критически важной инфраструктуры электронной почты

Наша приверженность принципам надежности, конфиденциальности и открытого исходного кода сделала Forward Email надежным выбором для организаций с высокими требованиями к электронной почте:

  • Учебные заведения: Как подробно описано в нашем [примере использования пересылки электронной почты выпускников]](https://forwardemail.net/blog/docs/alumni-email-forwarding-university-case-study), крупнейшие университеты полагаются на нашу инфраструктуру для поддержания постоянных связей с сотнями тысяч выпускников посредством надежных служб пересылки электронной почты.

  • Решения для корпоративного Linux: Пример использования Canonical Ubuntu для корпоративной электронной почты демонстрирует, как наш подход с открытым исходным кодом идеально соответствует потребностям поставщиков корпоративного Linux, предлагая им необходимую прозрачность и контроль.

  • Open Source Foundations: Возможно, наиболее показательным является наше партнерство с Linux Foundation, как это задокументировано в Пример использования электронной почты Linux Foundation для предприятий, где наша служба обеспечивает коммуникацию для той самой организации, которая курирует разработку Linux.

Есть прекрасная симметрия в том, как наши пакеты с открытым исходным кодом, которые мы бережно поддерживаем уже много лет, позволили нам создать почтовый сервис, который теперь поддерживает те самые сообщества и организации, которые продвигают программное обеспечение с открытым исходным кодом. Этот замкнутый круг — от разработки отдельных пакетов до создания корпоративной почтовой инфраструктуры для лидеров в области программного обеспечения с открытым исходным кодом — представляет собой окончательное подтверждение правильности нашего подхода к разработке программного обеспечения.

Десятилетие открытого исходного кода: взгляд в будущее

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

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

В ближайшие годы мы намерены:

  • Продолжение поддержки и совершенствования наших существующих пакетов, гарантируя, что они останутся надежными инструментами для разработчиков по всему миру.
  • Расширение нашего вклада в критически важные инфраструктурные проекты, особенно в области электронной почты и безопасности.
  • Расширение возможностей Forward Email, сохраняя при этом нашу приверженность принципам конфиденциальности, безопасности и прозрачности.
  • Поддержка следующего поколения разработчиков ПО с открытым исходным кодом посредством наставничества, спонсорства и взаимодействия с сообществом.

Мы верим, что будущее разработки программного обеспечения — это открытость, сотрудничество и доверие. Продолжая вносить свой вклад в экосистему JavaScript, предлагая высококачественные пакеты, ориентированные на безопасность, мы надеемся внести свой вклад в построение этого будущего.

Спасибо всем, кто воспользовался нашими пакетами услуг, внёс вклад в наши проекты, сообщал о проблемах или просто рассказывал о нашей работе. Ваша поддержка сделала это десятилетие возможным, и мы с нетерпением ждём возможности увидеть, чего мы сможем достичь вместе за следующие десять лет.


  1. Статистика загрузок npm для cabin, апрель 2025 г. ↩︎

  2. Статистика загрузок npm для bson-objectid, февраль-март 2025 г. ↩︎

  3. Статистика загрузок npm для url-regex-safe, апрель 2025 г. ↩︎

  4. Количество звёзд на GitHub для forwardemail/forwardemail.net по состоянию на апрель 2025 г. ↩︎

  5. Статистика загрузок npm для preview-email, апрель 2025 г. ↩︎

  6. Статистика загрузок npm для superagent, февраль-март 2025 г. ↩︎

  7. Статистика загрузок npm для supertest, февраль-март 2025 г. ↩︎

  8. Статистика загрузок npm для koa, февраль-март 2025 ↩︎

  9. Статистика загрузок npm для @koa/router, февраль-март 2025 ↩︎

  10. Статистика загрузок npm для koa-router, февраль-март 2025 ↩︎

  11. Статистика загрузок npm для url-regex, февраль-март 2025 ↩︎

  12. Статистика загрузок npm для preview-email, февраль-март 2025 г. ↩︎

  13. Статистика загрузок npm для cabin, февраль-март 2025 г. ↩︎

  14. Статистика загрузок npm для @breejs/later, февраль-март 2025 ↩︎

  15. Статистика загрузок email-templates, февраль-март 2025 ↩︎

  16. Статистика загрузок get-paths, февраль-март 2025 ↩︎

  17. Статистика загрузок npm для url-regex-safe, февраль-март 2025 г. ↩︎

  18. Статистика загрузок dotenv-parse-variables, февраль-март 2025 ↩︎

  19. Статистика загрузок npm для @koa/multer, февраль-март 2025 ↩︎

  20. Статистика загрузок npm для spamscanner, февраль-март 2025 г. ↩︎

  21. Статистика загрузок npm для bree, февраль-март 2025 г. ↩︎

  22. Ежедневные закономерности загрузок из статистики npm, апрель 2025 г. ↩︎

  23. Еженедельные закономерности загрузок из статистики npm, апрель 2025 г. ↩︎

  24. Статистика загрузок npm для nodemailer, апрель 2025 г. ↩︎

  25. https://github.com/nodemailer/smtp-server/issues/155 ↩︎

  26. https://github.com/nodemailer/smtp-server/issues/node-v12-requires-tls-min ↩︎

  27. https://github.com/nodemailer/mailparser/issues/261 ↩︎

  28. https://github.com/nodemailer/nodemailer/issues/1102 ↩︎

  29. https://github.com/postalsys/mailauth/issues/30 ↩︎

  30. https://github.com/postalsys/mailauth/issues/58 ↩︎

  31. https://github.com/postalsys/mailauth/issues/48 ↩︎

  32. https://github.com/postalsys/mailauth/issues/74 ↩︎

  33. https://github.com/postalsys/mailauth/issues/75 ↩︎

  34. https://github.com/postalsys/mailauth/issues/60 ↩︎

  35. https://github.com/nodemailer/smtp-server/issues/node-v12-requires-tls-min0 ↩︎

  36. На основе проблем GitHub в репозитории Upptime ↩︎

  37. На основе проблем GitHub в репозитории Upptime ↩︎

  38. На основе проблем GitHub в репозитории Upptime ↩︎

  39. На основе запросов на извлечение GitHub в Upptime ↩︎

  40. На основе запросов на извлечение GitHub в Upptime ↩︎