Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Лучшая client-side архитектура
Search
HappyDev'13
December 08, 2013
Programming
290
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Лучшая client-side архитектура
Антон Плешивцев
HappyDev'13
December 08, 2013
More Decks by HappyDev'13
See All by HappyDev'13
Вводный доклад о процессах и ролях, требованиях и визуализации
happydev
0
220
Особенности разработки финансовых проектов
happydev
0
180
Domain Driven Design. Модель вместо требований
happydev
0
450
К черту менеджерские карго культы! Дайте нормальное ТЗ
happydev
0
230
Эволюция больших проектов. Опыт API Яндекс.Карт
happydev
1
460
Мастер класс «Управленческие поединки»
happydev
0
220
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
happydev
0
590
Вводный доклад про SQL, NoSQL и других
happydev
0
300
NoNoSQL = Not Only NoSQL. Почему рано хоронить старый добрый SQL
happydev
0
270
Other Decks in Programming
See All in Programming
thread_parallel_with_free-threaded_Python_and_NumPy.pdf
riku_sakamoto
0
320
新卒PdEのリアル
ryu1013
1
490
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
120
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
700
The Good Stuff, Not the Slop: Engineering High-Quality Android Apps with Modern AI Tooling
danybony
1
240
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
4
660
Deep dive into the select statement (GopherCon UK)
jespino
0
180
Claude Codeを組織的に動かして月400PRを実現した話
happy_ryo
0
270
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
230
初心者DevRelとして参加者だった私が、DevRel Talks!#2に登壇するまでにしてきたこと
sokohirai
0
370
{ Android | Kotlin } Gradle Plugin in 2026
ryunen344
1
300
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
200
Featured
See All Featured
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2.1k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.1k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
AI: The stuff that nobody shows you
jnunemaker
PRO
9
990
The Spectacular Lies of Maps
axbom
PRO
1
990
Optimising Largest Contentful Paint
csswizardry
37
4k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
320
GraphQLとの向き合い方2022年版
quramy
50
15k
Designing for humans not robots
tammielis
254
26k
Transcript
Лучшая client-side архитектура Антон Плешивцев twitter.com/allaud github.com/allaud aviasales.ru
Что мы разрабатываем?
Frontend-приложение • Поисковая форма • Поисковая выдача (1000+ билетов) •
Фильтры (15 и более критериев) • Календарь цен (цены на год)
Frontend-приложение
Legacy • Внутренний framework • 10 000 строк кода •
Виджет - ориентированная архитектура
Проблемы старого подхода • Много собственного кода • Велосипеды •
Изобрели AMD • Отсутствие тестов • Высокий порог вхождения
«Жидкое приложение» Поисковая форма
«Жидкое приложение» Поисковая форма Поиск Выдача
«Жидкое приложение» Поисковая форма Поиск Выдача Фильтры Фильтры Состояние
«Жидкое приложение» Поисковая форма Поиск Выдача Билеты Фильтры Состояние Агенства
Фидбек История
«Жидкое приложение» Поисковая форма Поиск Выдача Билеты Фильтры Состояние Агенства
Фидбек История Календарь
«Жидкое приложение» Поисковая форма Поиск Выдача Билеты Фильтры Состояние Агенства
Фидбек История Календарь
Использовать 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
Frontend frameworks • Google Closure library • Backbone.js • AngularJS
• EmberJS • …
First try • Backbone • RequireJS • HandleBars • Jasmine
Выводы • Стало лучше • Порог вхождения понизился • AMD-модули
полезны • Функций недостаточно
Next try • AngularJS • Удобные тесты • Почти нет
кастомных решений • Очень высокая скорость разработки
Приложение aviasales. Как декомпозировать? • Разбить на виджеты • Разбить
на модели • Разбить на отдельные приложения
Frontend-приложение
Как спроектировать? Поисковая форма Выдача Фильтры
Как спроектировать? Форма История поисков Календарь Отели Билеты Цена Время
Авиакомпании
Как организовать общение между частями приложения? Календарь Отели Билеты Цена
Время Авиакомпании ?
Как организовать общение между частями приложения? Календарь Отели Билеты Цена
Время Авиакомпании SERVICE
«Выдача с фильтрами» Как организовать общение между частями приложения? Календарь
Отели Билеты Цена Время Авиакомпании
Как организовать модули? Календарь Отели Билеты Цена Время
Как организовать модули? Календарь Отели Билеты Цена Время Dependency Injection
Как собрать воедино? Ядро Форма История поисков Календарь Отели Билеты
Цена Время Авиаком Ядро Форма Поиска Выдача
Как собрать воедино? Ядро Форма Поиска Выдача Форма История поисков
Запись Билеты Фильтры Цена Время … Календарь Отели Список билетов
ng-controller directive CoreController SearchFormController SearchResultsController Form History Record Results Filters
Price Time … Calendar Hotels Tickets
Взаимодействие контроллеров 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(){…} }
Много небольших работающих приложений
Приложение «Список билетов» TicketsController BaseTicket FiltrableTicket TicketFactory RoundTripTicket OnewayTicket TourTicket
Шаблоны (было) 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}" } } } } }); });
Шаблоны (стало) %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 }}
Unobtrusive javascript layout.find(".yes").bind("click", function(){ self.toggle(layout, "yes"); }); layout.find(".no").bind("click", function(){ self.toggle(layout,
"no"); }); layout.find("#new_feedback").submit(function(){ return self._submit(); });
Angular way <form class="feedback" ng-submit="submit()"> <div class="yes" ng-click='success(true)'>Да</div> <div class="no"
ng-click='success(false)'>Нет</div> ... </form>
Итоги • Теперь делать фиксы и фичи могут все •
Ускорили разработку в разы • Части приложения используются в других проектах • Ядро поддерживает сообщество
About Антон Плешивцев ! twitter.com/allaud github.com/allaud https://www.facebook.com/ant.pl.3 ! aviasales.ru
None