Vylepšený code splitting ve Webpacku 5

JavaScript, CSS

Webpack 5 přináší novou funkcionalitu zvanou Code Splitting. Ta nabízí propracovanější a jednodušší možnost, jak rozdělit kód do více souborů. Ne jen oddělení vendor knihoven.

Vylepšený code splitting ve Webpacku 5

Article in English can be found on dev.to/arxeiss/enhanced-code-splitting-with-webpack-5-3af3

V prosinci 2018 byla vydána první alpha verze Webpacku 5. Na konci roku 2019 lidé psali: "Webpack 5 je po roce tady!". Je říjen 2020 a venku je stále jen release candidate. Každopádně to nebrání využívat některé nové funkcionality, převážně pokud jsou tak super, jako Code Splitting.

Ve webpacku 4 byla přepracována optimalizace pro vytváření chunků pro rozdělování kódu. Ta možnost je tu stále a je velmi dobře popsána ve videu na YouTube. Chunky se dobře hodí pro Single Page App, kde častěji dochází k úpravě kódu aplikace, nikoli však knihoven.

Rozdělení podle entry pointů

V systému pro lyžařskou školu používám Bootstrapu 4 a navíc Datatables, EasyMDE a z historických důvodů Magnific popup. Pro nepřihlášené návštěvníky stačí načíst základní JS s Bootstrapem. Až pro přihlášené rodiče, kteří tvoří 85 % uživatelů, je potřeba načíst DataTables. Pro zbylých 15 % uživatelů se načítají i ostatní knihovny, ale pouze na stránkách, kde jsou opravdu potřeba. Proto jsem chtěl mít kód rozdělen trochu jinak, než jen app.js a vendors.js.

Nastavení code-splittingu spočívá ve vytvoření více entry pointů a určení jejich závislostí. Je to velmi jednoduché a kód je rozdělen přesně, jak si vývojář určí. Tato nová metoda lze kombinovat se Split chunks pluginem, který je stále dostupný a hodí se na trochu něco jiného. Viz odkaz na video výše. Detailnější popis je v komentářích přímo v kódu níže.

const path = require('path');

module.exports = {
  entry: {
    // Výsledný soubor vendors.js obsahuje pouze jQuery a popper.js
    'public/js/vendors': ['jquery', 'popper.js'],
    // main.js obsahuje vše, co je v něm importováno, tj i Bootstrap a další knihovny
    // Neobsahuje ale nic, co již je ve vendors.js, protože na něm závisí
    'public/js/main': {
      import: './resources/assets/js/main.js',
      dependOn: 'public/js/vendors',
    },
    // DataTables jsou závislé na main.js
    // Vše co již je obsaženo ve vendors.js nebo main.js nebude znovu přiloženo
    'public/js/datatables': {
      import: './resources/assets/js/datatables.js',
      dependOn: 'public/js/main',
    },
    // Magnific popup načítá pouze jQuery, proto stačí závislost na vendors.js
    'public/js/magnific-popup': {
      import: './resources/assets/js/magnific-popup.js',
      dependOn: 'public/js/vendors',
    },
    // EasyMDE neobsahuje žádné závislosti obsažené v některém z dřívějších souborů
    'public/js/easymde': './resources/assets/js/easymde.js',
  },
  output: {
    filename: '[name].js',
    path: path.resolve(__dirname, './'),
    publicPath: '/',
    ecmaVersion: 5,
  },
};

Pozor na správnou verzi

Při instalaci pomocí npm i webpack dojde k nainstalování Webpacku v4! Opravdu zajímavé je, že při otevření dokumentace je zobrazena dokumentace pro verzi 5. Pro nainstalování RC verze 5 je nutné zadat npm i webpack@next.


Zkušenosti s Webpackem nebo přímo Code Splittingem můžete sdílet v komentářích.

K tomuto článku již není možné přidávat další komentáře