Tutustu Viten lisäosa-arkkitehtuuriin ja opi luomaan omia lisäosia parantaaksesi kehitystyönkulkuasi. Hallitse keskeiset konseptit käytännön esimerkeillä maailmanlaajuiselle yleisölle.
Viten lisäosa-arkkitehtuurin salat auki: globaali opas kustomoitujen lisäosien luontiin
Vite, salamannopea build-työkalu, on mullistanut frontend-kehityksen. Sen nopeus ja yksinkertaisuus johtuvat suurelta osin sen tehokkaasta lisäosa-arkkitehtuurista. Tämä arkkitehtuuri antaa kehittäjille mahdollisuuden laajentaa Viten toiminnallisuutta ja räätälöidä sitä omiin projektikohtaisiin tarpeisiinsa. Tämä opas tarjoaa kattavan tutkimusmatkan Viten lisäosajärjestelmään, antaen sinulle valmiudet luoda omia kustomoituja lisäosia ja optimoida kehitystyönkulkuasi.
Viten ydinperiaatteiden ymmärtäminen
Ennen kuin sukellamme lisäosien luomiseen, on oleellista ymmärtää Viten perusperiaatteet:
- Tarvepohjainen kääntäminen: Vite kääntää koodin vain, kun selain pyytää sitä, mikä lyhentää käynnistysaikaa merkittävästi.
- Natiivi ESM: Vite hyödyntää natiiveja ECMAScript-moduuleja (ESM) kehityksen aikana, mikä poistaa tarpeen paketoinnille kehitysvaiheessa.
- Rollup-pohjainen tuotanto-build: Tuotanto-buildeja varten Vite käyttää Rollupia, erittäin optimoitua paketointityökalua, tuottaakseen tehokasta ja tuotantovalmista koodia.
Lisäosien rooli Viten ekosysteemissä
Viten lisäosa-arkkitehtuuri on suunniteltu erittäin laajennettavaksi. Lisäosat voivat:
- Muuntaa koodia (esim. TypeScriptin transpilointi, esikäsittelijöiden lisääminen).
- Tarjoilla mukautettuja tiedostoja (esim. staattisten resurssien käsittely, virtuaalisten moduulien luominen).
- Muokata build-prosessia (esim. kuvien optimointi, service workerien generointi).
- Laajentaa Viten komentorivikäyttöliittymää (CLI) (esim. lisäämällä kustomoituja komentoja).
Lisäosat ovat avainasemassa Viten sopeuttamisessa erilaisiin projektivaatimuksiin, aina yksinkertaisista muutoksista monimutkaisiin integraatioihin.
Viten lisäosa-arkkitehtuuri: syväsukellus
Vite-lisäosa on pohjimmiltaan JavaScript-objekti, jolla on tiettyjä ominaisuuksia, jotka määrittelevät sen toiminnan. Tarkastellaan keskeisiä elementtejä:
Lisäosan konfiguraatio
`vite.config.js` (tai `vite.config.ts`) -tiedosto on paikka, jossa määrität Vite-projektisi asetukset, mukaan lukien käytettävät lisäosat. `plugins`-asetus hyväksyy taulukon lisäosa-objekteja tai funktioita, jotka palauttavat lisäosa-objekteja.
// vite.config.js
import myPlugin from './my-plugin';
export default {
plugins: [
myPlugin(), // Kutsu lisäosafunktiota luodaksesi lisäosainstanssin
],
};
Lisäosa-objektin ominaisuudet
Vite-lisäosaobjektilla voi olla useita ominaisuuksia, jotka määrittelevät sen toiminnan build-prosessin eri vaiheissa. Tässä erittely yleisimmistä ominaisuuksista:
- name: Uniikki nimi lisäosalle. Tämä on pakollinen ja auttaa virheenjäljityksessä ja konfliktien ratkaisussa. Esimerkki: `'my-custom-plugin'`
- enforce: Määrittää lisäosan suoritusjärjestyksen. Mahdolliset arvot ovat `'pre'` (ajetaan ennen ydinlisäosia), `'normal'` (oletus) ja `'post'` (ajetaan ydinlisäosien jälkeen). Esimerkki: `'pre'`
- config: Mahdollistaa Viten konfiguraatio-objektin muokkaamisen. Se vastaanottaa käyttäjän konfiguraation ja ympäristön (mode ja command). Esimerkki: `config: (config, { mode, command }) => { ... }`
- configResolved: Kutsutaan, kun Viten konfiguraatio on täysin ratkaistu. Hyödyllinen lopullisen konfiguraatio-objektin käyttämiseen. Esimerkki: `configResolved(config) { ... }`
- configureServer: Antaa pääsyn kehityspalvelimen instanssiin (Connect/Express-tyylinen). Hyödyllinen mukautettujen väliohjelmistojen (middleware) lisäämiseen tai palvelimen toiminnan muokkaamiseen. Esimerkki: `configureServer(server) { ... }`
- transformIndexHtml: Mahdollistaa `index.html`-tiedoston muuntamisen. Hyödyllinen skriptien, tyylien tai meta-tagien injektointiin. Esimerkki: `transformIndexHtml(html) { ... }`
- resolveId: Mahdollistaa moduulien resoluution sieppaamisen ja muokkaamisen. Hyödyllinen mukautetussa moduulien resoluutiologiikassa. Esimerkki: `resolveId(source, importer) { ... }`
- load: Mahdollistaa mukautettujen moduulien lataamisen tai olemassa olevan moduulisisällön muokkaamisen. Hyödyllinen virtuaalisille moduuleille tai mukautetuille lataajille. Esimerkki: `load(id) { ... }`
- transform: Muuntaa moduulien lähdekoodia. Samankaltainen kuin Babel- tai PostCSS-lisäosa. Esimerkki: `transform(code, id) { ... }`
- buildStart: Kutsutaan build-prosessin alussa. Esimerkki: `buildStart() { ... }`
- buildEnd: Kutsutaan, kun build-prosessi on valmis. Esimerkki: `buildEnd() { ... }`
- closeBundle: Kutsutaan, kun paketti on kirjoitettu levylle. Esimerkki: `closeBundle() { ... }`
- writeBundle: Kutsutaan ennen paketin kirjoittamista levylle, mahdollistaen muokkauksen. Esimerkki: `writeBundle(options, bundle) { ... }`
- renderError: Mahdollistaa mukautettujen virhesivujen renderöinnin kehityksen aikana. Esimerkki: `renderError(error, req, res) { ... }`
- handleHotUpdate: Mahdollistaa hienosäädetyn HMR-hallinnan. Esimerkki: `handleHotUpdate({ file, server }) { ... }`
Lisäosien koukut (hooks) ja suoritusjärjestys
Vite-lisäosat toimivat sarjan koukkuja (hooks) kautta, jotka laukeavat build-prosessin eri vaiheissa. Näiden koukkujen suoritusjärjestyksen ymmärtäminen on ratkaisevan tärkeää tehokkaiden lisäosien kirjoittamisessa.
- config: Muokkaa Viten konfiguraatiota.
- configResolved: Käytä ratkaistua konfiguraatiota.
- configureServer: Muokkaa kehityspalvelinta (vain kehitystilassa).
- transformIndexHtml: Muunna `index.html`-tiedosto.
- buildStart: Build-prosessin alku.
- resolveId: Ratkaise moduulitunnisteet.
- load: Lataa moduulisisältö.
- transform: Muunna moduulikoodi.
- handleHotUpdate: Käsittele Hot Module Replacement (HMR).
- writeBundle: Muokkaa tulostepakettia ennen levylle kirjoittamista.
- closeBundle: Kutsutaan, kun tulostepaketti on kirjoitettu levylle.
- buildEnd: Build-prosessin loppu.
Ensimmäisen kustomoidun Vite-lisäosan luominen
Luodaan yksinkertainen Vite-lisäosa, joka lisää bannerin jokaisen tuotanto-buildin JavaScript-tiedoston alkuun. Tämä banneri sisältää projektin nimen ja version.
Lisäosan toteutus
// 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;
},
};
}
Selitys:
- name: Määrittelee lisäosan nimen, 'banner-plugin'.
- apply: Määrittää, että tämän lisäosan tulisi toimia vain build-prosessin aikana. Asettamalla tämä arvoon 'build', se toimii vain tuotannossa, välttäen turhaa kuormitusta kehityksen aikana.
- transform(code, id):
- Tämä on lisäosan ydin. Se sieppaa jokaisen moduulin koodin (`code`) ja tunnisteen (`id`).
- Ehdollinen tarkistus: `if (!id.endsWith('.js'))` varmistaa, että muunnos koskee vain JavaScript-tiedostoja. Tämä estää muiden tiedostotyyppien (kuten CSS tai HTML) käsittelyn, mikä voisi aiheuttaa virheitä tai odottamatonta käyttäytymistä.
- Pääsy package.json-tiedostoon:
- `resolve(process.cwd(), 'package.json')` muodostaa absoluuttisen polun `package.json`-tiedostoon. `process.cwd()` palauttaa nykyisen työhakemiston, varmistaen oikean polun käytön riippumatta siitä, mistä komento suoritetaan.
- `JSON.parse(readFileSync(packageJsonPath, 'utf-8'))` lukee ja jäsentää `package.json`-tiedoston. `readFileSync` lukee tiedoston synkronisesti, ja `'utf-8'` määrittää koodauksen Unicode-merkkien oikeaan käsittelyyn. Synkroninen luku on tässä hyväksyttävää, koska se tapahtuu kerran muunnoksen alussa.
- Bannerin generointi:
- ``const banner = `/**\n * Project: ${packageJson.name}\n * Version: ${packageJson.version}\n */\n`;`` luo bannerimerkkijonon. Se käyttää malliliteraaleja (backtick-merkkejä) upottaakseen helposti projektin nimen ja version `package.json`-tiedostosta. `\n`-sekvenssit lisäävät rivinvaihtoja bannerin muotoilemiseksi oikein. `*` on escape-käsitelty `\*`:lla.
- Koodin muuntaminen: `return banner + code;` lisää bannerin alkuperäisen JavaScript-koodin alkuun. Tämä on transform-funktion palauttama lopullinen tulos.
Lisäosan integrointi
Tuo lisäosa `vite.config.js`-tiedostoosi ja lisää se `plugins`-taulukkoon:
// vite.config.js
import bannerPlugin from './banner-plugin';
export default {
plugins: [
bannerPlugin(),
],
};
Buildin ajaminen
Aja nyt komento `npm run build` (tai projektisi build-komento). Kun build on valmis, tarkastele generoituja JavaScript-tiedostoja `dist`-hakemistossa. Näet bannerin jokaisen tiedoston alussa.
Edistyneet lisäosatekniikat
Yksinkertaisten koodimuunnosten lisäksi Vite-lisäosat voivat hyödyntää edistyneempiä tekniikoita parantaakseen ominaisuuksiaan.
Virtuaaliset moduulit
Virtuaaliset moduulit antavat lisäosille mahdollisuuden luoda moduuleja, joita ei ole olemassa tiedostoina levyllä. Tämä on hyödyllistä dynaamisen sisällön generointiin tai konfiguraatiodatan tarjoamiseen sovellukselle.
// virtual-module-plugin.js
export default function virtualModulePlugin(options) {
const virtualModuleId = 'virtual:my-module';
const resolvedVirtualModuleId = '\0' + virtualModuleId; // Etuliite \0 estää Rollupia käsittelemästä tätä
return {
name: 'virtual-module-plugin',
resolveId(id) {
if (id === virtualModuleId) {
return resolvedVirtualModuleId;
}
},
load(id) {
if (id === resolvedVirtualModuleId) {
return `export default ${JSON.stringify(options)};`;
}
},
};
}
Tässä esimerkissä:
- `virtualModuleId` on merkkijono, joka edustaa virtuaalimoduulin tunnistetta.
- `resolvedVirtualModuleId` on varustettu etuliitteellä `\0`, jotta Rollup ei käsittelisi sitä oikeana tiedostona. Tämä on Rollup-lisäosissa käytetty käytäntö.
- `resolveId` sieppaa moduulin resoluution ja palauttaa ratkaistun virtuaalimoduulin tunnisteen, jos pyydetty tunniste vastaa `virtualModuleId`-tunnistetta.
- `load` sieppaa moduulin latauksen ja palauttaa moduulin koodin, jos pyydetty tunniste vastaa `resolvedVirtualModuleId`-tunnistetta. Tässä tapauksessa se generoi JavaScript-moduulin, joka vie `options`-objektin oletusvientinä.
Virtuaalimoduulin käyttäminen
// 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); // Tulostus: Hello from virtual module!
index.html-tiedoston muuntaminen
`transformIndexHtml`-koukku antaa mahdollisuuden muokata `index.html`-tiedostoa, esimerkiksi injektoimalla skriptejä, tyylejä tai meta-tageja. Tämä on hyödyllistä analytiikkaseurannan lisäämiseen, sosiaalisen median metadatan määrittämiseen tai HTML-rakenteen mukauttamiseen.
// inject-script-plugin.js
export default function injectScriptPlugin() {
return {
name: 'inject-script-plugin',
transformIndexHtml(html) {
return html.replace(
'