Raziščite arhitekturo vtičnikov Vite in se naučite ustvariti vtičnike po meri za izboljšanje vašega razvojnega procesa. Obvladajte bistvene koncepte s praktičnimi primeri.
Demistifikacija arhitekture vtičnikov Vite: Globalni vodnik za ustvarjanje vtičnikov po meri
Vite, bliskovito hitro orodje za gradnjo, je revolucioniral razvoj spletnih aplikacij. Njegova hitrost in preprostost sta v veliki meri posledica njegove zmogljive arhitekture vtičnikov. Ta arhitektura omogoča razvijalcem, da razširijo funkcionalnost Vite in jo prilagodijo svojim specifičnim projektnim potrebam. Ta vodnik ponuja celovito raziskovanje sistema vtičnikov Vite, ki vas opolnomoči za ustvarjanje lastnih vtičnikov po meri in optimizacijo vašega razvojnega procesa.
Razumevanje temeljnih načel Vite
Preden se poglobimo v ustvarjanje vtičnikov, je bistveno razumeti temeljna načela Vite:
- Prevajanje na zahtevo: Vite prevede kodo šele, ko jo zahteva brskalnik, kar znatno zmanjša čas zagona.
- Nativni ESM: Vite za razvoj uporablja nativne ECMAScript module (ESM), kar odpravlja potrebo po združevanju med razvojem.
- Produkcijska gradnja na osnovi Rollupa: Za produkcijske gradnje Vite uporablja Rollup, visoko optimiziran združevalnik, za generiranje učinkovite in za produkcijo pripravljene kode.
Vloga vtičnikov v ekosistemu Vite
Arhitektura vtičnikov Vite je zasnovana tako, da je izjemno razširljiva. Vtičniki lahko:
- Preoblikujejo kodo (npr. prevajanje TypeScripta, dodajanje predprocesorjev).
- Postrežejo datoteke po meri (npr. obravnavanje statičnih sredstev, ustvarjanje virtualnih modulov).
- Spreminjajo postopek gradnje (npr. optimizacija slik, generiranje servisnih delavcev).
- Razširijo Vite CLI (npr. dodajanje ukazov po meri).
Vtičniki so ključni za prilagajanje Vite različnim projektnim zahtevam, od preprostih sprememb do zapletenih integracij.
Arhitektura vtičnikov Vite: Poglobljen pregled
Vtičnik za Vite je v bistvu JavaScript objekt s specifičnimi lastnostmi, ki določajo njegovo obnašanje. Oglejmo si ključne elemente:
Konfiguracija vtičnika
Datoteka `vite.config.js` (ali `vite.config.ts`) je mesto, kjer konfigurirate svoj projekt Vite, vključno z določitvijo vtičnikov, ki jih želite uporabiti. Možnost `plugins` sprejme polje objektov vtičnikov ali funkcij, ki vračajo objekte vtičnikov.
// vite.config.js
import myPlugin from './my-plugin';
export default {
plugins: [
myPlugin(), // Klic funkcije vtičnika za ustvarjanje instance vtičnika
],
};
Lastnosti objekta vtičnika
Objekt vtičnika Vite ima lahko več lastnosti, ki določajo njegovo obnašanje v različnih fazah postopka gradnje. Tukaj je pregled najpogostejših lastnosti:
- name: Edinstveno ime za vtičnik. To je obvezno in pomaga pri odpravljanju napak in reševanju konfliktov. Primer: `'my-custom-plugin'`
- enforce: Določa vrstni red izvajanja vtičnika. Možne vrednosti so `'pre'` (izvede se pred jedrnimi vtičniki), `'normal'` (privzeto) in `'post'` (izvede se za jedrnimi vtičniki). Primer: `'pre'`
- config: Omogoča spreminjanje konfiguracijskega objekta Vite. Prejme uporabniško konfiguracijo in okolje (način in ukaz). Primer: `config: (config, { mode, command }) => { ... }`
- configResolved: Pokliče se, ko je konfiguracija Vite v celoti razrešena. Uporabno za dostop do končnega konfiguracijskega objekta. Primer: `configResolved(config) { ... }`
- configureServer: Omogoča dostop do instance razvojnega strežnika (podobno kot Connect/Express). Uporabno za dodajanje vmesne programske opreme po meri ali spreminjanje obnašanja strežnika. Primer: `configureServer(server) { ... }`
- transformIndexHtml: Omogoča preoblikovanje datoteke `index.html`. Uporabno za vstavljanje skript, stilov ali meta oznak. Primer: `transformIndexHtml(html) { ... }`
- resolveId: Omogoča prestrezanje in spreminjanje razreševanja modulov. Uporabno za logiko razreševanja modulov po meri. Primer: `resolveId(source, importer) { ... }`
- load: Omogoča nalaganje modulov po meri ali spreminjanje obstoječe vsebine modulov. Uporabno za virtualne module ali nalagalnike po meri. Primer: `load(id) { ... }`
- transform: Preoblikuje izvorno kodo modulov. Podobno kot vtičnik za Babel ali PostCSS. Primer: `transform(code, id) { ... }`
- buildStart: Pokliče se na začetku postopka gradnje. Primer: `buildStart() { ... }`
- buildEnd: Pokliče se po končanem postopku gradnje. Primer: `buildEnd() { ... }`
- closeBundle: Pokliče se, ko je sveženj zapisan na disk. Primer: `closeBundle() { ... }`
- writeBundle: Pokliče se pred pisanjem svežnja na disk, kar omogoča spremembe. Primer: `writeBundle(options, bundle) { ... }`
- renderError: Omogoča prikaz strani z napakami po meri med razvojem. Primer: `renderError(error, req, res) { ... }`
- handleHotUpdate: Omogoča natančen nadzor nad HMR. Primer: `handleHotUpdate({ file, server }) { ... }`
Kavlji (hooks) vtičnikov in vrstni red izvajanja
Vtičniki Vite delujejo preko serije kavljev (hooks), ki se sprožijo v različnih fazah postopka gradnje. Razumevanje vrstnega reda, v katerem se ti kavlji izvajajo, je ključnega pomena za pisanje učinkovitih vtičnikov.
- config: Spremeni konfiguracijo Vite.
- configResolved: Dostopi do razrešene konfiguracije.
- configureServer: Spremeni razvojni strežnik (samo med razvojem).
- transformIndexHtml: Preoblikuje datoteko `index.html`.
- buildStart: Začetek postopka gradnje.
- resolveId: Razreši ID-je modulov.
- load: Naloži vsebino modula.
- transform: Preoblikuje kodo modula.
- handleHotUpdate: Obravnava vročo zamenjavo modulov (HMR).
- writeBundle: Spremeni izhodni sveženj pred pisanjem na disk.
- closeBundle: Pokliče se, ko je izhodni sveženj zapisan na disk.
- buildEnd: Konec postopka gradnje.
Ustvarjanje vašega prvega vtičnika Vite po meri
Ustvarimo preprost vtičnik za Vite, ki na vrh vsake JavaScript datoteke v produkcijski gradnji doda pasico. Ta pasica bo vsebovala ime in različico projekta.
Implementacija vtičnika
// 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;
},
};
}
Pojasnilo:
- name: Določa ime vtičnika, 'banner-plugin'.
- apply: Določa, da se ta vtičnik izvaja samo med postopkom gradnje. Nastavitev na 'build' ga naredi samo za produkcijo, s čimer se izognemo nepotrebnim obremenitvam med razvojem.
- transform(code, id):
- To je jedro vtičnika. Prestrezanje kode (`code`) in ID-ja (`id`) vsakega modula.
- Pogojno preverjanje: `if (!id.endsWith('.js'))` zagotavlja, da se preoblikovanje uporabi samo za JavaScript datoteke. To preprečuje obdelavo drugih vrst datotek (kot so CSS ali HTML), kar bi lahko povzročilo napake ali nepričakovano obnašanje.
- Dostop do Package.json:
- `resolve(process.cwd(), 'package.json')` zgradi absolutno pot do datoteke `package.json`. `process.cwd()` vrne trenutni delovni direktorij, kar zagotavlja pravilno pot ne glede na to, kje se ukaz izvaja.
- `JSON.parse(readFileSync(packageJsonPath, 'utf-8'))` prebere in razčleni datoteko `package.json`. `readFileSync` bere datoteko sinhrono, `'utf-8'` pa določa kodiranje za pravilno obravnavo Unicode znakov. Sinhrono branje je tukaj sprejemljivo, saj se zgodi enkrat na začetku transformacije.
- Generiranje pasice:
- ``const banner = `/**\n * Project: ${packageJson.name}\n * Version: ${packageJson.version}\n */\n`;`` ustvari niz pasice. Uporablja predloge (template literals - z nazaj obrnjenimi narekovaji) za enostavno vstavljanje imena in različice projekta iz datoteke `package.json`. Sekvence `\n` vstavijo nove vrstice za pravilno oblikovanje pasice. `*` je ubežan z `\*`.
- Preoblikovanje kode: `return banner + code;` doda pasico na začetek originalne JavaScript kode. To je končni rezultat, ki ga vrne funkcija transform.
Integracija vtičnika
Uvozite vtičnik v vašo datoteko `vite.config.js` in ga dodajte v polje `plugins`:
// vite.config.js
import bannerPlugin from './banner-plugin';
export default {
plugins: [
bannerPlugin(),
],
};
Zagon gradnje
Zdaj zaženite `npm run build` (ali ukaz za gradnjo vašega projekta). Po končani gradnji preglejte generirane JavaScript datoteke v direktoriju `dist`. Na vrhu vsake datoteke boste videli pasico.
Napredne tehnike vtičnikov
Poleg preprostih preoblikovanj kode lahko vtičniki Vite uporabljajo naprednejše tehnike za izboljšanje svojih zmožnosti.
Virtualni moduli
Virtualni moduli omogočajo vtičnikom ustvarjanje modulov, ki ne obstajajo kot dejanske datoteke na disku. To je uporabno za generiranje dinamične vsebine ali zagotavljanje konfiguracijskih podatkov aplikaciji.
// virtual-module-plugin.js
export default function virtualModulePlugin(options) {
const virtualModuleId = 'virtual:my-module';
const resolvedVirtualModuleId = '\0' + virtualModuleId; // Predpona z \0 prepreči, da bi Rollup to obdelal
return {
name: 'virtual-module-plugin',
resolveId(id) {
if (id === virtualModuleId) {
return resolvedVirtualModuleId;
}
},
load(id) {
if (id === resolvedVirtualModuleId) {
return `export default ${JSON.stringify(options)};`;
}
},
};
}
V tem primeru:
- `virtualModuleId` je niz, ki predstavlja identifikator virtualnega modula.
- `resolvedVirtualModuleId` ima predpono `\0`, da prepreči, da bi ga Rollup obdelal kot pravo datoteko. To je konvencija, ki se uporablja v vtičnikih za Rollup.
- `resolveId` prestreže razreševanje modulov in vrne razrešen ID virtualnega modula, če se zahtevani ID ujema z `virtualModuleId`.
- `load` prestreže nalaganje modulov in vrne kodo modula, če se zahtevani ID ujema z `resolvedVirtualModuleId`. V tem primeru generira JavaScript modul, ki izvozi `options` kot privzeti izvoz.
Uporaba virtualnega modula
// vite.config.js
import virtualModulePlugin from './virtual-module-plugin';
export default {
plugins: [
virtualModulePlugin({ message: 'Pozdrav iz virtualnega modula!' }),
],
};
// main.js
import message from 'virtual:my-module';
console.log(message.message); // Izhod: Pozdrav iz virtualnega modula!
Preoblikovanje Index HTML
Kavelj `transformIndexHtml` vam omogoča spreminjanje datoteke `index.html`, na primer za vstavljanje skript, stilov ali meta oznak. To je uporabno za dodajanje sledenja analitike, konfiguriranje metapodatkov za socialna omrežja ali prilagajanje strukture HTML.
// inject-script-plugin.js
export default function injectScriptPlugin() {
return {
name: 'inject-script-plugin',
transformIndexHtml(html) {
return html.replace(
'