91
Фронтенд

Frontend весна 2014 лекция 1

Embed Size (px)

Citation preview

Page 1: Frontend весна 2014 лекция 1

Фронтенд

Page 2: Frontend весна 2014 лекция 1

I. Инструменты

Page 3: Frontend весна 2014 лекция 1

Фронтенд

АНТОН ЕПРЕВ // a.eprev \

ЕГОР ДЫДЫКИН // e.dydykin - @corp.mail.ru

ИВАН ЧАШКИН // i.chashkin /

01.

02.

03.

3

Page 4: Frontend весна 2014 лекция 1

Модули

АРХИТЕКТУРА // 2 СЗ + КР

DOM & AJAX // 3 СЗ + КР

ОТДЛАДКА И МОБИЛЬНЫЙ ВЕБ // 3 СЗ + КР

01.

02.

03.

4

Page 5: Frontend весна 2014 лекция 1

Определение

Веб-приложение — клиент-серверное приложение, в котором

клиентом выступает браузер, а сервером — веб-сервер. Логика веб-

приложения распределена между сервером и клиентом, хранение

данных осуществляется, преимущественно, на сервере, обмен

информацией происходит по сети.

Википедия

“5

Page 6: Frontend весна 2014 лекция 1

HTTP, JavaScript,Backbone, DOM,Events, AJAX,WebSockets,Sass, Grunt…

Page 7: Frontend весна 2014 лекция 1

Демо

Page 8: Frontend весна 2014 лекция 1

Контрольные рубежи

РК №1 <= 20

РК №2 <= 60

РК №3 <= 100

01.

02.

03.

8

Page 9: Frontend весна 2014 лекция 1

Итоговая оценка

0 <= "НЕУДОВЛЕТВОРИТЕЛЬНО" <= 59

60 <= "УДОВЛЕТВОРИТЕЛЬНО" <= 74

75 <= "ХОРОШО" <= 89

90 <= "ОТЛИЧНО" <= 100

01.

02.

03.

04.

9

Page 10: Frontend весна 2014 лекция 1

Критерии оценки

СООТВЕТСТВИЕ РЕЗУЛЬТАТА ПРЕДЪЯВЛЯЕМЫМ ТРЕБОВАНИЯМ

ОПТИМАЛЬНОСТЬ ПРЕДЛАГАЕМОГО РЕШЕНИЯ

ПРАКТИЧНОСТЬ РЕШЕНИЯ

КАЧЕСТВО ОФОРМЛЕНИЯ РЕЗУЛЬТАТОВ РАБОТЫ

ДОКАЗАТЕЛЬНОСТЬ АРГУМЕНТАЦИИ ПРИ ЗАЩИТЕ РАБОТЫ

01.

02.

03.

04.

05.

10

Page 11: Frontend весна 2014 лекция 1

tp.eprev.org/p/1

Page 12: Frontend весна 2014 лекция 1
Page 13: Frontend весна 2014 лекция 1
Page 14: Frontend весна 2014 лекция 1
Page 15: Frontend весна 2014 лекция 1

Single PageApplication

Page 16: Frontend весна 2014 лекция 1

Fest

Page 17: Frontend весна 2014 лекция 1

Ресурсы

1.  http://nodejs.org

2.  https://npmjs.org

3.  http://gruntjs.com

4.  https://github.com/mailru/fest

17

Page 18: Frontend весна 2014 лекция 1

Проектнаяработа

Page 19: Frontend весна 2014 лекция 1

Подготовка

$ node -v

v0.10.12

01.

02.

19

Page 20: Frontend весна 2014 лекция 1

Приступаем!

$ mkdir epicgame & cd epicgame

$ npm init

$ cat package.json

$ npm install grunt-cli -g

$ npm install grunt grunt-contrib-connect --save-dev

$ vim Gruntfile.js

01.

02.

03.

04.

05.

06.

20

Page 21: Frontend весна 2014 лекция 1

Gruntfile.js

module.exports = function (grunt) {

grunt.initConfig({

connect: { … } /* grunt-contrib-connect */

});

grunt.loadNpmTasks('grunt-contrib-connect');

};

01.

02.

03.

04.

05.

06.

21

Page 22: Frontend весна 2014 лекция 1

grunt-contrib-connect

server: { /* Подзадача */

options: {

keepalive: true, /* работать постоянно */

port: 8000, /* номер порта */

base: 'public' /* публичная директория */

}

}

01.

02.

03.

04.

05.

06.

07.

22

Page 23: Frontend весна 2014 лекция 1

Gruntfile.js

$ grunt connect:server

Running "connect:server" (connect) task

Waiting forever...

Started connect web server on http://localhost:8000

01.

02.

03.

04.

23

Page 24: Frontend весна 2014 лекция 1

public

$ cat public/index.html

Hello!

01.

02.

24

Page 25: Frontend весна 2014 лекция 1
Page 26: Frontend весна 2014 лекция 1

HTML

<!DOCTYPE html>

<html><head>

<meta charset="utf-8">

<link rel="stylesheet" href="/css/main.css"/>

</head><body>

<div id="page"></div>

</body></html>

01.

02.

03.

04.

05.

06.

07.

26

Page 27: Frontend весна 2014 лекция 1

Fest

$ npm install grunt-fest --save-dev

27

Page 28: Frontend весна 2014 лекция 1

Fest

<fest:template xmlns:fest="http://fest.mail.ru"

context_name="json">

<div>

<h1>Epic Game</h1>

</div>

</fest:template>

01.

02.

03.

04.

05.

06.

28

Page 29: Frontend весна 2014 лекция 1

Fest

$ vim templates/main.xml

$ vim templates/scoreboard.xml

$ vim templates/game.xml

01.

02.

03.

29

Page 30: Frontend весна 2014 лекция 1

Gruntfile.js

grunt.initConfig({

connect: { … } /* grunt-contrib-connect */

fest: { … } /* grunt-fest */

});

grunt.loadNpmTasks('grunt-contrib-connect');

grunt.loadNpmTasks('grunt-fest');

01.

02.

03.

04.

05.

06.

30

Page 31: Frontend весна 2014 лекция 1

grunt-fest

templates: { /* Подзадача */

files: [{

expand: true,

cwd: 'templates', /* исходная директория */

src: '*.xml', /* имена шаблонов */

dest: 'public/js/tmpl' /* результирующая директория */

}], … }

01.

02.

03.

04.

05.

06.

07.

31

Page 32: Frontend весна 2014 лекция 1

grunt-fest ’s options

template: function (data) { /* формат функции-шаблона */

return grunt.template.process(

/* присваиваем функцию-шаблон переменной */

'var <%= name %>Tmpl = <%= contents %> ;',

{data: data}

);

}

01.

02.

03.

04.

05.

06.

07.

32

Page 33: Frontend весна 2014 лекция 1

Grunt

$ grunt fest

$ cat public/js/tmpl/main.js

$ cat public/js/tmpl/scoreboard.js

$ cat public/js/tmpl/game.js

01.

02.

03.

04.

33

Page 34: Frontend весна 2014 лекция 1

Sweetness!

$ npm install grunt-contrib-watch --save-dev

34

Page 35: Frontend весна 2014 лекция 1

Gruntfile.js

grunt.initConfig({

watch: { … } /* grunt-contrib-watch */

});

grunt.loadNpmTasks('grunt-contrib-watch');

01.

02.

03.

04.

05.

06.

35

Page 36: Frontend весна 2014 лекция 1

grunt-contrib-watch

fest: { /* Подзадача */

files: ['templates/*.xml'], /* следим за шаблонами */

tasks: ['fest'], /* перекомпилировать */

options: {

atBegin: true /* запустить задачу при старте */

}

}

01.

02.

03.

04.

05.

06.

07.

36

Page 37: Frontend весна 2014 лекция 1

Gruntfile.js

grunt.initConfig({

watch: { … } /* grunt-contrib-watch */

connect: { … } /* grunt-contrib-connect */

});

grunt.registerTask('default', ['connect', 'watch']);

01.

02.

03.

04.

05.

06.

07.

37

Page 38: Frontend весна 2014 лекция 1

grunt-contrib-connect

server: { /* Подзадача */

options: {

keepalive: true, /* работать постоянно */

port: 8000, /* номер порта */

base: 'public' /* публичная директория */

}

}

01.

02.

03.

04.

05.

06.

07.

38

Page 39: Frontend весна 2014 лекция 1
Page 40: Frontend весна 2014 лекция 1

JavaScript

<script src="/js/lib/jquery.js"></script>

<script src="/js/tmpl/main.js"></script>

<script>

var $page = $('#page');

$page.html(mainTmpl()); // Рендерим шаблон

</script>

01.

02.

03.

04.

05.

06.

07.

40

Page 41: Frontend весна 2014 лекция 1

JavaScript

function showMainScreen() { // Конструктор экрана "Главный"

$page.html(mainTmpl()); // Рендерим шаблон

// Инициализируем обработчики событий

$page.find('.js-scoreboard')

.on('click', showScoreboardScreen);

$page.find('.js-start-game').on('click', showGameScreen);

}

01.

02.

03.

04.

05.

06.

07.

41

Page 42: Frontend весна 2014 лекция 1

JavaScript

function hideMainScreen() { // Деструктор экрана "Главный"

// Удаляем установленные обработчики событий

$page.find('.js-scoreboard')

.off('click', showScoreboardScreen);

$page.find('.js-start-game').off('click', showGameScreen);

}

01.

02.

03.

04.

05.

06.

42

Page 43: Frontend весна 2014 лекция 1

JavaScript

/* Конструктор экрана "Лучшие игроки" */

function showScoreboardScreen() {

hideMainScreen();

}

/* Деструктор экрана "Лучшие игроки" */

function hideScoreboardScreen() {}

01.

02.

03.

04.

05.

06.

43

Page 44: Frontend весна 2014 лекция 1

Домашнее задание

СФОРМИРОВАТЬ ИДЕЮ ИГРЫ

ОПРЕДЕЛИТЬСЯ С ГРУППОЙ И РОЛЯМИ В НЕЙ

САМОСТОЯТЕЛЬНО ИЗУЧИТЬ GRUNT, FEST И JQUERY

СОЗДАТЬ ПРОТОТИП ВЕБ-ПРИЛОЖЕНИЯ ПО ТЗ

01.

02.

03.

04.

44

Page 45: Frontend весна 2014 лекция 1

II. Архитектура

Page 46: Frontend весна 2014 лекция 1

Immediately-Invoked FunctionExpression, IIFE

var foo = 1;

(function () {

var foo = 2;

alert(foo);

})();

alert(foo);

01.

02.

03.

04.

05.

06.

46

Page 47: Frontend весна 2014 лекция 1

Модуль в JavaScript

var module = (function () {

var name = 'A'; // приватная переменная

return {

say: function () { // публичный метод

alert(name);

}

};

})();

01.

02.

03.

04.

05.

06.

07.

08.47

Page 48: Frontend весна 2014 лекция 1
Page 49: Frontend весна 2014 лекция 1
Page 50: Frontend весна 2014 лекция 1

Устройство веб-приложения

УРОВЕНЬ БИБЛИОТЕК.

УРОВЕНЬ ЯДРА ПРИЛОЖЕНИЯ.

УРОВЕНЬ МОДЕЛЕЙ.

01.

02.

03.

50

Page 51: Frontend весна 2014 лекция 1

Определение

Модуль — функционально законченный фрагмент программы,

оформленный в виде отдельного файла с исходным кодом…

предназначенный для использования в других программах.

Википедия

“51

Page 52: Frontend весна 2014 лекция 1

Модуль веб-приложения

Состоит из HTML, CSS и JavaScript.

Характеризуется слабой связностью.

01.

02.

52

Page 53: Frontend весна 2014 лекция 1
Page 54: Frontend весна 2014 лекция 1
Page 55: Frontend весна 2014 лекция 1
Page 56: Frontend весна 2014 лекция 1
Page 57: Frontend весна 2014 лекция 1
Page 58: Frontend весна 2014 лекция 1
Page 59: Frontend весна 2014 лекция 1
Page 60: Frontend весна 2014 лекция 1
Page 61: Frontend весна 2014 лекция 1

Кнопка тулбара

<div class="toolbar">

<div class="button">Click Me</div>

</div>

.toolbar .button {

background: white;

}

01.

02.

03.

04.

05.

06.

61

Page 62: Frontend весна 2014 лекция 1

Кнопка тулбара

<div class="window">

<div class="toolbar">

<div class="button">Click Me</div>

</div>

<div class="button">Submit</div>

</div>

01.

02.

03.

04.

05.

06.

62

Page 63: Frontend весна 2014 лекция 1

Кнопка тулбара

.toolbar .button {

background: white;

}

.window .button {

background: black;

}

01.

02.

03.

04.

05.

06.

63

Page 64: Frontend весна 2014 лекция 1

Кнопка тулбара (БЭМ)

<div class="window">

<div class="toolbar">

<div class="toolbar__button">Click Me</div>

</div>

<div class="window__button">Submit</div>

</div>

01.

02.

03.

04.

05.

06.

64

Page 65: Frontend весна 2014 лекция 1

Кнопка тулбара (БЭМ)

.toolbar__button {

background: white;

}

.window__button {

background: black;

}

01.

02.

03.

04.

05.

06.

65

Page 66: Frontend весна 2014 лекция 1

БЭМ

toolbar // блок

toolbar__button // блок__элемент

toolbar_fixed // блок_модификатор

toolbar__button_size_xl // блок__элемент_модификатор_значение

http://ru.bem.info

01.

02.

03.

04.

66

Page 67: Frontend весна 2014 лекция 1

Устройство веб-приложения

УРОВЕНЬ МОДУЛЕЙ. // AMD & RequireJS

УРОВЕНЬ ЯДРА ПРИЛОЖЕНИЯ. // Backbone

УРОВЕНЬ БИБЛИОТЕК. // jQuery & Underscore

01.

02.

03.

67

Page 68: Frontend весна 2014 лекция 1
Page 69: Frontend весна 2014 лекция 1

Модуль в JavaScript

var module = (function () {

var name = 'A'; // приватная переменная

return {

say: function () { // публичный метод

alert(name);

}

};

})();

01.

02.

03.

04.

05.

06.

07.

08.69

Page 70: Frontend весна 2014 лекция 1

Asynchronous Module Definition

define('A', function () {

var name = 'A'; // приватная переменная

return {

say: function () { // публичный метод

alert(name);

}

};

});

01.

02.

03.

04.

05.

06.

07.

08.70

Page 71: Frontend весна 2014 лекция 1

Asynchronous Module Definition

define('B', ['A'], function (A) {

var name = 'B'; // приватная переменная

return {

say: function () { // публичный метод

A.say(); // вызов публичного метода модуля A

alert(name);

}

01.

02.

03.

04.

05.

06.

07.

08.71

Page 72: Frontend весна 2014 лекция 1
Page 73: Frontend весна 2014 лекция 1

Backbone

МОДЕЛИ // models

КОЛЛЕКЦИИ // collections

ПРЕДСТАВЛЕНИЯ // view

01.

02.

03.

73

Page 74: Frontend весна 2014 лекция 1

Backbone.Events

var object = {};

_.extend(object, Backbone.Events);

object.on("alert", function (msg) {

alert("Triggered " + msg);

});

object.trigger("alert", "an event");

01.

02.

03.

04.

05.

06.

74

Page 75: Frontend весна 2014 лекция 1

Backbone.Model

var PlayerModel = Backbone.Model.extend({});

var player = new PlayerModel();

player.on('change:name', function(model, name) {

alert('Player name is ' + name);

});

player.set({name: 'Mark'});

01.

02.

03.

04.

05.

06.

75

Page 76: Frontend весна 2014 лекция 1

Backbone.View

var PlayerView = Backbone.View.extend({

tagName: "li",

className: "score__item",

template: fest['player'],

01.

02.

03.

04.

05.

76

Page 77: Frontend весна 2014 лекция 1

Backbone.View

events: {

"click .button_delete": "destroy"

},

destroy: function () {},

01.

02.

03.

04.

05.

06.

77

Page 78: Frontend весна 2014 лекция 1

Backbone.View

initialize: function () {

this.listenTo(this.model, "change", this.render);

},

render: function () {

this.$el.html(this.template(this.model.attributes));

}

});

01.

02.

03.

04.

05.

06.

07.

08. 78

Page 79: Frontend весна 2014 лекция 1

Backbone.View

var playerView = new PlayerView({

model: player,

id: "player-" + player.id

});

01.

02.

03.

04.

79

Page 80: Frontend весна 2014 лекция 1
Page 81: Frontend весна 2014 лекция 1

Uniform resource locator

scheme://domain:port/path?query_string#fragment_id

81

Page 82: Frontend весна 2014 лекция 1

Событие hashchange

Backbone.history.start();

82

Page 83: Frontend весна 2014 лекция 1

Backbone.Router

var Router = Backbone.Router.extend({

routes: {

'scoreboard': 'scoreboardAction',

'game' : 'gameAction',

'*default' : 'defaultActions'

},

scoreboardAction: function () {},

01.

02.

03.

04.

05.

06.

07.

08. 83

Page 84: Frontend весна 2014 лекция 1

Backbone.Router

gameAction: function () {},

defaultActions: function () {}

});

new Router();

01.

02.

03.

04.

05.

84

Page 85: Frontend весна 2014 лекция 1

grunt-fest ’s options

template: function (data) {

return grunt.template.process(

/* 'var <%= name %>Tmpl = <%= contents %> ;' */

'define(function () { return <%= contents %> ; });',

{data: data}

);

}

01.

02.

03.

04.

05.

06.

07.

85

Page 86: Frontend весна 2014 лекция 1
Page 87: Frontend весна 2014 лекция 1

Подлючение JavaScript файлов

<script src="/js/lib/jquery.js"></script>

<script src="/js/tmpl/main.js"></script>

<script src="/js/tmpl/scoreboard.js"></script>

<script src="/js/tmpl/game.js"></script>

01.

02.

03.

04.

87

Page 88: Frontend весна 2014 лекция 1

Подлючение JavaScript файлов(RequireJS)

<script data-main="js/main"

src="js/lib/require.js"></script>

01.

02.

88

Page 89: Frontend весна 2014 лекция 1

js/main.js

define([

'router'

], function () {

Backbone.history.start();

});

01.

02.

03.

04.

05.

06.

89

Page 90: Frontend весна 2014 лекция 1

Подготовка

$ git remote add tp \

→ https://github.com/eprev/frontend-stub.git

$ git fetch tp

$ git merge tp/v2

01.

02.

03.

04.

90

Page 91: Frontend весна 2014 лекция 1

Домашнее задание

САМОСТОЯТЕЛЬНО ИЗУЧИТЬ UNDERSCORE, BACKBONE И REQUIREJS

ДОРАБОТАТЬ ПРОТОТИП ПО ТЗ

01.

02.

91