Išnagrinėkite Vite įskiepių architektūrą ir išmokite kurti individualius įskiepius, kad pagerintumėte savo kūrimo procesą. Įsisavinkite esmines koncepcijas su praktiniais pavyzdžiais.
Vite įskiepių architektūros demistifikavimas: globalus vadovas, kaip kurti individualius įskiepius
Vite, žaibiškai greitas kūrimo įrankis, sukėlė revoliuciją frontend kūrime. Jo greitis ir paprastumas daugiausia priklauso nuo galingos įskiepių architektūros. Ši architektūra leidžia kūrėjams išplėsti Vite funkcionalumą ir pritaikyti jį prie savo specifinių projekto poreikių. Šis vadovas pateikia išsamią Vite įskiepių sistemos apžvalgą, suteikiančią jums galimybę kurti savo individualius įskiepius ir optimizuoti kūrimo eigą.
Vite pagrindinių principų supratimas
Prieš pradedant kurti įskiepius, būtina suprasti Vite pagrindinius principus:
- Kompiliavimas pagal pareikalavimą: Vite kompiliuoja kodą tik tada, kai jo paprašo naršyklė, taip žymiai sutrumpinant paleidimo laiką.
- Gimtieji ESM: Vite kūrimo metu naudoja gimtuosius ECMAScript modulius (ESM), todėl nereikia grupuoti (bundling) kodo kūrimo etape.
- „Rollup“ pagrįstas produkcijos kūrimas: Produkcijos versijoms Vite naudoja „Rollup“, itin optimizuotą grupuotoją, efektyviam ir produkcijai paruoštam kodui generuoti.
Įskiepių vaidmuo Vite ekosistemoje
Vite įskiepių architektūra sukurta taip, kad būtų itin išplečiama. Įskiepiai gali:
- Transformuoti kodą (pvz., transpiliuoti TypeScript, pridėti pirminius apdorojimo įrankius).
- Pateikti individualius failus (pvz., tvarkyti statinius išteklius, kurti virtualius modulius).
- Keisti kūrimo procesą (pvz., optimizuoti paveikslėlius, generuoti „service workers“).
- Išplėsti Vite CLI (pvz., pridėti individualias komandas).
Įskiepiai yra raktas į Vite pritaikymą įvairiems projekto reikalavimams, nuo paprastų modifikacijų iki sudėtingų integracijų.
Vite įskiepių architektūra: išsami apžvalga
Vite įskiepis iš esmės yra JavaScript objektas su specifinėmis savybėmis, kurios apibrėžia jo elgseną. Panagrinėkime pagrindinius elementus:
Įskiepio konfigūracija
`vite.config.js` (arba `vite.config.ts`) faile konfigūruojate savo Vite projektą, įskaitant nurodymą, kuriuos įskiepius naudoti. `plugins` parinktis priima įskiepių objektų masyvą arba funkcijas, kurios grąžina įskiepių objektus.
// vite.config.js
import myPlugin from './my-plugin';
export default {
plugins: [
myPlugin(), // Invoke the plugin function to create a plugin instance
],
};
Įskiepio objekto savybės
Vite įskiepio objektas gali turėti keletą savybių, kurios apibrėžia jo elgseną skirtinguose kūrimo proceso etapuose. Štai dažniausiai pasitaikančių savybių apžvalga:
- name: Unikalus įskiepio pavadinimas. Tai yra privaloma ir padeda derinti bei spręsti konfliktus. Pavyzdys: `'my-custom-plugin'`
- enforce: Nustato įskiepio vykdymo tvarką. Galimos reikšmės yra `'pre'` (vykdoma prieš pagrindinius įskiepius), `'normal'` (numatytoji) ir `'post'` (vykdoma po pagrindinių įskiepių). Pavyzdys: `'pre'`
- config: Leidžia modifikuoti Vite konfigūracijos objektą. Gauna vartotojo konfigūraciją ir aplinką (režimą ir komandą). Pavyzdys: `config: (config, { mode, command }) => { ... }`
- configResolved: Iškviečiama po to, kai Vite konfigūracija yra pilnai išspręsta. Naudinga norint pasiekti galutinį konfigūracijos objektą. Pavyzdys: `configResolved(config) { ... }`
- configureServer: Suteikia prieigą prie kūrimo serverio egzemplioriaus (panašaus į Connect/Express). Naudinga pridedant individualią tarpinę programinę įrangą (middleware) ar keičiant serverio elgseną. Pavyzdys: `configureServer(server) { ... }`
- transformIndexHtml: Leidžia transformuoti `index.html` failą. Naudinga įterpiant scenarijus, stilius ar meta žymes. Pavyzdys: `transformIndexHtml(html) { ... }`
- resolveId: Leidžia perimti ir modifikuoti modulių sprendimą. Naudinga individualiai modulių sprendimo logikai. Pavyzdys: `resolveId(source, importer) { ... }`
- load: Leidžia įkelti individualius modulius arba modifikuoti esamų modulių turinį. Naudinga virtualiems moduliams ar individualiems įkėlėjams. Pavyzdys: `load(id) { ... }`
- transform: Transformuoja modulių šaltinio kodą. Panašu į Babel įskiepį ar PostCSS įskiepį. Pavyzdys: `transform(code, id) { ... }`
- buildStart: Iškviečiama kūrimo proceso pradžioje. Pavyzdys: `buildStart() { ... }`
- buildEnd: Iškviečiama pasibaigus kūrimo procesui. Pavyzdys: `buildEnd() { ... }`
- closeBundle: Iškviečiama po to, kai paketas (bundle) įrašomas į diską. Pavyzdys: `closeBundle() { ... }`
- writeBundle: Iškviečiama prieš įrašant paketą į diską, leidžiant jį modifikuoti. Pavyzdys: `writeBundle(options, bundle) { ... }`
- renderError: Leidžia pateikti individualius klaidų puslapius kūrimo metu. Pavyzdys: `renderError(error, req, res) { ... }`
- handleHotUpdate: Leidžia smulkmeniškai valdyti HMR. Pavyzdys: `handleHotUpdate({ file, server }) { ... }`
Įskiepių „kabliai“ (hooks) ir vykdymo tvarka
Vite įskiepiai veikia per eilę „kablių“ (hooks), kurie suaktyvinami skirtinguose kūrimo proceso etapuose. Suprasti, kokia tvarka šie „kabliai“ vykdomi, yra labai svarbu norint rašyti efektyvius įskiepius.
- config: Modifikuoti Vite konfigūraciją.
- configResolved: Pasiekti išspręstą konfigūraciją.
- configureServer: Modifikuoti kūrimo serverį (tik kūrimo metu).
- transformIndexHtml: Transformuoti `index.html` failą.
- buildStart: Kūrimo proceso pradžia.
- resolveId: Išspręsti modulių ID.
- load: Įkelti modulio turinį.
- transform: Transformuoti modulio kodą.
- handleHotUpdate: Apdoroti karštąjį modulių pakeitimą (HMR).
- writeBundle: Modifikuoti išvesties paketą prieš įrašant į diską.
- closeBundle: Iškviečiama po to, kai išvesties paketas buvo įrašytas į diską.
- buildEnd: Kūrimo proceso pabaiga.
Pirmojo individualaus Vite įskiepio kūrimas
Sukurkime paprastą Vite įskiepį, kuris prideda antraštę (banner) į kiekvieno JavaScript failo viršų produkcijos versijoje. Šioje antraštėje bus projekto pavadinimas ir versija.
Įskiepio įgyvendinimas
// 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;
},
};
}
Paaiškinimas:
- name: Apibrėžia įskiepio pavadinimą, 'banner-plugin'.
- apply: Nurodo, kad šis įskiepis turėtų veikti tik kūrimo proceso metu. Nustačius reikšmę 'build', jis veiks tik produkcijoje, išvengiant nereikalingos apkrovos kūrimo metu.
- transform(code, id):
- Tai yra įskiepio branduolys. Jis perima kiekvieno modulio kodą (`code`) ir ID (`id`).
- Sąlyginis patikrinimas: `if (!id.endsWith('.js'))` užtikrina, kad transformacija būtų taikoma tik JavaScript failams. Tai apsaugo nuo kitų failų tipų (pvz., CSS ar HTML) apdorojimo, kuris galėtų sukelti klaidų ar netikėtą elgseną.
- Prieiga prie Package.json:
- `resolve(process.cwd(), 'package.json')` sukonstruoja absoliutų kelią iki `package.json` failo. `process.cwd()` grąžina dabartinį darbo katalogą, užtikrindamas, kad būtų naudojamas teisingas kelias, nepriklausomai nuo to, kur vykdoma komanda.
- `JSON.parse(readFileSync(packageJsonPath, 'utf-8'))` nuskaito ir išanalizuoja `package.json` failą. `readFileSync` nuskaito failą sinchroniškai, o `'utf-8'` nurodo kodavimą, kad būtų teisingai apdorojami Unicode simboliai. Sinchroninis skaitymas čia priimtinas, nes jis įvyksta vieną kartą transformacijos pradžioje.
- Antraštės generavimas:
- ``const banner = `/**\n * Project: ${packageJson.name}\n * Version: ${packageJson.version}\n */\n`;`` sukuria antraštės eilutę. Ji naudoja šablonines literales (atvirkštinius apostrofus), kad būtų lengva įterpti projekto pavadinimą ir versiją iš `package.json` failo. `\n` sekos įterpia naujas eilutes, kad antraštė būtų tinkamai suformatuota.
- Kodo transformavimas: `return banner + code;` prideda antraštę prie originalaus JavaScript kodo pradžios. Tai yra galutinis rezultatas, kurį grąžina transformavimo funkcija.
Įskiepio integravimas
Importuokite įskiepį į savo `vite.config.js` failą ir pridėkite jį į `plugins` masyvą:
// vite.config.js
import bannerPlugin from './banner-plugin';
export default {
plugins: [
bannerPlugin(),
],
};
Kūrimo (build) paleidimas
Dabar paleiskite `npm run build` (arba savo projekto kūrimo komandą). Baigus kūrimą, patikrinkite sugeneruotus JavaScript failus `dist` kataloge. Kiekvieno failo viršuje pamatysite antraštę.
Pažangios įskiepių technikos
Be paprastų kodo transformacijų, Vite įskiepiai gali naudoti pažangesnes technikas, siekiant pagerinti savo galimybes.
Virtualūs moduliai
Virtualūs moduliai leidžia įskiepiams kurti modulius, kurie neegzistuoja kaip realūs failai diske. Tai naudinga generuojant dinaminį turinį arba teikiant konfigūracijos duomenis programai.
// 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)};`;
}
},
};
}
Šiame pavyzdyje:
- `virtualModuleId` yra eilutė, kuri atspindi virtualaus modulio identifikatorių.
- `resolvedVirtualModuleId` yra pridedamas prefiksas `\0`, kad „Rollup“ neapdorotų jo kaip realaus failo. Tai yra konvencija, naudojama „Rollup“ įskiepiuose.
- `resolveId` perima modulių sprendimą ir grąžina išspręstą virtualaus modulio ID, jei prašomas ID atitinka `virtualModuleId`.
- `load` perima modulių įkėlimą ir grąžina modulio kodą, jei prašomas ID atitinka `resolvedVirtualModuleId`. Šiuo atveju jis sugeneruoja JavaScript modulį, kuris eksportuoja `options` kaip numatytąjį eksportą.
Virtualaus modulio naudojimas
// 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 transformavimas
`transformIndexHtml` „kablys“ leidžia modifikuoti `index.html` failą, pavyzdžiui, įterpiant scenarijus, stilius ar meta žymes. Tai naudinga pridedant analitikos sekimą, konfigūruojant socialinių tinklų metaduomenis ar pritaikant HTML struktūrą.
// inject-script-plugin.js
export default function injectScriptPlugin() {
return {
name: 'inject-script-plugin',
transformIndexHtml(html) {
return html.replace(
'