"webpack: 7 бед — один ответ" — Денис Измайлов, moscowjs 17

55
webpack 7 бед - один ответ Денис Измайлов Ведущий разработчик Компания Netris 27 ноября 2014

Upload: moscowjs

Post on 04-Jul-2015

1.360 views

Category:

Software


2 download

DESCRIPTION

Слайды доклада Дениса "Webpack: 7 бед — один ответ", MoscowJS 17

TRANSCRIPT

Page 1: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

webpack7 бед - один ответ

Денис ИзмайловВедущий разработчик Компания Netris 27 ноября 2014

Page 2: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

• CommonJS?

• AMD?

• Require.js?

• Browserify?

Page 3: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Начнём издалека

Page 4: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Начало

• Глобальные проблемы веб-разработки

• Локальные проблемы проектов

• Способы решения

4

Page 5: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Глобальные проблемы веб-разработки

• Многообразие решений

• Версии

• Форматы

5

Page 6: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Глобальные проблемы веб-разработки

1. Многообразие решений (одних и тех же задач)

• jQuery/Angular/React

• Underscore/lodash/Lazy

• MVC/MVVM/Flux

6

Page 7: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Глобальные проблемы веб-разработки

2. Версии

• 1.8

• 2.1

• 3.2

• 4.5

• …10, 24, 38…

7

Page 8: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Глобальные проблемы веб-разработки

3. Форматы (пре-процессинг)

• LESS, SCSS, Stylus, …

• Handlebars, jade, EJS, …

8

Page 9: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Локальные проблемы проектов

• Сложность роста

• Функциональная

• Технологическая

• Зависимости

• Версии

9

Page 10: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Локальные проблемы проектов

• Функциональный рост

• Регистрация

• Личный кабинет

• Загрузка фотографий

• Аналитика

• Поддержка языков

10

Page 11: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Локальные проблемы проектов

• Технологический рост

• Bootstrap

• jQuery

• Knockout

• Handlebars

• React

11

Page 12: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Локальные проблемы проектов• Зависимости

• Загружены ли стили?

• А шаблоны?

• А библиотека?

• А нужный jQuery-плагин?

• А локализация для него?

• А стили?…

12

Page 13: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Локальные проблемы проектов

• Версии

• Один плагин требует jQuery 1.8

• Второй плагин требует jQuery 2.1

• Что делать?

13

Page 14: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Способ решения

Изолированные модули

14

Page 15: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Реализации

• AMD

• CommonJS

15

Page 16: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

AMD

• Asynchronous Module Definition

• Пример 1:

define(["jquery"], function ($) { return { // … }; });

16

Page 17: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

AMD

• Asynchronous Module Definition

• Пример 2 (CommonJS wrapping):

define(function (require, module, exports) { var $ = require("jquery"); module.exports = { // … }; });

17

Page 18: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

CommonJS

• www.commonjs.org

• Нативно в Node.js/Rhino

• Пример:

var $ = require("jquery"); module.exports = { // … };

18

Page 19: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

CommonJS

Преимущества перед AMD:

• читабельность

• “писабельность”

• изоморфизм: var _ = require("lodash"); var data = require("./stock.json"); module.exports = _.where(data, function (item) { return item[‘count’] > 0; });

19

Page 20: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

AMD & CommonJS

• создавать изолированные модули

• использовать их

• не думать о порядке загрузки

• подключать любую статику

• собирать всё в один JS-файл

• использовать разные версии библиотек

20

Page 21: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Итого• Глобальные проблемы веб-разработки

• многообразие решения, версии, форматы

• Локальные проблемы проектов

• функциональный и технологический

• управление зависимостями и версиями

• Способы решения

• AMD

• CommonJS - лучшее

21

Page 22: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Так что же теперь?

Page 23: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Что воплотит наши фантазии в жизнь?

Page 24: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Что лучшее мы имеем на сегодняшний день?

Page 25: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
Page 26: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Любая логика

Page 27: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Любые форматы

Page 28: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Ваш проект быстро собирается

Page 29: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Ваш проект быстро запускается

Page 30: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Cамые современные инструменты разработки

Page 31: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

webpack• Плагины

• Загрузчики

• Асинхронная сборка

• Чанки (chunks)

• Инструменты разработки

31

Page 32: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

API для плагинов• Логика сборки и поиска модулей

• Самое сердце процесса

• Рассмотрим примеры:

• DefinePlugin

• BowerWebpackPlugin

• ExtractTextPlugin

32

Page 33: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

DefinePlugin

• Определение констант

• Настройка: … plugins: [ DefinePlugin({ "NODE_ENV": "production" }) …

33

Page 34: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

DefinePlugin

• Определение констант

• Использование: if (NODE_ENV === "development") { console.log("Debug info"); } if (NODE_ENV === "production") { console.log("App started"); }

34

Page 35: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

DefinePlugin• Определение констант

• Собранный код: if ("production" === "development") { console.log("Debug info"); } if ("production" === "production") { console.log("App started"); }

• После минификации: console.log("App started");

35

Page 36: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

BowerWebpackPlugin• Прозрачное использование bower-компонент

• Настройка: … plugins: [ new BowerWebpackPlugin({ modulesDirectories: ["bower_components"], manifestFiles: ["bower.json"], includes: /.*/, excludes: /.*\.less$/ }) …

36

Page 37: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

BowerWebpackPlugin

• Прозрачное использование bower-компонент

• Использование: $ bower install jquery —save

в коде: var $ = require("jquery"); $("body").html("Hello MoscowJS!");

• Уже более 20000 пакетов

37

Page 38: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

ExtractTextPlugin

• Позволяет извлекать данные и собирать их в один файл

• Настройка: … module: { loaders: { test: /\.css$/, loader: ExtractTextPlugin.extract("style-loader", "css-loader") } }, plugins: [ new ExtractTextPlugin("style.css") ] …

38

Page 39: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Загрузчики• Прозрачное подключение статики:

• JSON

• CoffeeScript,

• Handlebars/jade/EJS, …

• CSS/LESS/SASS/Stylus и т.д.

39

Page 40: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

ЗагрузчикиНастройка:

… module: { loaders: [ { test: /\.css$/, loader: "style-loader!css-loader"}, { test: /\.json$/, loader: "json-loader"}, { test: /\.hbs$/, loader: "handlebars-loader"}, { test: /\.coffee$/, loader: "coffee-loader"}, { test: /\.(eot|woff|ttf|svg|png|jpg)$/, loader: "url-loader?limit=30000" + "&name=[name]-[hash].[ext]" }, ] } …

40

Page 41: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Загрузчики

Использование:

var $ = require("jquery"); var pageTemplate = require("./page.hbs"); var offices = require("./offices.json"); require("bootstrap/bootstrap.min.css"); require("./page.css");

$("#content").html(pageTemplate(offices));

41

Page 42: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Пример подключения JSX

Установка:

$ npm install jsx-loader —save-dev

42

Page 43: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Пример подключения JSXНастройка:

resolve: { extensions: ["", ".js", ".jsx"], }, module: { loaders: [ { test: /\.jsx$/, loader: "jsx-loader"} ] } …

43

Page 44: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Пример подключения JSXИспользование:

var React = require("react"); // loads toolbar.jsx var Toolbar = require("./toolbar");

React.render( React.createElement(Toolbar, null), document.getElementById("toolbar") );

44

Page 45: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

webpack-dev-server

• Инструмент для ускорения разработки

• Автоматическое обновления страницы без пересборки проекта

• Можно запускать, как модуль или CLI

45

Page 46: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

webpack-dev-server• Как это работает:

• Веб-сервер на основе assets-директории

• При подключении файла-сборки, устанавливает соединение через socket.io

• Как только что-то изменилось - автоматически обновляется страница

46

Page 47: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Hot Module Replacement

• Обновления изменённых частей в реальном времени

• Без перезагрузки страниц

• Это опция webpack-dev-server

47

Page 48: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Hot Module ReplacementКак это работает с React:

• В окне IDE изменяете код компонента

• В это время через открытое socket-соединение передаётся информация об изменённой части

• Происходит “горячая” замена компонента (unmount + mount)

• На странице обновляется только компонент

48

Page 49: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Итого• AMD и CommonJS

• Более 30 готовых плагинов

• Более 50 готовых загрузчиков

• Асинхронной сборка

• Чанки (chunks)

• Развитые инструменты разработки

49

Page 50: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Были ли альтернативы?

• 2009 - Require.js

• 2010 - Browserify

• 2012 - webpack

50

Page 51: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Как насчёт поддержки?

• Высокая активность разработчиков

• Коммиты в github:

51

Page 52: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Так можно доверять?

• Команда Facebook использует webpack для веб-интерфейса Instagram

• Twitter использует webpack для своих проектов (Fronteers 2014, Nicholas Gallagher)

52

Page 53: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Заключение• Глобальные проблемы веб-разработки

• Многообразие, версия, форматов

• Локальные проблемы проектов

• Функциональный и технологический рост

• Управление зависимостями и версиями

• Решение

• CommonJS и webpack

53

Page 54: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Документация и примеры:http://webpack.github.io

Page 55: "Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17

Вопросы?webpack: 7 бед - один ответ

Денис Измайлов http://www.facebook.com/denis.izmaylov

http://www.github.com/DenisIzmaylov