Autor Zpráva
Radovan789
Profil *
Mám blbej dotaz kterej nemůžu nikde na netu najít :D

Mám npm package.json kde je:
  "scripts": {
    "build": "npx webpack --config webpack.config.js"
  }

A rád bych aby tento "build" byl proveden když uložím jakýkoliv soubor v aktuálním workspace ve VSCode. Vím že existují nějaké další rozšíření typu "Run on Save", což udělá jakýkoliv CMD při uložení nebo něco jako "nodemon myFile.js". Ale já hledám něco co je přímo implementováno v základním VSCode aby to bylo co nejjednodušší na nastavení/spuštění, určitě v roce 2023 musí být něco takového jednoduchého implementováno v čistém VS.
Radovan789
Profil *
Odpovím si nakonec:

našel jsem na to skvělý modul npm-watch
npm i --save-dev npm-watch

s tím že při každém otevření projektu ji spustím takto:
npm run watch
Str4wberry
Profil
Čistě ze zvědavosti – k čemu je taková věc dobrá? :–)
Radovan789
Profil *
Dobrá otázka,

již delší dobu se zabývám optimalizací mnou napsaného kódu. Píšu si svoje vlastní javascript funkce/moduly/třídy pro různé potřeby např.: slider, slideshow, vlastní galerie, ajax file upload, ajax contact form a k tomu používám i nějaké cizí práce například Zebra tooltips, Lightbox atd. Z toho vyplývá že je nutné v HTML kódu uvést třeba takových 10 JS souborů, to znamená že při načtení stránky se klientoví 10x stáhne javascript (10x request a zpracování požadvku přes HTTP).

A teď konečně k npm a Webpacku: Webpack mi dokáže všechny javascript soubory spojit v 1 javascript soubor, minifikovat ho a upravit kód aby byl ještě jednodušší a optimalizovanější. Odstraní například i kód který nedává smysl a nebyl by nikdy použit nebo spuštěn. Takže do html místo 10 scriptů vložím jen <script src="build.js"></script> a tím brutálně zmenším počet requestů při návštěvě uživatele webu. Takže když uložím některý js soubor v projektu tak se mi hned vygeneruje tento build.js se všemi JS scripty. Tohle je naprosté minimum co webpack umí, umí toho mnohem víc, viz webpack.js.org. Existují i další podobné nástroje, například: rollupjs.org nebo parceljs.org, babeljs.io.

Samozřejmě se dá namítnout že jako programátor si můžu všechen kód psát v jednom souboru, ať JS nebo třeba styly. Ale to je u větších projektů velmi neefektivní a velmi nepřehledné na budoucí úpravy a rozšíření, než propracovaná adresářová struktura několika souborů a jmenných prostorů které se poté vytvoří do jednoho souboru z důvodu optimalizace přes jmenovaný nástroj.
Keeehi
Profil
Radovan789:
Odpovím si nakonec
Kdybys v prvním příspěvku nepsal, že to chceš jen za využití nativních možnosti VSC, tak bych ti to poradil už dopoledne :)

Existují i moduly, které ti můžou nahrát novou verzi do prohlížeče aniž bys v něm musel sám manuálně provádět refresh stránky. Ne že by to člověk nezvládl ručně ale je to trochu otrava. A při psaní CSS je to fakt pohodlné, když stačí jen zmáčknout ctrl+s a na druhém monitoru se to samo hned změní.
Já jsem používal livereload. Dnes už weby nedělám tak nevím, jaké jsou trendy v této oblasti. Ale tohle vypadá stále funkční a případně se můžeš podívat po nějakých novinkách sám.
Radovan789
Profil *
Keeehi:
Ano, napřed jsem v tom hledal složitosti přitom je to tak primitivní :D

Jo něco jako tvůj nabízený livereload již používám, savnu cokoliv ve workspace a v prohlížeči se mi to aktualizuje automaticky, moc super věc :)) Pak ještě nějaké další VSCode rozšíření například formátování kódu při uložení, našeptávač jQuery apod.. Super věci.
Kcko
Profil
Radovan789:
Ty při vývoji děláš rovnou build? To musí být zoufale pomalé a otravné. Build se dělá při deploy, případně do nějaké preprod-stage, abys otestoval funkčnost všech minifakcí atd.
Nikde není zaručeno, že Ti to webpack spojí vše správně. A jak jsem psal, musí to být zoufalé pomalé a otravné.
Napíšeš nějakou podminku nebo kratší kus kódu, CTR+S a čekáš než se vše zminifukuje, znormalizuje a spojí? To snad ne.
Radovan789
Profil *
Mám nastaveno ve webpacku mode: 'development' což udělá míň úkonů než při produkci. A momentálně používám webpack jen na slepování javascriptů. SCSS si řeším jinými nástroji.

Z toho mi většinou vychází:
webpack 5.88.2 compiled successfully in 333 ms

Nebo mi navrhneš mnohem lepší řešení?
Kcko
Profil
Radovan789:
Nepoužívám webpack. Používám ViteJS, který je samozřejmě mnohem rychlejší.
Ale i před ViteJS jsem používal Grunt / Gulp a buildil jsem jen tehdy, když to šlo do produkce, při vývoji jsem nic neminifikoval / neslučoval.
Radovan789
Profil *
Můžu se na něho kouknout v budoucnu, vidím že ViteJS používá přednastavený Rollup. Teď mi ale webpack vyhovuje, navíc ten develop mód to ani neminifikuje a nepřejmenovává, takže to můžu stále jednoduše debugovat ve vývoji.
ttttttttt
Profil *
Je sloučování modulů pořád žádoucí? Problém to byl, když se pro každý skript vytvářelo nové spojení. Při rozdělení na víc skriptů je možnost

* paralelního stahování / načítání
* cachování (není potřeba stáhnout při změně celý skript)

Je webpack přístup pořád state-of-tha-art nebo se postupně přechází na něco jiného (moduly)?
Radovan789
Profil *
To je otázka, ještě jsem se tak daleko bohužel nedostal abych řešil modulování.

Pro mě je to stále jen přechod z 10 scriptů na 1 z pohledu načítání/timeline webu. Problém který má v dnešní době stále hodně webů, například WordPress (který klidně načítá 30 scriptů bez modulování).
Webpack umí i split do více bundlů podle Dependency graph.

Dávám za pravdu že nejspíš existuji i lepší řešení, s použitím i CDNs. Ale nemám na to teď kapacitu do toho jít tak moc do hloubky.


Respektive modulování u webpacku řeším, nativním JS typu: import $ from 'jquery';
Firibix
Profil
Výhoda oddělených skriptů je také v tom, že je lze linkovat podle toho, co se na stránce zrovna používá. Například když na hlavní stránce není fotogalerie, nemusí návštěvník v obřím bundle stahovat i lightbox. To se pozitivně odrazí na velikosti stránky a tím i době načítání. V dnešní době navíc máme protokol HTTP/2 (resp. HTTP/3), který nevytváří zvlášť TCP spojení pro každý požadavek, a režie spojená s načítáním většího množství separátních skriptů je tak minimální.
Str4wberry
Profil
Radovan789:
Aha. Musím říct, že vyvíjet přímo s buildem mi přijde dost nestandardní.

Ale jestli vás to nezdržuje a nekomplikuje to debugování, tak asi proč ne.
Kcko
Profil
Str4wberry:
Až bude dělat větší projekt a ten build bude trvat několik sekund, tak pochopí ;-)
Radovan789
Profil *
Str4wberry:
Nestandardní? Přímo v dokumentaci, rekompilování při každém uložení jakéhokoliv souboru při vývoji, sami zmiňují. Ačkoliv tedy používají "webpack --watch" což je možná lepší řešení, ale výsledek by měl být stejný, tedy build v development prostředí.
weroro
Profil
Radovan789:
1. webpack má argument --watch, ktorý zabezpečí, že sa po každom uložení tvoje zmeny rebuildnú.
2. v package.json nie je potrebné spúšťať CLI pomocou príkazu npx, takže ho môžeš odstrániť.
3. webpack.config.js je defaultný, takže ho netreba zadávať ako argument. Ak ho premenuješ alebo ak zmeníš jeho umiestnenie (mimo root projektu), tak vtedy je opodstatnené ho definovať ako argument aj s cestou ku nemu. Prípadne ak chceš používať pre rôzne buildy rôzne konfigurácie.

Tvoje aktuálne nastavenie by teda mohlo vyzerať takto npx webpack --watch --config webpack-config.js
Po odstránení zbytočných vecí to bude vyzerať takto: webpack --watch

Pri builde ti ale pravdepodobne bude webpack hlásiť warning pretože nemáš definovaný build --mode, to ale až tak nevadí. Akurát som si všimol, že to máš zadefinované priamo vo webpack.config.js

Ideálne by ale bolo aby sisi oddeloval runnery napr.

"scripts": {
    "build": "webpack --mode=development",
    "build:prod": "webpack --mode=production",
    "build:watch": "webpack --watch --mode=development"
}
  

Spúšťať to budeš ako pred tým (napr.): npm run build:watch


Kcko:
Až bude dělat větší projekt a ten build bude trvat několik sekund, tak pochopí ;-)
webpack to robí trochu inteligentne. Neprebuildí vždy komplet všetko ale iba závislé súčasti na aktuálnom kóde. Nap. ak upravujem modul, tak sa prebuildia aj ostatné moduly kde tento modul používam. + je tam cachovanie a tiež sa prihliada na predošlú verziu, pretože napr. pridanie nového riadka alebo niekedy dokonca preformátovanie celého kódu nespustí rebuild, lebo sa reálne nič nezmenilo.


Webpack je dostatočne výkonný, len ho treba vedieť používať. To že nejaký iný builder ide rýchlejšie neznamená, že bude rýchlejší vždy, pretože sa môže jednať o konkrétne situácie.
Nie je to také jednoznačné ako pri porovnávaní package managerov kde je npm reálne najpomalší. Jedného času bol skvelý yarn a dnes už ani to nestačí pretože prišiel pnpm.
Kcko
Profil
weroro:
Webpack používame ve spojení se starším VUE na VUE-CLI, máme masivní projekt a opravdu tato kombinace není nic extra (= JE TO POMALÉ JAK HOVADO).
Radovan789
Profil *
weroro:
🙏

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0