SlideShare a Scribd company logo
1 of 46
Download to read offline
Разработка больших приложений
Vue Webpack
Кирилл Кайсаров
github.com/markuplab
http://vuejs.org http://webpack.github.io
Какими были Javascript приложения
в период с 2006 по 2015 год
Минутка ностальгии
Write Less / Do More
Эра jQuery
$(element) - Основная структурная единица
1 Все манипуляции ориентированы на DOM ноды
Plugin основная единица экосистемы
2 Большинство популярных решений имели избыточный объем кода
Server Side Rendering
3 Получение отрендеренного html'a один из классических подходов эры
Model View Controller
ЭРА MVVC / MVC / VM / MC / MV / VC / ETC...
Plain JS Object - Основная архитектурная единица
1 new Constructor(), Object.prototype, Object.extend({}), итд...
Client-Side Rendering
2 Избавление сервера от дополнительной работы с шаблонами + гибкость
Триумф AMD
3 Загрузка модулей через AJAX, явные зависимости, и сборка на Java
Утром Data - Вечером HTML
4 Тренд на Dom-First Apps резко изменился на Data-First Apps
Наше время
Компонентная эра
Компоненты как архитектурная единица
1 Теперь модуль это не только Javascript. Все asset'ы внутри.
Триумф CommonJS
2 NPM, Модули для сервера и браузера, browserify, изоморфность.
Реактивное и асинхронное программирование
3 Promise, Generators, NextTick, Pipes
Большая нагрузка на клиента - почва для оптимизаций
4 Ленивая загрузка, разделение приложения на части, benchmarking
Vue.JS
Основные принципы
Построен на принципах реактивного программирования
Основные принципы
1 Vue.nextTick(), Queue, Reactive Directives
Поддерживает концепцию Web Components
2 V-component, Vueify, Component Registry, Custom Directives
Сущность это простой (plain) Javascript объект
3 Template as HTML String, Component as Javascript Object
Единая сущность Vue
Основные принципы
4 Объект содержит в себе $data, $methods, $events итд...
Дружелюбен к модульным системам
5 Простая интеграция с Common.JS и другими модульными системами
Webpack
Основные принципы
Основные принципы
1
Module is Everything
HTML строка, CSS таблица, Javascript функция, нет разницы.
2Только Javascript? Нет.
Webpack умеет собирать не только Javascript, также графику, шрифты итд...
3Ленивая / Частичная загрузка из пакета
Важный инструмент для больших приложений без излишних расширений
Основные принципы
4
Ориентирован на Client-Side приложения
Hot Module Replacement, JSONP, и другие браузерные решения
5AMD / CommonJS / Native
Нет разницы какую систему модулей вы используете
Какие задачи стоят
перед современными
Client-Side приложениями?
Технические требования приложения
Расширяется как в ширину так и в высоту
Приложение состоит из модулей
Приложение может быть интернационализировано
Приложение может быть менять свой внешний
вид на разных платформах
Время для котикадинга
/** Module dependencies */
var Vue = require('vue');
/** Define application */
var app = module.exports = new Vue({
el: '#v-app'
});
Точка входа в приложение
doctype html
html
head
title Simple application
body#v-app
script(src='/public/build.js')
Построим HTML Layout
$ sudo npm i webpack -g
Устанавливаем Webpack
module.exports = {
entry: {
app: "./components/app.js"
},
output: {
path: "./public/build",
filename: "app.js"
}
}
Описываем webpack.config.js
$ webpack -p
Hash: f2f8823c3ad505796c0d
Version: webpack 1.4.15
Time: 3230ms
Asset Size Chunks Chunk Names
app.js 59934 0 [emitted] app
+ 63 hidden modules
Собираем наше приложение
Создаем первый компонент
doctype html
html
body#v-app
#v-panel(v-component="panel")
Объявляем в Layout
Регистрируем компонент в нашем приложении
/** Define application */
var app = module.exports = new Vue({
el: '#v-app',
components: {
panel : require('./panel')
}
});
Описываем компонент
/** Define component */
module.exports = {
template: '<div class="v-panel">Я панель по имени {{ firstName }} '
+ 'и фамилии <span v-html="lastName"></span></div>',
data: function(){
return {
firstName: 'Петя'
}
},
created: function() {
this.$set('lastName', 'Петров');
}
};
Создаем первый компонент
Создаем первый компонент
Результат
Капля оптимизации
/** Define component */
module.exports = {
template: require('./template.html'),
data: function(){
return {
firstName: 'Петя'
}
},
created: function() {
this.$set('lastName', 'Петров');
}
};
Создаем первый компонент
/** Define component */
module.exports = {
// Как загрузить HTML в require?!
template: require('./template.html')
};
Опишем webpack.config.js
module.exports = {
module: {
loaders: [
{ test: /.html$/, loader: "html" }
]
}
};
Создаем первый компонент
Капля оптимизации
Webpack Loaders
Загрузчики это функции которые выполняют
трансформацию файлов в модули приложения.
Аналогичны browserify transform.
http://webpack.github.io/docs/using-loaders.html
/** Define component assets */
require('./styles.less')
/** Define component */
module.exports = {
template: require('./template.html')
};
Дополним наш webpack.config.js загрузчиком стилей
module: {
loaders: [
{ test: /.html$/, loader: "html" },
{ test: /.less$/, loader: "style!css!less" }
]
}
Создаем первый компонент
Результат template.html
module.exports = "<div class="v-panel">n Я панель по имени {{ firstName }}
и фамилииn
<span v-html="lastName"></span>n</div>n";
/***/
function(module, exports, __webpack_require__) {
exports = module.exports = __webpack_require__(32)();
exports.push([module.id, "span {n color: #999;n}n", ""]);
/***/ }
Результат styles.less
Создаем первый компонент
Создаем первый компонент
Результат
Технические требования приложения
Расширяется как в ширину так и в высоту
Приложение состоит из модулей
Приложение может быть интернационализировано
Приложение может быть менять свой внешний
вид на разных платформах
Добавим немного динамики
Controller - компонент отвечающий за состояние приложения
Содержит в себе все нужные для работы компоненты
1
Является точкой разрыва приложения. App -> Controller -> Components
2
Controller определяется в зависимости от состояния URL
3
Схема сбора и запуска приложения
Client App URL
State
Controller
Component Component Component
Controller Controller
Контроллер - место где наше приложение начинает
ответвляться от приложения. Именно тут мы можем
разделить наше приложение на части.
Для решения этой задачи подойдет require.ensure
представленный в CommonJS спецификации.
Webpack поддерживает этот метод.
http://wiki.commonjs.org/wiki/Modules/Async/A
require.ensure(['increment'], function(require) {
var inc = require('increment').inc;
var a = 1;
inc(a); // 2
});
Синтаксис:
Создадим явную карту наших контроллеров
/** Routes map */
var map = {
main: require('./controllers/main'),
alt: require('./controllers/alt')
};
Создаем контроллеры
Проблематика:
Основной проблематикой клиентских загрузчиков модулей является
"неумение" работать с динамическими аргументами require(). В
текущих реализациях мы вынуждены указывать имена модулей
явно. Node.JS умеет подтягивать модули динамически.
Делаем нашу карту модулей ленивой
/** Routes map */
var map = {
main: require('promise?bluebird!./controllers/main'),
alt: require('promise?bluebird!./controllers/alt')
};
Создаем контроллеры
Альтернативный вариант вызова Webpack Loaders
Для трансформации модулей можно использовать дополнительные
строковые параметры внутри require() отделив их через знак "!". В
указаном выше случае мы загружаем модуль пропуская его через
promise-loader.
Немного о Promise-Loader
Создаем контроллеры
Трансформация этим модулем позволяет сделать отложенный
require.ensure и обернуть его в Promise объект.
// Указываем библиотеку для обертки в Promise
var load = require("promise?bluebird!./file.js");
// Модуль не будет загружен пока вы не вызовете функцию
load().then(function(module) {
// Здесь вы можете работать с вашим модулем
});
Контроллеры выделены в отдельные файлы
$ webpack
Hash: 5fa98cfa191aa5dafdb4
Version: webpack 1.5.3
Time: 827ms
Asset Size Chunks Chunk Names
app.js 349774 0 [emitted] app
1.1.js 287 1 [emitted]
2.2.js 294 2 [emitted]
+ 78 hidden modules
Создаем контроллеры
Результат
Создаем контроллеры
Указываем элемент в котором расположим контроллер
doctype html
html
head
title Simple application
body#v-app
#v-panel(v-component="panel")
#v-controller(v-el="controller")
script(src='/public/build.js')
Создаем контроллеры
Загружаем и запускаем контроллер
module.exports = new Vue({
el: '#v-app',
created: function() {
var controller = url.getController();
var load = map[controller]();
load.then(function (module) {
var ctrl = new Vue(module);
ctrl.$mount(this.$$.controller);
}.bind(this));
}
...
});
Создаем контроллеры
Связать управление контроллерами с HTML5 History API
Следующие шаги
1 Состояние приложения можно хранить в this.$data
Спроектировать ленивую загрузку внутри контроллера
2 Актуально для больших контроллеров
3 Как инструмент дополнительной оптимизации
Использовать ApplicationCache и Deduplication Plugin
Технические требования приложения
Расширяется как в ширину так и в высоту
Приложение состоит из модулей
Приложение может быть интернационализировано
Приложение может быть менять свой внешний
вид на разных платформах
module.exports = {
template: require('./templates/' + platform + '.html')
};
Динамическая загрузка модулей
- templates
- ios.html
- android.html
- windows.html
Отлично подходит для кросс-платформенных решений
Другие возможности
Динамическая загрузка модулей
Другие возможности
При такой загрузке в сборку попадут все модули из
папки ./templates с форматом .html, а также внутри
загрузчика появиться карта соответствия имени
файла, id'шнику модуля.
Технические требования приложения
Расширяется как в ширину так и в высоту
Приложение состоит из модулей
Приложение может быть интернационализированно
Приложение может быть менять свой внешний
вид на разных платформах
var messages = require("json!po!./locale/en_US/LC_MESSAGES/messages.po");
Загрузка интернациональных пакетов
Другие полезные загрузчики
- autoprefixer
- mocha
- handlebars
- 6to5
- file
- json
Другие возможности
Технические требования приложения
Расширяется как в ширину так и в высоту
Приложение состоит из модулей
Приложение может быть интернационализировано
Приложение может быть менять свой внешний
вид на разных платформах
Вопросы???

More Related Content

What's hot

#12 "Создание двух desktop приложений на node-webkit и Electron” Михаил Реенко
#12 "Создание двух desktop приложений на node-webkit и Electron” Михаил Реенко#12 "Создание двух desktop приложений на node-webkit и Electron” Михаил Реенко
#12 "Создание двух desktop приложений на node-webkit и Electron” Михаил РеенкоJSib
 
Современный фронтенд -- как не утонуть в море хайпа?
Современный фронтенд -- как не утонуть в море хайпа?Современный фронтенд -- как не утонуть в море хайпа?
Современный фронтенд -- как не утонуть в море хайпа?Vladimir Malyk
 
Webpack integration
Webpack integrationWebpack integration
Webpack integrationIllia Zub
 
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)Как мы ускоряли WebGL / Мстислав Живодков (2GIS)
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)Ontico
 
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)Ontico
 
Сергей Морковкин "Разработка realtime SPA с использованием VueJS и RethinkDB"
Сергей Морковкин "Разработка realtime SPA с использованием VueJS и RethinkDB"Сергей Морковкин "Разработка realtime SPA с использованием VueJS и RethinkDB"
Сергей Морковкин "Разработка realtime SPA с использованием VueJS и RethinkDB"Fwdays
 
Изоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесьИзоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесьCodeFest
 
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов2ГИС Технологии
 
Knockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-ОнлайнKnockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-Онлайн2ГИС Технологии
 
#5 "React.js" Антон Артамонов
#5 "React.js" Антон Артамонов#5 "React.js" Антон Артамонов
#5 "React.js" Антон АртамоновJSib
 
МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016Anastasia Goryacheva
 
#11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов
#11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов#11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов
#11 "Отзывчивый UI без блокировки Event Loop" Денис РечкуновJSib
 
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
#6 "Изоморфный фреймворк Catberry.js" Денис РечкуновJSib
 
Реактивный фронтенд фреймворк для людей (Константин Комелин)
Реактивный фронтенд фреймворк для людей (Константин Комелин)Реактивный фронтенд фреймворк для людей (Константин Комелин)
Реактивный фронтенд фреймворк для людей (Константин Комелин)DrupalYug
 
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...Ontico
 
JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.Igor Shkulipa
 
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScriptCSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScriptAlexey Ivanov
 
Внутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpackВнутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpackAlexey Ivanov
 
All you need is Vue, Nuxt is all you need | Odessa Frontend Meetup #10
All you need is Vue, Nuxt is all you need | Odessa Frontend Meetup #10All you need is Vue, Nuxt is all you need | Odessa Frontend Meetup #10
All you need is Vue, Nuxt is all you need | Odessa Frontend Meetup #10OdessaFrontend
 
Инструменты разные нужны, инструменты разные важны
Инструменты разные нужны, инструменты разные важныИнструменты разные нужны, инструменты разные важны
Инструменты разные нужны, инструменты разные важныCodeFest
 

What's hot (20)

#12 "Создание двух desktop приложений на node-webkit и Electron” Михаил Реенко
#12 "Создание двух desktop приложений на node-webkit и Electron” Михаил Реенко#12 "Создание двух desktop приложений на node-webkit и Electron” Михаил Реенко
#12 "Создание двух desktop приложений на node-webkit и Electron” Михаил Реенко
 
Современный фронтенд -- как не утонуть в море хайпа?
Современный фронтенд -- как не утонуть в море хайпа?Современный фронтенд -- как не утонуть в море хайпа?
Современный фронтенд -- как не утонуть в море хайпа?
 
Webpack integration
Webpack integrationWebpack integration
Webpack integration
 
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)Как мы ускоряли WebGL / Мстислав Живодков (2GIS)
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)
 
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
 
Сергей Морковкин "Разработка realtime SPA с использованием VueJS и RethinkDB"
Сергей Морковкин "Разработка realtime SPA с использованием VueJS и RethinkDB"Сергей Морковкин "Разработка realtime SPA с использованием VueJS и RethinkDB"
Сергей Морковкин "Разработка realtime SPA с использованием VueJS и RethinkDB"
 
Изоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесьИзоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесь
 
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
 
Knockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-ОнлайнKnockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-Онлайн
 
#5 "React.js" Антон Артамонов
#5 "React.js" Антон Артамонов#5 "React.js" Антон Артамонов
#5 "React.js" Антон Артамонов
 
МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016
 
#11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов
#11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов#11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов
#11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов
 
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
 
Реактивный фронтенд фреймворк для людей (Константин Комелин)
Реактивный фронтенд фреймворк для людей (Константин Комелин)Реактивный фронтенд фреймворк для людей (Константин Комелин)
Реактивный фронтенд фреймворк для людей (Константин Комелин)
 
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
 
JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.
 
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScriptCSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
 
Внутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpackВнутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpack
 
All you need is Vue, Nuxt is all you need | Odessa Frontend Meetup #10
All you need is Vue, Nuxt is all you need | Odessa Frontend Meetup #10All you need is Vue, Nuxt is all you need | Odessa Frontend Meetup #10
All you need is Vue, Nuxt is all you need | Odessa Frontend Meetup #10
 
Инструменты разные нужны, инструменты разные важны
Инструменты разные нужны, инструменты разные важныИнструменты разные нужны, инструменты разные важны
Инструменты разные нужны, инструменты разные важны
 

Similar to #3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кайсаров

Антон Валюх - Использование паттерна Mvvm в android
Антон Валюх - Использование паттерна Mvvm в androidАнтон Валюх - Использование паттерна Mvvm в android
Антон Валюх - Использование паттерна Mvvm в androidDataArt
 
JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"oelifantiev
 
Web deployment
Web deploymentWeb deployment
Web deploymentGetDev.NET
 
Системы автоматизированной сборки (Lecture 05 – gradle)
Системы автоматизированной сборки (Lecture 05 – gradle)Системы автоматизированной сборки (Lecture 05 – gradle)
Системы автоматизированной сборки (Lecture 05 – gradle)Noveo
 
NPM и модульная архитектура приложения
NPM и модульная архитектура приложенияNPM и модульная архитектура приложения
NPM и модульная архитектура приложенияDenis Latushkin
 
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)7bits
 
Frontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиковFrontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиковCodeFest
 
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...Dev_Party
 
Meet Magento Belarus 2015: Denis Bosak
Meet Magento Belarus 2015: Denis BosakMeet Magento Belarus 2015: Denis Bosak
Meet Magento Belarus 2015: Denis BosakAmasty
 
Процесс разработки и тестирования с Docker + gitlab ci
Процесс разработки и тестирования с  Docker + gitlab ciПроцесс разработки и тестирования с  Docker + gitlab ci
Процесс разработки и тестирования с Docker + gitlab ciАлександр Сигачев
 
Java осень 2012 лекция 5
Java осень 2012 лекция 5Java осень 2012 лекция 5
Java осень 2012 лекция 5Technopark
 
Презентация «Bundle Transformer – инструмент для клиентской оптимизации в сре...
Презентация «Bundle Transformer – инструмент для клиентской оптимизации в сре...Презентация «Bundle Transformer – инструмент для клиентской оптимизации в сре...
Презентация «Bundle Transformer – инструмент для клиентской оптимизации в сре...Andrey Taritsyn
 
Владимир Кузнецов — Прототип сайта: разработка и развёртывание
Владимир Кузнецов — Прототип сайта: разработка и развёртываниеВладимир Кузнецов — Прототип сайта: разработка и развёртывание
Владимир Кузнецов — Прототип сайта: разработка и развёртываниеYandex
 
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Александр Егурцов
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationAndrii Dzynia
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobileUA Mobile
 
IT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаIT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаMikhail Chinkov
 
The Old New ASP.NET
The Old New ASP.NETThe Old New ASP.NET
The Old New ASP.NETVitaly Baum
 

Similar to #3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кайсаров (20)

Антон Валюх - Использование паттерна Mvvm в android
Антон Валюх - Использование паттерна Mvvm в androidАнтон Валюх - Использование паттерна Mvvm в android
Антон Валюх - Использование паттерна Mvvm в android
 
JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"
 
Web deployment
Web deploymentWeb deployment
Web deployment
 
Системы автоматизированной сборки (Lecture 05 – gradle)
Системы автоматизированной сборки (Lecture 05 – gradle)Системы автоматизированной сборки (Lecture 05 – gradle)
Системы автоматизированной сборки (Lecture 05 – gradle)
 
NPM и модульная архитектура приложения
NPM и модульная архитектура приложенияNPM и модульная архитектура приложения
NPM и модульная архитектура приложения
 
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
 
Frontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиковFrontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиков
 
Yulia tsuba
Yulia tsubaYulia tsuba
Yulia tsuba
 
Zend Framework и Doctrine
Zend Framework и DoctrineZend Framework и Doctrine
Zend Framework и Doctrine
 
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
 
Meet Magento Belarus 2015: Denis Bosak
Meet Magento Belarus 2015: Denis BosakMeet Magento Belarus 2015: Denis Bosak
Meet Magento Belarus 2015: Denis Bosak
 
Процесс разработки и тестирования с Docker + gitlab ci
Процесс разработки и тестирования с  Docker + gitlab ciПроцесс разработки и тестирования с  Docker + gitlab ci
Процесс разработки и тестирования с Docker + gitlab ci
 
Java осень 2012 лекция 5
Java осень 2012 лекция 5Java осень 2012 лекция 5
Java осень 2012 лекция 5
 
Презентация «Bundle Transformer – инструмент для клиентской оптимизации в сре...
Презентация «Bundle Transformer – инструмент для клиентской оптимизации в сре...Презентация «Bundle Transformer – инструмент для клиентской оптимизации в сре...
Презентация «Bundle Transformer – инструмент для клиентской оптимизации в сре...
 
Владимир Кузнецов — Прототип сайта: разработка и развёртывание
Владимир Кузнецов — Прототип сайта: разработка и развёртываниеВладимир Кузнецов — Прототип сайта: разработка и развёртывание
Владимир Кузнецов — Прототип сайта: разработка и развёртывание
 
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
 
IT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаIT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчика
 
The Old New ASP.NET
The Old New ASP.NETThe Old New ASP.NET
The Old New ASP.NET
 

More from JSib

#13 "Управление состоянием в Redux" Роман Сальников
#13 "Управление состоянием в Redux" Роман Сальников#13 "Управление состоянием в Redux" Роман Сальников
#13 "Управление состоянием в Redux" Роман СальниковJSib
 
#10 "Опыт создания Real-time игры на WebGL, Angular, Socket.io и Node.js" Его...
#10 "Опыт создания Real-time игры на WebGL, Angular, Socket.io и Node.js" Его...#10 "Опыт создания Real-time игры на WebGL, Angular, Socket.io и Node.js" Его...
#10 "Опыт создания Real-time игры на WebGL, Angular, Socket.io и Node.js" Его...JSib
 
#9 "Chrome DevTools: отладка, консоль, профилирование" Роман Сальников
#9 "Chrome DevTools: отладка, консоль, профилирование" Роман Сальников#9 "Chrome DevTools: отладка, консоль, профилирование" Роман Сальников
#9 "Chrome DevTools: отладка, консоль, профилирование" Роман СальниковJSib
 
#7 "Многообещающий JavaScript – Promises" Денис Речкунов
#7 "Многообещающий JavaScript – Promises" Денис Речкунов#7 "Многообещающий JavaScript – Promises" Денис Речкунов
#7 "Многообещающий JavaScript – Promises" Денис РечкуновJSib
 
#4 "Особенности разработки кросс-браузерных расширений" Сергей Рашитов
#4 "Особенности разработки кросс-браузерных расширений" Сергей Рашитов#4 "Особенности разработки кросс-браузерных расширений" Сергей Рашитов
#4 "Особенности разработки кросс-браузерных расширений" Сергей РашитовJSib
 
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис Речкунов#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис РечкуновJSib
 
#1 "JSib – Знакомство и амбициозные планы" Денис Речкунов
#1 "JSib – Знакомство и амбициозные планы" Денис Речкунов#1 "JSib – Знакомство и амбициозные планы" Денис Речкунов
#1 "JSib – Знакомство и амбициозные планы" Денис РечкуновJSib
 

More from JSib (7)

#13 "Управление состоянием в Redux" Роман Сальников
#13 "Управление состоянием в Redux" Роман Сальников#13 "Управление состоянием в Redux" Роман Сальников
#13 "Управление состоянием в Redux" Роман Сальников
 
#10 "Опыт создания Real-time игры на WebGL, Angular, Socket.io и Node.js" Его...
#10 "Опыт создания Real-time игры на WebGL, Angular, Socket.io и Node.js" Его...#10 "Опыт создания Real-time игры на WebGL, Angular, Socket.io и Node.js" Его...
#10 "Опыт создания Real-time игры на WebGL, Angular, Socket.io и Node.js" Его...
 
#9 "Chrome DevTools: отладка, консоль, профилирование" Роман Сальников
#9 "Chrome DevTools: отладка, консоль, профилирование" Роман Сальников#9 "Chrome DevTools: отладка, консоль, профилирование" Роман Сальников
#9 "Chrome DevTools: отладка, консоль, профилирование" Роман Сальников
 
#7 "Многообещающий JavaScript – Promises" Денис Речкунов
#7 "Многообещающий JavaScript – Promises" Денис Речкунов#7 "Многообещающий JavaScript – Promises" Денис Речкунов
#7 "Многообещающий JavaScript – Promises" Денис Речкунов
 
#4 "Особенности разработки кросс-браузерных расширений" Сергей Рашитов
#4 "Особенности разработки кросс-браузерных расширений" Сергей Рашитов#4 "Особенности разработки кросс-браузерных расширений" Сергей Рашитов
#4 "Особенности разработки кросс-браузерных расширений" Сергей Рашитов
 
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис Речкунов#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
 
#1 "JSib – Знакомство и амбициозные планы" Денис Речкунов
#1 "JSib – Знакомство и амбициозные планы" Денис Речкунов#1 "JSib – Знакомство и амбициозные планы" Денис Речкунов
#1 "JSib – Знакомство и амбициозные планы" Денис Речкунов
 

#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кайсаров

  • 1. Разработка больших приложений Vue Webpack Кирилл Кайсаров github.com/markuplab http://vuejs.org http://webpack.github.io
  • 2. Какими были Javascript приложения в период с 2006 по 2015 год Минутка ностальгии
  • 3. Write Less / Do More Эра jQuery $(element) - Основная структурная единица 1 Все манипуляции ориентированы на DOM ноды Plugin основная единица экосистемы 2 Большинство популярных решений имели избыточный объем кода Server Side Rendering 3 Получение отрендеренного html'a один из классических подходов эры
  • 4. Model View Controller ЭРА MVVC / MVC / VM / MC / MV / VC / ETC... Plain JS Object - Основная архитектурная единица 1 new Constructor(), Object.prototype, Object.extend({}), итд... Client-Side Rendering 2 Избавление сервера от дополнительной работы с шаблонами + гибкость Триумф AMD 3 Загрузка модулей через AJAX, явные зависимости, и сборка на Java Утром Data - Вечером HTML 4 Тренд на Dom-First Apps резко изменился на Data-First Apps
  • 5. Наше время Компонентная эра Компоненты как архитектурная единица 1 Теперь модуль это не только Javascript. Все asset'ы внутри. Триумф CommonJS 2 NPM, Модули для сервера и браузера, browserify, изоморфность. Реактивное и асинхронное программирование 3 Promise, Generators, NextTick, Pipes Большая нагрузка на клиента - почва для оптимизаций 4 Ленивая загрузка, разделение приложения на части, benchmarking
  • 7. Построен на принципах реактивного программирования Основные принципы 1 Vue.nextTick(), Queue, Reactive Directives Поддерживает концепцию Web Components 2 V-component, Vueify, Component Registry, Custom Directives Сущность это простой (plain) Javascript объект 3 Template as HTML String, Component as Javascript Object
  • 8. Единая сущность Vue Основные принципы 4 Объект содержит в себе $data, $methods, $events итд... Дружелюбен к модульным системам 5 Простая интеграция с Common.JS и другими модульными системами
  • 10. Основные принципы 1 Module is Everything HTML строка, CSS таблица, Javascript функция, нет разницы. 2Только Javascript? Нет. Webpack умеет собирать не только Javascript, также графику, шрифты итд... 3Ленивая / Частичная загрузка из пакета Важный инструмент для больших приложений без излишних расширений
  • 11. Основные принципы 4 Ориентирован на Client-Side приложения Hot Module Replacement, JSONP, и другие браузерные решения 5AMD / CommonJS / Native Нет разницы какую систему модулей вы используете
  • 12. Какие задачи стоят перед современными Client-Side приложениями?
  • 13. Технические требования приложения Расширяется как в ширину так и в высоту Приложение состоит из модулей Приложение может быть интернационализировано Приложение может быть менять свой внешний вид на разных платформах
  • 15. /** Module dependencies */ var Vue = require('vue'); /** Define application */ var app = module.exports = new Vue({ el: '#v-app' }); Точка входа в приложение doctype html html head title Simple application body#v-app script(src='/public/build.js') Построим HTML Layout
  • 16. $ sudo npm i webpack -g Устанавливаем Webpack module.exports = { entry: { app: "./components/app.js" }, output: { path: "./public/build", filename: "app.js" } } Описываем webpack.config.js
  • 17. $ webpack -p Hash: f2f8823c3ad505796c0d Version: webpack 1.4.15 Time: 3230ms Asset Size Chunks Chunk Names app.js 59934 0 [emitted] app + 63 hidden modules Собираем наше приложение
  • 18. Создаем первый компонент doctype html html body#v-app #v-panel(v-component="panel") Объявляем в Layout Регистрируем компонент в нашем приложении /** Define application */ var app = module.exports = new Vue({ el: '#v-app', components: { panel : require('./panel') } });
  • 19. Описываем компонент /** Define component */ module.exports = { template: '<div class="v-panel">Я панель по имени {{ firstName }} ' + 'и фамилии <span v-html="lastName"></span></div>', data: function(){ return { firstName: 'Петя' } }, created: function() { this.$set('lastName', 'Петров'); } }; Создаем первый компонент
  • 21. Капля оптимизации /** Define component */ module.exports = { template: require('./template.html'), data: function(){ return { firstName: 'Петя' } }, created: function() { this.$set('lastName', 'Петров'); } }; Создаем первый компонент
  • 22. /** Define component */ module.exports = { // Как загрузить HTML в require?! template: require('./template.html') }; Опишем webpack.config.js module.exports = { module: { loaders: [ { test: /.html$/, loader: "html" } ] } }; Создаем первый компонент Капля оптимизации
  • 23. Webpack Loaders Загрузчики это функции которые выполняют трансформацию файлов в модули приложения. Аналогичны browserify transform. http://webpack.github.io/docs/using-loaders.html
  • 24. /** Define component assets */ require('./styles.less') /** Define component */ module.exports = { template: require('./template.html') }; Дополним наш webpack.config.js загрузчиком стилей module: { loaders: [ { test: /.html$/, loader: "html" }, { test: /.less$/, loader: "style!css!less" } ] } Создаем первый компонент
  • 25. Результат template.html module.exports = "<div class="v-panel">n Я панель по имени {{ firstName }} и фамилииn <span v-html="lastName"></span>n</div>n"; /***/ function(module, exports, __webpack_require__) { exports = module.exports = __webpack_require__(32)(); exports.push([module.id, "span {n color: #999;n}n", ""]); /***/ } Результат styles.less Создаем первый компонент
  • 27. Технические требования приложения Расширяется как в ширину так и в высоту Приложение состоит из модулей Приложение может быть интернационализировано Приложение может быть менять свой внешний вид на разных платформах
  • 29. Controller - компонент отвечающий за состояние приложения Содержит в себе все нужные для работы компоненты 1 Является точкой разрыва приложения. App -> Controller -> Components 2 Controller определяется в зависимости от состояния URL 3
  • 30. Схема сбора и запуска приложения Client App URL State Controller Component Component Component Controller Controller
  • 31. Контроллер - место где наше приложение начинает ответвляться от приложения. Именно тут мы можем разделить наше приложение на части. Для решения этой задачи подойдет require.ensure представленный в CommonJS спецификации. Webpack поддерживает этот метод. http://wiki.commonjs.org/wiki/Modules/Async/A require.ensure(['increment'], function(require) { var inc = require('increment').inc; var a = 1; inc(a); // 2 }); Синтаксис:
  • 32. Создадим явную карту наших контроллеров /** Routes map */ var map = { main: require('./controllers/main'), alt: require('./controllers/alt') }; Создаем контроллеры Проблематика: Основной проблематикой клиентских загрузчиков модулей является "неумение" работать с динамическими аргументами require(). В текущих реализациях мы вынуждены указывать имена модулей явно. Node.JS умеет подтягивать модули динамически.
  • 33. Делаем нашу карту модулей ленивой /** Routes map */ var map = { main: require('promise?bluebird!./controllers/main'), alt: require('promise?bluebird!./controllers/alt') }; Создаем контроллеры Альтернативный вариант вызова Webpack Loaders Для трансформации модулей можно использовать дополнительные строковые параметры внутри require() отделив их через знак "!". В указаном выше случае мы загружаем модуль пропуская его через promise-loader.
  • 34. Немного о Promise-Loader Создаем контроллеры Трансформация этим модулем позволяет сделать отложенный require.ensure и обернуть его в Promise объект. // Указываем библиотеку для обертки в Promise var load = require("promise?bluebird!./file.js"); // Модуль не будет загружен пока вы не вызовете функцию load().then(function(module) { // Здесь вы можете работать с вашим модулем });
  • 35. Контроллеры выделены в отдельные файлы $ webpack Hash: 5fa98cfa191aa5dafdb4 Version: webpack 1.5.3 Time: 827ms Asset Size Chunks Chunk Names app.js 349774 0 [emitted] app 1.1.js 287 1 [emitted] 2.2.js 294 2 [emitted] + 78 hidden modules Создаем контроллеры
  • 37. Указываем элемент в котором расположим контроллер doctype html html head title Simple application body#v-app #v-panel(v-component="panel") #v-controller(v-el="controller") script(src='/public/build.js') Создаем контроллеры
  • 38. Загружаем и запускаем контроллер module.exports = new Vue({ el: '#v-app', created: function() { var controller = url.getController(); var load = map[controller](); load.then(function (module) { var ctrl = new Vue(module); ctrl.$mount(this.$$.controller); }.bind(this)); } ... }); Создаем контроллеры
  • 39. Связать управление контроллерами с HTML5 History API Следующие шаги 1 Состояние приложения можно хранить в this.$data Спроектировать ленивую загрузку внутри контроллера 2 Актуально для больших контроллеров 3 Как инструмент дополнительной оптимизации Использовать ApplicationCache и Deduplication Plugin
  • 40. Технические требования приложения Расширяется как в ширину так и в высоту Приложение состоит из модулей Приложение может быть интернационализировано Приложение может быть менять свой внешний вид на разных платформах
  • 41. module.exports = { template: require('./templates/' + platform + '.html') }; Динамическая загрузка модулей - templates - ios.html - android.html - windows.html Отлично подходит для кросс-платформенных решений Другие возможности
  • 42. Динамическая загрузка модулей Другие возможности При такой загрузке в сборку попадут все модули из папки ./templates с форматом .html, а также внутри загрузчика появиться карта соответствия имени файла, id'шнику модуля.
  • 43. Технические требования приложения Расширяется как в ширину так и в высоту Приложение состоит из модулей Приложение может быть интернационализированно Приложение может быть менять свой внешний вид на разных платформах
  • 44. var messages = require("json!po!./locale/en_US/LC_MESSAGES/messages.po"); Загрузка интернациональных пакетов Другие полезные загрузчики - autoprefixer - mocha - handlebars - 6to5 - file - json Другие возможности
  • 45. Технические требования приложения Расширяется как в ширину так и в высоту Приложение состоит из модулей Приложение может быть интернационализировано Приложение может быть менять свой внешний вид на разных платформах