Avastage Vite'i pluginate arhitektuuri ja õppige looma kohandatud pluginaid oma arendusprotsessi täiustamiseks. Omandage põhimõisted praktiliste näidetega.
Vite'i pluginate arhitektuuri lahtiseletamine: Globaalne juhend kohandatud pluginate loomiseks
Vite, välkkiire ehitustööriist, on revolutsiooniliselt muutnud front-end arendust. Selle kiirus ja lihtsus tulenevad suuresti selle võimsast pluginate arhitektuurist. See arhitektuur võimaldab arendajatel laiendada Vite'i funktsionaalsust ja kohandada seda vastavalt oma konkreetsetele projekti vajadustele. See juhend pakub põhjalikku ülevaadet Vite'i pluginate süsteemist, andes teile võimaluse luua oma kohandatud pluginaid ja optimeerida oma arendusprotsessi.
Vite'i põhiprintsiipide mõistmine
Enne pluginate loomisesse sukeldumist on oluline mõista Vite'i aluspõhimõtteid:
- Nõudepõhine kompileerimine: Vite kompileerib koodi ainult siis, kui brauser seda nõuab, vähendades oluliselt käivitusaega.
- Natiivne ESM: Vite kasutab arenduses natiivseid ECMAScript mooduleid (ESM), mis välistab vajaduse arenduse ajal koodi kokku pakkida (bundling).
- Rollupil põhinev produktsiooni ehitus: Produktsiooni ehituste jaoks kasutab Vite Rollupi, kõrgelt optimeeritud pakkijat, et genereerida tõhusat ja produktsioonivalmis koodi.
Pluginate roll Vite'i ökosüsteemis
Vite'i pluginate arhitektuur on loodud olema väga laiendatav. Pluginad saavad:
- Teisendada koodi (nt TypeScripti transpileerimine, eeltöötlejate lisamine).
- Pakkuda kohandatud faile (nt staatiliste varade käsitlemine, virtuaalsete moodulite loomine).
- Muuta ehitusprotsessi (nt piltide optimeerimine, service worker'ite genereerimine).
- Laiendada Vite'i CLI-d (nt kohandatud käskude lisamine).
Pluginad on võti Vite'i kohandamiseks erinevatele projektinõuetele, alates lihtsatest muudatustest kuni keerukate integratsioonideni.
Vite'i pluginate arhitektuur: Süvaanalüüs
Vite'i plugin on sisuliselt JavaScripti objekt spetsiifiliste omadustega, mis määravad selle käitumise. Vaatleme peamisi elemente:
Plugina seadistamine
Fail vite.config.js
(või vite.config.ts
) on koht, kus seadistate oma Vite'i projekti, sealhulgas määrate, milliseid pluginaid kasutada. Valik plugins
aktsepteerib pluginate objektide massiivi või funktsioone, mis tagastavad pluginate objekte.
// vite.config.js
import myPlugin from './my-plugin';
export default {
plugins: [
myPlugin(), // Invoke the plugin function to create a plugin instance
],
};
Plugina objekti omadused
Vite'i plugina objektil võib olla mitu omadust, mis määravad selle käitumise ehitusprotsessi erinevates faasides. Siin on ülevaade kõige levinumatest omadustest:
- name: Unikaalne nimi pluginale. See on kohustuslik ja aitab silumisel ja konfliktide lahendamisel. Näide: `'my-custom-plugin'`
- enforce: Määrab plugina täitmise järjekorra. Võimalikud väärtused on `'pre'` (käivitatakse enne tuumpluginaid), `'normal'` (vaikimisi) ja `'post'` (käivitatakse pärast tuumpluginaid). Näide: `'pre'`
- config: Võimaldab muuta Vite'i konfiguratsiooniobjekti. See saab kasutaja konfiguratsiooni ja keskkonna (mode ja command). Näide: `config: (config, { mode, command }) => { ... }`
- configResolved: Kutsutakse välja pärast seda, kui Vite'i konfiguratsioon on täielikult lahendatud. Kasulik lõpliku konfiguratsiooniobjekti kättesaamiseks. Näide: `configResolved(config) { ... }`
- configureServer: Annab juurdepääsu arendusserveri instantsile (Connect/Express-sarnane). Kasulik kohandatud vahevara lisamiseks või serveri käitumise muutmiseks. Näide: `configureServer(server) { ... }`
- transformIndexHtml: Võimaldab teisendada faili `index.html`. Kasulik skriptide, stiilide või meta-tagide sisestamiseks. Näide: `transformIndexHtml(html) { ... }`
- resolveId: Võimaldab pealt kuulata ja muuta moodulite lahendamist. Kasulik kohandatud moodulite lahendamise loogika jaoks. Näide: `resolveId(source, importer) { ... }`
- load: Võimaldab laadida kohandatud mooduleid või muuta olemasolevate moodulite sisu. Kasulik virtuaalsete moodulite või kohandatud laadijate jaoks. Näide: `load(id) { ... }`
- transform: Teisendab moodulite lähtekoodi. Sarnane Babeli plugina või PostCSS-i pluginaga. Näide: `transform(code, id) { ... }`
- buildStart: Kutsutakse välja ehitusprotsessi alguses. Näide: `buildStart() { ... }`
- buildEnd: Kutsutakse välja pärast ehitusprotsessi lõppu. Näide: `buildEnd() { ... }`
- closeBundle: Kutsutakse välja pärast seda, kui bundle on kettale kirjutatud. Näide: `closeBundle() { ... }`
- writeBundle: Kutsutakse välja enne bundle'i kettale kirjutamist, võimaldades muutmist. Näide: `writeBundle(options, bundle) { ... }`
- renderError: Võimaldab arenduse ajal kuvada kohandatud vealehti. Näide: `renderError(error, req, res) { ... }`
- handleHotUpdate: Võimaldab HMR-i peenelt kontrollida. Näide: `handleHotUpdate({ file, server }) { ... }`
Pluginate "haagid" (hooks) ja täitmise järjekord
Vite'i pluginad töötavad läbi "haakide" (hooks) seeria, mis käivitatakse ehitusprotsessi erinevates etappides. Nende haakide täitmise järjekorra mõistmine on tõhusate pluginate kirjutamiseks ülioluline.
- config: Muuda Vite'i konfiguratsiooni.
- configResolved: Pääse ligi lahendatud konfiguratsioonile.
- configureServer: Muuda arendusserverit (ainult arenduses).
- transformIndexHtml: Teisenda fail `index.html`.
- buildStart: Ehitusprotsessi algus.
- resolveId: Lahenda moodulite ID-d.
- load: Laadi mooduli sisu.
- transform: Teisenda mooduli kood.
- handleHotUpdate: Halda kiiret moodulivahetust (HMR).
- writeBundle: Muuda väljund-bundle'it enne kettale kirjutamist.
- closeBundle: Kutsutakse välja pärast väljund-bundle'i kettale kirjutamist.
- buildEnd: Ehitusprotsessi lõpp.
Oma esimese kohandatud Vite'i plugina loomine
Loome lihtsa Vite'i plugina, mis lisab produktsiooni ehituses iga JavaScripti faili algusesse bänneri. See bänner sisaldab projekti nime ja versiooni.
Plugina implementatsioon
// 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;
},
};
}
Selgitus:
- name: Määrab plugina nime, 'banner-plugin'.
- apply: Määrab, et see plugin peaks käivituma ainult ehitusprotsessi ajal. Selle väärtuseks 'build' seadmine muudab selle ainult produktsiooni jaoks mõeldud pluginaks, vältides tarbetut koormust arenduse ajal.
- transform(code, id):
- See on plugina tuum. See püüab kinni iga mooduli koodi (`code`) ja ID (`id`).
- Tingimuslik kontroll: `if (!id.endsWith('.js'))` tagab, et teisendus rakendub ainult JavaScripti failidele. See hoiab ära teiste failitüüpide (nagu CSS või HTML) töötlemise, mis võiks põhjustada vigu või ootamatut käitumist.
- Juurdepääs failile package.json:
- `resolve(process.cwd(), 'package.json')` konstrueerib absoluutse tee failini `package.json`. `process.cwd()` tagastab praeguse töökataloogi, tagades õige tee kasutamise olenemata sellest, kust käsk käivitatakse.
- `JSON.parse(readFileSync(packageJsonPath, 'utf-8'))` loeb ja parssib faili `package.json`. `readFileSync` loeb faili sünkroonselt ja `'utf-8'` määrab kodeeringu Unicode'i märkide korrektseks käsitlemiseks. Sünkroonne lugemine on siin vastuvõetav, kuna see toimub teisenduse alguses üks kord.
- Bänneri genereerimine:
- ``const banner = `/**\n * Project: ${packageJson.name}\n * Version: ${packageJson.version}\n */\n`;`` loob bänneri stringi. See kasutab mall-literaale (tagurpidi ülakomasid), et hõlpsasti lisada projekti nimi ja versioon failist `package.json`. `\n` järjestused lisavad reavahetusi bänneri korrektseks vormindamiseks.
- Koodi teisendamine: `return banner + code;` lisab bänneri algse JavaScripti koodi ette. See on transform-funktsiooni poolt tagastatav lõpptulemus.
Plugina integreerimine
Importige plugin oma vite.config.js
faili ja lisage see plugins
massiivi:
// vite.config.js
import bannerPlugin from './banner-plugin';
export default {
plugins: [
bannerPlugin(),
],
};
Ehituse käivitamine
Nüüd käivitage `npm run build` (või oma projekti ehituskäsk). Pärast ehituse lõppu kontrollige genereeritud JavaScripti faile `dist` kaustas. Näete bännerit iga faili ülaosas.
Täiustatud pluginate tehnikad
Lisaks lihtsatele koodi teisendustele saavad Vite'i pluginad kasutada oma võimekuse suurendamiseks täiustatud tehnikaid.
Virtuaalsed moodulid
Virtuaalsed moodulid võimaldavad pluginatel luua mooduleid, mida tegelikult failidena kettal ei eksisteeri. See on kasulik dünaamilise sisu genereerimiseks või konfiguratsiooniandmete pakkumiseks rakendusele.
// virtual-module-plugin.js
export default function virtualModulePlugin(options) {
const virtualModuleId = 'virtual:my-module';
const resolvedVirtualModuleId = '\0' + virtualModuleId; // Prefix with \0 to prevent Rollup from processing
return {
name: 'virtual-module-plugin',
resolveId(id) {
if (id === virtualModuleId) {
return resolvedVirtualModuleId;
}
},
load(id) {
if (id === resolvedVirtualModuleId) {
return `export default ${JSON.stringify(options)};`;
}
},
};
}
Selles näites:
- `virtualModuleId` on string, mis esindab virtuaalse mooduli identifikaatorit.
- `resolvedVirtualModuleId` on eesliitega `\0`, et takistada Rollupil seda reaalse failina töötlemast. See on Rollupi pluginates kasutatav konventsioon.
- `resolveId` püüab kinni mooduli lahendamise ja tagastab lahendatud virtuaalse mooduli ID, kui nõutud ID vastab `virtualModuleId`-le.
- `load` püüab kinni mooduli laadimise ja tagastab mooduli koodi, kui nõutud ID vastab `resolvedVirtualModuleId`-le. Sel juhul genereerib see JavaScripti mooduli, mis ekspordib `options` vaikeekspordina.
Virtuaalse mooduli kasutamine
// 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); // Output: Hello from virtual module!
Index HTML-i teisendamine
transformIndexHtml
haak võimaldab teil muuta index.html
faili, näiteks sisestades skripte, stiile või meta-täge. See on kasulik analüütika jälgimise lisamiseks, sotsiaalmeedia metaandmete seadistamiseks või HTML-struktuuri kohandamiseks.
// inject-script-plugin.js
export default function injectScriptPlugin() {
return {
name: 'inject-script-plugin',
transformIndexHtml(html) {
return html.replace(
'