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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
190
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
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
750
Domain-Driven Transformation
hschwentner
2
2.3k
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
phperだってパンチカードでコーディングしたい
o0h
PRO
0
330
コードで差別化できない時代の ソフトウェアエンジニアリング / Software Engineering in an Era Where Code Doesn’t Differentiate
kishida
2
180
Next.js: The final boss of Web Performance
guaca
0
250
Long Living Tokens, Die, Die, Die! (or: The One Ring is Banned in Modern)
sylph01
0
300
Rでドレミ/Do-Re-Mi_with_R
florets1
0
130
[2026-09-26]空論ジェネリックプロセス~テスト資産とAIで紡ぐ、再現可能なパフォーマンスチューニングの話~
tosite
0
270
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
6.6k
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
220
全ての永続トークンを、生まれる前に消し去りたい!
sylph01
2
880
Featured
See All Featured
Facilitating Awesome Meetings
lara
57
7.2k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
The Limits of Empathy - UXLibs8
cassininazir
2
720
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Site-Speed That Sticks
csswizardry
13
1.6k
[RailsConf 2023] Rails as a piece of cake
palkan
59
7.1k
How to build a perfect <img>
jonoalderson
1
6.1k
Designing for Performance
lara
612
70k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.5k
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