Sposób, w jaki buduję strony WordPress, zmienił się fundamentalnie. W 2026 roku wydajność Twojego łańcucha budowania jest równie ważna jak wydajność Twojej strony internetowej. Jeśli uruchomienie “npm run dev” zajmuje 30 sekund, tracisz godziny produktywności każdego tygodnia. Dla profesjonalnych programistów WordPress, którzy pracują nad projektami korporacyjnymi, ta nieefektywność sumuje się do tysięcy złotych utraconej produktywności rocznie.
Oto kompleksowy przewodnik po profesjonalnych narzędziach WordPress w 2026 roku, obejmujący wszystko od narzędzi budowania po pipeline’y wdrożeniowe.
Vite czy webpack w WordPress
Vite stał się złotym standardem dla nowoczesnego rozwoju WordPress. Choć Webpack służył nam dobrze przez dekadę, jego podejście “najpierw bundle” jest zbyt wolne dla nowoczesnych, bogatych w dane projektów Gutenberg, które wymagają natychmiastowej informacji zwrotnej podczas rozwoju.
Czas startu i przeładowania w Vite i webpacku
Podejście Webpack:
- Tworzy bundle całego kodu przed uruchomieniem serwera deweloperskiego
- Czas zimnego startu: 15-45 sekund dla dużych projektów
- Hot reload: 2-5 sekund dla zmian
- Wymagający pamięci: Często wymaga 4GB+ RAM
Podejście Vite:
- Wykorzystuje natywne moduły ES w przeglądarce podczas rozwoju
- Czas zimnego startu: <1 sekunda, niezależnie od rozmiaru projektu
- Hot Module Replacement: <100ms dla większości zmian
- Wydajne wykorzystanie pamięci: Zazwyczaj poniżej 1GB RAM
Ile czasu dziennie oszczędza Vite
Rozważ typowy dzień dla programisty WordPress:
- 50 zapisów plików podczas rozwoju
- Przepływ pracy Webpack: 50 × 5 sekund = 250 sekund (4+ minuty) stracone na przeładowania
- Przepływ pracy Vite: 50 × 0,1 sekundy = 5 sekund łącznie
- Czas zaoszczędzony dziennie: 4 minuty. Rocznie: 16+ godzin
Konfiguracja vite dla WordPress
Głównym wyzwaniem z Vite jest integracja z backendem PHP WordPress. Połączenie obsługują małe wtyczki, takie jak vite-plugin-wordpress (wersja 1.0.4 w npm), i według ich pliku readme robią mniej, niż sugeruje nazwa:
- Zapisują plik
vite.config.phpw katalogu konfiguracji projektu, z informacjami potrzebnymi PHP do ustalenia ścieżek plików wygenerowanych przez Vite - W trybie deweloperskim zapisują plik
.devz adresem serwera deweloperskiego Vite, dzięki czemu PHP wie, czy ładować pliki z serwera, czy z buildu - Opcjonalnie obserwują pliki i wywołują pełne przeładowanie (opcja
watch, oparta navite-plugin-live-reload)
Wypisanie tagów script i dołączenie plików zostaje zadaniem motywu. Opisuje to sekcja o manifeście poniżej.
// vite.config.js - Nowoczesna konfiguracja WordPress
import { defineConfig } from 'vite';
import wordpress from 'vite-plugin-wordpress';
export default defineConfig({
plugins: [
wordpress({
watch: true,
devDir: process.cwd(),
wordpressConfigDir: 'config'
})
],
build: {
outDir: 'dist',
manifest: true,
rolldownOptions: {
input: {
main: './src/index.js',
blocks: './src/blocks/index.js'
}
}
}
});Kiedy webpack jest nadal potrzebny
Webpack pozostaje konieczny dla:
- Projektów legacy, które nie mogą być natychmiast migrowane
- Złożonych wymagań bundlowania (code splitting przez wiele punktów wejścia)
- Projektów wymagających rozległych ekosystemów wtyczek
- Zespołów z głęboką wiedzą o Webpack i bez czasu na przekwalifikowanie
Dla nowych projektów w 2026 Vite jest jednak prawie zawsze lepszym wyborem.
Jak @wordpress/scripts buduje bloki WordPress webpackiem
Zanim przeniesiesz wtyczkę z blokami na Vite, warto wiedzieć, co robi oficjalny zestaw narzędzi, bo właśnie to zastępujesz. Dokumentacja @wordpress/scripts w serwisie developer.wordpress.org opisuje pakiet jako zbiór skryptów wielokrotnego użytku do pracy z WordPressem, konfigurowany w sekcji scripts pliku package.json. Polecenia build i start działają na webpacku. Wersja 36.1.0 trafiła do npm 7 października 2026, więc to aktywnie rozwijana konfiguracja webpacka, a nie spadek po starych projektach.
wp-scripts build tworzy jeden build produkcyjny, a wp-scripts start przebudowuje projekt przyrostowo w trakcie pracy. Jeśli nie podasz punktów wejścia, katalog źródłowy (domyślnie ./src) jest przeszukiwany pod kątem plików block.json, a pliki JavaScript wskazane w ich polach skryptów stają się punktami wejścia. Gdy nie ma żadnego block.json, zapasowym punktem wejścia jest src/index.js (albo .jsx, .ts, .tsx), zapisywany do build/index.js.
Flagi istotne dla tematów z tego artykułu:
| Flaga | Co robi |
|---|---|
--hot | Włącza Fast Refresh. Wymaga włączonego SCRIPT_DEBUG w WordPressie i zainstalowanej wtyczki Gutenberg |
--experimental-modules | Dodaje obsługę pola viewScriptModule w block.json |
--blocks-manifest | Zapisuje plik PHP z metadanymi wszystkich plików block.json dla wp_register_block_metadata_collection() |
--source-path, --output-path | Zmieniają katalog źródłowy i wyjściowy (domyślnie build) |
Oficjalny zestaw ma więc już przeładowanie na gorąco dla bloków, z dwoma warunkami, które łatwo przeoczyć na kopii stagingowej z wyłączonym SCRIPT_DEBUG.
Ten sam pakiet obejmuje resztę łańcucha: lint-js (ESLint z @wordpress/eslint-plugin), lint-style (stylelint z @wordpress/stylelint-config), format, test-unit-js (uruchamia Vitest zainstalowany w projekcie), test-e2e (Playwright), plugin-zip i packages-update. Żeby zmienić konfigurację webpacka, tworzysz webpack.config.js w katalogu głównym projektu, wczytujesz domyślną konfigurację przez require i rozszerzasz ją operatorem spread. Nadal uruchamiasz polecenia wp-scripts, a nie webpacka bezpośrednio.
Co zawiera plik index.asset.php
Każdy punkt wejścia zbudowany domyślną konfiguracją dostaje odpowiadający mu plik .asset.php. Tworzy go Dependency Extraction Webpack Plugin, który pomija importy @wordpress/* w paczce i w czasie działania mapuje je na globalny obiekt wp: @wordpress/blocks jest czytany z wp.blocks i rejestrowany pod uchwytem skryptu wp-blocks. Wygenerowany plik zwraca listę zależności i wersję wyliczoną z kodu źródłowego:
<?php return array( 'dependencies' => array( 'react' ), 'version' => 'dd4c2dc50d046ed9d4c063a7ca95702f' );Twój PHP przekazuje obie wartości wprost do wywołania enqueue, więc nikt nie utrzymuje listy zależności ręcznie:
$asset = include plugin_dir_path( __FILE__ ) . 'build/index.asset.php';
wp_enqueue_script( 'my-block', plugins_url( 'build/index.js', __FILE__ ), $asset['dependencies'], $asset['version'] );Vite nie ma wbudowanego odpowiednika. Build Vite, który importuje @wordpress/element, dołącza własną kopię pakietu, dopóki nie oznaczysz tych pakietów jako zewnętrznych i sam nie zmapujesz ich na obiekty globalne. To mapowanie jest największą częścią pracy przy migracji wtyczki z blokami.
Jak ładować pliki Vite w PHP WordPressa przez manifest
Przewodnik po integracji z backendem w dokumentacji Vite jest punktem odniesienia dla każdej konfiguracji renderowanej po stronie serwera, także WordPressa. Składa się z trzech części.
Konfiguracja. Ustaw punkt wejścia i włącz build.manifest: true. Po vite build Vite zapisuje plik .vite/manifest.json w katalogu wyjściowym.
Praca lokalna. Dopóki działa vite, szablon PHP wypisuje dwa skrypty modułowe wskazujące na serwer deweloperski: @vite/client i plik wejściowy, na przykład http://localhost:5173/@vite/client i http://localhost:5173/main.js. W server.cors ustaw origin, który otwierasz w przeglądarce, czyli lokalny adres WordPressa. Dla obrazów i fontów wskazywanych w CSS albo przekaż żądania plików przez proxy do Vite, albo ustaw server.origin, żeby wygenerowane adresy wskazywały właściwy host.
Produkcja. PHP czyta manifest, czyli mapę nazw chunków na chunki. Dla punktu wejścia bierze file (skrypt do załadowania), wypisuje link do arkusza stylów dla każdej pozycji w css i rekurencyjnie przechodzi po imports, dodając ich CSS i opcjonalne linki modulepreload. Jeśli polyfill module preload nie jest wyłączony, punkt wejścia powinien zaczynać się od import 'vite/modulepreload-polyfill'.
Vite generuje moduły ES, więc po stronie WordPressa lepiej pasuje wp_enqueue_script_module(), dostępne od WordPressa 6.5.0, niż klasyczne wp_enqueue_script():
$manifest = json_decode( file_get_contents( get_theme_file_path( 'dist/.vite/manifest.json' ) ), true );
$entry = $manifest['src/index.js'];
wp_enqueue_script_module( 'theme-main', get_theme_file_uri( 'dist/' . $entry['file'] ) );
foreach ( $entry['css'] ?? array() as $i => $css ) {
wp_enqueue_style( 'theme-main-' . $i, get_theme_file_uri( 'dist/' . $css ) );
}Plik .dev zapisywany przez vite-plugin-wordpress jest tym, co ten kod PHP może sprawdzić najpierw: jeśli istnieje, wypisuje dwa tagi serwera deweloperskiego, w przeciwnym razie czyta manifest.
Jak używać TypeScript w blokach WordPress
W 2026 dostarczanie czystego JavaScriptu jest uważane za ryzyko w projektach korporacyjnych. TypeScript stał się standardem branżowym, i to z dobrego powodu.
Dlaczego typescript jest ważny dla WordPress
Zapobieganie błędom: TypeScript wykrywa błędy, zanim kod zostanie uruchomiony. Rozważ ten powszechny błąd bloku Gutenberg:
// ❌ Bez TypeScript - Błąd runtime
attributes: {
color: 'czerwony' // Programista przypadkowo przekazuje string
}
// Później w kodzie:
setAttributes({ color: { r: 255, g: 0, b: 0 }}) // Oczekuje obiektu, otrzymuje string
// ✅ Z TypeScript - Błąd kompilacji
interface ColorAttributes {
color: string;
}
// TypeScript natychmiast wykrywa niezgodnośćBezpieczeństwo rozwoju bloków: Ponieważ bloki Gutenberg w dużym stopniu polegają na złożonych obiektach attributes, TypeScript zapewnia bezpieczeństwo typów w:
- Atrybutach bloków
- Kontrolach inspektóra
- Renderowaniu po stronie serwera
- Odpowiedziach API
Konfiguracja typescript dla WordPress
// tsconfig.json - Zoptymalizowany dla WordPress
{
"compilerOptions": {
"target": "ES2020",
"module": "ESNext",
"lib": ["ES2020", "DOM"],
"jsx": "react",
"moduleResolution": "node",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"resolveJsonModule": true,
"types": ["@wordpress/blocks"]
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"]
}Gdzie używa się TypeScript w projektach WordPress
Gdzie TypeScript faktycznie się pojawia w pracy z WordPressem:
- kod edytora blokowego, gdzie kształty danych są udokumentowane i stabilne
- wszystko, co dotyka REST API, gdzie literówka w nazwie pola inaczej wychodzi dopiero w runtime
- wspólne paczki wewnątrz agencji, gdzie typy są kontraktem między zespołami
Jak przenieść projekt WordPress na TypeScript
Dla istniejących projektów migracja do TypeScript może być stopniowa:
- Zacznij od nowych plików (rozszerzenie
.ts) - Stopniowo konwertuj krytyczne pliki (bloki, obsługi API)
- Używaj komentarzy
// @ts-checkdla szybkich zwycięstw w istniejących plikach - Włączaj tryb strict stopniowo
HMR przy tworzeniu bloków Gutenberg
HMR w 2026 działa bezproblemowo i transformuje doświadczenie dewelopera.
Czas iteracji z HMR i bez niego
Tradycyjny przepływ pracy:
- Edytuj CSS dla bloku Gutenberg
- Zapisz plik
- Czekaj na build (5 sekund)
- Odśwież przeglądarkę
- Nawiguj do strony (10 sekund)
- Otwórz edytor bloków
- Nawiguj 10 poziomów w dół do ustawienia, nad którym pracujesz
- Sprawdź zmianę
- Powtórz dla następnej iteracji
Całkowity czas na iterację: 20-30 sekund
Nowoczesny przepływ pracy HMR:
- Edytuj CSS dla bloku Gutenberg
- Zapisz plik
- Zmiana pojawia się natychmiast w przeglądarce (<100ms)
- Żadna nawigacja nie jest stracona, żadna zmiana kontekstu
Całkowity czas na iterację: <1 sekunda
Co HMR aktualizuje w blokach Gutenberg
Nowoczesne narzędzia budujące obsługują HMR automatycznie dla:
- Zmian CSS (natychmiastowe aktualizacje wizualne)
- Zmian JavaScript (zachowanie stanu komponentu)
- Aktualizacji komponentów React (zachowanie stanu edytora)
- Zmian zasobów (obrazy, czcionki)
Korzyści z HMR w codziennej pracy nad blokami
W codziennej pracy HMR widać w trzech miejscach:
- iteracja kończy się podmianą modułu, a nie pełnym przeładowaniem strony
- zostajesz w edytorze, zamiast skakać do przeglądarki i z powrotem
- błąd wychodzi, póki zmiana jest jeszcze w głowie, a nie po przebudowie
Ładowanie CSS per blok i theme.json w motywach FSE
Motywy Full Site Editing (FSE) wymagają fundamentalnie innego podejścia do stylów i zarządzania zasobami.
Jak generować theme.json z tokenów designu
W 2026 generuję części theme.json dynamicznie z tokenów designu:
// build-theme-json.js
import designTokens from './figma-tokens.json' with { type: 'json' };
const themeJson = {
settings: {
color: {
palette: designTokens.colors.map(color => ({
slug: color.name,
color: color.value,
name: color.label
}))
},
typography: {
fontFamilies: designTokens.fonts.map(font => ({
slug: font.name,
fontFamily: font.value
}))
}
}
};
// Automatyczne generowanie theme.json z tokenów FigmaTo podejście zapewnia:
- Spójność systemu designu w motywie
- Jedno źródło prawdy, od Figmy do WordPressa
- Automatyczne aktualizacje, gdy tokeny designu się zmieniają
- Zmniejszone błędy konfiguracji ręcznej
Jak ładować CSS tylko dla bloków na stronie
W 2026 nie ładuję jednego gigantycznego style.css. Nowoczesne łańcuchy budowania:
- Analizują użycie bloków na każdej stronie
- Dzielą CSS według typu bloku
- Ładują tylko wymagane style dla bloków obecnych na stronie
- Wstawiają krytyczny CSS dla treści above-the-fold
To skutkuje:
- wysyłany arkusz stylów zawiera tylko te klasy, których faktycznie używają szablony
- Szybszym First Contentful Paint (FCP)
- Lepszymi wynikami Core Web Vitals
- Lepszą wydajnością mobilną
Jak skonfigurować dzielenie CSS w Vite
// Nowoczesna strategia dzielenia CSS
export default {
build: {
cssCodeSplit: true,
rolldownOptions: {
output: {
assetFileNames: 'assets/[name].[hash][extname]',
chunkFileNames: 'assets/[name].[hash].js',
codeSplitting: {
groups: [
{ name: 'core-blocks', test: /src\/blocks\/core/ },
{ name: 'custom-blocks', test: /src\/blocks\/custom/ },
{ name: 'editor-styles', test: /src\/editor/ }
]
}
}
}
}
}Vite vs webpack vs Parcel vs esbuild w 2026
| Narzędzie | Szybkość | Złożoność | Najlepsze dla | Integracja WordPress |
|---|---|---|---|---|
| Vite | Ultra Szybki | Średnia | Nowoczesne motywy FSE / Wtyczki | Doskonała (przez wtyczki) |
| Webpack | Wolny | Wysoka | Projekty legacy / Złożone bundlowanie | Doskonała (dojrzały ekosystem) |
| Parcel | Szybki | Niska | Małe / Proste wtyczki | Dobra (zero-config) |
| Esbuild | Ekstremalny | Średnia | Wysokoprędkościowa minifikacja backendu | Ograniczona (tylko build) |
| Turbopack | Ekstremalny | Niska | Projekty Next.js | Niedostępny |
Które narzędzie wybrać do projektu WordPress
Wybierz Vite, jeśli:
- Rozpoczynasz nowy projekt WordPress
- Używasz nowoczesnego JavaScriptu (moduły ES)
- Potrzebujesz szybkiego doświadczenia deweloperskiego
- Pracujesz z motywami FSE lub blokami Gutenberg
- Zespół ceni doświadczenie dewelopera
Wybierz Webpack, jeśli:
- Utrzymujesz projekty WordPress legacy
- Wymagasz rozległego ekosystemu wtyczek
- Są złożone wymagania code-splitting
- Zespół ma głęboką wiedzę o Webpack
- Ryzyko migracji jest zbyt wysokie
Wybierz Parcel, jeśli:
- Budujesz proste wtyczki WordPress
- Preferujesz konfigurację zero
- Preferujesz konwencję nad konfiguracją
- Małe do średnich projekty
npm vs yarn vs pnpm dla motywów WordPress
W 2026 wybór menedżera pakietów ma znaczący wpływ na wydajność budowania.
Czas instalacji i miejsce na dysku w npm, yarn i pnpm
Dla typowego motywu WordPress z 150 zależnościami:
| Menedżer | Czas instalacji | Miejsce na dysku | Rozmiar Node Modules |
|---|---|---|---|
| pnpm | 8 sekund | 250 MB | 280 MB |
| yarn | 15 sekund | 400 MB | 450 MB |
| npm | 20 sekund | 500 MB | 550 MB |
Dlaczego pnpm instaluje szybciej i zajmuje mniej miejsca
pnpm wykorzystuje magazyn content-addressable:
- Pakiety są przechowywane raz globalnie
- Projekty łączą się z globalnym magazynem (hard links)
- zużycie dysku rośnie z liczbą różnych wersji, nie z liczbą projektów
- Szybsze instalacje (brak duplikatów pobierania)
Dokumentacja pnpm wyjaśnia mechanizm: przy aktualizacji zależności do magazynu trafiają tylko pliki, które się zmieniły. Nowa wersja pakietu ze 100 plikami, w której zmienił się jeden plik, dodaje więc jeden plik. Projekty dostają twarde dowiązania do magazynu zamiast kopii. Ta sama strona nie podaje żadnych pomiarów, więc czasy instalacji z tabeli powyżej traktuj jako przykład dla jednego motywu, a nie pomiar, który powtórzysz.
# Nowoczesna konfiguracja projektu WordPress
pnpm create vite@latest moj-temat-wordpress
cd moj-temat-wordpress
pnpm installNajnowsze wersje Vite, webpacka i @wordpress/scripts w 2026
Numery wersji w artykułach o narzędziach budowania szybko się starzeją. Oto aktualne wydania według rejestru npm (pole time każdego pakietu) z 15 października 2026:
| Pakiet | Najnowsza wersja | Data publikacji | Obecna wersja główna od |
|---|---|---|---|
| vite | 8.3.4 | 2026-10-08 | 8.0.0, 2026-03-12 |
| webpack | 5.111.1 | 2026-09-18 | 5.0.0, 2020-10-10 |
| @wordpress/scripts | 36.1.0 | 2026-10-07 | 36.0.0, 2026-09-23 |
| pnpm | 12.11.2 | 2026-10-09 | 12.0.0, 2026-08-26 |
| turbo | 2.11.8 | 2026-10-13 | 2.0.0, 2024-06-04 |
| vite-plugin-wordpress | 1.0.4 | 2026-06-09 | pierwsza publikacja 2025-07-29 |
Dwa z tych wydań zmieniają kod w tym artykule. Vite 8 używa Rolldown i Oxc zamiast esbuild i Rollupa: build.rollupOptions jest przestarzałe i nazywa się teraz build.rolldownOptions, obiektowa forma output.manualChunks nie jest już obsługiwana, a forma funkcyjna jest przestarzała na rzecz opcji codeSplitting z Rolldown. Przykłady Vite powyżej używają już nowych nazw. Turbo 2.0 zmieniło nazwę klucza pipeline w turbo.json na tasks. Dokumentacja codemodów Turborepo opisuje tę zmianę jako rename-pipeline, uruchamianą razem z pozostałymi zmianami 2.0 przez npx @turbo/codemod migrate.
webpack 5 jest za to aktualną wersją główną od sześciu lat. @wordpress/scripts zmienia się szybko: wersje główne od 33 do 36 ukazały się między lipcem a wrześniem 2026. Przypnij więc wersję w package.json i przeczytaj changelog, zanim uruchomisz packages-update.
Monorepo WordPress dla agencji z Turbo
Dla agencji zarządzających 50+ stronami WordPress, 2026 to rok Monorepo.
Korzyści z architektury monorepo
- Wspólna biblioteka komponentów: Jedna biblioteka “Komponenty Core” używana we wszystkich stronach klientów
- Spójne narzędzia: Te same narzędzia budowania, linting, testy we wszystkich projektach
- Aktualizacje atomowe: Zaktualizuj wspólny komponent raz, wdroż na wszystkich stronach
- Równoległe budowy: Turbo lub Nx mogą budować/testować wiele projektów jednocześnie
Jak skonfigurować turbo.json dla WordPress
// turbo.json
{
"tasks": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**"]
},
"test": {
"dependsOn": ["build"]
},
"lint": {}
}
}Co monorepo zmienia w codziennej pracy agencji
Co zmienia się w codziennej pracy:
- jedna instalacja i jeden lockfile zamiast osobnych dla każdego projektu
- wspólny kod trafia do paczki, więc poprawka ląduje raz, a nie w każdym repozytorium
- nowa osoba uruchamia te same komendy na każdym projekcie
- podbicie zależności recenzuje się raz, w jednym pull requeście
Narzędzia budowania WordPress w CI/CD
Nowoczesne narzędzia budujące integrują się bezproblemowo z profesjonalnymi usługami rozwoju WordPress:
- Pipeline’y CI/CD: Zautomatyzowane budowy przy każdym commicie
- Jakość kodu: ESLint, Prettier, TypeScript zintegrowane
- Testowanie: Jest, Vitest dla testów jednostkowych
- Wdrożenie: Zautomatyzowane wdrożenie do staging/produkcji
Dla sklepów WooCommerce nowoczesne narzędzia umożliwiają:
- Szybszy rozwój niestandardowych przepływów checkout
- Podgląd w czasie rzeczywistym integracji płatności
- Szybką iterację komponentów wyświetlania produktów
Jak analizować rozmiar bundla i czas budowania w WordPress
Nowoczesne narzędzia budujące oferują wbudowane informację o wydajności:
- Analiza bundla: Identyfikuj duże zależności
- Śledzenie czasu budowania: Monitoruj wydajność budowania w czasie
- Optymalizacja zasobów: Automatyczna minifikacja, tree-shaking
- Generowanie source map: Lepsze debugowanie w produkcji
Te narzędzia pomagają utrzymać szybką wydajność WordPress przez cały cykl życia rozwoju.
Podsumowanie
Narzędzia, których używasz, definiują jakość produktu, który dostarczasz. Poprzez przyjęcie Vite, TypeScript i nowoczesnych łańcuchów budowania w 2026, zapewniasz, że Twój proces rozwoju jest równie szybki i niezawodny jak strony, które budujesz.
Dla profesjonalnych programistów WordPress i agencji, nowoczesne narzędzia nie są opcjonalne - są niezbędne, aby pozostać konkurencyjnym. Zyski produktywności z szybszych buildów, lepszego bezpieczeństwa typów i bezproblemowego HMR sumują się do znacznej wartości biznesowej.
Czy nadal czekasz, aż Webpack się skończy? Czas na aktualizację narzędzi.
Szukasz modernizacji przepływu pracy rozwoju WordPress? Specjalizuję się w niestandardowym rozwoju WordPress z narzędziami z 2026 roku. Mogę pomóc w migracji istniejących projektów do Vite, konfiguracji TypeScript lub budowaniu nowych projektów z nowoczesną architekturą od samego początku.







