Недавно сделал обновление до Webpack 2, потому что мне нужна была функция встряхивания дерева. Прошло около суток. Вот несколько советов и результаты.
Что такое "встряхивание деревьев"?
Встряхивание дерева (популяризованное Rollup) - это устранение неиспользуемого экспорта.
К сожалению, Tree Shaking в Webpack 2, похоже, не устраняет неиспользуемый экспорт внутри пакетов - по крайней мере, в моем проекте (например, все функции Lodash включены в мой пакет, включая функции, которые я не использую).
Обновление до Webpack 2
Официальное руководство по миграции Webpack довольно исчерпывающее, поэтому я не буду тратить время на то, чтобы повторять то, что уже есть.
В предустановке es2015 .babelrc отключите модули
До:
"presets": ["es2015", "react"],
После:
"presets": [ ["es2015", {"loose": true, "modules": false}], "react" ]
Это уменьшит размер файла вашего выведенного JS.
Убедитесь, что вы не включаете плагин Babel «react-hot-loader / babel» в ваш .babelrc файл!
Встряхивание дерева не сработает, если будет добавлен этот плагин (потратил на это много времени).
Отключение .babelrc и импорт собственной конфигурации в Webpack (НЕОБЯЗАТЕЛЬНО)
Измените раздел «babel-loader» в файле конфигурации Webpack, чтобы он выглядел следующим образом (где .babelrc.js - это JS-файл, содержащий вашу конфигурацию .babelrc)
module: { rules: [ { test: /\.js$/, use: { loader: 'babel-loader', options: Object.assign({ babelrc: false }, require('./babelrc.js')) }, exclude: /node_modules/, }, ] }
Игнорируйте предупреждение
Теперь вы будете получать предупреждение о каждой компиляции Webpack, которое выглядит следующим образом:
(node:35513) DeprecationWarning: loaderUtils.parseQuery() received a non-string value which can be problematic, see https://github.com/webpack/loader-utils/issues/56 parseQuery() will be replaced with getOptions() in the next major version of loader-utils.
Просто проигнорируйте это, это проблема с одним из ваших загрузчиков Webpack и не имеет к вам никакого отношения (похоже, что Webpack отключит это предупреждение в будущем обновлении).
Результаты
Webpack 1.13.2
Version: webpack 1.13.2 Time: 25305ms Asset Size Chunks Chunk Names js/contact_e752e5854d7a6f7422c9.chunk.js 1.43 kB 4 [emitted] contact chunk-manifest.json 274 bytes [emitted] js/catalog_d3fe90090a995c7254ef.chunk.js 41.9 kB 1 [emitted] catalog js/how_63fabed843b4144effd8.chunk.js 1.35 kB 2 [emitted] how js/finance_7ae1304d69a4e204bd20.chunk.js 1.56 kB 3 [emitted] finance js/vendor_876e13b789b38023cf83.bundle.js 394 kB 0 [emitted] vendor js/about_467405304c50e28a9c63.chunk.js 1.44 kB 5 [emitted] about js/main_d6bdb9cbe29bc1a164e5.bundle.js 342 kB 6 [emitted] main css/main_19b822f00587cc2e781c3bbe6bc852f3.css 205 kB 6 [emitted] main manifest.json 467 bytes [emitted] sw-toolbox.js 17.4 kB [emitted] [0] multi vendor 136 bytes {0} [built] + 851 hidden modules Child extract-text-webpack-plugin: + 2 hidden modules
Webpack 2.2.1
Version: webpack 2.2.1 Time: 22533ms Asset Size Chunks Chunk Names js/about_489704d5cc668862b9be.chunk.js 40.1 kB 0 [emitted] about js/main_ba108242d5c525cd6d9d.bundle.js 325 kB 1 [emitted] [big] main chunk-manifest.json 90 bytes [emitted] js/vendor_a9ebdde44b1b55d21147.bundle.js 396 kB 2 [emitted] [big] vendor css/main_70a9bee7273fab9ef275864d6bda5aca.css 205 kB 1 [emitted] main manifest.json 235 bytes [emitted] sw-toolbox.js 17.4 kB [emitted] [1] ./~/react/react.js 56 bytes {2} [built] [18] ./~/react-redux/lib/index.js 475 bytes {2} [built] [42] ./~/lodash/lodash.js 527 kB {2} [built] [61] ./~/react-router/lib/index.js 3.62 kB {2} [built] [72] ./~/react-helmet/lib/Helmet.js 23.4 kB {2} [built] [89] ./src/modules/analytics/AnalyticsLib.js 1.54 kB {1} [built] [102] ./~/redux/es/index.js 1.08 kB {2} [built] [103] ./~/react-dom/index.js 63 bytes {2} [built] [134] ./~/react-router-scroll/lib/index.js 512 bytes {2} [built] [206] ./src/client/Device.js 856 bytes {1} [built] [207] ./~/history/lib/createBrowserHistory.js 3.38 kB {2} [built] [208] ./~/redux-thunk/lib/index.js 529 bytes {2} [built] [320] ./src/optimizely/client/index.js 464 bytes {1} [built] [840] ./src/client.js 3.36 kB {1} [built] [841] multi babel-polyfill lodash react react-dom react-helmet redux redux-thunk react-redux react-router react-router-scroll 136 bytes {2} [built] + 853 hidden modules Child extract-text-webpack-plugin: [0] ./~/css-loader/lib/css-base.js 2.19 kB {0} [built] [1] ./~/base64-js/index.js 3.48 kB {0} [built] [2] ./~/buffer/index.js 48.6 kB {0} [built] [3] ./~/ieee754/index.js 2.05 kB {0} [built] [4] ./~/isarray/index.js 132 bytes {0} [built] [5] (webpack)/buildin/global.js 509 bytes {0} [built] [6] ./~/css-loader!./~/postcss-loader!./~/sass-loader/lib/loader.js!./src/style/index.scss 205 kB {0} [built]
main.js увеличился с 342 КБ до 325 КБ, что на 5% меньше размера файла. Не совсем радикально, но я возьмусь за это.
Обратите внимание, что размер about.js увеличился с 1,44 кБ до 40,1 кБ, а количество фрагментов было уменьшено. Это связано с тем, что, по-видимому, minChunkSizePlugin, у которого minChunkSize = 50000 (50 КБ), раньше не работал по какой-либо причине. Крошечные блоки размером 2 КБ были удалены и объединены в about.js.
Но если вам было любопытно, что будет на выходе Webpack 2.0 с отключенным minChunks, вот он:
Version: webpack 2.2.1 Time: 21718ms Asset Size Chunks Chunk Names js/main_ba108242d5c525cd6d9d.bundle.js 325 kB 5 [emitted] [big] main js/catalog_bef2c4168fd2a654ff5c.chunk.js 36 kB 0 [emitted] catalog js/finance_aa3df57fc02b5cf34182.chunk.js 1.16 kB 2 [emitted] finance js/contact_d26e17e05dadd81271dc.chunk.js 1.04 kB 3 [emitted] contact js/about_21fe64e0b5fde043e86d.chunk.js 1.05 kB 4 [emitted] about js/how_1d3b0d4332d795dd1fa3.chunk.js 968 bytes 1 [emitted] how chunk-manifest.json 274 bytes [emitted] js/vendor_a9ebdde44b1b55d21147.bundle.js 396 kB 6 [emitted] [big] vendor css/main_70a9bee7273fab9ef275864d6bda5aca.css 205 kB 5 [emitted] main manifest.json 467 bytes [emitted] sw-toolbox.js 17.4 kB [emitted]
(Я бы сделал таблицу для сравнения размеров файлов, но Medium не позволяет создавать таблицы ... Я знаю, это безумие)
Catalog.js увеличился с 41,9 КБ до 36 КБ, что на 14% меньше.
В целом мы увидели небольшое уменьшение размера файла, но ничего особенного. При этом наш сайт очень маленький. Если бы он был больше, то уменьшение размера файла было бы более значительным.
Стоило ли это усилий и альтернативных затрат на обновление? С точки зрения бизнеса, наверное, нет. Но, по крайней мере, я получил это сообщение в блоге.