Webpack → Vite: Migration des Storybook-Bundlers
(medium.com/@hong009319)Wir haben den Storybook-Bundler von Webpack auf Vite migriert. Dabei traten mehrere Probleme nacheinander auf, sodass wir letztlich den bestehenden Tech-Stack ändern mussten.
Änderung des Tech-Stacks
• [Bisheriger Tech-Stack] Storybook v6.5, builder-webpack5, Node v18, Yarn 1
• [Finaler Tech-Stack] Storybook v7, react-vite, Node v18, Pnpm
Probleme während der Migration
1. Kompatibilitätsproblem zwischen Webpack 4 und OpenSSL 3
-
Problembeschreibung
- Während der Migration von builder-webpack5 zu builder-vite trat ein Kompatibilitätsproblem mit der OpenSSL-Version auf
- Versionen vor Webpack 5.61.0 verwenden eine ältere OpenSSL-Version, danach wird OpenSSL 3 verwendet
- Storybook v6 nutzt Webpack 4 als Standard-Builder und bietet Webpack 5 optional an
- Damals war Webpack 5 ausgewählt, und mit builder-webpack5 auf Basis von Webpack ^5.9.0 trat kein OpenSSL-Fehler auf
- Der migrierte builder-vite baut zwar mit Vite, aber da Storybook v6 intern standardmäßig Webpack 4 verwendet, trat das Kompatibilitätsproblem mit der OpenSSL-Version auf
-
Lösung: Migration auf Storybook v7
- In Storybook v7 wird bei der Nutzung von Vite intern nicht mehr Webpack 4 verwendet, daher tritt der OpenSSL-Fehler nicht auf
2. Durch Hoisting in Yarn 1 wurden Dependencies mit abweichenden Versionen verwendet
-
Problembeschreibung
- Im Paket @isaacs/cliui werden das ESM-Format
string-width@5und das CommonJS-(CJS)-Formatstring-width@4über den Aliasstring-width-cjsverwendet - Da Yarn 1 doppelte Dependency-Pakete in die root
node_moduleshoistet, kann auf Dependencies zugegriffen werden, die im jeweiligen Paket gar nicht installiert wurden - Da
string-width@4und@5von mehreren Paketen als Sub-Dependencies mehrfach verwendet werden, wurden sie in die rootnode_modulesgehoistet cli-table3im CJS-Format wollte aufstring-width@4zugreifen, konnte wegen des Alias jedoch nicht dieselbe Version finden und löste stattdessen das ESM-formatigestring-width@5auf, wodurch ein Modul-Kompatibilitätsproblem entstand
- Im Paket @isaacs/cliui werden das ESM-Format
-
Lösung: Wechsel des Paketmanagers zu pnpm, bei dem keine Phantom-Dependencies entstehen
1 Kommentare
Frage. Gibt es einen bestimmten Grund, warum in webpack kein
esbuild-loaderverwendet wurde?Antwort.
Wir haben Vite verwendet, um die Native-ESM-Funktionalität zu nutzen.
Soweit ich weiß, ist
esbuild-loaderein Loader, mit dem manesbuildin Webpack verwenden kann. Mitesbuild-loaderwird der Build zwar sehr viel schneller, aber man muss trotzdem weiterhin den Bundling-Prozess durchlaufen.Mit Native ESM hingegen werden nur die tatsächlich verwendeten Module gebaut und an den Browser übertragen; wenn sich ein Modul ändert, wird auch nur dieses geänderte Modul gebaut, was schneller ist.
Da bei Storybook häufig nur bestimmte Komponenten angefordert werden, hielten wir den Einsatz von Native ESM für sinnvoll und haben deshalb Vite verwendet.