Istražite arhitekturu Vite dodataka i naučite kako izraditi prilagođene dodatke za poboljšanje vašeg razvojnog procesa. Savladajte ključne koncepte uz praktične primjere za globalnu publiku.
Demistificiranje arhitekture Vite dodataka: Globalni vodič za izradu prilagođenih dodataka
Vite, munjevito brzi alat za izgradnju, revolucionirao je frontend razvoj. Njegova brzina i jednostavnost uvelike su posljedica moćne arhitekture dodataka. Ova arhitektura omogućuje programerima da prošire funkcionalnost Vitea i prilagode ga specifičnim potrebama projekta. Ovaj vodič pruža sveobuhvatno istraživanje sustava dodataka Vitea, osnažujući vas da stvorite vlastite prilagođene dodatke i optimizirate svoj razvojni proces.
Razumijevanje temeljnih principa Vitea
Prije nego što zaronimo u izradu dodataka, ključno je shvatiti temeljne principe Vitea:
- Kompilacija na zahtjev: Vite kompilira kod samo kada ga preglednik zatraži, značajno smanjujući vrijeme pokretanja.
- Nativni ESM: Vite koristi nativne ECMAScript module (ESM) za razvoj, eliminirajući potrebu za povezivanjem (bundling) tijekom razvoja.
- Produkcijska izgradnja temeljena na Rollupu: Za produkcijske izgradnje, Vite koristi Rollup, visoko optimizirani povezivač (bundler), za generiranje učinkovitog koda spremnog za produkciju.
Uloga dodataka u Vite ekosustavu
Arhitektura dodataka Vitea dizajnirana je da bude izrazito proširiva. Dodaci mogu:
- Transformirati kod (npr. transpiliranje TypeScripta, dodavanje predprocesora).
- Posluživati prilagođene datoteke (npr. rukovanje statičkim resursima, stvaranje virtualnih modula).
- Mijenjati proces izgradnje (npr. optimizacija slika, generiranje service workera).
- Proširiti Viteov CLI (npr. dodavanje prilagođenih naredbi).
Dodaci su ključ prilagodbe Vitea različitim zahtjevima projekta, od jednostavnih modifikacija do složenih integracija.
Arhitektura Vite dodataka: Dubinski pregled
Vite dodatak je u suštini JavaScript objekt sa specifičnim svojstvima koja definiraju njegovo ponašanje. Pogledajmo ključne elemente:
Konfiguracija dodatka
Datoteka `vite.config.js` (ili `vite.config.ts`) je mjesto gdje konfigurirate svoj Vite projekt, uključujući navođenje dodataka koje želite koristiti. Opcija `plugins` prihvaća niz objekata dodataka ili funkcija koje vraćaju objekte dodataka.
// vite.config.js
import myPlugin from './my-plugin';
export default {
plugins: [
myPlugin(), // Pozovite funkciju dodatka kako biste stvorili instancu dodatka
],
};
Svojstva objekta dodatka
Objekt Vite dodatka može imati nekoliko svojstava koja definiraju njegovo ponašanje tijekom različitih faza procesa izgradnje. Ovdje je pregled najčešćih svojstava:
- name: Jedinstveno ime za dodatak. Obavezno je i pomaže pri otklanjanju pogrešaka i rješavanju sukoba. Primjer: `'my-custom-plugin'`
- enforce: Određuje redoslijed izvršavanja dodatka. Moguće vrijednosti su `'pre'` (izvršava se prije osnovnih dodataka), `'normal'` (zadano) i `'post'` (izvršava se nakon osnovnih dodataka). Primjer: `'pre'`
- config: Omogućuje izmjenu Viteovog konfiguracijskog objekta. Prima korisničku konfiguraciju i okruženje (način rada i naredbu). Primjer: `config: (config, { mode, command }) => { ... }`
- configResolved: Poziva se nakon što je Vite konfiguracija u potpunosti riješena. Korisno za pristup konačnom konfiguracijskom objektu. Primjer: `configResolved(config) { ... }`
- configureServer: Pruža pristup instanci razvojnog poslužitelja (slično Connect/Express). Korisno za dodavanje prilagođenog middlewarea ili mijenjanje ponašanja poslužitelja. Primjer: `configureServer(server) { ... }`
- transformIndexHtml: Omogućuje transformaciju datoteke `index.html`. Korisno za umetanje skripti, stilova ili meta tagova. Primjer: `transformIndexHtml(html) { ... }`
- resolveId: Omogućuje presretanje i izmjenu razrješavanja modula. Korisno za prilagođenu logiku razrješavanja modula. Primjer: `resolveId(source, importer) { ... }`
- load: Omogućuje učitavanje prilagođenih modula ili izmjenu postojećeg sadržaja modula. Korisno za virtualne module ili prilagođene učitavače. Primjer: `load(id) { ... }`
- transform: Transformira izvorni kod modula. Slično Babel dodatku ili PostCSS dodatku. Primjer: `transform(code, id) { ... }`
- buildStart: Poziva se na početku procesa izgradnje. Primjer: `buildStart() { ... }`
- buildEnd: Poziva se nakon završetka procesa izgradnje. Primjer: `buildEnd() { ... }`
- closeBundle: Poziva se nakon što je paket zapisan на disk. Primjer: `closeBundle() { ... }`
- writeBundle: Poziva se prije pisanja paketa na disk, omogućujući izmjenu. Primjer: `writeBundle(options, bundle) { ... }`
- renderError: Omogućuje prikaz prilagođenih stranica s greškama tijekom razvoja. Primjer: `renderError(error, req, res) { ... }`
- handleHotUpdate: Omogućuje finu kontrolu nad HMR-om. Primjer: `handleHotUpdate({ file, server }) { ... }`
Okidači (Hooks) i redoslijed izvršavanja
Vite dodaci djeluju kroz niz okidača (hooks) koji se aktiviraju u različitim fazama procesa izgradnje. Razumijevanje redoslijeda izvršavanja ovih okidača ključno je za pisanje učinkovitih dodataka.
- config: Izmijenite Vite konfiguraciju.
- configResolved: Pristupite razriješenoj konfiguraciji.
- configureServer: Izmijenite razvojni poslužitelj (samo u razvoju).
- transformIndexHtml: Transformirajte datoteku `index.html`.
- buildStart: Početak procesa izgradnje.
- resolveId: Razriješite ID-jeve modula.
- load: Učitajte sadržaj modula.
- transform: Transformirajte kod modula.
- handleHotUpdate: Obradite Hot Module Replacement (HMR).
- writeBundle: Izmijenite izlazni paket prije pisanja na disk.
- closeBundle: Poziva se nakon što je izlazni paket zapisan na disk.
- buildEnd: Kraj procesa izgradnje.
Izrada vašeg prvog prilagođenog Vite dodatka
Napravimo jednostavan Vite dodatak koji dodaje banner na vrh svake JavaScript datoteke u produkcijskoj izgradnji. Ovaj banner će uključivati ime i verziju projekta.
Implementacija dodatka
// banner-plugin.js
import { readFileSync } from 'node:fs';
import { resolve } from 'node:path';
export default function bannerPlugin() {
return {
name: 'banner-plugin',
apply: 'build',
transform(code, id) {
if (!id.endsWith('.js')) {
return code;
}
const packageJsonPath = resolve(process.cwd(), 'package.json');
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
const banner = `/**\n * Project: ${packageJson.name}\n * Version: ${packageJson.version}\n */\n`;
return banner + code;
},
};
}
Objašnjenje:
- name: Definira ime dodatka, 'banner-plugin'.
- apply: Određuje da se ovaj dodatak treba izvršiti samo tijekom procesa izgradnje. Postavljanje ovoga na 'build' čini ga isključivo za produkciju, izbjegavajući nepotrebno opterećenje tijekom razvoja.
- transform(code, id):
- Ovo je srž dodatka. Presreće kod (`code`) i ID (`id`) svakog modula.
- Uvjetna provjera: `if (!id.endsWith('.js'))` osigurava da se transformacija primjenjuje samo na JavaScript datoteke. To sprječava obradu drugih vrsta datoteka (poput CSS-a ili HTML-a), što bi moglo uzrokovati pogreške ili neočekivano ponašanje.
- Pristup package.json:
- `resolve(process.cwd(), 'package.json')` konstruira apsolutnu putanju do datoteke `package.json`. `process.cwd()` vraća trenutni radni direktorij, osiguravajući da se koristi ispravna putanja bez obzira na to odakle se naredba izvršava.
- `JSON.parse(readFileSync(packageJsonPath, 'utf-8'))` čita i parsira datoteku `package.json`. `readFileSync` čita datoteku sinkrono, a `'utf-8'` specificira kodiranje za ispravno rukovanje Unicode znakovima. Sinkrono čitanje je prihvatljivo ovdje jer se događa jednom na početku transformacije.
- Generiranje bannera:
- ``const banner = `/**\n * Project: ${packageJson.name}\n * Version: ${packageJson.version}\n */\n`;`` stvara string bannera. Koristi template literale (backticks) za jednostavno ugrađivanje imena i verzije projekta iz datoteke `package.json`. Sekvence `\n` umeću nove redove kako bi se banner ispravno formatirao. Znak `*` je eskepiran s `\*`.
- Transformacija koda: `return banner + code;` dodaje banner ispred originalnog JavaScript koda. Ovo je konačni rezultat koji vraća funkcija transform.
Integracija dodatka
Uvezite dodatak u svoju datoteku `vite.config.js` i dodajte ga u niz `plugins`:
// vite.config.js
import bannerPlugin from './banner-plugin';
export default {
plugins: [
bannerPlugin(),
],
};
Pokretanje izgradnje
Sada pokrenite `npm run build` (ili naredbu za izgradnju vašeg projekta). Nakon što je izgradnja završena, pregledajte generirane JavaScript datoteke u direktoriju `dist`. Vidjet ćete banner na vrhu svake datoteke.
Napredne tehnike dodataka
Osim jednostavnih transformacija koda, Vite dodaci mogu koristiti naprednije tehnike za poboljšanje svojih mogućnosti.
Virtualni moduli
Virtualni moduli omogućuju dodacima stvaranje modula koji ne postoje kao stvarne datoteke na disku. To je korisno za generiranje dinamičkog sadržaja ili pružanje konfiguracijskih podataka aplikaciji.
// virtual-module-plugin.js
export default function virtualModulePlugin(options) {
const virtualModuleId = 'virtual:my-module';
const resolvedVirtualModuleId = '\0' + virtualModuleId; // Prefiks \0 sprječava Rollup da ga obrađuje kao stvarnu datoteku
return {
name: 'virtual-module-plugin',
resolveId(id) {
if (id === virtualModuleId) {
return resolvedVirtualModuleId;
}
},
load(id) {
if (id === resolvedVirtualModuleId) {
return `export default ${JSON.stringify(options)};`;
}
},
};
}
U ovom primjeru:
- `virtualModuleId` je string koji predstavlja identifikator virtualnog modula.
- `resolvedVirtualModuleId` ima prefiks `\0` kako bi se spriječilo da ga Rollup obrađuje kao stvarnu datoteku. Ovo je konvencija koja se koristi u Rollup dodacima.
- `resolveId` presreće razrješavanje modula i vraća razriješeni ID virtualnog modula ako traženi ID odgovara `virtualModuleId`.
- `load` presreće učitavanje modula i vraća kod modula ako traženi ID odgovara `resolvedVirtualModuleId`. U ovom slučaju, generira JavaScript modul koji izvozi `options` kao zadani izvoz.
Korištenje virtualnog modula
// vite.config.js
import virtualModulePlugin from './virtual-module-plugin';
export default {
plugins: [
virtualModulePlugin({ message: 'Hello from virtual module!' }),
],
};
// main.js
import message from 'virtual:my-module';
console.log(message.message); // Ispis: Hello from virtual module!
Transformacija Index HTML-a
Okidač `transformIndexHtml` omogućuje vam izmjenu datoteke `index.html`, kao što je umetanje skripti, stilova ili meta tagova. To je korisno za dodavanje praćenja analitike, konfiguriranje metapodataka za društvene mreže ili prilagođavanje HTML strukture.
// inject-script-plugin.js
export default function injectScriptPlugin() {
return {
name: 'inject-script-plugin',
transformIndexHtml(html) {
return html.replace(
'