Слайд 2Framework — основа или каркас приложения
![Framework — основа или каркас приложения](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/435253/slide-1.jpg)
Слайд 3Приложение
Яндекс
Underscore
jQuery
Backbone
common.js
![Приложение Яндекс Underscore jQuery Backbone common.js](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/435253/slide-2.jpg)
Слайд 7Дробим на модули чтобы:
улучшить архитектуру фреймворка;
упростить командную разработку и тестирование;
из «большого» фреймворка
![Дробим на модули чтобы: улучшить архитектуру фреймворка; упростить командную разработку и тестирование;](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/435253/slide-6.jpg)
можно собрать «маленький» только с нужными функциями.
Слайд 9Тестирование
Автоматическое дешевле и проще ручного.
Дает возможность покрыть больше различных случаев.
Не заменимо при
![Тестирование Автоматическое дешевле и проще ручного. Дает возможность покрыть больше различных случаев. Не заменимо при рефакторинге.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/435253/slide-8.jpg)
рефакторинге.
Слайд 11Jasmine
describe(“Test case", function() {
it('should be true', function() {
expect(App.method()).toEqual(true);
});
});
![Jasmine describe(“Test case", function() { it('should be true', function() { expect(App.method()).toEqual(true); }); });](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/435253/slide-10.jpg)
Слайд 14Точки расширения функциональности
![Точки расширения функциональности](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/435253/slide-13.jpg)
Слайд 15События
$(root).on(“tableWasFilled.module1”,
function () { alert(“Filled”); });
$({a: 1}).on(“tableWasFilled.module1”,
function () { alert(“Filled”); });
![События $(root).on(“tableWasFilled.module1”, function () { alert(“Filled”); }); $({a: 1}).on(“tableWasFilled.module1”, function () { alert(“Filled”); });](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/435253/slide-14.jpg)
Слайд 16Функции обратного вызова
Можно передать только одну функцию обратного вызова.
Перед вызовом нужно проверить,
![Функции обратного вызова Можно передать только одну функцию обратного вызова. Перед вызовом](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/435253/slide-15.jpg)
что передали именно функцию.
Явное связывание модулей.
Слайд 17Отложенные объекты
Можно зарегистрировать сколько угодно функций-обработчиков.
Объект может изменить состояние только один раз.
Явное
![Отложенные объекты Можно зарегистрировать сколько угодно функций-обработчиков. Объект может изменить состояние только](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/435253/slide-16.jpg)
связывание модулей.
Мало кто понимает как это работает!
Слайд 18Стиль кода
Программы пишут,
чтобы их читать.
![Стиль кода Программы пишут, чтобы их читать.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/435253/slide-17.jpg)
Слайд 19Стиль кода
Douglas Crockford: “Programming Style & Your Brain”
JSLint в качестве валидатора
Code Guidelines
![Стиль кода Douglas Crockford: “Programming Style & Your Brain” JSLint в качестве](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/435253/slide-18.jpg)
для вашей команды
Слайд 20Рефакторинг
Не боимся трогать то,
что работает.
![Рефакторинг Не боимся трогать то, что работает.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/435253/slide-19.jpg)
Слайд 25Чеклист
Модульность
Тесты
Точки расширения
Хороший стиль кода
Документация
![Чеклист Модульность Тесты Точки расширения Хороший стиль кода Документация](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/435253/slide-24.jpg)
Слайд 26Решил сделать «идеальный» фреймворк.
http://bit.ly/app-skeleton
![Решил сделать «идеальный» фреймворк. http://bit.ly/app-skeleton](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/435253/slide-25.jpg)
Слайд 27Создаем пространство имён
App.namespace(“App.Module”, {
method: function () {
…
}
});
![Создаем пространство имён App.namespace(“App.Module”, { method: function () { … } });](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/435253/slide-26.jpg)
Слайд 28Хранилище данных модуля
App.defaults(“App.Module”, {
text: “Hello, world!”,
enabled: true,
});
![Хранилище данных модуля App.defaults(“App.Module”, { text: “Hello, world!”, enabled: true, });](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/435253/slide-27.jpg)
Слайд 29Доступ к данным
var data = App.defaults(“App.Module”);
var enabled = App.defaults(“App.Module”,
“enabled”);
var text = App.defaults(“App.Module”,
“error.text”,
![Доступ к данным var data = App.defaults(“App.Module”); var enabled = App.defaults(“App.Module”, “enabled”);](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/435253/slide-28.jpg)
“Default text”);
Слайд 30Описание зависимостей
App.register({
name: “module1”,
path: [
“/js/module1.js”, “/css/module1.css”
],
requires: [“jQuery”, “module2”]
});
![Описание зависимостей App.register({ name: “module1”, path: [ “/js/module1.js”, “/css/module1.css” ], requires: [“jQuery”, “module2”] });](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/435253/slide-29.jpg)
Слайд 31Загрузка модуля
App.load({
load: App.calculate(“module1”);
complete: function () {
$(App.Module.init);
}
});
![Загрузка модуля App.load({ load: App.calculate(“module1”); complete: function () { $(App.Module.init); } });](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/435253/slide-30.jpg)
Слайд 32Загрузка обязательных ресурсов
App.bootstrap({
load: “jquery-1.7.1.min.js”,
complete: function () {
// в этом месте уже можно
![Загрузка обязательных ресурсов App.bootstrap({ load: “jquery-1.7.1.min.js”, complete: function () { // в](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/435253/slide-31.jpg)
декорировать // страницу с применением jQuery.
}
});
Слайд 33http://bit.ly/app-skeleton
Модульность
Тесты
Точки расширения
Хороший стиль кода
Документация
![http://bit.ly/app-skeleton Модульность Тесты Точки расширения Хороший стиль кода Документация](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/435253/slide-32.jpg)