Představuji Nette Assets pro správa statických souborů s integrací Vite

- David Grudl
- Nette Core | 8285
Ahoj,
štval mě na různých projektech fragmentovaný přístup k assetům – měl jsem Vite pro frontend buildy, různé helpery pro obrázky, custom řešení pro thumbnaily, jiný systém pro OG images, na některých projektech ještě WebPack atd.
A samozřejmě řadu projektů, kde jsem verzoval assety ručně:
<link rel="stylesheet" href="{$baseUrl}/css/style.css?v=7">
<img src="{$baseUrl}/images/logo.png?v=1699123456" width="200" height="100" alt="Logo">
Tak jsem napsal jednotný systém pro všechny statické soubory. Malý, elegantní, s možností neomezeného rozšíření:
S Nette Assets se stejný kód změní na toto:
{asset 'css/style.css'}
<img n:asset="images/logo.png" alt="Logo">
Funguje to dokonce úplně bez konfigurace. Hned po instalaci můžete začít používat:
{asset 'logo.png'} {* najde /www/assets/logo.png *}
{asset 'style.css'} {* najde /www/assets/style.css *}
{asset 'app.js'} {* najde /www/assets/app.js *}
Pokud máte soubory jinde než v /www/assets/, stačí
jedna řádka:
assets:
mapping:
default: static # soubory v /www/static/
Nativní Vite integrace s HMR
Moderní frontend vývoj bez Vite si neumím představit. Proto má Nette Assets first-class podporu včetně Hot Module Replacement!
Stačí minimal config:
vite.config.ts:
import { defineConfig } from 'vite';
import nette from '@nette/vite-plugin';
export default defineConfig({
plugins: [nette()],
build: {
rollupOptions: {
input: 'assets/main.js',
},
},
});
common.neon:
assets:
mapping:
default:
type: vite
path: assets
V šablonách používáte stejný kód:
{asset 'app.js'}
V development se automaticky načítá z Vite dev serveru
s HMR.
V production se načítají optimalizované buildy.
Flexibilní Latte integrace
Knihovna poskytuje tři způsoby použití:
{* Kompletní HTML element *}
{asset 'hero.jpg'}
{* Plná kontrola nad HTML *}
<img n:asset="product.jpg" alt="Product" class="rounded">
{* Maximální flexibilita *}
{var $logo = asset('logo.png')}
<img src={$logo} width={$logo->width} height={$logo->height}>
…A spousta dalších feature
Budu rád za zpětnou vazbu, testování, bugreporty nebo nápady na vylepšení!

- MajklNajt
- Člen | 518
https://blog.nette.org/…nette-assets#…
getAsset má parameter $options, s tým by sa to
malo dať zmáknuť

- medhi
- Generous Backer | 257
Ahoj, díky moc za tuhle věc, vypadá to naprosto skvěle, něco takového mi chybělo jako poslední puzzle celé Nette skládačky.
Narazil jsem ale zatím na tyto problémy:
- Z konfigurace Nette (http: csp) jsem musel:
- ze
style-srcodebratnoncea přidatunsafe-inline - do
connect-srcpřidat'ws://localhost:5173'
- ze
, jinak jsem dostával CSP violation.
- EDIT: nalezl jsem příčinu: https://github.com/…/Helpers.php#L134 timeout je tam 0, když dám 1 a více, už to funguje.
https://github.com/…ets/issues/1
Původní problém:
Nějak divně se mi detekuje development mód. Vše bych měl mít nastaveno správně, ale vite-plugin se aktivuje úplně náhodně při refreshování stránky tak v 10% případů… vůbec netuším s čím to může souviset.. nějaké kešování?
Projekt běží na localhost:8005, vite dev aktivní na localhost:5173, obojí na http. V 90% se natahují buildované soubory
<script src="http://localhost:8005/assets/app-Daee5PCB.js" type="module" crossorigin></script><link rel="stylesheet" href="http://localhost:8005/assets/app-DdsAdNXv.css" crossorigin>
v 10% se načte správně
<script src="http://localhost:5173/app.js" type="module"></script><script src="http://localhost:5173/@vite/client" type="module"></script>
Zkoušeno v Brave, Chrome, Firefox
Editoval medhi (11. 6. 14:48)

- Felix
- Nette Core | 1271
Vypada to skvele, urcite to zkusim nahradit za to co pouzivam ja (contributte/ui a contributte/vite) a pripadne to zarchivujeme. :-)

- VáclavČerný
- Člen | 6
Ahoj, super práce, něco takového tu chybělo, díky!
Zkusil jsem se rovnou zbavit Webpacku a to se mi i relativně snadno
povedlo. Narazil jsem jen na jeden problém u Vite + Sass. Nastavil jsem
.scss soubor přímo jako samostatný entry point a použil ho
skrze {assets} makro. V produkčním buildu vše funguje podle
očekávání, nicméně při použití dev serveru to končí chybou
This asset type cannot be rendered as HTML., protože
.scss se nevyhodnotí jako StyleAsset. Pokud jako
quick fix přidám ExtensionToMime 'scss' => 'text/css', vše
funguje krásně i v dev módu a to včetně HMR.
Dá se tohle nějak vyřešit?
Díky.

- MaN8fy
- Člen | 2
Ahoj,
řeším integraci s Dockerem. Vše mám nastavené tak, aby vývoj probíhal přes reverzní proxy (nginx-proxy), takže jednotlivé služby mají své domény (app.localhost, adminer.localhost, vite.localhost, atd.).
Mám:
- vite.config.js
export default defineConfig({
server: {
host: '0.0.0.0',
port: 5173,
origin: 'http://vite.localhost:5173',
watch: {
usePolling: true,
},
},
plugins: [
nette(),
],
});
- docker-compose.yml (výběr relevantních služeb)
services:
proxy:
image: jwilder/nginx-proxy
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
networks:
- skeleton-net
vite:
image: node:24-alpine
user: "1000:1000"
working_dir: /var/www
volumes:
- ./:/var/www
command: >
sh -c "npm install && npm run dev"
ports:
- "5173:5173"
expose:
- "5173"
environment:
VIRTUAL_HOST: vite.localhost
VIRTUAL_PORT: 5173
networks:
- skeleton-net
Vite server běží správně –
http://vite.localhost:5173/app.js je dostupné
z prohlížeče.
Problém
Když v šabloně použiju {asset 'favicon.ico'},
@nette/vite-plugin ve vývojovém režimu
vygeneruje: http://0.0.0.0:5173/favicon.ico
Namísto správného: http://vite.localhost:5173/favicon.ico
Zkoušel jsem
- změnit server.host z ‚0.0.0.0‘ na ‚vite.localhost‘ – Vite server pak přestal úplně fungovat (nebyl přístupný zvenku),
- přidat server.origin – bez efektu,
- přidat server.hmr s nastavením host, clientPort, protocol, atd. – bez efektu.
Existuje nějaký způsob, jak přimět @nette/vite-plugin, aby generoval ve vývojovém režimu správnou adresu assetů – tedy vite.localhost:5173 místo 0.0.0.0:5173?
Případně – je potřeba plugin nějak speciálně konfigurovat, aby to fungovalo s reverzní proxy (jwilder/nginx-proxy)? Vite sám o sobě běží správně…
Editoval MaN8fy (9. 7. 10:15)

- jeremy
- Člen | 58
@MaN8fy
Uz je na to PR: https://github.com/…lugin/pull/2
Zatim muzes nastavit devServer url v configuraci nette assets
assets:
mapping:
...
devServer: vite.localhost:5173
Editoval jeremy (9. 7. 17:27)