A Pinterest Progressive Web App Performance Case Study

Pinterestning yangi mobil veb-tajribasi - bu Progressive Web App. Ushbu postda biz mobil qurilmalarga tezkor yuklash bo'yicha ba'zi ishlarni ko'rib chiqamiz, bu esa JavaScript-ni to'g'ri saqlash va tarmoqning barqarorligi uchun xizmat ko'rsatuvchi ishchilarni qabul qilishdir.

O'zlarining yangi mobil saytlarini ko'rish uchun telefoningizdagi https://pinterest.com-ga kiring

Nega Progressive Web App (PWA)? Ba'zi tarix.

Pinterest PWA ularni xalqaro mobil aloqaga yo'naltirganligi sababli boshlandi, bu ularni mobil Internetga olib keldi.

Tasdiqlanmagan mobil veb-foydalanuvchilar uchun foydalanishni tahlil qilgandan so'ng, ular o'zlarining eski va sekin veb-tajribalari faqat 1% foydalanuvchilarni ro'yxatdan o'tishga, tizimga kirishga yoki mahalliy ilovalarni o'rnatishga aylantirishga muvaffaq bo'lishganini angladilar. Ushbu suhbat tezligini oshirish imkoniyati juda katta edi, bu ularni PWA-ga sarmoya kiritishga olib keldi.

Bir chorakda PWA qurish va etkazib berish

3 oy ichida Pinterest React, Redux va veb-paketlardan foydalangan holda o'zlarining mobil veb-tajribalarini tikladi. Ularning mobil veb-saytlarini qayta yozish asosiy biznes o'lchovlarida bir qator ijobiy yaxshilanishlarga olib keldi.

Sarflangan vaqt eski mobil veb-tajribaga qaraganda 40% ga, foydalanuvchi tomonidan yaratiladigan reklama daromadi 44% ga va asosiy bitimlar 60% ga o'sdi:

Ularning uyali veb-saytlarini qayta ishlash shuningdek, ishlashning bir necha yaxshilanishiga olib keldi.

3G orqali o'rtacha mobil qurilmalarga tezkor yuklash

Pinterest-ning eski mobil veb-tajribasi monolit edi - u CP-og'ir JavaScript-ning katta to'plamlarini o'z ichiga olgan bo'lib, bu Pin-sahifalarni tezda yuklash va interaktiv ishlashga imkon beradi.

Odatda, har qanday foydalanuvchi interfeysi umuman ishlatilmasligi uchun foydalanuvchilar 23 soniya kutishlari kerak edi:

Pinterest-ning eski mobil veb-sayti interaktiv bo'lishiga 23 soniya vaqt sarfladi. Ular 2,5MB dan oshiq JavaScript-ni yuboradi (asosiy to'plam uchun ~ 1.5MB, 1MB bemalol yuklanadi), bir necha soniya bosib, asosiy ip nihoyasiga yetguncha interfaol bo'lguncha kompilyatsiya qilinadi.

Ularning yangi mobil veb-tajribasi keskin yaxshilanishdir.

Ular nafaqat yuzlab KB-larni sindirib, JavaScript-ni o'chirib tashladilar va yadro to'plamlarining hajmini 650KB dan 150KB gacha tushirib yubordilar, ammo asosiy ko'rsatkichlar ko'rsatkichlarini yaxshiladilar. Birinchi ma'noli bo'yoq 4.2 dan 1.8s gacha, Interaktiv vaqt 23sdan 5.6sgacha qisqartirildi.

Bu o'rtacha 3G qurilmasi sekin 3G tarmoq ulanishi orqali. Takroriy tashriflarda vaziyat yanada yaxshi edi.

Servis ishchisining asosiy JavaScript, CSS va statik interfeys aktivlarini keshlashi tufayli ular takroriy tashriflarga interfaol vaqtni 3.9sgacha qisqartirishga muvaffaq bo'ldilar:

Pinterest sotuvchisi iOS va Android-ning ilovalari bo'lsa-da, ular ushbu dasturlarni Internetda yuklab olishning boshlang'ich narxidan ozgina miqdorda - shunchaki ~ 150KB minitlangan va gzplanlangan uy sharoitida etkazib berish tajribasini etkazib bera oldilar. Bu Android uchun ushbu tajribani taqdim etish uchun talab qilinadigan 9.6MB va iOS uchun 56MB bilan taqqoslanadi:

Shuni ta'kidlash kerakki, bu olma bilan olma taqqoslanmaydi. PWA talabga binoan yangi yo'nalishlar uchun kodni yuklaydi va qo'shimcha kod narxi dasturning amal qilish muddati davomida amortizatsiya qilinadi. Keyingi navigatsiyalar hali ham dasturni yuklab olish kabi katta xarajatlarni talab qilmaydi.

Pinterest-ning Firefox, Edge va Safari-dagi mobil qurilmalaridagi Progressive veb-ilovasi.

Yo'nalishga asoslangan JavaScript-ni chunking

Veb-sahifani yuklab olish va interaktiv xususiyatga ega bo'lish, faqatgina foydalanuvchiga oldindan kerak bo'lgan kodni yuklashdan foyda keltiradi. Bu tarmoq uzatish va JavaScript tahlil qilish / yozish vaqtini kamaytiradi. Kritik bo'lmagan manbalar kerak bo'lganda dangasa tarzda yuklanishi mumkin.

Pinterest juda ko'p megabaytli JavaScript to'plamlarini uchta yaxshi ishlaydigan veb-to'plam bo'limlarining uchta toifasiga bo'lish orqali ajratishni boshladi:

  • tashqi qaramlik (reaktsiya, redux, reaktsion yo'riqnoma va boshqalar) mavjud bo'lgan sotuvchi punkti ~ 73KB
  • Ilovani ko'rsatish uchun zarur bo'lgan ko'p kodni o'z ichiga olgan kirish zanjiri (ya'ni, umumiy libslar, sahifaning asosiy qobig'i, redux-do'konimiz) ~ 72KB
  • individual marshrutlarga tegishli kodni o'z ichiga olgan async marshrut bo'laklari ~ 13–18KB

Tajriba uchun tarmoq sharsharasi zarur hollarda kodni bosqichma-bosqich etkazib berishga o'tish monolit to'plamlarga ehtiyojni oldini olishni ta'kidlaydi.

Uzoq muddatli keshlash uchun Pinterest shuningdek har bir fayl nomiga xash-almashtirishni ishlatadi.

Pinterest veb-paketning CommonsChunkPlugin-dan foydalanib, o'zlarining keshlab bo'lmaydigan bo'laklariga etkazib beruvchi to'plamlarini ajratib oladi:

Shuningdek, ular tajribaga kodni ajratish uchun React Router-dan foydalanishdi:

Faqat maqsadli brauzerlarga kerak bo'ladigan narsalarni almashtirish uchun babel-preset-env-dan foydalaning

Pinterest-dan Babelning babel-preset-env-ni faqat ES2015 + xususiyatlarini ko'chirish uchun foydalaning, chunki ular maqsadga muvofiq zamonaviy brauzerlar tomonidan qo'llab-quvvatlanmaydi. Pinterest zamonaviy brauzerlarning so'nggi ikki versiyasiga yo'naltirilgan va ularning .babelrc sozlamalari quyidagicha:

Kerak bo'lsa, faqat shartli ravishda polifiller xizmatini ko'rsatish uchun qo'shimcha optimallashtirishlar mavjud (masalan, Safari uchun Internationalization API), ammo bu kelajak uchun rejalashtirilgan.

Webpack Bundle Analyzer yordamida yaxshilanish uchun tahlil xonasi

Webpack Bundle Analyzer - bu JavaScript to'plamlarida foydalanuvchilaringizga qanday bog'liqliklar yuborayotganingizni tushunish uchun juda yaxshi vositadir.

Quyida, Pinterest-ning ilgari qurilishi uchun juda ko'p binafsha, pushti va ko'k rangli bloklarni ko'rasiz. Bu marshrutlarni zo'rg'a yuklab olish uchun asenk tarkibiy qismlar.

Webpack Bundle Analyzer bu muammoni ularning barcha qismlari orasidagi o'lchov nisbatlarini vizualizatsiya qilishga yordam berdi.

To'plangan kodlar haqidagi ma'lumotlardan foydalangan holda, Pinterest qo'ng'iroq qilish imkoniyatiga ega bo'ldi. Ular asl nusxadagi kodlarning nusxalarini asosiy qismlariga o'tkazdilar. Bu kirish punkti hajmini 20% ga oshirdi, ammo barcha dadil yuklarni 90% ga kamaytirdi!

Tasvirni optimallashtirish

Pinterest PWA tarkibidagi dangasa yuklamalarning aksariyati cheksiz masonlar tarmog'i tomonidan boshqariladi. U virtualizatsiya va faqat ko'rinishda bo'lgan bolalarni ulash uchun o'rnatilgan qo'llab-quvvatlovchiga ega.

Pinterest shuningdek, PWA-dagi rasmlarga progressiv yuklash texnikasidan foydalanadi. Dastlab har bir PIN uchun ustun rangga ega to'ldiruvchi ishlatiladi. Pinli rasmlar har bir skanerlash orqali tasvir sifatini yaxshilaydigan Progressive JPEG sifatida xizmat qiladi:

Og'riq nuqtalarini reaktsiya qilish

Pinterest ushbu Masonry panjarasidan foydalanishning bir qismi sifatida React bilan ishlash bo'yicha ba'zi muammolarga duch keldi. O'rnatish va qismlarning katta daraxtlarini (masalan, ignalar) olib tashlash juda sekin bo'lishi mumkin. PIN-kod ichiga kiradigan juda ko'p narsa:

Pinterest-ni yozish paytida React 15.5.4-dan foydalanayotgan bo'lsa-da, ularning reaktsiyasi 16-reaktiv (Fiber) olib tashlash vaqtini qisqartirishga yordam beradi deb umid qilaman. Shu vaqt ichida, panjara virtualizatsiya qilish komponentni o'chirishga yordam berdi.

Pinterest shuningdek, birinchi pimlarni tezroq o'lchash / ko'rsatish uchun pinlarni o'rnatishni amalga oshiradi, lekin bu qurilmaning protsessorlari uchun ko'proq ish kerakligini anglatadi.

Navigatsiya o'tishlari

Hisoblangan ish faoliyatini yaxshilash uchun, Pinterest shuningdek, marshrutdan qat'iy nazar tanlangan navigatsiya paneli piktogrammalarining holatini yangilaydi. Bu tarmoqni blokirovka qilish tufayli sekinlik sezmaslik uchun bir yo'nalishdan ikkinchisiga navigatsiyani amalga oshirishga imkon beradi. Ma'lumotlar kelishini kutayotganimizda, foydalanuvchi tezda UI bo'yalgan rasmga ega bo'ladi:

Redux-dan foydalanish tajribasi

Pinterest-ning barcha API ma'lumotlari uchun normalizr-dan foydalaning (sxema bo'yicha o'rnatilgan JSON-ni normallashtiradi). Buni Redux DevTools orqali ko'rish mumkin:

Ushbu jarayonning salbiy tomoni shundaki, denormalizatsiya juda sekin, shuning uchun ular ko'rsatmalar paytida denormalizatsiyani eslab qolish uchun tanlangan tanlagich modeliga tayanadilar. Shuningdek, ular har doim yangilanishlarning katta hajmga olib kelmasligini ta'minlash uchun har doim eng past darajada tanovul qiladi.

Misol sifatida, ularning panjara elementlari ro'yxati shunchaki Pin tarkibiy qismining o'zini tanitmaydigan Pin identifikatorlari. Agar biron-bir PIN-kodda o'zgarishlar bo'lsa, to'liq panjara qayta ko'rsatilishi shart emas. Pinterest PWA-da Redux-ning juda ko'p abonentlari borligi, ammo bu muammolarni sezilarli darajada keltirib chiqarmaganligi.

Xizmatchilar bilan aktivlarni keshlash

Pinterest Workbox kutubxonalaridan ularning xizmatchilarini yaratish va boshqarish uchun foydalanadi:

Bugungi kunda Pinterest kesh-birinchi strategiyasidan foydalangan holda har qanday JavaScript yoki CSS to'plamlarini keshlaydi, shuningdek ularning foydalanuvchi interfeysini (dastur qobig'i) keshlaydi.

Birinchi keshni sozlashda, agar so'rov kesh yozuviga to'g'ri kelsa, u holda javob bering. Aks holda, manbani tarmoqdan olishga harakat qiling. Agar tarmoq so'rovi muvaffaqiyatli bo'lsa, keshni yangilang. Service Worker bilan keshlash strategiyalari haqida ko'proq bilish uchun Jeyk Archibaldning

Ular dastur qobig'i tomonidan yuklangan boshlang'ich to'plamlarni (veb-paketning ishlash vaqti, sotuvchi va kirishChunks) aniqligini aniqlaydi.

Pinterest bir nechta tillarni qo'llab-quvvatlaydigan dunyo miqyosidagi sayt bo'lganligi sababli, ular mahalliy to'plamlarga ishlov berish uchun mahalliy xizmatlarga ishchi konfiguratsiyasini yaratadilar. Pinterest shuningdek, yuqori darajadagi asinx marshrut paketlarini tozalash uchun veb-to'plamning nomlangan qismlaridan foydalanadi.

Ushbu ish bir necha kichikroq, iterativ bosqichlarda amalga oshirildi.

  • 1-chi: Pinterest-ning xizmat ko'rsatuvchi xodimi talabga binoan dangasa yuklangan skriptlarni ish vaqtida keshlashni amalga oshirdi. Buning sababi V8-ni kod keshlashdan foydalanish, ularni tezroq yuklab olishlari uchun qayta ko'rib chiqishda ba'zi tahlil qilish / tuzish narxini o'tkazib yuborishga yordam berish edi. Servis xodimi bo'lgan joyda saqlanadigan skriptlar xizmat xodimi hozir bo'lgan joyda kodni keshlashga katta kirishadi, chunki brauzer foydalanuvchi ushbu manbalarni takroriy ko'rishda foydalanishni yakunlashini biladi.
  • Shundan so'ng, Pinterest o'zlarining sotuvchilari va kirish bo'limlarini oldindan keshlashda davom etdilar.
  • Keyinchalik, Pinterest eng ko'p ishlatiladigan marshrutlarga (uy sahifasi, mix sahifasi, qidirish sahifasi va hk) murojaat qilishni boshladi.
  • Va nihoyat, ular mahalliy to'plamni keshlashlari uchun har bir til uchun xizmat ko'rsatuvchi ishchini yaratishni boshladilar. Bu nafaqat yuklarni takrorlash, balki ko'pchilik tinglovchilar uchun asosiy oflayn ko'rsatishni yoqish uchun ham muhim edi:

Shell dasturini qo'llash muammolari

Pinterest o'zlarining amaliy qobig'ini biroz murakkab deb topdi. Ish stoli davridagi ma'lumotlar kabel orqali ulanishi mumkinligi to'g'risidagi taxminlar tufayli, dastlabki yuklamalar juda katta bo'lgan, bunda foydalanuvchilarning tajriba guruhlari, foydalanuvchi ma'lumotlari, kontekstual ma'lumotlar va boshqalar.

Ular o'zlariga shunday savol berishlari kerak edi: “biz bu ma'lumotlarni dastur qobig'ida keshlab qo'yamizmi? yoki uni umuman olish uchun biron bir narsa taqdim etishdan oldin tarmoqni blokirovka qilish bo'yicha so'rovni to'g'ri bajaring ”.

Ular dastur qobig'ida keshlashga qaror qildilar, buning natijasida ba'zi vaqtlarda ilova qobig'ini bekor qilish (boshqarish, foydalanuvchi ma'lumotlarini sozlamalardan yangilash va hk) talab qilinadi. Har bir so'rov javobida "appversiya" mavjud - agar ilova versiyasi o'zgartirilsa, ular Xizmat ko'rsatuvchi xodimni ro'yxatdan o'chiradilar, yangisini ro'yxatdan o'tkazadilar, keyin keyingi yo'nalish o'zgarganda ular to'liq sahifani qayta yuklashadi.

Ushbu ma'lumotni ilova qobig'iga qo'shish biroz mushkulroq, ammo ko'rsatishni blokirovka qilish so'rovidan qochish kerak.

Lighthouse bilan tekshirish

Pinterest Lighthouse-dan ularning ishlashi yaxshilanganligini bir martalik tekshirish uchun foydalangan. Bu vaqtni doimiy ravishda interaktiv qilish kabi o'lchovlarga e'tibor berish uchun foydali edi.

Keyingi yil ular Lighthouse-ni sahifalar yuklarining tezkorligini tekshirish uchun regressiya mexanizmi sifatida ishlatishga umid qilishadi.

Kelajak

Pinterest shunchaki Web Push bildirishnomalarini qo'llab-quvvatladi va shuningdek, PWA uchun tasdiqlanmagan (tizimdan chiqqan) tajribasi ustida ishlamoqda.

Ular muhim paketlarni oldindan yuklash uchun yordamini o'rganishga va birinchi yuklanishda foydalanuvchilarga etkazib berilmagan JavaScript miqdorini kamaytirishga qiziqishmoqda. Kelgusida yanada ajoyib va ​​barkamol ishlarga tayyor bo'ling!

Zack Argile, YenWei Liu, Luna Ruan, Viktoriya Kvong, Imad Elyafi, Langtian Lang, Bekki Stoneman va Ben Finkelga Pinterest-dan Progressive veb-ilovasini ishga tushirish va ushbu yozuvni yozishda yordam berish uchun tabriklar bilan. Ushbu lavozimni sharhlaganlari uchun Jeffri Posnik va Zouxirga rahmat.