Vite-ன் plugin கட்டமைப்பை ஆராய்ந்து, உங்கள் மேம்பாட்டுப் பணிகளை மேம்படுத்த தனிப்பயன் plugin-களை உருவாக்கக் கற்றுக்கொள்ளுங்கள். உலகளாவிய பார்வையாளர்களுக்காக நடைமுறை எடுத்துக்காட்டுகளுடன் முக்கிய கருத்துக்களை மாஸ்டர் செய்யுங்கள்.
Vite Plugin கட்டமைப்பை எளிதாக்குதல்: தனிப்பயன் Plugin உருவாக்குவதற்கான ஒரு உலகளாவிய வழிகாட்டி
Vite, மின்னல் வேகமான build tool, frontend மேம்பாட்டில் ஒரு புரட்சியை ஏற்படுத்தியுள்ளது. அதன் வேகம் மற்றும் எளிமை பெரும்பாலும் அதன் சக்திவாய்ந்த plugin கட்டமைப்பின் காரணமாகும். இந்த கட்டமைப்பு டெவலப்பர்கள் Vite-ன் செயல்பாட்டை விரிவுபடுத்தவும், தங்கள் குறிப்பிட்ட திட்டத் தேவைகளுக்கு ஏற்ப அதை மாற்றியமைக்கவும் அனுமதிக்கிறது. இந்த வழிகாட்டி Vite-ன் plugin அமைப்பின் ஒரு விரிவான ஆய்வை வழங்குகிறது, இது உங்கள் சொந்த தனிப்பயன் plugin-களை உருவாக்கவும், உங்கள் மேம்பாட்டுப் பணிப்பாய்வை மேம்படுத்தவும் உங்களுக்கு அதிகாரம் அளிக்கிறது.
Vite-ன் அடிப்படைக் கொள்கைகளைப் புரிந்துகொள்ளுதல்
plugin உருவாக்கத்தில் இறங்குவதற்கு முன், Vite-ன் அடிப்படைக் கொள்கைகளைப் புரிந்துகொள்வது அவசியம்:
- தேவைக்கேற்ப தொகுத்தல் (On-Demand Compilation): உலாவி கோரும்போது மட்டுமே Vite குறியீட்டைத் தொகுக்கிறது, இது தொடக்க நேரத்தை கணிசமாகக் குறைக்கிறது.
- நேட்டிவ் ESM: Vite மேம்பாட்டிற்காக நேட்டிவ் ECMAScript தொகுதிகளை (ESM) பயன்படுத்துகிறது, இது மேம்பாட்டின் போது bundling செய்வதற்கான தேவையை நீக்குகிறது.
- Rollup-அடிப்படையிலான தயாரிப்பு பில்ட்: தயாரிப்பு பில்ட்களுக்கு, Vite மிகவும் மேம்படுத்தப்பட்ட bundler ஆன Rollup-ஐப் பயன்படுத்தி திறமையான மற்றும் உற்பத்திக்குத் தயாரான குறியீட்டை உருவாக்குகிறது.
Vite-ன் Ecosystem-ல் Plugin-களின் பங்கு
Vite-ன் plugin கட்டமைப்பு மிகவும் விரிவாக்கக்கூடிய வகையில் வடிவமைக்கப்பட்டுள்ளது. Plugin-கள் செய்யக்கூடியவை:
- குறியீட்டை மாற்றுதல் (உதாரணமாக, TypeScript-ஐ மாற்றுதல், preprocessors-ஐ சேர்த்தல்).
- தனிப்பயன் கோப்புகளை வழங்குதல் (உதாரணமாக, நிலையான சொத்துக்களைக் கையாளுதல், மெய்நிகர் தொகுதிகளை உருவாக்குதல்).
- பில்ட் செயல்முறையை மாற்றுதல் (உதாரணமாக, படங்களை மேம்படுத்துதல், சேவைப் பணியாளர்களை உருவாக்குதல்).
- Vite-ன் CLI-ஐ விரிவுபடுத்துதல் (உதாரணமாக, தனிப்பயன் கட்டளைகளைச் சேர்த்தல்).
எளிய மாற்றங்கள் முதல் சிக்கலான ஒருங்கிணைப்புகள் வரை, பல்வேறு திட்டத் தேவைகளுக்கு Vite-ஐ மாற்றியமைப்பதற்கான திறவுகோல் Plugin-கள்தான்.
Vite Plugin கட்டமைப்பு: ஒரு ஆழமான பார்வை
ஒரு Vite plugin என்பது அடிப்படையில் அதன் நடத்தையை வரையறுக்கும் குறிப்பிட்ட பண்புகளைக் கொண்ட ஒரு JavaScript பொருளாகும். முக்கிய கூறுகளை ஆராய்வோம்:
Plugin கட்டமைப்பு
`vite.config.js` (அல்லது `vite.config.ts`) கோப்பில் தான் உங்கள் Vite திட்டத்தை உள்ளமைப்பீர்கள், எந்தெந்த plugin-களைப் பயன்படுத்த வேண்டும் என்பதையும் குறிப்பிடுவீர்கள். `plugins` விருப்பம் plugin பொருள்கள் அல்லது plugin பொருள்களை வழங்கும் செயல்பாடுகளின் வரிசையை ஏற்றுக்கொள்கிறது.
// vite.config.js
import myPlugin from './my-plugin';
export default {
plugins: [
myPlugin(), // ஒரு plugin நிகழ்வை உருவாக்க plugin செயல்பாட்டை அழைக்கவும்
],
};
Plugin பொருளின் பண்புகள்
ஒரு Vite plugin பொருளுக்கு பல பண்புகள் இருக்கலாம், அவை பில்ட் செயல்முறையின் வெவ்வேறு கட்டங்களில் அதன் நடத்தையை வரையறுக்கின்றன. மிகவும் பொதுவான பண்புகளின் ஒரு முறிவு இங்கே:
- name: plugin-க்கான ஒரு தனித்துவமான பெயர். இது அவசியமானது மற்றும் பிழைத்திருத்தம் மற்றும் முரண்பாடுகளைத் தீர்க்க உதவுகிறது. எடுத்துக்காட்டு: `'my-custom-plugin'`
- enforce: plugin-ன் செயல்படுத்தும் வரிசையை இது தீர்மானிக்கிறது. சாத்தியமான மதிப்புகள் `'pre'` (முக்கிய plugin-களுக்கு முன் இயங்கும்), `'normal'` (இயல்புநிலை), மற்றும் `'post'` (முக்கிய plugin-களுக்குப் பிறகு இயங்கும்). எடுத்துக்காட்டு: `'pre'`
- config: Vite-ன் உள்ளமைவு பொருளை மாற்ற அனுமதிக்கிறது. இது பயனர் உள்ளமைவு மற்றும் சூழலை (mode மற்றும் command) பெறுகிறது. எடுத்துக்காட்டு: `config: (config, { mode, command }) => { ... }`
- configResolved: Vite உள்ளமைவு முழுமையாக தீர்க்கப்பட்ட பிறகு அழைக்கப்படுகிறது. இறுதி உள்ளமைவு பொருளை அணுகுவதற்குப் பயன்படும். எடுத்துக்காட்டு: `configResolved(config) { ... }`
- configureServer: மேம்பாட்டு சேவையக நிகழ்வுக்கான அணுகலை வழங்குகிறது (Connect/Express-போன்றது). தனிப்பயன் middleware சேர்ப்பதற்கோ அல்லது சேவையகத்தின் நடத்தையை மாற்றுவதற்கோ பயன்படும். எடுத்துக்காட்டு: `configureServer(server) { ... }`
- transformIndexHtml: `index.html` கோப்பை மாற்ற அனுமதிக்கிறது. ஸ்கிரிப்டுகள், ஸ்டைல்கள் அல்லது மெட்டா குறிச்சொற்களைச் செருகுவதற்குப் பயன்படும். எடுத்துக்காட்டு: `transformIndexHtml(html) { ... }`
- resolveId: தொகுதித் தீர்மானத்தைக் குறுக்கிட்டு மாற்ற அனுமதிக்கிறது. தனிப்பயன் தொகுதித் தீர்வு தர்க்கத்திற்குப் பயன்படும். எடுத்துக்காட்டு: `resolveId(source, importer) { ... }`
- load: தனிப்பயன் தொகுதிகளை ஏற்றுவதற்கோ அல்லது தற்போதுள்ள தொகுதி உள்ளடக்கத்தை மாற்றுவதற்கோ அனுமதிக்கிறது. மெய்நிகர் தொகுதிகள் அல்லது தனிப்பயன் லோடர் களுக்குப் பயன்படும். எடுத்துக்காட்டு: `load(id) { ... }`
- transform: தொகுதிகளின் மூலக் குறியீட்டை மாற்றுகிறது. Babel plugin அல்லது PostCSS plugin-ஐப் போன்றது. எடுத்துக்காட்டு: `transform(code, id) { ... }`
- buildStart: பில்ட் செயல்முறையின் தொடக்கத்தில் அழைக்கப்படுகிறது. எடுத்துக்காட்டு: `buildStart() { ... }`
- buildEnd: பில்ட் செயல்முறை முடிந்த பிறகு அழைக்கப்படுகிறது. எடுத்துக்காட்டு: `buildEnd() { ... }`
- closeBundle: bundle வட்டில் எழுதப்பட்ட பிறகு அழைக்கப்படுகிறது. எடுத்துக்காட்டு: `closeBundle() { ... }`
- writeBundle: bundle-ஐ வட்டில் எழுதும் முன் அழைக்கப்படுகிறது, மாற்றத்தை அனுமதிக்கிறது. எடுத்துக்காட்டு: `writeBundle(options, bundle) { ... }`
- renderError: dev ಸಮಯದಲ್ಲಿ தனிப்பயன் பிழைப் பக்கங்களைக் காட்ட அனுமதிக்கிறது. எடுத்துக்காட்டு: `renderError(error, req, res) { ... }`
- handleHotUpdate: HMR மீது நுணுக்கமான கட்டுப்பாட்டை அனுமதிக்கிறது. எடுத்துக்காட்டு: `handleHotUpdate({ file, server }) { ... }`
Plugin Hooks மற்றும் செயல்படுத்தும் வரிசை
Vite plugin-கள் பில்ட் செயல்முறையின் வெவ்வேறு கட்டங்களில் தூண்டப்படும் தொடர்ச்சியான hooks மூலம் செயல்படுகின்றன. இந்த hooks எந்த வரிசையில் செயல்படுத்தப்படுகின்றன என்பதைப் புரிந்துகொள்வது பயனுள்ள plugin-களை எழுதுவதற்கு முக்கியமானது.
- config: Vite உள்ளமைவை மாற்றவும்.
- configResolved: தீர்க்கப்பட்ட உள்ளமைவை அணுகவும்.
- configureServer: dev சேவையகத்தை மாற்றவும் (மேம்பாட்டிற்கு மட்டும்).
- transformIndexHtml: `index.html` கோப்பை மாற்றவும்.
- buildStart: பில்ட் செயல்முறையின் தொடக்கம்.
- resolveId: தொகுதி ID-களைத் தீர்க்கவும்.
- load: தொகுதி உள்ளடக்கத்தை ஏற்றவும்.
- transform: தொகுதி குறியீட்டை மாற்றவும்.
- handleHotUpdate: Hot Module Replacement (HMR) ஐக் கையாளவும்.
- writeBundle: வட்டில் எழுதுவதற்கு முன் வெளியீட்டு bundle-ஐ மாற்றவும்.
- closeBundle: வெளியீட்டு bundle வட்டில் எழுதப்பட்ட பிறகு அழைக்கப்படுகிறது.
- buildEnd: பில்ட் செயல்முறையின் முடிவு.
உங்கள் முதல் தனிப்பயன் Vite Plugin-ஐ உருவாக்குதல்
உற்பத்தி பில்டில் உள்ள ஒவ்வொரு JavaScript கோப்பின் மேலேயும் ஒரு பேனரைச் சேர்க்கும் ஒரு எளிய Vite plugin-ஐ உருவாக்குவோம். இந்த பேனரில் திட்டத்தின் பெயர் மற்றும் பதிப்பு ஆகியவை அடங்கும்.
Plugin செயல்படுத்தல்
// 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;
},
};
}
விளக்கம்:
- name: plugin-ன் பெயரை 'banner-plugin' என வரையறுக்கிறது.
- apply: இந்த plugin build செயல்முறையின் போது மட்டுமே இயங்க வேண்டும் என்று குறிப்பிடுகிறது. இதை 'build' என அமைப்பது உற்பத்திக்கு மட்டுமேயானது ஆக்குகிறது, மேம்பாட்டின் போது தேவையற்ற சுமையைத் தவிர்க்கிறது.
- transform(code, id):
- இது plugin-ன் மையப் பகுதியாகும். இது ஒவ்வொரு தொகுதியின் குறியீடு (`code`) மற்றும் ID (`id`) ஆகியவற்றைக் குறுக்கிடுகிறது.
- நிபந்தனைச் சரிபார்ப்பு: `if (!id.endsWith('.js'))` இந்த மாற்றம் JavaScript கோப்புகளுக்கு மட்டுமே பொருந்தும் என்பதை உறுதி செய்கிறது. இது CSS அல்லது HTML போன்ற மற்ற கோப்பு வகைகளைச் செயல்படுத்துவதைத் தடுக்கிறது, இது பிழைகள் அல்லது எதிர்பாராத நடத்தையை ஏற்படுத்தக்கூடும்.
- Package.json அணுகல்:
- `resolve(process.cwd(), 'package.json')` `package.json` கோப்பிற்கான முழுமையான பாதையை உருவாக்குகிறது. `process.cwd()` தற்போதைய வேலை செய்யும் கோப்பகத்தை வழங்குகிறது, கட்டளை எங்கிருந்து செயல்படுத்தப்பட்டாலும் சரியான பாதை பயன்படுத்தப்படுவதை உறுதி செய்கிறது.
- `JSON.parse(readFileSync(packageJsonPath, 'utf-8'))` `package.json` கோப்பைப் படித்து பகுப்பாய்வு செய்கிறது. `readFileSync` கோப்பை ஒத்திசைவாகப் படிக்கிறது, மற்றும் `'utf-8'` யூனிகோட் எழுத்துக்களைச் சரியாகக் கையாள குறியாக்கத்தைக் குறிப்பிடுகிறது. ஒத்திசைவான வாசிப்பு இங்கே ஏற்றுக்கொள்ளத்தக்கது, ஏனெனில் இது transform-ன் தொடக்கத்தில் ஒருமுறை நிகழ்கிறது.
- பேனர் உருவாக்கம்:
- ``const banner = `/**\n * Project: ${packageJson.name}\n * Version: ${packageJson.version}\n */\n`;`` பேனர் சரத்தை உருவாக்குகிறது. `package.json` கோப்பிலிருந்து திட்டத்தின் பெயர் மற்றும் பதிப்பை எளிதாக உட்பொதிக்க டெம்ப்ளேட் லிட்டரல்களை (backticks) பயன்படுத்துகிறது. `\n` வரிசைகள் பேனரைச் சரியாக வடிவமைக்க புதிய வரிகளைச் செருகுகின்றன. `*` `\*` உடன் தப்பிக்கப்படுகிறது.
- குறியீடு மாற்றம்: `return banner + code;` அசல் JavaScript குறியீட்டிற்கு முன் பேனரைச் சேர்க்கிறது. இது transform செயல்பாட்டின் மூலம் வழங்கப்படும் இறுதி முடிவாகும்.
Plugin-ஐ ஒருங்கிணைத்தல்
உங்கள் `vite.config.js` கோப்பில் plugin-ஐ இறக்குமதி செய்து `plugins` வரிசையில் சேர்க்கவும்:
// vite.config.js
import bannerPlugin from './banner-plugin';
export default {
plugins: [
bannerPlugin(),
],
};
பில்டை இயக்குதல்
இப்போது, `npm run build` (அல்லது உங்கள் திட்டத்தின் பில்ட் கட்டளை) ஐ இயக்கவும். பில்ட் முடிந்ததும், `dist` கோப்பகத்தில் உருவாக்கப்பட்ட JavaScript கோப்புகளை ஆய்வு செய்யவும். ஒவ்வொரு கோப்பின் ಮೇலேயும் பேனரைக் காண்பீர்கள்.
மேம்பட்ட Plugin நுட்பங்கள்
எளிய குறியீடு மாற்றங்களுக்கு அப்பால், Vite plugin-கள் தங்கள் திறன்களை மேம்படுத்த மேலும் மேம்பட்ட நுட்பங்களைப் பயன்படுத்தலாம்.
மெய்நிகர் தொகுதிகள் (Virtual Modules)
மெய்நிகர் தொகுதிகள், plugin-கள் வட்டில் உண்மையான கோப்புகளாக இல்லாத தொகுதிகளை உருவாக்க அனுமதிக்கின்றன. இது மாறும் உள்ளடக்கத்தை உருவாக்க அல்லது பயன்பாட்டிற்கு உள்ளமைவுத் தரவை வழங்குவதற்குப் பயன்படும்.
// virtual-module-plugin.js
export default function virtualModulePlugin(options) {
const virtualModuleId = 'virtual:my-module';
const resolvedVirtualModuleId = '\0' + virtualModuleId; // Rollup இதைச் செயலாக்குவதைத் தடுக்க \0 உடன் முன்னொட்டுச் சேர்க்கவும்
return {
name: 'virtual-module-plugin',
resolveId(id) {
if (id === virtualModuleId) {
return resolvedVirtualModuleId;
}
},
load(id) {
if (id === resolvedVirtualModuleId) {
return `export default ${JSON.stringify(options)};`;
}
},
};
}
இந்த எடுத்துக்காட்டில்:
- `virtualModuleId` என்பது மெய்நிகர் தொகுதியின் அடையாளத்தைக் குறிக்கும் ஒரு சரம்.
- `resolvedVirtualModuleId` என்பது `\0` உடன் முன்னொட்டாகச் சேர்க்கப்பட்டுள்ளது, இது Rollup அதை ஒரு உண்மையான கோப்பாகச் செயல்படுத்துவதைத் தடுக்கிறது. இது Rollup plugin-களில் பயன்படுத்தப்படும் ஒரு மரபாகும்.
- `resolveId` தொகுதித் தீர்மானத்தைக் குறுக்கிட்டு, கோரப்பட்ட ID `virtualModuleId` உடன் பொருந்தினால் தீர்க்கப்பட்ட மெய்நிகர் தொகுதி ID-ஐ வழங்குகிறது.
- `load` தொகுதி ஏற்றத்தைக் குறுக்கிட்டு, கோரப்பட்ட ID `resolvedVirtualModuleId` உடன் பொருந்தினால் தொகுதியின் குறியீட்டை வழங்குகிறது. இந்த வழக்கில், இது `options`-ஐ இயல்புநிலை ஏற்றுமதியாக ஏற்றுமதி செய்யும் ஒரு JavaScript தொகுதியை உருவாக்குகிறது.
மெய்நிகர் தொகுதியைப் பயன்படுத்துதல்
// 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); // வெளியீடு: Hello from virtual module!
Index HTML-ஐ மாற்றுதல்
`transformIndexHtml` hook, `index.html` கோப்பை மாற்றியமைக்க உங்களை அனுமதிக்கிறது, அதாவது ஸ்கிரிப்டுகள், ஸ்டைல்கள் அல்லது மெட்டா குறிச்சொற்களைச் செருகுவது போன்றவை. இது பகுப்பாய்வு கண்காணிப்பைச் சேர்ப்பதற்கும், சமூக ஊடக மெட்டாடேட்டாவை உள்ளமைப்பதற்கும் அல்லது HTML கட்டமைப்பைத் தனிப்பயனாக்குவதற்கும் பயனுள்ளதாக இருக்கும்.
// inject-script-plugin.js
export default function injectScriptPlugin() {
return {
name: 'inject-script-plugin',
transformIndexHtml(html) {
return html.replace(
'