Polyfill va transpilyatorlar
JavaScript tili muntazam rivojlanadi โ har yili yangi imkoniyatlar qo'shiladi. Ammo bu yangiliklar barcha (ayniqsa eski) brauzerlarda darhol ishlamaydi. Ular bilan ishlash uchun ikki asosiy vosita bor: transpilyatorlar va polyfill'lar.
Muammo: yangi til, eski brauzerlar
Aytaylik, biz zamonaviy sintaksisdan foydalanamiz โ masalan, "nullish coalescing" operatori ??. Yangi brauzerlar buni tushunadi, lekin eskilari xato beradi. Bizga kodni eski brauzerlar ham tushunadigan holatga keltirish kerak.
// zamonaviy kod (eski brauzerlar tushunmaydi)
let balandlik = kirim ?? 100;
Transpilyatorlar
Transpilyator (transpiler) โ bir kodni o'qib, uni boshqa (odatda eskiroq) sintaksisga qayta yozib beradigan maxsus dastur. Eng mashhur JavaScript transpilyatori โ Babel.
Babel yuqoridagi zamonaviy kodni eski brauzerlar tushunadigan shaklga o'giradi:
// transpilyatsiyadan OLDIN (zamonaviy)
let balandlik = kirim ?? 100;
// transpilyatsiyadan KEYIN (eski sintaksis)
let balandlik = (kirim !== undefined && kirim !== null) ? kirim : 100;
Odatda dasturchi Babel'ni build tizimi (masalan, webpack) ichida ishlatadi. Har safar kod o'zgarganda, build tizimi avtomatik ravishda transpilyatsiyani ishga tushiradi.
Polyfill'lar
Ba'zi yangiliklar โ bu sintaksis emas, balki tilga qo'shilgan yangi funksiyalar. Masalan, Math.trunc(x) โ sonning kasr qismini olib tashlaydigan funksiya. Eski dvigatellarda bu funksiya umuman mavjud emas.
Polyfill โ bu yetishmayotgan funksiyaning o'rnini to'ldiradigan ("yamaydigan") kod. U funksiya mavjudligini tekshiradi va bo'lmasa, uni qo'lda qo'shadi:
// Math.trunc uchun oddiy polyfill
if (!Math.trunc) { // agar funksiya yo'q bo'lsa
Math.trunc = function(number) {
// Math.ceil salbiy, Math.floor musbat sonlar uchun
return number < 0 ? Math.ceil(number) : Math.floor(number);
};
}
Endi kodimizni ishlatishdan oldin bu polyfill yuklansa, eski brauzerda ham Math.trunc ishlaydi. Yangi brauzerlarda esa if sharti false bo'lgani uchun polyfill hech narsa qilmaydi.
core-js
Har bir funksiya uchun polyfill'ni qo'lda yozish mumkin emas. Shuning uchun tayyor polyfill to'plamlari bor. Eng mashhuri โ core-js. U yuzlab zamonaviy funksiyalarni eski muhitlar uchun to'ldiradi.
- core-js โ keng qamrovli polyfill kutubxonasi (masalan,
Promise,Array.from,Object.entriesva h.k.); - U modullarga bo'lingan โ faqat kerakli qismini ulash mumkin, bu esa hajmni kamaytiradi;
- Odatda Babel bilan birgalikda ishlatiladi.
Transpilyator va polyfill โ farqi
Ikki vositani chalkashtirmaslik uchun:
- Transpilyator โ yangi sintaksisni eski shaklga o'giradi (masalan,
=>,??,let/const); - Polyfill โ yetishmayotgan funksiya/metodlarni qo'shadi (masalan,
Promise,Math.trunc).
Xulosa
- Zamonaviy JavaScript hamma brauzerlarda darhol ishlamaydi;
- Transpilyator (Babel) yangi sintaksisni eski shaklga o'giradi;
- Polyfill yetishmayotgan funksiyalarni qo'shadi;
- core-js โ tayyor polyfill'lar to'plami, odatda Babel bilan birga ishlatiladi.