Shimming उन मॉड्यूल्स की संगतता सुनिश्चित करने की तकनीक है जो विशेष ग्लोबल वेरिएबल्स या API की अपेक्षा करते हैं। Webpack इकोसिस्टम में shimming, ProvidePlugin, imports-loader और exports-loader के माध्यम से लागू किया जाता है, जिससे उनके सोर्स कोड को बदले बिना legacy लाइब्रेरीज़ को जोड़ा जा सकता है। Webpack Documentation (2026) के अनुसार, shimming मॉड्यूलर सिस्टम का समर्थन न करने वाले jQuery प्लगइन्स और अन्य निर्भरताओं को एकीकृत करने के लिए एक प्रमुख उपकरण बना हुआ है।
मुख्य बातें
Shimming एक सॉफ़्टवेयर तकनीक है जो मॉड्यूल के सोर्स कोड को बदले बिना कोड और वातावरण के बीच संगतता की एक परत स्थापित करती है। JavaScript बिल्ड के संदर्भ में, shimming उस समस्या को हल करता है जब कोई मॉड्यूल ग्लोबल वेरिएबल्स (window.$, global.process) को एक्सेस करता है जो मॉड्यूलर वातावरण में मौजूद नहीं होते।
Polyfill लुप्त कार्यक्षमता को शुरू से लागू करता है, वातावरण में नई क्षमताएँ जोड़ता है। उदाहरण के लिए, core-js पुराने ब्राउज़रों के लिए Array.prototype.flatMap जोड़ता है। Shim मौजूदा कॉल्स को उपलब्ध कार्यान्वयनों पर पुनर्निर्देशित करता है या अपेक्षित ग्लोबल ऑब्जेक्ट्स को बदल देता है। Webpack में, ProvidePlugin स्वचालित रूप से import $ from 'jquery' को हर उस स्थान पर डालता है जहाँ ग्लोबल वेरिएबल $ का संदर्भ मिलता है, बिना कोड में बदलाव की आवश्यकता के।
मुख्य अंतर उद्देश्य में है। Polyfill वह जोड़ता है जो मौजूद नहीं है, जबकि shim मौजूदा कोड को उस वातावरण के अनुकूल बनाता है जिसमें वह चलता है। उनके बीच चुनाव इस बात पर निर्भर करता है कि कौन सी समस्या हल की जा रही है: API की अनुपस्थिति या इंटरफेस की असंगतता।
Webpack प्रत्येक मॉड्यूल को अपनी विज़िबिलिटी रेंज के साथ एक पृथक इकाई के रूप में संसाधित करता है। यदि कोई लाइब्रेरी ग्लोबल वेरिएबल jQuery को window.$ के रूप में एक्सेस करती है, तो बिल्ड त्रुटि के साथ समाप्त हो जाएगा, क्योंकि मॉड्यूलर संदर्भ में यह वेरिएबल नहीं होता। ProvidePlugin कंपाइलेशन चरण में समस्या का समाधान करता है: कोड में पहचानकर्ता $ का पता चलने पर प्लगइन स्वचालित रूप से फ़ाइल की शुरुआत में import $ from 'jquery' डाल देता है।
// मूल कोड (legacy मॉड्यूल ग्लोबल jQuery तक पहुँचता है)
$('.element').hide();
// ProvidePlugin प्रसंस्करण के बाद (Webpack import डालता है)
import $ from 'jquery';
$('.element').hide();
इसके अतिरिक्त, imports-loader स्पष्ट रूप से निर्दिष्ट करने की अनुमति देता है कि मॉड्यूल को कौन सी निर्भरताएँ मिलनी चाहिए। यह तब उपयोगी है जब लाइब्रेरी शीर्ष स्तर पर this का उपयोग करती है, यह अपेक्षा करते हुए कि this, module.exports के बजाय window को संदर्भित करता है।
ProvidePlugin Webpack का अंतर्निहित प्लगइन है जो निर्दिष्ट पहचानकर्ताओं के संदर्भ का पता चलने पर स्वचालित रूप से मॉड्यूल लोड करता है। कॉन्फ़िगरेशन एक ऑब्जेक्ट है जहाँ कुंजी वेरिएबल का नाम है, और मान मॉड्यूल का पथ और निर्यात किया गया फ़ील्ड है।
// webpack.config.js
const webpack = require('webpack');
module.exports = {
plugins: [
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery',
_: 'lodash',
'window.$': 'jquery',
}),
],
};
ProvidePlugin ऐरे सिंटैक्स के माध्यम से आंशिक आयात का समर्थन करता है। उदाहरण के लिए, [lodash, debounce] lodash से केवल debounce फ़ंक्शन आयात करता है, जिससे अंतिम बंडल का आकार कम होता है। यह मोबाइल प्रोजेक्ट्स के लिए विशेष रूप से महत्वपूर्ण है, जहाँ हर किलोबाइट लोड समय को प्रभावित करता है।
imports-loader मॉड्यूल की शुरुआत में आवश्यक आयात जोड़ता है, जबकि exports-loader उन मॉड्यूल्स के लिए निर्यात मान निर्धारित करता है जो module.exports का स्पष्ट रूप से उपयोग नहीं करते। ये लोडर अलग-अलग फ़ाइलों के स्तर पर काम करते हैं, न कि ProvidePlugin की तरह वैश्विक रूप से।
// webpack.config.js — imports-loader की सेटिंग
module.exports = {
module: {
rules: [
{
test: /legacy-module\.js$/,
use: [
{
loader: 'imports-loader',
options: {
imports: [
'jquery',
'$',
],
},
},
],
},
],
},
};
exports-loader का उपयोग तब किया जाता है जब लाइब्रेरी किसी ग्लोबल वेरिएबल को मान सौंपती है, लेकिन उसे मॉड्यूलर सिस्टम के माध्यम से निर्यात नहीं करती। लोडर मान निकालता है और उसे मॉड्यूलर निर्यात में बदल देता है, जिससे अन्य मॉड्यूल इसे import के माध्यम से आयात कर सकते हैं।
Shimming को webpack.config.js में प्लगइन्स और लोडर्स के संयोजन के माध्यम से कॉन्फ़िगर किया जाता है। विशिष्ट परिदृश्य में ग्लोबल वेरिएबल्स के लिए ProvidePlugin और विशेष मॉड्यूल्स के लिए imports-loader शामिल होता है, जिन्हें विज़िबिलिटी रेंज में बदलाव की आवश्यकता होती है।
const webpack = require('webpack');
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js',
globalObject: 'this',
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules\/(?!legacy-lib)/,
use: [
{
loader: 'imports-loader',
options: {
type: 'commonjs',
imports: ['jquery', '$'],
},
},
],
},
],
},
plugins: [
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery',
}),
],
};
output में globalObject फ़ील्ड शीर्ष स्तर पर this के संदर्भों के लिए संदर्भ निर्धारित करता है। ब्राउज़र वातावरण के लिए, 'this' मान window को संदर्भित करता है, जबकि React Native या Node.js के लिए — global को। सही मान का चयन लक्षित वातावरण में निष्पादन त्रुटियों को रोकता है।
Shimming एक शक्तिशाली लेकिन खतरनाक उपकरण है। गलत कॉन्फ़िगरेशन से बंडल में कोड का दोहराव, नामों के टकराव और अप्रत्याशित निष्पादन त्रुटियाँ होती हैं। डेवलपर्स अक्सर भूल जाते हैं कि ProvidePlugin कंपाइलेशन चरण में काम करता है और वेरिएबल्स के डायनामिक संदर्भों को संसाधित नहीं कर सकता।
यदि दो प्लगइन्स jQuery के विभिन्न संस्करणों का उपयोग करते हैं, तो ProvidePlugin केवल उनमें से एक को स्थानापन्न करेगा, जो कॉन्फ़िगरेशन में पहले निर्दिष्ट होता है। दूसरी लाइब्रेरी को एक असंगत संस्करण मिलेगा, जिससे डीबग करना कठिन त्रुटियाँ होंगी। समाधान — प्रत्येक लाइब्रेरी के लिए स्पष्ट संस्करण निर्दिष्ट करते हुए exports-loader का उपयोग करना या डुप्लिकेट मॉड्यूल्स को हटाने के लिए webpack.IgnorePlugin लागू करना है।
एक और सामान्य गलती — उन मॉड्यूल्स को shim करने का प्रयास है जो डायनामिक संदर्भ में CommonJS सिंक्रोनस require कॉल का उपयोग करते हैं। ProvidePlugin केवल स्टैटिक पहचानकर्ताओं को संसाधित करता है, इसलिए डायनामिक संदर्भों को मैन्युअल रूप से या NormalModuleReplacementPlugin का उपयोग करके बदलना आवश्यक है।
shimming की गलत सेटिंग से बंडल के आकार में महत्वपूर्ण वृद्धि हो सकती है। यदि ProvidePlugin दर्जनों ग्लोबल वेरिएबल्स के लिए कॉन्फ़िगर किया गया है, तो Webpack संबंधित आयातों को प्रोजेक्ट की सभी फ़ाइलों में डालेगा, भले ही वे वेरिएबल्स प्रत्येक विशेष फ़ाइल में उपयोग होते हों या नहीं। यह अतिरिक्त कोड बनाता है, विशेष रूप से हजारों मॉड्यूल वाली बड़ी परियोजनाओं में।
shimming की समस्याओं के निदान के लिए webpack-bundle-analyzer का उपयोग करें — बंडल की संरचना का विज़ुअलाइज़ेशन टूल। यदि jQuery या कोई अन्य लाइब्रेरी बंडल में कई बार दिखाई देती है, तो संभवतः विभिन्न संस्करण टकराते हैं या ProvidePlugin पैकेज के विभिन्न संस्करणों की ओर ले जाने वाले कई पहचानकर्ताओं के लिए कॉन्फ़िगर किया गया है। समाधान — resolve.alias के माध्यम से निर्भरताओं के संस्करणों को एकीकृत करना और यह सुनिश्चित करना कि सभी shim किए गए पहचानकर्ता एक ही मॉड्यूल को संदर्भित करते हैं।
shimming लागू करने से पहले, लाइब्रेरी को मॉड्यूलर सिस्टम का समर्थन करने वाले संस्करण में अद्यतन करने की संभावना का मूल्यांकन करें। कई legacy पैकेजों के आधुनिक विकल्प हैं जिन्हें shimming की आवश्यकता नहीं होती। उदाहरण के लिए, jQuery प्लगइन्स को ब्राउज़र के मूल API से बदला जा सकता है: $.ajax → fetch, $.each → Array.forEach। रिफैक्टरिंग रखरखाव में दीर्घकालिक लाभ देती है, जबकि shimming एक अस्थायी समाधान है जो कॉन्फ़िगरेशन को जटिल बनाता है।
यदि अद्यतन संभव नहीं है, तो NormalModuleReplacementPlugin पर विचार करें, जो सोर्स कोड को बदले बिना, रिज़ॉल्यूशन के स्तर पर एक मॉड्यूल को दूसरे से बदलने की अनुमति देता है। यह प्लगइन लोडर्स लागू होने से पहले, निर्भरता ग्राफ के निर्माण के चरण में काम करता है, और संदर्भ की परवाह किए बिना मॉड्यूल के सभी संदर्भों को संसाधित करता है। पूरी लाइब्रेरीज़ को बदलने के लिए यह बिंदुवार लोडर्स की तुलना में एक स्वच्छ समाधान है।
ब्राउज़रों में मूल ES मॉड्यूल्स के विकास और import maps के आगमन के साथ, कुछ shimming परिदृश्यों को Webpack के बिना हल किया जा सकता है। Import maps बिल्ड चरण के बिना, ब्राउज़र स्तर पर मॉड्यूल नामों को गतिशील रूप से पुनर्निर्देशित करने की अनुमति देते हैं। हालाँकि, यह दृष्टिकोण React Native और ब्राउज़र ESM के बिना अन्य वातावरणों में समर्थित नहीं है, इसलिए Webpack के माध्यम से shimming production बिल्ड्स के लिए प्रासंगिक बना हुआ है, जहाँ निर्भरताओं और उनके संस्करणों पर पूर्ण नियंत्रण की आवश्यकता होती है। Import maps और Webpack shims के बीच चुनाव लक्षित प्लेटफ़ॉर्म और पुराने ब्राउज़रों के साथ संगतता की आवश्यकताओं पर निर्भर करता है।
अक्सर पूछे जाने वाले प्रश्न
Shimming संगतता सुनिश्चित करने के लिए कोड जोड़ता है, जबकि tree shaking अप्रयुक्त कोड को हटाता है। ये तकनीकें उद्देश्य में विपरीत हैं: shimming बंडल का आकार बढ़ाता है, tree shaking घटाता है। Production बिल्ड में दोनों क्रमिक रूप से लागू होते हैं।
हाँ, shimming Webpack से स्वतंत्र एक तकनीक के रूप में मौजूद है — उदाहरण के लिए, HTML में ग्लोबल स्क्रिप्ट्स या पुनः निर्यात वाले ES मॉड्यूल्स के माध्यम से। हालाँकि, Webpack सबसे सुविधाजनक स्वचालन उपकरण प्रदान करता है: ProvidePlugin और लोडर, जिन्हें कोड में मैन्युअल बदलाव की आवश्यकता नहीं होती।
ProvidePlugin बिल्ड की गति को प्रभावित नहीं करता, क्योंकि यह AST कंपाइलेशन चरण में काम करता है। imports-loader और exports-loader प्रत्येक फ़ाइल के प्रसंस्करण में थोड़ा समय जोड़ते हैं। सैकड़ों फ़ाइलों पर उपयोग करने पर अंतर पूरे बिल्ड समय का 5–15% हो सकता है।
यदि सभी निर्भरताएँ ES मॉड्यूल्स और मॉड्यूलर सिस्टम का समर्थन करती हैं, तो shimming अनावश्यक है। shimming छोड़ने से कॉन्फ़िगरेशन सरल होता है, बंडल का आकार घटता है और नाम टकराव का जोखिम कम होता है। निर्भरताओं को caniuse.com पर जाँचने की अनुशंसा की जाती है।
TypeScript को shim किए गए वेरिएबल्स के लिए अतिरिक्त टाइप घोषणाओं की आवश्यकता होती है। declare const $: any जोड़ना या @types/jquery के माध्यम से टाइप्स स्थापित करना आवश्यक है। ProvidePlugin TypeScript कंपाइलेशन के बाद JavaScript स्तर पर आयात डालता है, इसलिए टाइप्स अलग से जाँचे जाते हैं।
निष्कर्ष
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें