Shimming: mohiyati, yondashuvlari va ishlash tamoyili

Muallif: IT Sectr Nashr etilgan: 2026-05-19 O'qish vaqti: 8 daq

Shimming — ma'lum global o'zgaruvchilar yoki API-larni kutayotgan modullar mosligini ta'minlash texnikasi. Webpack ekotizimida shimming ProvidePlugin, imports-loader va exports-loader orqali amalga oshiriladi va legacy kutubxonalarni ularning manba kodini o'zgartirmasdan ulash imkonini beradi. Webpack Documentation (2026) ma'lumotlariga ko'ra, shimming modul tizimini qo'llab-quvvatlamaydigan jQuery plaginlari va boshqa bog'liqliklarni integratsiya qilishning asosiy vositasi bo'lib qolmoqda.

Asosiy fikrlar

  • Shimming — yig'ishda modullar mosligini ta'minlash uchun global o'zgaruvchilar va API-larni almashtirish texnikasi.
  • ProvidePlugin kodda global o'zgaruvchiga murojaat aniqlanganda modulni avtomatik import qiladi.
  • imports-loader va exports-loader modullarning ko'rinish doirasini boshqaradi, ularning interfeyslarini qo'shadi yoki o'zgartiradi.
  • Shim polyfilldan shunisi bilan farq qiladiki, mavjud bo'lmagan funksionallikni amalga oshirmaydi, balki mavjud chaqiruvlarni yo'naltiradi.
  • Webpack qo'shimcha paketlar o'rnatishni talab qilmasdan shimming uchun o'rnatilgan mexanizmlarni taqdim etadi.

Shimming nima?

Shimming — modulning manba kodini o'zgartirmasdan kod va muhit o'rtasida moslik qatlamini joylashtiradigan dasturiy texnika. JavaScript yig'ish kontekstida shimming modul muhitida mavjud bo'lmagan global o'zgaruvchilarga (window.$, global.process) murojaat qiladigan modul muammosini hal qiladi.

Shim va polyfill: asosiy farqlar

Polyfill mavjud bo'lmagan funksionallikni noldan amalga oshiradi va muhitga yangi imkoniyatlar qo'shadi. Masalan, core-js eski brauzerlar uchun Array.prototype.flatMap qo'shadi. Shim esa mavjud chaqiruvlarni mavjud amalga oshirishlarga yo'naltiradi yoki kutilgan global obyektlarni almashtiradi. Webpackda ProvidePlugin global $ o'zgaruvchisiga murojaat uchraydigan har joyda avtomatik import $ from 'jquery' qo'shadi va kodda o'zgarish talab qilmaydi.

Asosiy farq maqsadda. Polyfill mavjud bo'lmagan narsani qo'shadi, shim esa mavjud kodni u ishlaydigan muhit bilan moslashtiradi. Ular orasida tanlov qanday muammo hal qilinayotganiga bog'liq: API yo'qligi yoki interfeyslarning mos kelmasligi.

Shimming Webpackda qanday ishlaydi

Webpack har bir modulni o'z ko'rinish doirasiga ega izolyatsiya qilingan birlik sifatida qayta ishlaydi. Agar kutubxona global jQuery o'zgaruvchisiga window.$ sifatida murojaat qilsa, modul kontekstida bu o'zgaruvchi mavjud bo'lmagani uchun yig'ish xato bilan tugaydi. ProvidePlugin muammoni kompilyatsiya bosqichida hal qiladi: kodda $ identifikatori aniqlanganda plagin fayl boshiga avtomatik import $ from 'jquery' qo'shadi.

js
// Manba kodi (legacy modul global jQuery-ga murojaat qiladi)
$('.element').hide();

// ProvidePlugin tomonidan qayta ishlangandan so'ng (Webpack import kiritadi)
import $ from 'jquery';
$('.element').hide();

Bundan tashqari, imports-loader modul qaysi bog'liqliklarni olishi kerakligini aniq ko'rsatishga imkon beradi. Bu, kutubxona this module.exportsga emas, balki windowga tegishli ekanini kutib, thisni eng yuqori darajada ishlatganda foydalidir.

ProvidePlugin: modullar uchun global o'zgaruvchilar

ProvidePlugin — belgilangan identifikatorlarga murojaat aniqlanganda modullarni avtomatik yuklaydigan Webpackning o'rnatilgan plagini. Konfiguratsiya obyektdan iborat: kalit o'zgaruvchi nomi, qiymat esa modulga yo'l va eksport qilinadigan maydon.

Plagin konfiguratsiyasi

js
// webpack.config.js
const webpack = require('webpack');

module.exports = {
  plugins: [
    new webpack.ProvidePlugin({
      $: 'jquery',
      jQuery: 'jquery',
      _: 'lodash',
      'window.$': 'jquery',
    }),
  ],
};

ProvidePlugin massiv sintaksisi orqali nuqtali importni qo'llab-quvvatlaydi. Masalan, [lodash, debounce] lodashdan faqat debounce funksiyasini import qiladi, bu esa yakuniy paket hajmini kamaytiradi. Bu har bir kilobayt yuklash vaqtiga ta'sir qiladigan mobil loyihalar uchun ayniqsa muhimdir.

imports-loader va exports-loader

imports-loader modul boshiga kerakli importlarni qo'shadi, exports-loader esa module.exportsni aniq ishlatmaydigan modullar uchun eksport qilinadigan qiymatlarni belgilaydi. Bu loaderlar ProvidePlugin kabi global emas, alohida fayllar darajasida ishlaydi.

imports-loader yordamida bog'liqliklarni tuzatish

js
// webpack.config.js — imports-loader sozlamalari
module.exports = {
  module: {
    rules: [
      {
        test: /legacy-module\.js$/,
        use: [
          {
            loader: 'imports-loader',
            options: {
              imports: [
                'jquery',
                '$',
              ],
            },
          },
        ],
      },
    ],
  },
};

exports-loader kutubxona qiymatni global o'zgaruvchiga tayinlaganda, lekin uni modul tizimi orqali eksport qilmaganda ishlatiladi. Loader qiymatni ajratib oladi va uni modul eksportiga aylantiradi, bu boshqa modullarga uni import orqali import qilish imkonini beradi.

Webpack konfiguratsiyasida shimmingni sozlash

Shimming webpack.config.jsda plaginlar va loaderlar kombinatsiyasi orqali sozlanadi. Odatdagi stsenariy global o'zgaruvchilar uchun ProvidePlugin va ko'rinish doirasini o'zgartirishni talab qiladigan aniq modullar uchun imports-loader bilan ishlashni o'z ichiga oladi.

Shimming uchun Webpackning asosiy konfiguratsiyasi

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 maydoni outputda eng yuqori darajadagi thisga murojaatlar uchun kontekstni belgilaydi. Brauzer muhiti uchun 'this' qiymati windowga, React Native yoki Node.js uchun esa globalga ishora qiladi. To'g'ri qiymatni tanlash maqsadli muhitda bajarish xatolarining oldini oladi.

Shimming paytida odatiy xatolar

Shimming — kuchli, ammo xavfli vosita. Noto'g'ri sozlash paketda kodning takrorlanishiga, nom ziddiyatlariga va kutilmagan bajarish xatolariga olib keladi. Dasturchilar ko'pincha ProvidePlugin kompilyatsiya bosqichida ishlashini va o'zgaruvchilarga dinamik murojaatlarni qayta ishlay olmasligini unutadi.

Global o'zgaruvchi ziddiyatlari

Agar ikkita plagin turli versiyadagi jQueryni ishlatsa, ProvidePlugin ulardan faqat bittasini, konfiguratsiyada birinchi ko'rsatilganini qo'shadi. Ikkinchi kutubxona mos kelmaydigan versiyani oladi va bu topish qiyin bo'lgan xatolarga sabab bo'ladi. Yechim — har bir kutubxona uchun exports-loaderni versiyani aniq ko'rsatib ishlatish yoki takrorlanuvchi modullarni chiqarib tashlash uchun webpack.IgnorePlugin qo'llash.

Yana bir keng tarqalgan xato — dinamik kontekstda CommonJS sinxron require chaqiruvlaridan foydalanadigan modullarni shimming qilishga urinish. ProvidePlugin faqat statik identifikatorlarni qayta ishlaydi, shuning uchun dinamik murojaatlarni qo'lda almashtirish yoki NormalModuleReplacementPlugindan foydalanish kerak.

Noto'g'ri shimmingda ishlash muammolari

Shimmingning noto'g'ri sozlanishi paket hajmining sezilarli darajada oshishiga olib kelishi mumkin. Agar ProvidePlugin o'nlab global o'zgaruvchilarga sozlangan bo'lsa, Webpack bu o'zgaruvchilar har bir aniq faylda ishlatilishidan qat'i nazar, loyihaning barcha fayllariga tegishli importlarni qo'shadi. Bu, ayniqsa, minglab modulli yirik loyihalarda ortiqcha kod yaratadi.

Shimming bilan bog'liq muammolarni tashxislash uchun webpack-bundle-analyzer — paket tarkibini vizuallashtiruvchi vositaning o'zidan foydalaning. Agar jQuery yoki boshqa kutubxona paketda bir necha marta paydo bo'lsa, ehtimol turli versiyalar ziddiyatda yoki ProvidePlugin paketning turli versiyalariga olib boradigan bir nechta identifikatorlarga sozlangan. Yechim — resolve.alias orqali bog'liqlik versiyalarini birlashtirish va barcha shimming qilingan identifikatorlar bitta modulga ishora qilishini tekshirish.

Shimmingga alternativalar: refaktoring va bog'liqliklarni yangilash

Shimmingni qo'llashdan oldin kutubxonani modul tizimini qo'llab-quvvatlaydigan versiyaga yangilash imkoniyatini baholang. Ko'pgina legacy paketlar shimming talab qilmaydigan zamonaviy alternativalarga ega. Masalan, jQuery plaginlarini brauzerning o'rnatilgan API-lari bilan almashtirish mumkin: $.ajaxfetch, $.eachArray.forEach. Refaktoring uzoq muddatli saqlash foydasini beradi, shimming esa konfiguratsiyani murakkablashtiradigan vaqtinchalik yechimdir.

Agar yangilash imkoni bo'lmasa, manba kodini o'zgartirmasdan bir modulni ikkinchisi bilan rezolyusiya darajasida almashtirishga imkon beradigan NormalModuleReplacementPluginni ko'rib chiqing. Bu plagin loaderlar qo'llanilishidan oldin, bog'liqlik grafigini qurish bosqichida ishlaydi va modulga barcha murojaatlarni kontekstdan qat'i nazar qayta ishlaydi. Bu butun kutubxonalarni almashtirish uchun nuqtali loaderlardan ko'ra toza yechimdir.

Zamonaviy JavaScriptda Shimming: ESM va import maps

Brauzerlarda o'rnatilgan ES modullarining rivojlanishi va import mapsning paydo bo'lishi bilan ba'zi shimming stsenariylarini Webpacksiz hal qilish mumkin. Import maps modul nomlarini yig'ish bosqichisiz, brauzer darajasida darhol qayta tayinlash imkonini beradi. Biroq bu yondashuv React Native va brauzer ESMiga ega bo'lmagan boshqa muhitlarda qo'llab-quvvatlanmaydi, shuning uchun Webpack orqali shimming bog'liqliklar va ularning versiyalari ustidan to'liq nazorat talab qilinadigan production yig'ishlari uchun dolzarb bo'lib qoladi. Import maps va Webpack shimlari o'rtasidagi tanlov maqsadli platformaga va eski brauzerlar bilan moslik talablariga bog'liq.

Tez-tez beriladigan savollar

Shimming tree shakingdan nima bilan farq qiladi?

Shimming moslikni ta'minlash uchun kod qo'shadi, tree shaking esa ishlatilmayotgan kodni olib tashlaydi. Bu texnikalar maqsadiga ko'ra qarama-qarshidir: shimming paket hajmini oshiradi, tree shaking kamaytiradi. Production yig'ishda ikkalasi ham ketma-ket qo'llaniladi.

Shimmingdan Webpaksiz foydalanish mumkinmi?

Ha, shimming Webpackdan mustaqil texnika sifatida mavjud — masalan, HTMLdagi global skriptlar yoki re-eksportli ES modullari orqali. Biroq Webpack eng qulay avtomatlashtirish vositalarini taqdim etadi: ProvidePlugin va qo'lda kod o'zgartirishni talab qilmaydigan loaderlar.

Shimming yig'ish unumdorligiga qanday ta'sir qiladi?

ProvidePlugin AST kompilyatsiyasi bosqichida ishlagani uchun yig'ish tezligiga ta'sir qilmaydi. imports-loader va exports-loader har bir faylni qayta ishlashga ozgina vaqt qo'shadi. Yuzlab fayllarda ishlatilganda farq to'liq yig'ish vaqtining 5–15% ni tashkil qilishi mumkin.

Qachon shimmingdan voz kechish kerak?

Agar barcha bog'liqliklar ES modullarini va modul tizimini qo'llab-quvvatlasa, shimming ortiqcha. Shimmingdan voz kechish konfiguratsiyani soddalashtiradi, paket hajmini kamaytiradi va nom ziddiyatlari xavfini pasaytiradi. Bog'liqliklarni caniuse.com saytida tekshirish tavsiya etiladi.

Shimming TypeScript bilan qanday ishlaydi?

TypeScript shimming qilingan o'zgaruvchilar uchun qo'shimcha tip deklaratsiyalarini talab qiladi. declare const $: any qo'shish yoki tiplarni @types/jquery orqali o'rnatish kerak. ProvidePlugin importlarni TypeScript kompilyatsiyasidan so'ng JavaScript darajasida qo'shadi, shuning uchun tiplar alohida tekshiriladi.

Xulosalar

  • Shimming — global o'zgaruvchilar va API-larni almashtirish orqali modullarning muhit bilan mosligini ta'minlash texnikasi.
  • ProvidePlugin kodda belgilangan identifikatorlarga murojaat aniqlanganda modullarni avtomatik import qiladi.
  • imports-loader aniq fayllar boshiga importlar qo'shadi, exports-loader esa eksport qilinadigan qiymatlarni belgilaydi.
  • Shim polyfilldan shunisi bilan farq qiladiki, funksionallikni amalga oshirmaydi, balki chaqiruvlarni mavjud amalga oshirishlarga yo'naltiradi.
  • ProvidePlugin kompilyatsiya bosqichida ishlaydi va o'zgaruvchilarga dinamik murojaatlarni qayta ishlamaydi.
  • globalObject maydoni outputda maqsadli muhitda eng yuqori daraja uchun to'g'ri kontekstni belgilaydi.
  • Shimmingdan faqat zamonaviy modul tizimini qo'llab-quvvatlamaydigan modullar uchun foydalaning va ES modullari to'liq qo'llab-quvvatlanganda undan voz keching.

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing