Vite च्या प्लगइन आर्किटेक्चरचा शोध घ्या आणि आपला डेव्हलपमेंट वर्कफ्लो सुधारण्यासाठी कस्टम प्लगइन्स कसे तयार करायचे ते शिका. जागतिक प्रेक्षकांसाठी व्यावहारिक उदाहरणांसह आवश्यक संकल्पनांवर प्रभुत्व मिळवा.
Vite प्लगइन आर्किटेक्चरचे सुलभीकरण: कस्टम प्लगइन निर्मितीसाठी एक जागतिक मार्गदर्शक
Vite, हे अत्यंत वेगवान बिल्ड टूल, फ्रंटएंड डेव्हलपमेंटमध्ये क्रांती घडवून आणले आहे. त्याचा वेग आणि साधेपणा मोठ्या प्रमाणावर त्याच्या शक्तिशाली प्लगइन आर्किटेक्चरमुळे आहे. हे आर्किटेक्चर डेव्हलपर्सना Vite ची कार्यक्षमता वाढविण्यास आणि त्यांच्या विशिष्ट प्रोजेक्टच्या गरजांनुसार ते तयार करण्यास अनुमती देते. हे मार्गदर्शक Vite च्या प्लगइन सिस्टीमचा एक व्यापक शोध प्रदान करते, जे तुम्हाला स्वतःचे कस्टम प्लगइन्स तयार करण्यास आणि आपला डेव्हलपमेंट वर्कफ्लो ऑप्टिमाइझ करण्यास सक्षम करते.
Vite ची मुख्य तत्त्वे समजून घेणे
प्लगइन निर्मितीमध्ये जाण्यापूर्वी, Vite ची मूलभूत तत्त्वे समजून घेणे आवश्यक आहे:
- मागणीनुसार संकलन (On-Demand Compilation): Vite फक्त ब्राउझरद्वारे विनंती केल्यावरच कोड संकलित करते, ज्यामुळे स्टार्टअप वेळ लक्षणीयरीत्या कमी होतो.
- नेटिव्ह ESM: Vite डेव्हलपमेंटसाठी नेटिव्ह ECMAScript मॉड्यूल्स (ESM) वापरते, ज्यामुळे डेव्हलपमेंट दरम्यान बंडलिंगची गरज नाहीशी होते.
- रोलअप-आधारित प्रोडक्शन बिल्ड: प्रोडक्शन बिल्डसाठी, Vite रोलअप (Rollup) या अत्यंत ऑप्टिमाइझ केलेल्या बंडलरचा वापर करून कार्यक्षम आणि प्रोडक्शन-रेडी कोड तयार करते.
Vite च्या इकोसिस्टममधील प्लगइन्सची भूमिका
Vite चे प्लगइन आर्किटेक्चर अत्यंत विस्तारणीय (extensible) होण्यासाठी डिझाइन केलेले आहे. प्लगइन्स हे करू शकतात:
- कोड रूपांतरित करणे (उदा. TypeScript चे ट्रांसपाइलिंग, प्रीप्रोसेसर जोडणे).
- कस्टम फाइल्स सर्व्ह करणे (उदा. स्टॅटिक मालमत्ता हाताळणे, व्हर्च्युअल मॉड्यूल तयार करणे).
- बिल्ड प्रक्रियेत बदल करणे (उदा. इमेजेस ऑप्टिमाइझ करणे, सर्व्हिस वर्कर्स तयार करणे).
- Vite च्या CLI चा विस्तार करणे (उदा. कस्टम कमांड्स जोडणे).
प्लगइन्स हे Vite ला विविध प्रोजेक्ट आवश्यकतांनुसार, साध्या बदलांपासून ते गुंतागुंतीच्या इंटिग्रेशन्सपर्यंत, जुळवून घेण्याची गुरुकिल्ली आहेत.
Vite प्लगइन आर्किटेक्चर: एक सखोल आढावा
एक Vite प्लगइन मूलत: एक जावास्क्रिप्ट ऑब्जेक्ट आहे ज्यामध्ये विशिष्ट गुणधर्म असतात जे त्याचे वर्तन परिभाषित करतात. चला मुख्य घटकांचे परीक्षण करूया:
प्लगइन कॉन्फिगरेशन
`vite.config.js` (किंवा `vite.config.ts`) ही फाइल आहे जिथे तुम्ही तुमच्या Vite प्रोजेक्टला कॉन्फिगर करता, ज्यात कोणते प्लगइन्स वापरायचे हे निर्दिष्ट करणे समाविष्ट आहे. `plugins` पर्याय प्लगइन ऑब्जेक्ट्सची किंवा प्लगइन ऑब्जेक्ट्स परत करणाऱ्या फंक्शन्सची एक ॲरे स्वीकारतो.
// vite.config.js
import myPlugin from './my-plugin';
export default {
plugins: [
myPlugin(), // प्लगइन इन्स्टन्स तयार करण्यासाठी प्लगइन फंक्शनला कॉल करा
],
};
प्लगइन ऑब्जेक्ट गुणधर्म
Vite प्लगइन ऑब्जेक्टमध्ये अनेक गुणधर्म असू शकतात जे बिल्ड प्रक्रियेच्या विविध टप्प्यांदरम्यान त्याचे वर्तन परिभाषित करतात. येथे सर्वात सामान्य गुणधर्मांचे विवरण दिले आहे:
- name: प्लगइनसाठी एक युनिक नाव. हे आवश्यक आहे आणि डीबगिंग आणि विरोधाभास निराकरणात मदत करते. उदाहरण: `'my-custom-plugin'`
- enforce: प्लगइनचा अंमलबजावणी क्रम ठरवते. संभाव्य मूल्ये `'pre'` (मुख्य प्लगइन्सच्या आधी चालते), `'normal'` (डीफॉल्ट), आणि `'post'` (मुख्य प्लगइन्सच्या नंतर चालते) आहेत. उदाहरण: `'pre'`
- config: Vite च्या कॉन्फिगरेशन ऑब्जेक्टमध्ये बदल करण्याची परवानगी देते. हे वापरकर्ता कॉन्फिग आणि पर्यावरण (मोड आणि कमांड) प्राप्त करते. उदाहरण: `config: (config, { mode, command }) => { ... }`
- configResolved: Vite कॉन्फिग पूर्णपणे रिझॉल्व्ह झाल्यानंतर कॉल केला जातो. अंतिम कॉन्फिग ऑब्जेक्टमध्ये प्रवेश करण्यासाठी उपयुक्त. उदाहरण: `configResolved(config) { ... }`
- configureServer: डेव्हलपमेंट सर्व्हर इन्स्टन्समध्ये (Connect/Express-like) प्रवेश प्रदान करते. कस्टम मिडलवेअर जोडण्यासाठी किंवा सर्व्हरचे वर्तन बदलण्यासाठी उपयुक्त. उदाहरण: `configureServer(server) { ... }`
- transformIndexHtml: `index.html` फाइलमध्ये बदल करण्याची परवानगी देते. स्क्रिप्ट्स, स्टाइल्स, किंवा मेटा टॅग्ज इंजेक्ट करण्यासाठी उपयुक्त. उदाहरण: `transformIndexHtml(html) { ... }`
- resolveId: मॉड्यूल रिझोल्यूशनमध्ये हस्तक्षेप आणि बदल करण्याची परवानगी देते. कस्टम मॉड्यूल रिझोल्यूशन लॉजिकसाठी उपयुक्त. उदाहरण: `resolveId(source, importer) { ... }`
- load: कस्टम मॉड्यूल लोड करण्याची किंवा विद्यमान मॉड्यूल सामग्रीमध्ये बदल करण्याची परवानगी देते. व्हर्च्युअल मॉड्यूल किंवा कस्टम लोडर्ससाठी उपयुक्त. उदाहरण: `load(id) { ... }`
- transform: मॉड्यूल्सचा सोर्स कोड रूपांतरित करते. बॅबेल प्लगइन किंवा पोस्टसीएसएस प्लगइनसारखे. उदाहरण: `transform(code, id) { ... }`
- buildStart: बिल्ड प्रक्रियेच्या सुरुवातीला कॉल केला जातो. उदाहरण: `buildStart() { ... }`
- buildEnd: बिल्ड प्रक्रिया पूर्ण झाल्यानंतर कॉल केला जातो. उदाहरण: `buildEnd() { ... }`
- closeBundle: बंडल डिस्कवर लिहिल्यानंतर कॉल केला जातो. उदाहरण: `closeBundle() { ... }`
- writeBundle: बंडल डिस्कवर लिहिण्यापूर्वी कॉल केला जातो, बदलासाठी परवानगी देतो. उदाहरण: `writeBundle(options, bundle) { ... }`
- renderError: डेव्हलपमेंट दरम्यान कस्टम एरर पेजेस प्रस्तुत करण्याची परवानगी देते. उदाहरण: `renderError(error, req, res) { ... }`
- handleHotUpdate: HMR वर सूक्ष्म नियंत्रण ठेवण्याची परवानगी देते. उदाहरण: `handleHotUpdate({ file, server }) { ... }`
प्लगइन हुक्स आणि अंमलबजावणी क्रम
Vite प्लगइन्स हुक्सच्या मालिकेमधून कार्य करतात जे बिल्ड प्रक्रियेच्या विविध टप्प्यांवर ट्रिगर होतात. हे हुक्स कोणत्या क्रमाने कार्यान्वित होतात हे समजून घेणे प्रभावी प्लगइन्स लिहिण्यासाठी महत्त्वाचे आहे.
- config: Vite कॉन्फिगमध्ये बदल करा.
- configResolved: रिझॉल्व्ह केलेल्या कॉन्फिगमध्ये प्रवेश करा.
- configureServer: डेव्ह सर्व्हरमध्ये बदल करा (केवळ डेव्हलपमेंटसाठी).
- transformIndexHtml: `index.html` फाइलमध्ये बदल करा.
- buildStart: बिल्ड प्रक्रियेची सुरुवात.
- resolveId: मॉड्यूल आयडी रिझॉल्व्ह करा.
- load: मॉड्यूल सामग्री लोड करा.
- transform: मॉड्यूल कोडमध्ये बदल करा.
- handleHotUpdate: हॉट मॉड्यूल रिप्लेसमेंट (HMR) हाताळा.
- writeBundle: डिस्कवर लिहिण्यापूर्वी आउटपुट बंडलमध्ये बदल करा.
- closeBundle: आउटपुट बंडल डिस्कवर लिहिल्यानंतर कॉल केला जातो.
- buildEnd: बिल्ड प्रक्रियेचा शेवट.
तुमचा पहिला कस्टम Vite प्लगइन तयार करणे
चला एक साधा Vite प्लगइन तयार करूया जो प्रोडक्शन बिल्डमधील प्रत्येक जावास्क्रिप्ट फाइलच्या शीर्षस्थानी एक बॅनर जोडेल. या बॅनरमध्ये प्रोजेक्टचे नाव आणि आवृत्ती समाविष्ट असेल.
प्लगइन अंमलबजावणी
// 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: प्लगइनचे नाव 'banner-plugin' परिभाषित करते.
- apply: हे निर्दिष्ट करते की हा प्लगइन फक्त बिल्ड प्रक्रियेदरम्यान चालला पाहिजे. हे 'build' वर सेट केल्याने ते फक्त प्रोडक्शनसाठी होते, डेव्हलपमेंट दरम्यान अनावश्यक ओव्हरहेड टाळले जाते.
- transform(code, id):
- हे प्लगइनचे मुख्य कार्य आहे. ते प्रत्येक मॉड्यूलचा कोड (`code`) आणि आयडी (`id`) मध्ये हस्तक्षेप करते.
- अटी तपासणी: `if (!id.endsWith('.js'))` हे सुनिश्चित करते की रूपांतरण फक्त जावास्क्रिप्ट फाइल्सना लागू होते. हे इतर फाइल प्रकारांवर (जसे की CSS किंवा HTML) प्रक्रिया करणे टाळते, ज्यामुळे त्रुटी किंवा अनपेक्षित वर्तन होऊ शकते.
- Package.json ॲक्सेस:
- `resolve(process.cwd(), 'package.json')` हे `package.json` फाइलचा संपूर्ण मार्ग तयार करते. `process.cwd()` वर्तमान कार्यरत डिरेक्टरी परत करते, ज्यामुळे कमांड कोठूनही कार्यान्वित केली तरी योग्य मार्ग वापरला जातो.
- `JSON.parse(readFileSync(packageJsonPath, 'utf-8'))` `package.json` फाइल वाचते आणि पार्स करते. `readFileSync` फाइल सिंकक्रोनसपणे वाचते, आणि `'utf-8'` युनिकोड वर्ण योग्यरित्या हाताळण्यासाठी एन्कोडिंग निर्दिष्ट करते. येथे सिंकक्रोनस वाचन स्वीकार्य आहे कारण ते ट्रान्सफॉर्मच्या सुरुवातीला एकदाच होते.
- बॅनर निर्मिती:
- ``const banner = `/**\n * Project: ${packageJson.name}\n * Version: ${packageJson.version}\n */\n`;`` बॅनर स्ट्रिंग तयार करते. हे `package.json` फाइलमधून प्रोजेक्टचे नाव आणि आवृत्ती सहजपणे एम्बेड करण्यासाठी टेम्पलेट लिटरल्स (बॅकटिक्स) वापरते. `\n` क्रम नवीन ओळी घालतात जेणेकरून बॅनर योग्यरित्या फॉरमॅट होईल. `*` हे `\*` ने एस्केप केले आहे.
- कोड रूपांतरण: `return banner + code;` मूळ जावास्क्रिप्ट कोडच्या आधी बॅनर जोडते. हे ट्रान्सफॉर्म फंक्शनद्वारे परत केलेले अंतिम परिणाम आहे.
प्लगइन समाकलित करणे
तुमच्या `vite.config.js` फाइलमध्ये प्लगइन आयात करा आणि `plugins` ॲरेमध्ये जोडा:
// vite.config.js
import bannerPlugin from './banner-plugin';
export default {
plugins: [
bannerPlugin(),
],
};
बिल्ड चालवणे
आता, `npm run build` (किंवा तुमच्या प्रोजेक्टची बिल्ड कमांड) चालवा. बिल्ड पूर्ण झाल्यानंतर, `dist` डिरेक्टरीमधील तयार झालेल्या जावास्क्रिप्ट फाइल्स तपासा. तुम्हाला प्रत्येक फाइलच्या शीर्षस्थानी बॅनर दिसेल.
प्रगत प्लगइन तंत्र
साध्या कोड रूपांतरणांच्या पलीकडे, Vite प्लगइन्स त्यांच्या क्षमता वाढविण्यासाठी अधिक प्रगत तंत्रांचा वापर करू शकतात.
व्हर्च्युअल मॉड्यूल्स
व्हर्च्युअल मॉड्यूल्स प्लगइन्सना असे मॉड्यूल तयार करण्याची परवानगी देतात जे डिस्कवर वास्तविक फाइल्स म्हणून अस्तित्वात नसतात. डायनॅमिक सामग्री तयार करण्यासाठी किंवा ॲप्लिकेशनला कॉन्फिगरेशन डेटा प्रदान करण्यासाठी हे उपयुक्त आहे.
// virtual-module-plugin.js
export default function virtualModulePlugin(options) {
const virtualModuleId = 'virtual:my-module';
const resolvedVirtualModuleId = '\0' + virtualModuleId; // रोलअपला प्रक्रिया करण्यापासून रोखण्यासाठी \0 ने préfix करा
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` ने préfix केले आहे जेणेकरून रोलअप त्याला वास्तविक फाइल म्हणून प्रक्रिया करणार नाही. ही रोलअप प्लगइन्समध्ये वापरली जाणारी एक प्रथा आहे.
- `resolveId` मॉड्यूल रिझोल्यूशनमध्ये हस्तक्षेप करते आणि विनंती केलेला आयडी `virtualModuleId` शी जुळल्यास रिझॉल्व्ह केलेला व्हर्च्युअल मॉड्यूल आयडी परत करते.
- `load` मॉड्यूल लोडिंगमध्ये हस्तक्षेप करते आणि विनंती केलेला आयडी `resolvedVirtualModuleId` शी जुळल्यास मॉड्यूलचा कोड परत करते. या प्रकरणात, ते एक जावास्क्रिप्ट मॉड्यूल तयार करते जे `options` डीफॉल्ट एक्सपोर्ट म्हणून निर्यात करते.
व्हर्च्युअल मॉड्यूल वापरणे
// 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` हुक तुम्हाला `index.html` फाइलमध्ये बदल करण्याची परवानगी देतो, जसे की स्क्रिप्ट्स, स्टाइल्स, किंवा मेटा टॅग्ज इंजेक्ट करणे. हे ॲनालिटिक्स ट्रॅकिंग जोडण्यासाठी, सोशल मीडिया मेटाडेटा कॉन्फिगर करण्यासाठी, किंवा HTML संरचना सानुकूलित करण्यासाठी उपयुक्त आहे.
// inject-script-plugin.js
export default function injectScriptPlugin() {
return {
name: 'inject-script-plugin',
transformIndexHtml(html) {
return html.replace(
'