Diese Präsentation wurde erfolgreich gemeldet.
Die SlideShare-Präsentation wird heruntergeladen. ×

Как Webpack сделал меня счастливее

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
сделал меня счастливей
WEBPACK
KHARKIV.JS, 8 NOVEMBER 2015
YAROSLAV SERHIEIEV, WIX.COM
КАК Я НАЧИНАЛ
СВОИ ХОББИ-ПРОЕКТЫ
НА ПОЛПУТИ К ЦЕЛИ
НАЧИНАЛСЯ НУРЕ

YouTube-Videos werden auf SlideShare nicht mehr unterstützt.

Original auf YouTube ansehen

Hier ansehen

1 von 107 Anzeige

Как Webpack сделал меня счастливее

Herunterladen, um offline zu lesen

#KharkivJS 2015, Харьков
- Мои впечатления от Webpack.
- Рассказ о его принципах работы.
- Интересные фишки Webpack 1 и 2.
- Что еще есть аналогичного и выводы.

#KharkivJS 2015, Харьков
- Мои впечатления от Webpack.
- Рассказ о его принципах работы.
- Интересные фишки Webpack 1 и 2.
- Что еще есть аналогичного и выводы.

Anzeige
Anzeige

Weitere Verwandte Inhalte

Diashows für Sie (20)

Andere mochten auch (20)

Anzeige

Ähnlich wie Как Webpack сделал меня счастливее (20)

Aktuellste (20)

Anzeige

Как Webpack сделал меня счастливее

  1. 1. сделал меня счастливей WEBPACK KHARKIV.JS, 8 NOVEMBER 2015 YAROSLAV SERHIEIEV, WIX.COM
  2. 2. КАК Я НАЧИНАЛ СВОИ ХОББИ-ПРОЕКТЫ
  3. 3. НА ПОЛПУТИ К ЦЕЛИ НАЧИНАЛСЯ НУРЕ
  4. 4. а новых технологий-то хочется…
  5. 5. а новых технологий-то хочется…
  6. 6. а новых технологий-то хочется…
  7. 7. REQUIRE.JS SystemJS namespaces? а новых технологий-то хочется…
  8. 8. .JSX REQUIRE.JS SystemJS namespaces? а новых технологий-то хочется…
  9. 9. source maps live reload .JSX tests REQUIRE.JS SystemJS namespaces? ??? minify lazy load а новых технологий-то хочется…
  10. 10. СЛОЖНО УВЯЗАТЬ МЕЖДУ СОБОЙ .CSS source maps RUNNER .JS MODULES live reload .JSX tests REQUIRE.JS namespaces? MISC ??? minify R.JS
  11. 11. МОЙ ЭНТУЗИАЗМ ПОСЛЕ НАСТРОЙКИ БИЛДА
  12. 12. ЧТО ИЗМЕНИЛ ДЛЯ МЕНЯ WEBPACK?
  13. 13. ▸ index.html ▸ index.debug.html ▸ bundle.css ▸ bundle.min.css ▸ bundle.js ▸ bundle.min.js ▸ img/logo.png ▸ fonts/… РЕЗУЛЬТАТ СБОРКИ (DIST) ПРОСТОГО SINGLE PAGE APPLICATION KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ
  14. 14. СОБИРАЕМ ПО ОЛД-СКУЛУ KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ
  15. 15. СОБИРАЕМ ПО ОЛД-СКУЛУ ▸ rm -rf dist; mkdir dist ▸ cat src/common.js src/page1.js src/page2.js > dist/bundle.js ▸ uglify dist/bundle.js > dist/bundle.min.js ▸ cat src/common.css src/page1.css src/page2.css > dist/ bundle.css ▸ cssmin dist/bundle.css > dist/bundle.min.css ▸ cp src/img dist/img ▸ cp src/font dist/font KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ
  16. 16. ТЕ ЖЕ КОМАНДЫ, ТОЛЬКО В ПРОФИЛЬ :}> ЧЕРЕЗ GRUNTFILE.JS KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ module.exports = function(grunt) { grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), concat: { options: { separator: ';' }, dist: { src: ['src/**/*.js'], dest: 'dist/<%= pkg.name %>.js' } }, uglify: { options: { banner: '/*! <%= pkg.name %> <%= grunt.template.today("dd-mm-yyyy") %> */n' }, dist: { files: { 'dist/<%= pkg.name %>.min.js': ['<%= concat.dist.dest %>'] } } }, qunit: { files: ['test/**/*.html'] }, jshint: { files: ['Gruntfile.js', 'src/**/*.js', 'test/**/*.js'], options: { // options here to override JSHint defaults globals: { jQuery: true, console: true, module: true, document: true } } }, watch: { files: ['<%= jshint.files %>'], tasks: ['jshint', 'qunit'] } }); }); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-qunit'); grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-contrib-concat'); grunt.registerTask('test', ['jshint', 'qunit']); grunt.registerTask('default', ['jshint', 'qunit', 'concat', 'uglify']); };
  17. 17. KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ
  18. 18. KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ
  19. 19. KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ ▸ js ▸ css ▸ png ▸ woff ▸ txt ▸ xml ▸ hbs ▸ jsx ▸ ES6 ▸ jpg ▸ ROBOTS.TXT ▸ html ▸ coffee ▸ typescript ▸ whatever ВСЕ ОНИ — FIRST CLASS CITIZENS
  20. 20. HomePage.jsx KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ ES6 ContactsPage.jsx ES6
  21. 21. HomePage.jsx KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ ES6 ContactsPage.jsx ES6 [babel-loader] => .js, .map
  22. 22. HomePage.jsx KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ ES6 ContactsPage.jsx ES6 HTMLindex.html HTMLcontacts.html [babel-loader] => .js, .map
  23. 23. HomePage.jsx KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ ES6 ContactsPage.jsx ES6 HTMLindex.html HTMLcontacts.html [babel-loader] => .js, .map StaticSiteGeneratorPlugin
  24. 24. KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ ES6 ES6 HTMLindex.html HTMLcontacts.html HomePage.jsx ContactsPage.jsx
  25. 25. KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ ES6 JSX JSX JSX JSX JSX A.jsx B.jsx C.jsx D.jsx E.jsx ES6 HTMLindex.html HTMLcontacts.html HomePage.jsx ContactsPage.jsx
  26. 26. KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ ES6 JSX JSX JSX JSX JSX A.jsx B.jsx C.jsx D.jsx E.jsx ES6 HTMLindex.html HTMLcontacts.html HomePage.jsx ContactsPage.jsx
  27. 27. KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ ES6 JSX JSX JSX JSX JSX A.jsx B.jsx C.jsx D.jsx E.jsx ES6 HTMLindex.html HTMLcontacts.html HomePage.jsx ContactsPage.jsx
  28. 28. KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ ES6 JSX JSX JSX JSX JSX A.jsx B.jsx C.jsx D.jsx E.jsx ES6 CommonsChunkPlugin HTMLindex.html HTMLcontacts.html HomePage.jsx ContactsPage.jsx
  29. 29. KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ ES6 JSX JSX JSX JSX JSX A.jsx B.jsx C.jsx D.jsx E.jsx ES6 page1.less page2.css CommonsChunkPlugin HTMLindex.html HTMLcontacts.html HomePage.jsx ContactsPage.jsx
  30. 30. KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ ES6 JSX JSX JSX JSX JSX A.jsx B.jsx C.jsx D.jsx E.jsx ES6 page1.less page2.css CommonsChunkPluginAggressiveMergingPlugin HTMLindex.html HTMLcontacts.html HomePage.jsx ContactsPage.jsx
  31. 31. KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ page2.css site.css placeholder.png Roboto.ttf Roboto.woff page1.less
  32. 32. KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ page2.css site.css placeholder.png Roboto.ttf Roboto.woff page1.less
  33. 33. KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ page2.css site.css placeholder.png Roboto.ttf Roboto.woff page1.less
  34. 34. KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ page2.css site.css placeholder.png Roboto.ttf Roboto.woff page1.less unused.png
  35. 35. КАК ВЫГЛЯДИТ ПРОСТЕЙШАЯ КОНФИГУРАЦИЯ В ИТОГЕ KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ module.exports = { context: path.resolve(__dirname, 'src'), entry: "./app.js", output: { path: './dist', filename: '[name].js' } };
  36. 36. module: { loaders: [{ test: /.js$/, loader: ‘babel-loader', include: path.resolve(__dirname, 'src'), }], }, }; ES6 ЗАГРУЗЧИК KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ
  37. 37. plugins: [ new HtmlWebpackPlugin({ template: path.join(src, 'index.html'), inject: 'body', }) ] }; HTML-ПЛАГИН KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ
  38. 38. КАК REQUIRE’ИТЬ В WEBPACK? KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ Notation Sync (per file) Async (per file) Sync (mask) Async (mask) CJS require(module) require.ensure require(expr)
 require.context N/A AMD define([modules]) require([modules]) N/A N/A ES6/S.JS import System.import
 (module) N/A System.import
 (expr) нестандартные функции Webpack доступно в 2.0.0-beta
  39. 39. ОПТОВЫЙ REQUIRE KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ System.import(‘./locales/‘ + lang).then(locale => /* … */);
  40. 40. ОПТОВЫЙ REQUIRE KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ System.import(‘./locales/‘ + lang).then(locale => /* … */); ▸ 0.0.js ▸ 1.0.js ▸ 2.0.js…
  41. 41. ОПТОВЫЙ REQUIRE KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ var locale = require(‘./locales/‘ + lang); var locale = require.context(‘./locales’, true, /.js$/); System.import(‘./locales/‘ + lang).then(locale => /* … */); ▸ 0.0.js ▸ 1.0.js ▸ 2.0.js…
  42. 42. ОПТОВЫЙ REQUIRE KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ var locale = require(‘./locales/‘ + lang); var locale = require.context(‘./locales’, true, /.js$/); System.import(‘./locales/‘ + lang).then(locale => /* … */); ▸ 0.0.js ▸ 1.0.js ▸ 2.0.js… ▸ main.bundle.js <- [all locales]
  43. 43. ОПТОВЫЙ REQUIRE KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ var locale = require(‘./locales/‘ + lang); var locale = require.context(‘./locales’, true, /.js$/); System.import(‘./locales/‘ + lang).then(locale => /* … */); ▸ 0.0.js ▸ 1.0.js ▸ 2.0.js… ▸ main.bundle.js <- [all locales] ContextReplacementPlugin
  44. 44. ЧТО ДЕЛАЕТ WEBPACK МОЩНЫМ И ПРОСТЫМ? KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ JS CSS PNG
  45. 45. ЧТО ДЕЛАЕТ WEBPACK МОЩНЫМ И ПРОСТЫМ? KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ JS CSS PNG JS JS JS loaders
  46. 46. dependency analysis ЧТО ДЕЛАЕТ WEBPACK МОЩНЫМ И ПРОСТЫМ? KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ JS CSS PNG JS JS JS loaders
  47. 47. dependency analysis ЧТО ДЕЛАЕТ WEBPACK МОЩНЫМ И ПРОСТЫМ? KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ JS CSS PNG JS JS JS loaders JAVASCRIPT - ЭТО ВАМ НЕ ЭТО (C)
  48. 48. dependency analysis ЧТО ДЕЛАЕТ WEBPACK МОЩНЫМ И ПРОСТЫМ? KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ JS CSS PNG JS JS JS loaders
  49. 49. dependency analysis ЧТО ДЕЛАЕТ WEBPACK МОЩНЫМ И ПРОСТЫМ? KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ JS CSS PNG JS JS JS loaders BUILD PIPELINE
  50. 50. dependency analysis ЧТО ДЕЛАЕТ WEBPACK МОЩНЫМ И ПРОСТЫМ? KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ JS CSS PNG JS JS JS loaders BUILD PIPELINEplugins
  51. 51. dependency analysis ЧТО ДЕЛАЕТ WEBPACK МОЩНЫМ И ПРОСТЫМ? KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ JS CSS PNG JS JS JS loaders HTML JS PNG CSSBUILD PIPELINEplugins
  52. 52. КАК БИНАРНИКИ ПРЕВРАЩАЮТСЯ В JAVASCRIPT-МОДУЛИ ? KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ var placeholderImage = require('assets/images/placeholder.png'); module.exports = { createSafeImage: function (src) { var img = document.createElement('img'); img.src = src || placeholderImage; return img; } };
  53. 53. BASE64 URL OR…? KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCA..."
  54. 54. BASE64 URL OR…? KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCA..." "assets/images/placeholder.png" "assets/placeholder.png?787efa438c612b89f46a812" "assets/787efa438c612b89f46a812.png"
  55. 55. … И ЭТО БЫЛА СХЕМА РАБОТЫ URL-LOADER В WEBPACK KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ
  56. 56. … И ЭТО БЫЛА СХЕМА РАБОТЫ URL-LOADER В WEBPACK KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ test: /.png$/
  57. 57. … И ЭТО БЫЛА СХЕМА РАБОТЫ URL-LOADER В WEBPACK KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ URL-LOADER * limit = 8000 * name = [path][hash].[ext] test: /.png$/
  58. 58. … И ЭТО БЫЛА СХЕМА РАБОТЫ URL-LOADER В WEBPACK KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ var placeholderImage = require('assets/images/placeholder.png');URL-LOADER * limit = 8000 * name = [path][hash].[ext] test: /.png$/
  59. 59. … И ЭТО БЫЛА СХЕМА РАБОТЫ URL-LOADER В WEBPACK KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ var placeholderImage = require('assets/images/placeholder.png'); module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEU URL-LOADER * limit = 8000 * name = [path][hash].[ext] test: /.png$/
  60. 60. … И ЭТО БЫЛА СХЕМА РАБОТЫ URL-LOADER В WEBPACK KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ var placeholderImage = require('assets/images/placeholder.png'); module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEU URL-LOADER * limit = 8000 * name = [path][hash].[ext] FILE-LOADER * name =
 [path][hash].[ext] test: /.png$/
  61. 61. … И ЭТО БЫЛА СХЕМА РАБОТЫ URL-LOADER В WEBPACK KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ var placeholderImage = require('assets/images/placeholder.png'); module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEU module.exports = "assets/images/787efa438c612b89f46a812.png"; URL-LOADER * limit = 8000 * name = [path][hash].[ext] FILE-LOADER * name =
 [path][hash].[ext] test: /.png$/
  62. 62. КОМПОЗИЦИЯ ЗАГРУЗЧИКОВ KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ 0 1 1 SCSS CSS SOURCE MAP 2 2CSS
 AUTOPREFIXED SOURCE MAP 3JS 3 SOURCE MAP SASS-LOADER AUTOPREFIXER-LOADER CSS-LOADER STYLE-LOADER
  63. 63. КОМПОЗИЦИЯ ЗАГРУЗЧИКОВ KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ 0 1 1 SCSS CSS SOURCE MAP 2 2CSS
 AUTOPREFIXED SOURCE MAP 3JS 3 SOURCE MAP SASS-LOADER AUTOPREFIXER-LOADER CSS-LOADER STYLE-LOADER ExtractTextPlugin
  64. 64. ПИШЕМ ASCII ART LOADER KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ
  65. 65. ПОДКЛЮЧЕНИЕ ASCII KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ pre.innerHTML = require(‘asciiart?color=1!./cute- little-cat.png');
  66. 66. ПОДКЛЮЧЕНИЕ ASCII KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ module: { loaders: [ { test: /ASCII_REGEX/, loader: ‘asciiart-loader?color=1’ } ] pre.innerHTML = require(‘asciiart?color=1!./cute- little-cat.png');
  67. 67. ПОДКЛЮЧЕНИЕ ASCII KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ module: { loaders: [ { test: /ASCII_REGEX/, loader: ‘asciiart-loader?color=1’ } ] pre.innerHTML = require(‘asciiart?color=1!./cute- little-cat.png'); require('images/ascii/cute-little-cat.png');
  68. 68. В ИТОГЕ ОН НАМ ВЕРНЕТ? KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ
  69. 69. В ИТОГЕ ОН НАМ ВЕРНЕТ? KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ module.exports =
 "<b class="ansi-0">;</b>
 <b class="ansi-1">@</b>...";
  70. 70. КОМУ ТАКОЕ НАДО? KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ
  71. 71. КОМУ ТАКОЕ НАДО? KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ
  72. 72. КОМУ ТАКОЕ НАДО? KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ
  73. 73. КОМУ ТАКОЕ НАДО? KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ
  74. 74. КОМУ ТАКОЕ НАДО? KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ
  75. 75. И ВСЕ-ТАКИ ПОЛУЧИЛОСЬ МИЛО KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ
  76. 76. HOT MODULE REPLACEMENT [ WITHOUT REACT.JS + REDUX]
  77. 77. ДЛЯ ЭТОГО ПОНАДОБИТСЯ WEBPACK-DEV-SERVER KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ
  78. 78. KIT CAT CLOCK KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ
  79. 79. KIT CAT CLOCK KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ
  80. 80. TEXT
  81. 81. ЧУДА НЕТ. РАСХОДИМСЯ :) KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ function injectRootElement() { var input = document.createElement('input'); input.placeholder = "App Started"; // -> File Changed document.body.appendChild(input); return input; } var input = injectRootElement();
  82. 82. ЧУДА НЕТ. РАСХОДИМСЯ :) KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ function injectRootElement() { var input = document.createElement('input'); input.placeholder = "App Started"; // -> File Changed document.body.appendChild(input); return input; } var input = injectRootElement(); APP STARTED
  83. 83. ЧУДА НЕТ. РАСХОДИМСЯ :) KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ APP STARTED function injectRootElement() { var input = document.createElement('input'); input.placeholder = “File Changed”; document.body.appendChild(input); return input; } var input = injectRootElement();
  84. 84. ЧУДА НЕТ. РАСХОДИМСЯ :) KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ APP STARTED FILE CHANGED function injectRootElement() { var input = document.createElement('input'); input.placeholder = “File Changed”; document.body.appendChild(input); return input; } var input = injectRootElement();
  85. 85. КАК УБРАТЬ ПОБОЧНЫЙ ЭФФЕКТ? KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ var input = injectRootElement(); if (module.hot) { // если включен режим HMR module.hot.accept(); // разрешить замену данного модуля // событие перед загрузкой новой версии модуля module.hot.dispose(function (data) { document.body.removeChild(input); // убираем побочный эффект });
  86. 86. KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ
  87. 87. KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ import { defaults } from 'lodash'; export function kharkiv(conference) { return defaults(conference, { city: 'Kharkiv' }); } TREE SHAKING — WEBPACK 2 СТАЛ ЕЩЕ УМНЕЕ
  88. 88. KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ import { defaults } from 'lodash'; export function kharkiv(conference) { return defaults(conference, { city: 'Kharkiv' }); } TREE SHAKING — WEBPACK 2 СТАЛ ЕЩЕ УМНЕЕ
  89. 89. ТАК ПРИСТАЛЬНО УМЕЮТ СМОТРЕТЬ НА ТВОЙ КОД KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ
  90. 90. ТАК ПРИСТАЛЬНО УМЕЮТ СМОТРЕТЬ НА ТВОЙ КОД ▸ Google Closure Compiler
 (2009-)* KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ
  91. 91. ТАК ПРИСТАЛЬНО УМЕЮТ СМОТРЕТЬ НА ТВОЙ КОД ▸ Google Closure Compiler
 (2009-)* KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ ▸ Browserify** (2010-)
  92. 92. ТАК ПРИСТАЛЬНО УМЕЮТ СМОТРЕТЬ НА ТВОЙ КОД ▸ Google Closure Compiler
 (2009-)* KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ ▸ Browserify** (2010-) ▸ Webpack (2012-)
  93. 93. ТАК ПРИСТАЛЬНО УМЕЮТ СМОТРЕТЬ НА ТВОЙ КОД ▸ Google Closure Compiler
 (2009-)* KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ ▸ Browserify** (2010-) ▸ Webpack (2012-) ▸ JSPM*** (2013-)
  94. 94. ТАК ПРИСТАЛЬНО УМЕЮТ СМОТРЕТЬ НА ТВОЙ КОД ▸ Google Closure Compiler
 (2009-)* KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ ▸ Browserify** (2010-) ▸ Webpack (2012-) ▸ JSPM*** (2013-) ▸ StealJS**** (2014-)
  95. 95. ТАК ПРИСТАЛЬНО УМЕЮТ СМОТРЕТЬ НА ТВОЙ КОД ▸ Google Closure Compiler
 (2009-)* KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ ▸ Browserify** (2010-) ▸ Webpack (2012-) ▸ JSPM*** (2013-) ▸ StealJS**** (2014-) ▸ Rollup.js (2015-)
  96. 96. WEBPACK РАСКРЫВАЕТ СВОЙ ПОТЕНЦИАЛ ▸ React.js ▸ React.js + Redux ▸ Проекты с React-like библиотеками ▸ Проекты 90+% ФП ?? ▸ Самопальные Vanilla.js проекты (пишем HMR вручную) KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ
  97. 97. WEBPACK МОЖЕТ ▸ Заменить собой на несложном проекте Gulp, Grunt ▸ Компилировать из очень многих распространенных форматов ▸ Ставить строгие зависимости между всеми файлами в приложении ▸ Подгружать части проекта асинхронно ▸ Выделять vendor bundle, common bundle, склеивать bundles ▸ Генерировать CSS, HTML файлы, несмотря на то что все модули — JS KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ
  98. 98. ЧЕГО ЛУЧШЕ НЕ ДЕЛАТЬ С WEBPACK ▸ Ставить вместе с ним Babel 6 ▸ Использовать 2.0.0-beta прямо сейчас ▸ Таргетить сервер-сайд (библиотеки под node.js ) ▸ Создавать сайты с минимальным количеством JS ▸ Приложения, где нужно слишком много динамических require() ▸ Искать документацию про написание плагинов KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ
  99. 99. KHARKIV.JS, 8 NOVEMBER 2015 :: КАК WEBPACK СДЕЛАЛ МЕНЯ СЧАСТЛИВЕЕ :: ЯРОСЛАВ СЕРГЕЕВ ▸ https://webpack.github.io/analyse ▸ https://github.com/noomorph/asciiart-loader ▸ http://y2u.be/xsSnOQynTHs -
 Dan Abramov: Live React: Hot Reloading with Time Travel ▸ HTTP2, System.import, JSPM - просто стоит почитать он их СПАСИБО ЗА ВНИМАНИЕ… И НЕВОШЕДШЕЕ В ПРЕЗЕНТАЦИЮ

×