Ostatnio znalazłem trochę chęci i czasu na webpack i doszedłem do tego, co następuje:
Okazuje się, że budowanie można uruchomić taką komendą będąc w folderze z plikiem konfiguracyjnym:
./node_modules/.bin/webpack build
Stwierdziłem też, że instalator zmienia plik package.json
, więc najlepiej poinstalować wszystkie potrzebne rzeczy, a potem utworzyć package.json
.
Podany przykład z pliku "webpack-inline.zip" od @Riddle integruje się i działa, ale to nie jest to, o co chodziło. Docelowo chodzi o to, żeby wskazać plik HTML, a WebPack sam wyczuje, jakie są skrypty wskazane za pomocą <script src="JakisSkrypt.js"><script>
. Jak to zrobić? Nawet bez integracji HTML z JS, jak jest jeden czy dwa skrypty, to można zrobić ręcznie, ale jak jest 10 skryptów, to trzeba by zrobić 10 bundlowań, choć to da się zautomatyzować skryptem Bash, mając 10 plików konfiguracyjnych. Tylko, jak przetworzyć skrypty zawarte wewnątrz HTML?
Załączam prosty przykład modułów w pliku Modules.zip
Modules.zip , który zrobiłem jakiś czas temu na podstawie https://www.w3schools.com/js/js_modules.asp , sam dorobiłem przykład łączący dwa pierwsze.
W podkatalogu "Modules1" i "Modules2" jest to samo z tą różnicą, że w tym pierwszym skrypty są ręcznie napisane w samym HTML, oprócz samych modułów, a w tym drugim, skrypty są wyciągnięte do osobnych plików specjalnie na użytek testu WebPack, jak integruje moduły. Jak się podaje pliki mod1.js
, mod2.js
, mod3.js
, to bardzo dobrze WebPack integruje, przy czym docelowy plik to main.js
, którego nazwę trzeba zmienić. Po tej integracji, skrypty działają poprawnie.
No i pozostaje pytanie, w jaki sposób zintegrować moduły z podfolderu Modules1, gdzie skrypty są zawarte w HTML?
Kolejna rzecz, która bardziej mnie interesuje niż moduły, to Worker
i SharedWorker
. W takim razie, na tapet wziąłem plik app2.js
z https://github.com/andrzejlisek/SingleHtmlAppBundler/tree/main/Samples/Multimedia .
W oryginalnej postaci, Webpack w ogóle nie widzi odniesienia do pliku worker.js
. Teoretycznie odnalazłem info, jak to zrobić:
https://webpack.js.org/guides/web-workers/
https://mmazzarolo.com/blog/2021-09-03-loading-web-workers-using-webpack-5/
W praktyce, po zmianie odniesienia do "Worker" tak jak podano, czyli wykorzystując URL
, nie uruchamia się w przeglądarce, teoretycznie się integruje, ale w praktyce WebPack też coś robi nie tak. Wytwarza jakiś skrypt i dodatkowy plik, jak się go analizuje, to nie ma śladu oryginalnej funkcji zawartej w Worker, a jak się w ciemno podstawi w miejsce oryginalnego app2.js
, to w przeglądarce nie działa.
Pomniejsza kwestia, to wyłączenie minimalizowania, żeby łatwiej analizować, co z czym i jak WebPack łączy:
https://davidwalsh.name/how-to-not-minify-source-with-webpack
https://stackoverflow.com/questions/41255380/can-i-get-webpack-to-bundle-but-without-minification-for-debugging
https://maheshwaghmare.com/webpack/how-to/avoid-minification/?utm_content=cmp-true
Teoretycznie tym czymś jest to: optimization: { minimize: false },
, ale w praktyce to tak nie do końca, w praktyce, to po wyłączeniu minifikacji jest natworzone więcej kodu, czyli przy minimalizacji nie tylko są wyrzucone komentarze, spacje, entery i skrócone identyfikatory, ale też tworzony kod jest trochę inny, jak się porównuje. Próba zainstalowania UglifyJs poleceniem npm install uglifyjs-webpack-plugin
zakończyła się serią błędów, z drugiej strony, wyłącznie minimalizacji nie jest aż tak ważne (przy jakiś małych skryptach tworzonych do testów można posiłkować się https://beautifier.io/ ), a sam fakt konieczności instalowania dodatkowych wtyczek w celu zrezygnowania z jakiejś czynności (w tym przypadku minimalizacja kodu) brzmi absurdalnie.
Koniec końców, wygląda na to, że w obecnej postaci, WebPack potrafi dobrze tylko dwie rzeczy:
- Zminimalizować kod JavaScript, żeby plik był możliwie najmniejszy.
- Zintegrować moduły z skryptem używającego modułu, na użytek starej przeglądarki, która nie zna modułów, i to tylko po wskazaniu pliku *.js, po wskazaniu *.html nie potrafi.
Akurat to są rzeczy, które może i są ważne i przydatne, ale mnie to najmniej interesują.
Co w takim razie z resztą?
Już nie dążę do zintegrowania wszystkiego w jednym pliku, ale chodzi o to, że wskazuje plik HTML, a program sam widzi, jakie pliki *.js są użyte i te wszystkie pliki *.js integruje do pojedynczych. Jak to zrobić?