Shimming: mahiyyəti, yanaşmaları və iş prinsipi

Müəllif: IT Sectr Dərc olunub: 2026-05-19 Oxuma vaxtı: 8 dəq

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 — yığımda modulların uyğunluğunu təmin etmək üçün qlobal dəyişənləri və API-ləri əvəz edən texnikadır.
  • ProvidePlugin kodda qlobal dəyişənə müraciət aşkar edildikdə modulu avtomatik idxal edir.
  • imports-loaderexports-loader modulların görünmə sahəsini idarə edir, onların interfeyslərini əlavə edir və ya dəyişdirir.
  • Shim polyfill-dən onunla fərqlənir ki, çatışmayan funksionallığı reallaşdırmır, mövcud çağırışları istiqamətləndirir.
  • Webpack əlavə paketlər quraşdırmadan shimming üçün daxili mexanizmlər təqdim edir.

Shimming nədir?

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.

Shim və polyfill: əsas fərqlər

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.

Shimming Webpack-də necə işləyir

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.

js
// 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: modullar üçün qlobal dəyişənlə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.

Plaginin konfiqurasiyası

js
// 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 və exports-loader

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.

imports-loader vasitəsilə asılılıqların düzəldilməsi

js
// 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.

Webpack konfiqurasiyasında shimming-in qurulması

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.

Shimming üçün Webpack-in əsas konfiqurasiyası

js
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 zamanı tipik səhvlə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.

Qlobal dəyişən konfliktləri

İ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.

Səhv shimming zamanı performans problemləri

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-in alternativləri: refaktoring və asılılıqların yenilənməsi

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: $.ajaxfetch, $.eachArray.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.

Müasir JavaScript-də Shimming: ESM və import maps

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 tree shaking-dən nə ilə fərqlənir?

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.

Shimming-dən Webpack olmadan istifadə etmək olarmı?

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.

Shimming yığımın performansına necə təsir edir?

ProvidePlugin AST kompilyasiyası mərhələsində işlədiyi üçün yığım sürətinə təsir etmir. imports-loaderexports-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.

Nə vaxt shimming-dən imtina etməliyəm?

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.

Shimming TypeScript ilə necə işləyir?

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

  • Shimming — qlobal dəyişənlərin və API-lərin əvəz edilməsi vasitəsilə modulların mühitlə uyğunluğunu təmin edən texnikadır.
  • ProvidePlugin kodda müəyyən identifikatorlara müraciət aşkar edildikdə modulları avtomatik idxal edir.
  • imports-loader konkret faylların əvvəlinə importlar əlavə edir, exports-loader isə ixrac edilən qiymətləri müəyyən edir.
  • Shim polyfill-dən onunla fərqlənir ki, funksionallığı reallaşdırmır, çağırışları mövcud reallaşdırmalara istiqamətləndirir.
  • ProvidePlugin kompilyasiya mərhələsində işləyir və dəyişənlərə dinamik müraciətləri emal etmir.
  • globalObject sahəsi output-da hədəf mühitdə ən yuxarı səviyyə üçün düzgün konteksti müəyyən edir.
  • Shimming-dən yalnız müasir modul sistemini dəstəkləməyən modullar üçün istifadə edin və ES modullarının tam dəstəyi olduqda ondan imtina edin.

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.

Layihəni müzakirə et

Həm də oxuyun