Shimming — müəyyən qlobal dəyişənləri və ya API-ləri gözləyən modulların uyğunluğunu təmin edən texnikadır. Webpack ekosistemində shimming ProvidePlugin, imports-loader və exports-loader vasitəsilə həyata keçirilir və legacy kitabxanaların mənbə kodunu dəyişmədən qoşulmasına imkan verir. Webpack Documentation (2026)-ya görə, shimming modul sistemini dəstəkləməyən jQuery plaginləri və digər asılılıqların inteqrasiyası üçün əsas alət olaraq qalır.
Əsas məqamlar
Shimming — modulun mənbə kodunu dəyişmədən kodla mühit arasında uyğunluq qatı yerləşdirən proqram texnikasıdır. JavaScript yığımı kontekstində shimming modul mühitində olmayan qlobal dəyişənlərə (window.$, global.process) müraciət edən modul problemi həll edir.
Polyfill çatışmayan funksionallığı sıfırdan reallaşdırır və mühitə yeni imkanlar əlavə edir. Məsələn, core-js köhnə brauzerlər üçün Array.prototype.flatMap əlavə edir. Shim isə mövcud çağırışları mövcud reallaşdırmalara istiqamətləndirir və ya gözlənilən qlobal obyektləri əvəz edir. Webpack-də ProvidePlugin qlobal $ dəyişəninə müraciət olan hər yerdə avtomatik import $ from 'jquery' əlavə edir və kodda dəyişiklik tələb etmir.
Əsas fərq məqsəddədir. Polyfill olmayanı əlavə edir, shim isə mövcud kodu işlədiyi mühitlə uyğunlaşdırır. Onların arasında seçim hansı problemin həll olunduğundan asılıdır: API-nin olmaması və ya interfeyslərin uyğunsuzluğu.
Webpack hər modulu öz görünmə sahəsi olan izolyasiya edilmiş vahid kimi emal edir. Kitabxana qlobal jQuery dəyişəninə window.$ kimi müraciət edərsə, modul kontekstində bu dəyişən olmadığı üçün yığım xəta ilə başa çatacaq. ProvidePlugin problemi kompilyasiya mərhələsində həll edir: kodda $ identifikatoru aşkar edildikdə plagin faylın əvvəlinə avtomatik import $ from 'jquery' əlavə edir.
// Mənbə kodu (legacy modul qlobal jQuery-yə müraciət edir)
$('.element').hide();
// ProvidePlugin tərəfindən işləndikdən sonra (Webpack import əlavə edir)
import $ from 'jquery';
$('.element').hide();
Əlavə olaraq imports-loader modulun hansı asılılıqları almalı olduğunu açıq şəkildə göstərməyə imkan verir. Bu, kitabxana this-in module.exports-ə deyil, window-a aid olduğunu gözləyərək this-i ən yuxarı səviyyədə istifadə etdikdə faydalıdır.
ProvidePlugin — müəyyən identifikatorlara müraciət aşkar edildikdə modulları avtomatik yükləyən Webpack-in daxili plaginidir. Konfiqurasiya obyektdir: açar dəyişənin adı, qiymət isə modula yol və ixrac olunan sahədir.
// webpack.config.js
const webpack = require('webpack');
module.exports = {
plugins: [
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery',
_: 'lodash',
'window.$': 'jquery',
}),
],
};
ProvidePlugin massiv sintaksisi vasitəsilə nöqtəli idxalı dəstəkləyir. Məsələn, [lodash, debounce] lodash-dan yalnız debounce funksiyasını idxal edir və bu, son paketin ölçüsünü azaldır. Bu, hər kilobaytın yüklənmə vaxtına təsir etdiyi mobil layihələr üçün xüsusilə vacibdir.
imports-loader modulun əvvəlinə lazımi importları əlavə edir, exports-loader isə module.exports-i açıq istifadə etməyən modullar üçün ixrac edilən qiymətləri müəyyən edir. Bu loader-lər ProvidePlugin kimi qlobal deyil, ayrı-ayrı fayllar səviyyəsində işləyir.
// webpack.config.js — imports-loader konfiqurasiyası
module.exports = {
module: {
rules: [
{
test: /legacy-module\.js$/,
use: [
{
loader: 'imports-loader',
options: {
imports: [
'jquery',
'$',
],
},
},
],
},
],
},
};
exports-loader kitabxana qiyməti qlobal dəyişənə təyin etdikdə, lakin onu modul sistemi vasitəsilə ixrac etmədikdə istifadə olunur. Loader qiyməti çıxarır və onu modul ixracına çevirir ki, digər modullar onu import vasitəsilə idxal edə bilsin.
Shimming webpack.config.js-də plaginlər və loader-lərin kombinasiyası ilə konfiqurasiya olunur. Tipik ssenari qlobal dəyişənlər üçün ProvidePlugin və görünmə sahəsinin dəyişdirilməsini tələb edən konkret modullar üçün imports-loader-i əhatə edir.
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',
}),
],
};
globalObject sahəsi output-da ən yuxarı səviyyədə this-ə müraciətlər üçün kontekst müəyyən edir. Brauzer mühiti üçün 'this' qiyməti window-a, React Native və ya Node.js üçün isə global-a istinad edir. Düzgün qiymətin seçilməsi hədəf mühitdə icra xətalarının qarşısını alır.
Shimming güclü, lakin təhlükəli alətdir. Səhv konfiqurasiya paketdə kodun təkrarlanmasına, ad konfliktlərinə və gözlənilməz icra xətalarına gətirib çıxarır. Tərtibatçılar çox vaxt unudurlar ki, ProvidePlugin kompilyasiya mərhələsində işləyir və dəyişənlərə dinamik müraciətləri emal edə bilmir.
İki plagin müxtəlif versiyalı jQuery istifadə edirsə, ProvidePlugin yalnız konfiqurasiyada birinci göstərilənini əlavə edəcək. İkinci kitabxana uyğunsuz versiya alacaq və bu, çətin tapılan xətalara səbəb olacaq. Həll yolu — hər kitabxana üçün exports-loader-i versiyanı açıq göstərməklə istifadə etmək və ya təkrarlanan modulları istisna etmək üçün webpack.IgnorePlugin tətbiq etməkdir.
Digər geniş yayılmış səhv — dinamik kontekstdə CommonJS sinxron require çağırışlarından istifadə edən modulları shimming etmək cəhdidir. ProvidePlugin yalnız statik identifikatorları emal edir, buna görə də dinamik müraciətlər əl ilə əvəz edilməli və ya NormalModuleReplacementPlugin istifadə olunmalıdır.
Shimming-in səhv konfiqurasiyası paketin ölçüsünün əhəmiyyətli dərəcədə artmasına səbəb ola bilər. ProvidePlugin onlarla qlobal dəyişənə konfiqurasiya olunarsa, Webpack bu dəyişənlərin konkret faylda istifadə olunub-olmamasından asılı olmayaraq bütün layihə fayllarına müvafiq importları əlavə edəcək. Bu, xüsusilə minlərlə modulu olan böyük layihələrdə lazımsız kod yaradır.
Shimming problemlərini diaqnoz etmək üçün webpack-bundle-analyzer — paketin tərkibini vizuallaşdıran alətdən istifadə edin. jQuery və ya digər kitabxana paketdə bir neçə dəfə görünürsə, çox güman ki, müxtəlif versiyalar konflikt edir və ya ProvidePlugin paketin müxtəlif versiyalarına aparan bir neçə identifikatora konfiqurasiya olunub. Həll yolu — resolve.alias vasitəsilə asılılıq versiyalarını birləşdirmək və bütün shimm edilmiş identifikatorların eyni modulu göstərdiyini yoxlamaqdır.
Shimming tətbiq etməzdən əvvəl kitabxananı modul sistemini dəstəkləyən versiyaya yeniləmək imkanını qiymətləndirin. Bir çox legacy paketlərin shimming tələb etməyən müasir alternativləri var. Məsələn, jQuery plaginlərini brauzerin yerli API-ləri ilə əvəz etmək olar: $.ajax → fetch, $.each → Array.forEach. Refaktoring uzunmüddətli saxlanma qazancı verir, shimming isə konfiqurasiyanı çətinləşdirən müvəqqəti həll yolu sayılır.
Yeniləmə mümkün deyilsə, mənbə kodunu dəyişmədən bir modulu digəri ilə rezolyusiya səviyyəsində əvəz etməyə imkan verən NormalModuleReplacementPlugin-i nəzərdən keçirin. Bu plagin loader-lər tətbiq olunmazdan əvvəl asılılıq qrafikinin qurulması mərhələsində işləyir və modula bütün müraciətləri kontekstdən asılı olmayaraq emal edir. Bu, bütöv kitabxanaları əvəz etmək üçün nöqtəli loader-lərdən daha təmiz həll yoludur.
Brauzerlərdə yerli ES modullarının inkişafı və import maps-in yaranması ilə bəzi shimming ssenariləri Webpack olmadan həll oluna bilər. Import maps modul adlarını yığım mərhələsi olmadan brauzer səviyyəsində dərhal yenidən təyin etməyə imkan verir. Lakin bu yanaşma React Native və brauzer ESM-i olmayan digər mühitlərdə dəstəklənmir, buna görə də Webpack vasitəsilə shimming asılılıqlara və onların versiyalarına tam nəzarət tələb olunan production yığımları üçün aktual qalır. Import maps ilə Webpack shim-ləri arasında seçim hədəf platformadan və köhnə brauzerlərlə uyğunluq tələblərindən asılıdır.
Tez-tez verilən suallar
Shimming uyğunluğu təmin etmək üçün kod əlavə edir, tree shaking isə istifadə olunmayan kodu silir. Bu texnikalar məqsədinə görə əksdir: shimming paketin ölçüsünü artırır, tree shaking azaldır. Production yığımında hər ikisi ardıcıl olaraq tətbiq olunur.
Bəli, shimming Webpack-dən asılı olmayaraq texnika kimi mövcuddur — məsələn, HTML-də qlobal skriptlər və ya reeksportlu ES modulları vasitəsilə. Lakin Webpack ən rahat avtomatlaşdırma alətləri təqdim edir: ProvidePlugin və əl ilə kod dəyişikliyi tələb etməyən loader-lər.
ProvidePlugin AST kompilyasiyası mərhələsində işlədiyi üçün yığım sürətinə təsir etmir. imports-loader və exports-loader hər faylın emalına az miqdarda vaxt əlavə edir. Yüzlərlə faylda istifadə edildikdə fərq tam yığım vaxtının 5–15%-ni təşkil edə bilər.
Bütün asılılıqlar ES modullarını və modul sistemini dəstəkləyirsə, shimming artıqdır. Shimming-dən imtina konfiqurasiyanı sadələşdirir, paketin ölçüsünü azaldır və ad konflikti riskini aşağı salır. Asılılıqları caniuse.com saytında yoxlamaq tövsiyə olunur.
TypeScript shimm edilmiş dəyişənlər üçün əlavə tip bəyannamələri tələb edir. declare const $: any əlavə etmək və ya @types/jquery vasitəsilə tipləri quraşdırmaq lazımdır. ProvidePlugin importları TypeScript kompilyasiyasından sonra JavaScript səviyyəsində əlavə edir, buna görə də tiplər ayrıca yoxlanılır.
Nəticələr
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun