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

image
Многие считают что Swift не имеет будущего, в связи с тем, что он ориентирован лишь на одну еко-систему, но опуская тот факт, что язык уже год как Open Source, продолжают «кукарекать» не верить в его силы. За это время язык приобрел немалую популярность, а разработчики пытаются внедрить его в разные платформы и технологии, на данный момент вы можете писать на Swift под .NET и Android благодаря Silver, появляются фреймворки для создания бэкенда на Swift в их числе Vapor.

Vapor позволяет вам писать веб-приложения, сайты, API используя HTTP либо WebSockets. По заявлению разработчиков этот фреймворк до 100 раз быстрее других популярных фреймворков написанных на Ruby и PHP. Не словом, а делом. Предлагаю «пощупать» этот фреймворк и написать демонстрационный HTTP API на Swift под Vapor (это не туториал, моей целью является заинтересовать вас и познакомить с этим замечательным проектом)

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

vapor new HelloHabr

image

Поздравляю, вы успешно создали новый проект. Теперь вы можете открыть его в проводнике, найти там файл Sources/App/main.swift и писать в любом текстовом редакторе, сохраняя и перезапуская сервер каждый раз с помощью терминала, но нас интересует подсветка синтаксиса, breakpoints и привычный деплой через Xcode. Перейдем в директорию с нашим проектом:

cd HelloHabr

Теперь мы можем сгенерировать новый Xcode проект используя команду:

vapor xcode

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

image

Давайте откроем ранее упомянутый файл main.swift, и обработаем простейший GET запрос c параметром.

drop.get("greeting") { req in
    guard let name = req.data["target"]?.string else {
        return "Hello!"
    }
    return "Hello, \(name)!"
}

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

image

Что там с JSON? Давайте попробуем получить больше информации немного дополнив наш код.


drop.get("info") { req in
    let date = Date()
    let calendar = Calendar.current
    
    let hours = calendar.component(.hour, from: date)
    let minutes = calendar.component(.minute, from: date)
    let seconds = calendar.component(.second, from: date)
    
    return try JSON(node: [
            "place"     : "habrahabr",
            "framework" : "vapor",
            "time"      : "\(hours):\(minutes):\(seconds)"
        ])
}

Скомпилируем проект и отправим запрос на наш сервер, посмотрим что же нам прийдет в ответ.

image

Отлично, в ответ нам приходит обычный JSON, который вы можете распарсить и использовать данные из него в своем приложении. В целом по Vapor существует достаточно много официальной документации, вы можете подробней узнать о настройке сервера, возможности генерировать HTML на лету, о том как использовать WebSockets и сессии. Так же существует ресурс от разработчиков Vapor University на котором вы можете найти много информации, сравнений и туториалов.

Vapor совместим с macOS и Ubuntu, вы можете размещать свои приложения на Heroku, использовать MySQL, SQLite, MongoDB и др. в своих проектах. Присоединяйтесь к Slack каналу и предлагайте свои варианты улучшения проекта, задавайте вопросы либо просто поблагодарите создателей за их труд.

В целом проект очень амбициозный и быстро развивается, создатели Vapor дают нам прекрасную возможность стать Full Stack. Спасибо за внимание, надеюсь у меня получилось вас заинтересовать.
Поделиться с друзьями
-->

Комментарии (18)


  1. jenezis
    06.12.2016 16:32
    +2

    По заявлению разработчиков этот фреймворк до 100 раз быстрее других популярных фреймворков написанных на Ruby и PHP

    Пруф, пожалуйста?


    1. Azy
      06.12.2016 16:36
      +10


      1. halfcupgreentea
        06.12.2016 17:18
        +5

        Не знаю, как jenezis, а я ждал не скриншота с заявлением разработчиков :)


        1. Azy
          06.12.2016 17:55
          +3

          Шерлок Холмс и Ватсон летели на воздушном шаре и совершили вынужденную посадку в пустыне. Вокруг от горизонта до горизонта — один песок… Вдруг видят — проходит мимо человек. Ватсон спрашивает у него:
          — Вы не могли бы сказать хотя бы приблизительно, где мы находимся?
          В ответ слышат:
          — Не только приблизительно, но и совершенно точно — вы находитесь в корзине воздушного шара!
          Холмс:
          — Этот человек — программист!
          Ватсон (изумленно):
          — Как Вы об этом узнали, Холмс?
          Холмс:
          — Элементарно, Ватсон! Только у программиста мог быть такой абсолютно точный и абсолютно бесполезный ответ.


      1. jenezis
        06.12.2016 17:34
        +1

        «Я так и знал!»

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


        1. Daniyar94
          06.12.2016 19:06
          +2

          https://medium.com/@rymcol/linux-ubuntu-benchmarks-for-server-side-swift-vs-node-js-db52b9f8270b#.m4qmvblp0


    1. greyfruit
      06.12.2016 20:46
      +1

      На днях переведу официальную статью на тему сравнений с другими фреймворками, не переживайте.


      1. Makaveli
        08.12.2016 11:16

        Лучше сделайте собственный замер. Желательно на сервере, на котором больше 1 ядра


  1. loststylus
    06.12.2016 16:51
    -4

    Компилируемый бекенд? Well, ну ок.

    Икскод? Well… а под нормальным IDE можно это готовить?


    1. Azy
      06.12.2016 17:56
      +1

      Компилируемый бекенд? Well, ну ок.

      С компилируемым Go вопросов почему-то не возникает.
      Да и на сях бекенды пишут

      Икскод? Well… а под нормальным IDE можно это готовить?

      А вы точно к разработке имеете какое-то отношение?


    1. egmar
      06.12.2016 18:02
      +2

      Вполне можни писать в каком угодно IDE. Я успешно использую Atom


  1. EagleMoor
    06.12.2016 18:56
    -2

    То что framework быстрее вообще ни о чем не говорит.

    А дрова для MySQL or PostgreSQL завезли? Нет? Ок, дальше можно не рассматривать.


    1. kshvakov
      06.12.2016 19:11
      -4

      С таким подходом вы, скорее всего, многое упускаете т.к. если бы потрудились и просмотрели хотя бы главную страницу проекта и, таки да — «дрова завезли»


    1. egmar
      06.12.2016 19:34

      Да, смотрите в сторону https://github.com/IBM-Swift/Swift-Kuery


  1. Nagg
    07.12.2016 03:37
    +4

    Ох понаписали корявых тестов, не настроили енвайрнмент, почитайте комментарии к статье сравнения. Особенно порадовал SQL тест, где в Java в отличие от других сперва загружаются все записи с таблицы в память (+ парсинг в объекты), а потом идет where. Это говорит о том, что ребята вообще не представляют с чем тестируют. В 100 раз быстрее, чо.


    1. Nagg
      07.12.2016 03:44
      +3

      Дабы не быть голословным:


      List<User> allUsers = userRepository.findAll();
      return allUsers.get(random.nextInt(allUsers.size()));


      против, к примеру, Go


      rows, err := db.Queryx("select * from users order by random() limit 1")


  1. Makaveli
    08.12.2016 11:13
    +1

    Как раз доделываю сейчас один свой pet-project на Vapor. Сайт + API для приложений.

    Попробовал из фреймворков на Swift для бэкенда Kitura, Perfect и Vapor — последний понравился больше всего.

    Компилится, правда, долго, на обычной 1-ядерной VPS-ке, но памяти запущенный результат кушает в 2-2.5 раза меньше, чем Node.js + Express, например.

    Вот только по скорости я так и не смог подтвердить то, что Vapor быстрее, чем Node.js. Проводил свои замеры для Kitura, Vapor и Node.js, в итоге нода уделала всех с существенным отрывом.



    Почему мои результаты так сильно отличаются от бенчмарков по ссылке, которая в посте, я не знаю, но подозреваю, что дело в количестве ядер — на 1 ядре пока свифтовые фреймворки работают медленнее.

    Если интересно, мои замеры тут. В слаке Vapor ребята не объяснили, почему такая разница, сказали лишь, что этот теперь часть истории, скоро команда по Swift Server API нафигачит низкоуровневые решения для серверного Swift и всё будет хорошо. Посмотрим :) Пока решил всё-таки Vapor попробовать, т.к. больших нагрузок не ожидаю.


    1. Makaveli
      08.12.2016 12:10
      +1

      Замерил новую версию Vapor (1.2.5), теперь результаты другие — догнал по скорости Node.js :)