वाइट के प्लगइन आर्किटेक्चर का अन्वेषण करें और अपने डेवलपमेंट वर्कफ़्लो को बेहतर बनाने के लिए कस्टम प्लगइन बनाना सीखें। वैश्विक दर्शकों के लिए व्यावहारिक उदाहरणों के साथ आवश्यक अवधारणाओं में महारत हासिल करें।
वाइट प्लगइन आर्किटेक्चर को समझना: कस्टम प्लगइन बनाने के लिए एक वैश्विक गाइड
वाइट, बिजली की तेजी से काम करने वाला बिल्ड टूल, ने फ्रंटएंड डेवलपमेंट में क्रांति ला दी है। इसकी गति और सरलता का बड़ा श्रेय इसके शक्तिशाली प्लगइन आर्किटेक्चर को जाता है। यह आर्किटेक्चर डेवलपर्स को वाइट की कार्यक्षमता का विस्तार करने और इसे उनकी विशिष्ट प्रोजेक्ट आवश्यकताओं के अनुसार ढालने की अनुमति देता है। यह गाइड वाइट के प्लगइन सिस्टम का एक व्यापक अन्वेषण प्रदान करता है, जो आपको अपने स्वयं के कस्टम प्लगइन बनाने और अपने डेवलपमेंट वर्कफ़्लो को अनुकूलित करने में सशक्त बनाता है।
वाइट के मूल सिद्धांतों को समझना
प्लगइन बनाने से पहले, वाइट के मौलिक सिद्धांतों को समझना आवश्यक है:
- ऑन-डिमांड कंपाइलेशन: वाइट केवल तभी कोड कंपाइल करता है जब ब्राउज़र द्वारा इसकी मांग की जाती है, जिससे स्टार्टअप समय में काफी कमी आती है।
- नेटिव ESM: वाइट डेवलपमेंट के लिए नेटिव ECMAScript मॉड्यूल (ESM) का लाभ उठाता है, जिससे डेवलपमेंट के दौरान बंडलिंग की आवश्यकता समाप्त हो जाती है।
- रोलअप-आधारित प्रोडक्शन बिल्ड: प्रोडक्शन बिल्ड के लिए, वाइट कुशल और प्रोडक्शन-रेडी कोड उत्पन्न करने के लिए रोलअप, एक अत्यधिक अनुकूलित बंडलर, का उपयोग करता है।
वाइट के इकोसिस्टम में प्लगइन्स की भूमिका
वाइट का प्लगइन आर्किटेक्चर अत्यधिक विस्तारणीय होने के लिए डिज़ाइन किया गया है। प्लगइन्स कर सकते हैं:
- कोड को बदलना (जैसे, टाइपस्क्रिप्ट को ट्रांसपाइल करना, प्रीप्रोसेसर जोड़ना)।
- कस्टम फाइलें सर्व करना (जैसे, स्टैटिक एसेट्स को संभालना, वर्चुअल मॉड्यूल बनाना)।
- बिल्ड प्रक्रिया को संशोधित करना (जैसे, छवियों का अनुकूलन, सर्विस वर्कर बनाना)।
- वाइट के CLI का विस्तार करना (जैसे, कस्टम कमांड जोड़ना)।
प्लगइन्स वाइट को विभिन्न प्रोजेक्ट आवश्यकताओं के अनुकूल बनाने की कुंजी हैं, साधारण संशोधनों से लेकर जटिल एकीकरण तक।
वाइट प्लगइन आर्किटेक्चर: एक गहरा अवलोकन
एक वाइट प्लगइन अनिवार्य रूप से विशिष्ट गुणों वाला एक जावास्क्रिप्ट ऑब्जेक्ट है जो इसके व्यवहार को परिभाषित करता है। आइए प्रमुख तत्वों की जांच करें:
प्लगइन कॉन्फ़िगरेशन
`vite.config.js` (या `vite.config.ts`) फ़ाइल वह जगह है जहाँ आप अपने वाइट प्रोजेक्ट को कॉन्फ़िगर करते हैं, जिसमें यह निर्दिष्ट करना भी शामिल है कि कौन से प्लगइन्स का उपयोग करना है। `plugins` विकल्प प्लगइन ऑब्जेक्ट्स की एक ऐरे या ऐसे फ़ंक्शंस को स्वीकार करता है जो प्लगइन ऑब्जेक्ट्स लौटाते हैं।
// vite.config.js
import myPlugin from './my-plugin';
export default {
plugins: [
myPlugin(), // प्लगइन इंस्टेंस बनाने के लिए प्लगइन फ़ंक्शन को कॉल करें
],
};
प्लगइन ऑब्जेक्ट प्रॉपर्टीज
एक वाइट प्लगइन ऑब्जेक्ट में कई गुण हो सकते हैं जो बिल्ड प्रक्रिया के विभिन्न चरणों के दौरान इसके व्यवहार को परिभाषित करते हैं। यहाँ सबसे आम गुणों का विवरण दिया गया है:
- नाम (name): प्लगइन के लिए एक अद्वितीय नाम। यह आवश्यक है और डिबगिंग और टकराव समाधान में मदद करता है। उदाहरण: `'my-custom-plugin'`
- लागू करना (enforce): प्लगइन के निष्पादन क्रम को निर्धारित करता है। संभावित मान `'pre'` (कोर प्लगइन्स से पहले चलता है), `'normal'` (डिफ़ॉल्ट), और `'post'` (कोर प्लगइन्स के बाद चलता है) हैं। उदाहरण: `'pre'`
- कॉन्फ़िग (config): वाइट के कॉन्फ़िगरेशन ऑब्जेक्ट को संशोधित करने की अनुमति देता है। यह उपयोगकर्ता कॉन्फ़िग और पर्यावरण (मोड और कमांड) प्राप्त करता है। उदाहरण: `config: (config, { mode, command }) => { ... }`
- कॉन्फ़िग रिजॉल्व्ड (configResolved): वाइट कॉन्फ़िग पूरी तरह से हल हो जाने के बाद कॉल किया जाता है। अंतिम कॉन्फ़िग ऑब्जेक्ट तक पहुंचने के लिए उपयोगी है। उदाहरण: `configResolved(config) { ... }`
- सर्वर कॉन्फ़िगर करें (configureServer): डेवलपमेंट सर्वर इंस्टेंस (कनेक्ट/एक्सप्रेस-जैसा) तक पहुंच प्रदान करता है। कस्टम मिडलवेयर जोड़ने या सर्वर व्यवहार को संशोधित करने के लिए उपयोगी है। उदाहरण: `configureServer(server) { ... }`
- इंडेक्स HTML बदलें (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): एचएमआर पर सूक्ष्म नियंत्रण की अनुमति देता है। उदाहरण: `handleHotUpdate({ file, server }) { ... }`
प्लगइन हुक्स और निष्पादन क्रम
वाइट प्लगइन्स हुक्स की एक श्रृंखला के माध्यम से काम करते हैं जो बिल्ड प्रक्रिया के विभिन्न चरणों में ट्रिगर होते हैं। प्रभावी प्लगइन्स लिखने के लिए इन हुक्स के निष्पादन के क्रम को समझना महत्वपूर्ण है।
- कॉन्फ़िग (config): वाइट कॉन्फ़िग को संशोधित करें।
- कॉन्फ़िग रिजॉल्व्ड (configResolved): हल किए गए कॉन्फ़िग तक पहुंचें।
- सर्वर कॉन्फ़िगर करें (configureServer): देव सर्वर को संशोधित करें (केवल डेवलपमेंट)।
- इंडेक्स HTML बदलें (transformIndexHtml): `index.html` फ़ाइल को बदलें।
- बिल्ड प्रारंभ (buildStart): बिल्ड प्रक्रिया की शुरुआत।
- आईडी रिजॉल्व करें (resolveId): मॉड्यूल आईडी हल करें।
- लोड (load): मॉड्यूल सामग्री लोड करें।
- बदलें (transform): मॉड्यूल कोड बदलें।
- हॉट अपडेट संभालें (handleHotUpdate): हॉट मॉड्यूल रिप्लेसमेंट (HMR) संभालें।
- बंडल लिखें (writeBundle): डिस्क पर लिखने से पहले आउटपुट बंडल को संशोधित करें।
- बंडल बंद करें (closeBundle): आउटपुट बंडल को डिस्क पर लिखे जाने के बाद कॉल किया जाता है।
- बिल्ड समाप्त (buildEnd): बिल्ड प्रक्रिया का अंत।
अपना पहला कस्टम वाइट प्लगइन बनाना
आइए एक सरल वाइट प्लगइन बनाएं जो प्रोडक्शन बिल्ड में प्रत्येक जावास्क्रिप्ट फ़ाइल के शीर्ष पर एक बैनर जोड़ता है। इस बैनर में प्रोजेक्ट का नाम और संस्करण शामिल होगा।
प्लगइन कार्यान्वयन
// 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'))` यह सुनिश्चित करता है कि परिवर्तन केवल जावास्क्रिप्ट फ़ाइलों पर लागू हो। यह अन्य फ़ाइल प्रकारों (जैसे सीएसएस या एचटीएमएल) को संसाधित होने से रोकता है, जिससे त्रुटियां या अप्रत्याशित व्यवहार हो सकता है।
- 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` डायरेक्टरी में उत्पन्न जावास्क्रिप्ट फ़ाइलों का निरीक्षण करें। आपको प्रत्येक फ़ाइल के शीर्ष पर बैनर दिखाई देगा।
उन्नत प्लगइन तकनीकें
सरल कोड परिवर्तनों से परे, वाइट प्लगइन्स अपनी क्षमताओं को बढ़ाने के लिए अधिक उन्नत तकनीकों का लाभ उठा सकते हैं।
वर्चुअल मॉड्यूल
वर्चुअल मॉड्यूल प्लगइन्स को ऐसे मॉड्यूल बनाने की अनुमति देते हैं जो डिस्क पर वास्तविक फ़ाइलों के रूप में मौजूद नहीं होते हैं। यह गतिशील सामग्री उत्पन्न करने या एप्लिकेशन को कॉन्फ़िगरेशन डेटा प्रदान करने के लिए उपयोगी है।
// virtual-module-plugin.js
export default function virtualModulePlugin(options) {
const virtualModuleId = 'virtual:my-module';
const resolvedVirtualModuleId = '\0' + virtualModuleId; // रोलअप को संसाधित करने से रोकने के लिए \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` के साथ उपसर्ग किया गया है ताकि रोलअप इसे एक वास्तविक फ़ाइल के रूप में संसाधित करने से रोक सके। यह रोलअप प्लगइन्स में उपयोग की जाने वाली एक परंपरा है।
- `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!
इंडेक्स HTML को बदलना
`transformIndexHtml` हुक आपको `index.html` फ़ाइल को संशोधित करने की अनुमति देता है, जैसे कि स्क्रिप्ट, स्टाइल या मेटा टैग इंजेक्ट करना। यह एनालिटिक्स ट्रैकिंग जोड़ने, सोशल मीडिया मेटाडेटा कॉन्फ़िगर करने या HTML संरचना को अनुकूलित करने के लिए उपयोगी है।
// inject-script-plugin.js
export default function injectScriptPlugin() {
return {
name: 'inject-script-plugin',
transformIndexHtml(html) {
return html.replace(
'