Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Лучшая client-side архитектура

HappyDev'13
December 08, 2013

Лучшая client-side архитектура

Антон Плешивцев

HappyDev'13

December 08, 2013
Tweet

More Decks by HappyDev'13

Other Decks in Programming

Transcript

  1. Frontend-приложение • Поисковая форма • Поисковая выдача (1000+ билетов) •

    Фильтры (15 и более критериев) • Календарь цен (цены на год)
  2. Legacy • Внутренний framework • 10 000 строк кода •

    Виджет - ориентированная архитектура
  3. Проблемы старого подхода • Много собственного кода • Велосипеды •

    Изобрели AMD • Отсутствие тестов • Высокий порог вхождения
  4. Использовать jQuery-плагины? JQuery jQueryUIJformer Hyjack SelectjQuery Sparkline sasmSelect jQuery PluginjQuery

    Plugin BoilerplatejQuery Floater PluginjQuery Queue plugin Apprise Jquery-toast message-plugin Websanova Color Picker safeSubmit Plugin JratingjQuery Opineo PluginFollow & Tweet WidgetjQuery Corner Gallery InputNotes GmapPicNet Table FilterJquery UI datepickerActivity IndicatorTitle AlertFix Scrollbar HeightBetter Check Boxes with jQuery and CSSBetterTooltip
  5. Next try • AngularJS • Удобные тесты • Почти нет

    кастомных решений • Очень высокая скорость разработки
  6. Как собрать воедино? Ядро Форма Поиска Выдача Форма История поисков

    Запись Билеты Фильтры Цена Время … Календарь Отели Список билетов
  7. Взаимодействие контроллеров SearchResultsController Results Filters Price Tickets { filters: {}

    tickets: [] } { reset: function(){…} filters: {} } { visible: [1000, 10 000] reset: function(){} filters: {} } { tickets: [] sort: function(){…} } { sorting: ‘price’ tickets: [] sort: function(){…} }
  8. Шаблоны (было) NANO("templates.searches.tickets.widgets.proposals", function(NANO){ return NANO.templates('<%= j render 'nano_ui_templates/searches/tickets/widgets/proposals' %>',

    { "@data-ticket-id": "ticket.id", "@data-source": "source", ".ticket_proposal": { "gate<-proposals": { ".gate_name": "gate.name", ".gate_select_button a@href": "gate.url", ".gate_select_button a@data-gate": "gate.id", ".gate_price": "gate.price", ".gate_payment_methods .payment_method": { "method<-gate.payment_methods": { "@class+": " #{method}" } } } } }); });
  9. Шаблоны (стало) %li.proposal-carousel{'ng-repeat' => 'proposal in ticket.proposals_for_carousel()'} %a.agency_offer{'ng-click' => 'buy_ticket(ticket,

    proposal)'} %span {{ proposal.name() | cut:15 }} %span.price %span {{ proposal.price() | current_price:search.currency }}
  10. Итоги • Теперь делать фиксы и фичи могут все •

    Ускорили разработку в разы • Части приложения используются в других проектах • Ядро поддерживает сообщество