惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Schneier on Security
The Register - Security
The Register - Security
月光博客
月光博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The GitHub Blog
The GitHub Blog
博客园 - 司徒正美
罗磊的独立博客
U
Unit 42
S
SegmentFault 最新的问题
Y
Y Combinator Blog
博客园_首页
Hugging Face - Blog
Hugging Face - Blog
J
Java Code Geeks
Schneier on Security
Schneier on Security
Know Your Adversary
Know Your Adversary
C
Check Point Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Simon Willison's Weblog
Simon Willison's Weblog
V
Vulnerabilities – Threatpost
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
阮一峰的网络日志
阮一峰的网络日志
The Hacker News
The Hacker News
博客园 - 叶小钗
C
Cybersecurity and Infrastructure Security Agency CISA
Spread Privacy
Spread Privacy
L
LINUX DO - 热门话题
T
The Exploit Database - CXSecurity.com
P
Palo Alto Networks Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Latest news
Latest news
L
Lohrmann on Cybersecurity
A
About on SuperTechFans
L
LangChain Blog
Stack Overflow Blog
Stack Overflow Blog
S
Securelist
A
Arctic Wolf
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Threatpost
Scott Helme
Scott Helme
博客园 - 聂微东
博客园 - 【当耐特】
T
Tenable Blog
I
Intezer
D
DataBreaches.Net
B
Blog RSS Feed
Security Latest
Security Latest
C
Cisco Blogs
T
Tor Project blog
N
Netflix TechBlog - Medium

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Начало работы с Hummingbird
Chidorin · 2026-04-17 · via Все публикации подряд на Хабре

От автора: Я до сих пор помню конец 90-х, когда установил на свой компьютер Internet Information Services. Это позволило мне запускать страницы Classic ASP, подключенные к базе данных Microsoft SQL Server. Так я впервые познакомился с серверной разработкой.

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

За годы работы я успел познакомиться с различными серверными технологиями, включая ASP.NET Web Forms, ASP.NET MVC, ExpressJS, Flask, Vapor, а теперь и Hummingbird.

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

Что такое Hummingbird?

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

Почему Hummingbird? Почему не Vapor?

Дело не в том, что один из них лучше другого. Дело в том, что для вас важнее как для разработчика.

Hummingbird — отличный выбор, если вам нужно что-то лёгкое и максимально приближенное к тому, как Swift работает сегодня. Он с самого начала поддерживает async/await и не прячет детали за множеством абстракций. Вы сами пишете большую часть кода, но взамен получаете ясность и контроль. Если вы уже разбираетесь в основах бэкенда, Hummingbird покажется вам очень естественным выбором.

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

С другой стороны, иногда кажется, что Vapor работает медленнее. Он был создан до появления современной модели параллелизма в Swift, поэтому некоторые его части скорее адаптированы, чем изначально разработаны с учетом async/await.

Если вам нужен контроль, простота и фреймворк, максимально приближенный к современному Swift, выбирайте Hummingbird. Если вам нужна полноценная экосистема с готовыми библиотеками и минимальной настройкой, то Vapor — отличный выбор.

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

Создание вашего первого проекта Hummingbird

Самый простой способ начать работу с Hummingbird — использовать официальный шаблон. Он дает вам готовую отправную точку, так что вам не придется настраивать все с нуля.

Для начала клонируйте репозиторий шаблонов на свой компьютер:

git clone https://github.com/hummingbird-project/template

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

./template/configure.sh MyNewProject

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

После создания проекта перейдите в папку MyNewProject и запустите:

swift run

Это позволит собрать и запустить ваш сервер. Первая сборка может занять несколько минут, так как Swift Package Manager необходимо загрузить и скомпилировать зависимости.

Когда все будет готово, откройте браузер и перейдите по адресу 127.0.0.1:8080. Вы увидите простой ответ «Hello», подтверждающий, что ваш сервер Hummingbird запущен и работает.

Понимание начального шаблона

Вы можете открыть свой проект Hummingbird в любом удобном для вас редакторе. Если вы хотите использовать Xcode, просто запустите open Package.swift из папки проекта. Это откроет проект в Xcode и автоматически разрешит и загрузит все необходимые зависимости.

В папке Sources/App находится файл App.swift. Этот файл содержит основную функцию, которая служит точкой входа в ваше приложение. Здесь начинается выполнение вашего приложения, и эта функция отвечает за настройку конфигурации, сборку приложения и запуск сервера. Код основной функции приведен ниже:

@main
struct App {
    static func main() async throws {
        // Приложение будет считывать конфигурацию из следующего списка в указанном порядке
        // Командная строка, переменные среды, файл dotEnv, значения по умолчанию, указанные в памяти
        let reader = try await ConfigReader(providers: [
            CommandLineArgumentsProvider(),
            EnvironmentVariablesProvider(),
            EnvironmentVariablesProvider(environmentFilePath: ".env", allowMissing: true),
            InMemoryProvider(values: [
                "http.serverName": "MyNewProject"
            ])
        ])
        let app = try await buildApplication(reader: reader)
        try await app.runService()
    }
}

Функция main является точкой входа в ваше приложение Hummingbird и отвечает за три основные задачи: чтение конфигурации, сборку приложения и запуск сервера.  Атрибут @main сообщает Swift, где начинается программа, а сигнатура async throws позволяет приложению выполнять асинхронную работу и корректно обрабатывать ошибки, что соответствует принципам построения Hummingbird на основе модели async/await в Swift.

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

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

Наконец, app.runService() запускает сервер и начинает прослушивать входящие HTTP-запросы.  Теперь ваше приложение полностью готово к работе и может обрабатывать запросы от браузера или любого другого клиента.

Следующий файл — App+Build.swift. Ниже приведен полный код:

import Configuration
import Hummingbird
import Logging

// Контекст запроса, используемый приложением
typealias AppRequestContext = BasicRequestContext

///  Build application
/// - Parameter reader: configuration reader
func buildApplication(reader: ConfigReader) async throws -> some ApplicationProtocol {
    let logger = {
        var logger = Logger(label: "MyNewProject")
        logger.logLevel = reader.string(forKey: "log.level", as: Logger.Level.self, default: .info)
        return logger
    }()
    let router = try buildRouter()
    let app = Application(
        router: router,
        configuration: ApplicationConfiguration(reader: reader.scoped(to: "http")),
        logger: logger
    )
    return app
}

/// Build router
func buildRouter() throws -> Router<AppRequestContext> {
    let router = Router(context: AppRequestContext.self)
    // Добавляем middleware
    router.addMiddleware {
        // logging middleware
        LogRequestsMiddleware(.info)
    }
    // Добавляем стандартный endpoint
    router.get("/") { _,_ in
        return "Hello!"
    }
    return router
}

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

Функция buildApplication принимает ConfigReader в качестве входных данных и возвращает экземпляр вашего приложения.  Первое, что она делает, — настраивает логгер.  Логгер создается с использованием системы Swift Logging, а уровень ведения журнала считывается из конфигурации.  Это значит, что вы можете контролировать объем выводимой информации (отладка, информация, ошибка), не меняя код, а просто обновляя значения в конфигурации.

Далее функция вызывает buildRouter(), где определены все ваши маршруты и промежуточное ПО. Представьте, что маршрутизатор — это часть вашего приложения, которая определяет, как реагировать на запросы по разным URL. После создания маршрутизатора он передается в Application вместе с конфигурацией и логгером. Конфигурация ограничена областью "http", то есть в ней будут использоваться только настройки, связанные с HTTP, из ваших источников конфигурации.

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

Наконец, с помощью router.get("/"). определяется простой маршрут. Это означает, что при переходе пользователя по корневому URL (/), сервер ответит "Hello!". Это ваша первая конечная точка, и она показывает, насколько просто определять маршруты в Hummingbird.

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

Теперь измените маршрут так, чтобы он возвращал Hello World вместо просто Hello. Если вы обновите страницу в браузере по адресу 127.0.0.1:8080, то увидите, что вместо Hello по-прежнему отображается Hello World.

Чтобы это сработало, нужно остановить сервер Control C и снова запустить его swift run. Теперь при переходе по маршруту вы увидите обновленную информацию.

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

Автоматический перезапуск сервера с помощью watchexec

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

Такого же поведения можно добиться в проектах Hummingbird с помощью инструмента под названием watchexec. Он отслеживает ваши файлы и перезапускает команду при обнаружении изменений.

Чтобы установить watchexec, выполните следующие действия:

brew install watchexec

После установки перейдите в папку с проектом Hummingbird и запустите:

watchexec -e swift --restart swift run

Эта команда указывает watchexec отслеживать изменения в файлах Swift и автоматически перезапускать сервер с помощью команды swift run.

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

Заключение

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

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

Hummingbird — это просто еще один инструмент, но он отлично сочетается с современным Swift. Если вам нравится создавать что-то с нуля и вы хотите иметь больше контроля над серверной частью, определенно стоит обратить на него внимание.