Разработка больших приложений
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

PDF
Vue.js - реактивный фронтенд фреймворк для людей
PDF
Рендеринг может больше: vue.js vs React, Андрей Солодовников
PDF
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
PDF
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
PDF
Как Webpack сделал меня счастливее
PPTX
Стабильность WebGL приложений / Кирилл Дмитренко (Яндекс)
PDF
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
PDF
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
Vue.js - реактивный фронтенд фреймворк для людей
Рендеринг может больше: vue.js vs React, Андрей Солодовников
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
Как Webpack сделал меня счастливее
Стабильность WebGL приложений / Кирилл Дмитренко (Яндекс)
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)

What's hot (20)

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

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

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

More from JSib (7)

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