SlideShare a Scribd company logo
1 of 93
Download to read offline
basis.js
production ready framework
1
Обо мне
@smelukov
Работаю в Avito
Делаю большое SPA
Преподаю JS
Учу создавать веб-приложения
Люблю JS и жену
Но больше жену
Популяризирую basis.js
Верю, что basis.js захватит мир
Сергей Мелюков
2
Когда я рассказываю про basis.js
‣ Зачем?! Есть же [X]
‣ basis.js - сложный, а [X] - простой
3
Возможно, я не точно доносил
смысл того, что такое basis.js и это
повлекло поспешные выводы
4
Действительно ли можно просто
взять любой фреймворк и сразу
начать делать веб-приложения?
5
Нет!
Любой фреймворк требует
изучения и опыта использования
6
Поговорим о том, какие
возможности дает basis.js из
коробки
7
План
‣ Компоненты
‣ Источники данных
‣ Локализация
‣ Трекинг событий
‣ Инструменты разработки
‣ Заключение
8
‣ Компоненты
‣ Источники данных
‣ Локализация
‣ Трекинг событий
‣ Инструменты разработки
‣ Заключение
9
basis.js - это компонентный
подход
10
OK
имя
фамилия
отчество
Отмена
11


new Node({

template: ...,

binding: {

firstName: ...,

lastName: ...,

}

});
12


new Node({

template: ...,

binding: {

firstName: ...,

lastName: ...

}

});
13
basis.js - это шаблоны без
логики
14
<li *ngFor="let item of items; let i = index; trackBy: trackByFn">...</li>

<li template="ngFor let item of items; let i = index; trackBy: trackByFn">...</li>
if (todos.length) {

main = (

<section className="main">

<input

className="toggle-all"

type="checkbox"

onChange={this.toggleAll}

checked={activeTodoCount === 0}

/>

<ul className="todo-list">

{todoItems}

</ul>

</section>

);

}

15
Логика в JS, шаблон в XHTML
16
<b:style src="./person.css"/>



<div class="person">

<div>Имя: {firstName}</div>

<div>Фамилия: {lastName}</div>

</div>
17
basis.js - это изоляция стилей и
модульный CSS
18
<b:style src="./person.css"/>

<b:isolate/>



<div class="person">

<div class="photo"> ... </div>

<div class="info"> ... </div>

</div>
<style> ... </style>



<div class="i1__person">

<div class="i1__photo"> ...</div>

<div class="i1__info"> ...</div>

</div>
19
‣ Компоненты
‣ Источники данных
‣ Локализация
‣ Трекинг событий
‣ Инструменты разработки
‣ Заключение
20
basis.js - это гибкое
взаимодействие с источниками
данных
21
Источником данных может быть
объект, коллекция объектов или
другой компонент
22


new Node({

template: ...,

binding: { ... },
dataSource: ... 

});
23
childNodes
Component
items
Dataset
(коллекция)
‣ model
‣ model
‣ model
‣ model
‣ model
‣ model
component
component
component
component
component
component
24
Контролировать источник данных
можно при помощи состояний
25
‣ processing - в состоянии синхронизации
‣ deprecated - данные устарели
‣ ready - готов к работе
‣ error - ошибка
26
Примеры использования?
Показываем спиннер, пока
загружаются данные
Обновляем устаревшие данные
basis.js - это автоматические
источники данных (индексы,
фильтры, etc…)
30
31
Выбранные друзья
items
Доступные друзья
items
‣ model
‣ model
‣ model???
32
Исключим выбранных друзей из
всех друзей и получим доступных
друзей
33
allFriends = new Dataset();
favoriteFriends = new Dataset();



availableFriends = new Subtract({

minuend: allFriends,

subtrahend: favoriteFriends

});
34
allFriends = new Dataset();
favoriteFriends = new Dataset();



availableFriends = new Subtract({

minuend: allFriends,

subtrahend: favoriteFriends

});
35
allFriends = new Dataset();
favoriteFriends = new Dataset();



availableFriends = new Subtract({

minuend: allFriends,

subtrahend: favoriteFriends

});
36
Почему не for?
37
Придется реализовать механизм
отслеживания изменений
38
Такой механизм уже встроен в
наборы basis.js!
39
allFriends = new Dataset();
favoriteFriends = new Dataset();



availableFriends = new Subtract({

minuend: allFriends,

subtrahend: favoriteFriends

});
40
А есть еще что-то, кроме Subtract?
41
42
‣ Merge - объединение коллекций
‣ Filter - фильтрация элементов коллекции
‣ Slice - срез элементов коллекции
‣ Split - деление коллекции на подмножества
‣ etc…
Для агрегации элементов коллекции
используются индексы
43
44
‣ Min - минимальное значение коллекции
‣ Max - максимальное значение коллекции
‣ Avg - среднее значение коллекции
‣ Sum - сумма элементов в коллекции
‣ etc…
Манипуляция с данными, а не с DOM
DOM - всего лишь отображение
45
‣ Компоненты
‣ Источники данных
‣ Локализация
‣ Трекинг событий
‣ Инструменты разработки
‣ Заключение
46
basis.js - это удобные
инструменты локализации
47
Словарь - это JSON-файл
48
{

"en-US": {

"hello": "Hello!"

},

"ru-RU": {

"hello": "Привет!"

}

}
49
{

"en-US": {

"hello": "Hello!"

},

"ru-RU": {

"hello": "Привет!"

}

}
<div>

{l10n:hello}

</div>
50
<div>

Привет!

</div>
51
В словарях можно использовать
биндинги и разметку
52
new Node({

template: ...
binding: {

firstName: ...,

lastName: ...

}

});
53
{

"_meta": {

"type": {

"hello": "markup"

}

},

"ru-RU": {

"hello": "Привет, <b>{firstName} {lastName}</b>"

}

}
{

"_meta": {

"type": {

"hello": "markup"

}

},

"ru-RU": {

"hello": "Привет, <b>{firstName} {lastName}</b>"

}

}
<div>

{l10n:hello}

</div>
55
<div>

Привет, <b>Иван Петров</b>

</div>
56
Грамматическое число
поддерживается на уровне словаря
57
new Node({

template: ...
binding: {

total: ...

}

});
58
{

"_meta": {

"type": {

"offer": "plural"

}

},

"ru-RU": {

"offer": [

"Всего {#} объявление",

"Всего {#} объявления",

"Всего {#} объявлений"

]

}

}
59
{

"_meta": {

"type": {

"offer": "plural"

}

},

"ru-RU": {

"offer": [

"Всего {#} объявление",

"Всего {#} объявления",

"Всего {#} объявлений"

]

}

}
<div>

{l10n:offer.{total}}

</div>
60
<div>

Всего 10 объявлений

</div>
61
‣ Компоненты
‣ Источники данных
‣ Локализация
‣ Трекинг событий
‣ Инструменты разработки
‣ Заключение
62
basis.js - это трекинг событий
63
Разметим компоненты и
шаблоны ролями
64
<div b:role>

<div> ... </div>

<button b:role="ok">OK</button>

<button b:role="cancel">Отмена</button>

</div>
new Node({

template: ...,

role: "popup"

});
65
<div role-marker="popup">

<div> ... </div>

<button role-marker="popup/ok">OK</button>

<button role-marker="popup/cancel">Отмена</button>

</div>
66
Создадим tracking-map и укажем
за чем необходимо следить
67
{

"popup/ok": {

"click": {

...

}

},
"popup/cancel": {

"click": {

...

}

}

}
map.json
68
{

"popup/ok": {

"click": [

...

]

},
"popup/cancel": {

"click": [

...

]

}

}
map.json
69
Соединяем воедино
70
tracker.loadMap(require('./map.json'));

tracker.attach(function(info) {
// Google Analytics

ga(info.data);

});
71
tracker.loadMap(require('./map.json'));

tracker.attach(function(info) {
// Google Analytics

ga(info.data);

});
72
tracker.loadMap(require('./map.json'));

tracker.attach(function(info) {
// Google Analytics

ga(info.data);

});
73
‣ Компоненты
‣ Источники данных
‣ Локализация
‣ Трекинг событий
‣ Инструменты разработки
‣ Заключение
74
basis.js - это удобные
инструменты разработки
75
Граф зависимостей - простое приложение
76
Граф зависимостей - сложное приложение
77
‣ выбраны услуги
‣ достаточно средств
‣ достаточно прав
78
Почему кнопка неактивна?
79
80
Более подробно в докладе
Романа Дворнова
http://bit.ly/2fr9vXO
81
‣ Прошлый опыт
‣ Компоненты
‣ Источники данных
‣ Локализация
‣ Трекинг событий
‣ Инструменты разработки
‣ Заключение
82
И все таки…
Почему мне нужно
использовать basis.js?
83
basis.js уже сейчас активно
используется в production
84
Попробуйте basis.js и сделайте
свои выводы
85
Как попробовать?
86
‣ npm i -g basisjs-tools
basis create app
basis server
87
‣ npm i -g basisjs-tools
‣ basis create app
basis server
88
‣ npm i -g basisjs-tools
‣ basis create app
‣ basis server
89
90
Отлично!
А минусы тоже есть?
91
‣ Документация
‣ Есть что улучшать
‣ Сообщество (есть gitter)
92
Спасибо за внимание!
93

More Related Content

What's hot

DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"Roman Dvornov
 
Как построить DOM
Как построить DOMКак построить DOM
Как построить DOMRoman Dvornov
 
Svyatoslav Login "360 View of XSS"
Svyatoslav Login "360 View of XSS"Svyatoslav Login "360 View of XSS"
Svyatoslav Login "360 View of XSS"Fwdays
 
СВЯТ ЛОГИН «Як провести пошук на xss атаку» Online QADay 2020 #2
СВЯТ ЛОГИН «Як провести пошук на xss атаку» Online QADay 2020 #2СВЯТ ЛОГИН «Як провести пошук на xss атаку» Online QADay 2020 #2
СВЯТ ЛОГИН «Як провести пошук на xss атаку» Online QADay 2020 #2GoQA
 
Не бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их многоНе бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их многоRoman Dvornov
 
построение внутренней ссылочной структуры сайта на Drupal 7 (seo). Костин ...
построение внутренней ссылочной структуры сайта на Drupal 7 (seo). Костин ...построение внутренней ссылочной структуры сайта на Drupal 7 (seo). Костин ...
построение внутренней ссылочной структуры сайта на Drupal 7 (seo). Костин ...PVasili
 
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...Ontico
 
Баба Яга против!
Баба Яга против!Баба Яга против!
Баба Яга против!Roman Dvornov
 
Компонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективноКомпонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективноRoman Dvornov
 
МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016Anastasia Goryacheva
 
Web осень 2013 лекция 4
Web осень 2013 лекция 4Web осень 2013 лекция 4
Web осень 2013 лекция 4Technopark
 
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов2ГИС Технологии
 
инструкция по оптимизации сайтов на Drupal херени даниэл
инструкция по оптимизации сайтов на Drupal херени даниэлинструкция по оптимизации сайтов на Drupal херени даниэл
инструкция по оптимизации сайтов на Drupal херени даниэлPVasili
 
Олег Мохов: Модель Отображения. Браузеры
Олег Мохов: Модель Отображения. БраузерыОлег Мохов: Модель Отображения. Браузеры
Олег Мохов: Модель Отображения. БраузерыYandex
 
Web осень 2013 лекция 8
Web осень 2013 лекция 8Web осень 2013 лекция 8
Web осень 2013 лекция 8Technopark
 

What's hot (19)

DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"
 
Как построить DOM
Как построить DOMКак построить DOM
Как построить DOM
 
Svyatoslav Login "360 View of XSS"
Svyatoslav Login "360 View of XSS"Svyatoslav Login "360 View of XSS"
Svyatoslav Login "360 View of XSS"
 
СВЯТ ЛОГИН «Як провести пошук на xss атаку» Online QADay 2020 #2
СВЯТ ЛОГИН «Як провести пошук на xss атаку» Online QADay 2020 #2СВЯТ ЛОГИН «Як провести пошук на xss атаку» Online QADay 2020 #2
СВЯТ ЛОГИН «Як провести пошук на xss атаку» Online QADay 2020 #2
 
Не бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их многоНе бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их много
 
построение внутренней ссылочной структуры сайта на Drupal 7 (seo). Костин ...
построение внутренней ссылочной структуры сайта на Drupal 7 (seo). Костин ...построение внутренней ссылочной структуры сайта на Drupal 7 (seo). Костин ...
построение внутренней ссылочной структуры сайта на Drupal 7 (seo). Костин ...
 
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
 
Kranonit s16 (python). dmitry furzenko
Kranonit s16 (python). dmitry furzenkoKranonit s16 (python). dmitry furzenko
Kranonit s16 (python). dmitry furzenko
 
Баба Яга против!
Баба Яга против!Баба Яга против!
Баба Яга против!
 
Компонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективноКомпонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективно
 
МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016
 
Js fuckworks
Js fuckworksJs fuckworks
Js fuckworks
 
Web осень 2013 лекция 4
Web осень 2013 лекция 4Web осень 2013 лекция 4
Web осень 2013 лекция 4
 
Основы MongoDB + NodeJS
Основы MongoDB + NodeJSОсновы MongoDB + NodeJS
Основы MongoDB + NodeJS
 
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
 
инструкция по оптимизации сайтов на Drupal херени даниэл
инструкция по оптимизации сайтов на Drupal херени даниэлинструкция по оптимизации сайтов на Drupal херени даниэл
инструкция по оптимизации сайтов на Drupal херени даниэл
 
Основы JS
Основы JSОсновы JS
Основы JS
 
Олег Мохов: Модель Отображения. Браузеры
Олег Мохов: Модель Отображения. БраузерыОлег Мохов: Модель Отображения. Браузеры
Олег Мохов: Модель Отображения. Браузеры
 
Web осень 2013 лекция 8
Web осень 2013 лекция 8Web осень 2013 лекция 8
Web осень 2013 лекция 8
 

Similar to Basis.js - Production Ready Framework

2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb Spock2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb SpockBohdan Danyliuk
 
Доставка данных в реальном времени.
Доставка данных в реальном времени. Доставка данных в реальном времени.
Доставка данных в реальном времени. beshkenadze
 
Тестирование CSS-регрессий с Gemini — Сергей Татаринцев
Тестирование CSS-регрессий с Gemini — Сергей ТатаринцевТестирование CSS-регрессий с Gemini — Сергей Татаринцев
Тестирование CSS-регрессий с Gemini — Сергей ТатаринцевYandex
 
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020OdessaJS Conf
 
Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016Кирилл Толкачёв
 
Тестирование серверной конфигурации
Тестирование серверной конфигурацииТестирование серверной конфигурации
Тестирование серверной конфигурацииTimur Batyrshin
 
QA MeetUp - Тимур Батыршин: "Тестирование серверной конфигурации"
QA MeetUp - Тимур Батыршин: "Тестирование серверной конфигурации"QA MeetUp - Тимур Батыршин: "Тестирование серверной конфигурации"
QA MeetUp - Тимур Батыршин: "Тестирование серверной конфигурации"Provectus
 
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидах
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидахCodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидах
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидахCodeFest
 
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»Yandex
 
Сергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CСергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CYandex
 
Jbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot StarterJbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot StarterAleksandr Tarasov
 
Problems of Automated Generation of Exploits on the Basis of Source Code
Problems of Automated Generation of Exploits on the Basis of Source CodeProblems of Automated Generation of Exploits on the Basis of Source Code
Problems of Automated Generation of Exploits on the Basis of Source CodePositive Hack Days
 
Лекция 4 Client-side
Лекция 4 Client-sideЛекция 4 Client-side
Лекция 4 Client-sideTechnosphere1
 
MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?Alexey Tokar
 
Cовременный станок верстальщика
Cовременный станок верстальщикаCовременный станок верстальщика
Cовременный станок верстальщикаmcslayer
 
Евгений Батовский, Николай Птущук "Современный станок верстальщика"
Евгений Батовский, Николай Птущук "Современный станок верстальщика"Евгений Батовский, Николай Птущук "Современный станок верстальщика"
Евгений Батовский, Николай Птущук "Современный станок верстальщика"Yandex
 
JavaScript: хороший тон клиентской разработки
JavaScript: хороший тон клиентской разработкиJavaScript: хороший тон клиентской разработки
JavaScript: хороший тон клиентской разработкиGetDev.NET
 
Азат Разетдинов "Оптимизация времени загрузки на примере Яндекс.Карт"
Азат Разетдинов "Оптимизация времени загрузки на примере Яндекс.Карт"Азат Разетдинов "Оптимизация времени загрузки на примере Яндекс.Карт"
Азат Разетдинов "Оптимизация времени загрузки на примере Яндекс.Карт"Yandex
 
Optimizaciya vremeni zagruzki_azat_razetdinov
Optimizaciya vremeni zagruzki_azat_razetdinovOptimizaciya vremeni zagruzki_azat_razetdinov
Optimizaciya vremeni zagruzki_azat_razetdinovyaevents
 

Similar to Basis.js - Production Ready Framework (20)

2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb Spock2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb Spock
 
Доставка данных в реальном времени.
Доставка данных в реальном времени. Доставка данных в реальном времени.
Доставка данных в реальном времени.
 
Тестирование CSS-регрессий с Gemini — Сергей Татаринцев
Тестирование CSS-регрессий с Gemini — Сергей ТатаринцевТестирование CSS-регрессий с Gemini — Сергей Татаринцев
Тестирование CSS-регрессий с Gemini — Сергей Татаринцев
 
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020
 
Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016
 
Grails & Groovy
Grails & GroovyGrails & Groovy
Grails & Groovy
 
Тестирование серверной конфигурации
Тестирование серверной конфигурацииТестирование серверной конфигурации
Тестирование серверной конфигурации
 
QA MeetUp - Тимур Батыршин: "Тестирование серверной конфигурации"
QA MeetUp - Тимур Батыршин: "Тестирование серверной конфигурации"QA MeetUp - Тимур Батыршин: "Тестирование серверной конфигурации"
QA MeetUp - Тимур Батыршин: "Тестирование серверной конфигурации"
 
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидах
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидахCodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидах
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидах
 
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
 
Сергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CСергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3C
 
Jbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot StarterJbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot Starter
 
Problems of Automated Generation of Exploits on the Basis of Source Code
Problems of Automated Generation of Exploits on the Basis of Source CodeProblems of Automated Generation of Exploits on the Basis of Source Code
Problems of Automated Generation of Exploits on the Basis of Source Code
 
Лекция 4 Client-side
Лекция 4 Client-sideЛекция 4 Client-side
Лекция 4 Client-side
 
MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?
 
Cовременный станок верстальщика
Cовременный станок верстальщикаCовременный станок верстальщика
Cовременный станок верстальщика
 
Евгений Батовский, Николай Птущук "Современный станок верстальщика"
Евгений Батовский, Николай Птущук "Современный станок верстальщика"Евгений Батовский, Николай Птущук "Современный станок верстальщика"
Евгений Батовский, Николай Птущук "Современный станок верстальщика"
 
JavaScript: хороший тон клиентской разработки
JavaScript: хороший тон клиентской разработкиJavaScript: хороший тон клиентской разработки
JavaScript: хороший тон клиентской разработки
 
Азат Разетдинов "Оптимизация времени загрузки на примере Яндекс.Карт"
Азат Разетдинов "Оптимизация времени загрузки на примере Яндекс.Карт"Азат Разетдинов "Оптимизация времени загрузки на примере Яндекс.Карт"
Азат Разетдинов "Оптимизация времени загрузки на примере Яндекс.Карт"
 
Optimizaciya vremeni zagruzki_azat_razetdinov
Optimizaciya vremeni zagruzki_azat_razetdinovOptimizaciya vremeni zagruzki_azat_razetdinov
Optimizaciya vremeni zagruzki_azat_razetdinov
 

Basis.js - Production Ready Framework