A Tinder Progressive Web App Performance Case Study

Yaqinda Tinder veb orqali surildi. Ularning yangi javob beradigan Progressive Web App - Tinder Online - ish stoli va mobil telefonlarda 100% foydalanuvchilar uchun mavjud, ular JavaScript ishlashini optimallashtirish usullarini, tarmoqning barqarorligi uchun xizmat ko'rsatuvchi ishchilarni va suhbatni faollashtirish uchun push-xabarlarni ishlatadilar. Bugun biz ularning veb-pardalarni o'rganish bo'yicha ba'zi narsalarni o'rganamiz.

Progressive veb-dasturiga sayohat

Tinder Online yangi bozorlarda asrab olishni, V1 Tinder tajribasini boshqa platformalarda sinab ko'rishni maqsad qilib qo'yishni boshladi.

PWA uchun MVP 3 oy vaqtni React-dan UI kutubxonasi va davlat boshqaruvida Redux sifatida foydalanishni amalga oshirdi. Ularning sa'y-harakatlarining natijasi - bu qimmatga tushadigan yoki ma'lumot etishmaydigan bozorda kimdir uchun investitsiya xarajatlarining 10 foizida asosiy Tinder tajribasini etkazib beradigan PWA:

Tinder Online va mahalliy ilovalar uchun ma'lumot-investitsiyalarni taqqoslash. 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.

Dastlabki belgilar mahalliy ilovaga nisbatan tez surish, xabar almashish va seans uzunligini ko'rsatadi. PWA bilan:

  • Foydalanuvchilar o'zlarining ilovalariga qaraganda Internetda ko'proq harakat qilishadi
  • Foydalanuvchilar o'zlarining ilovalariga qaraganda ko'proq Internetda xabarlar yuborishadi
  • Foydalanuvchilar mahalliy ilovalar bilan teng ravishda sotib olishadi
  • Foydalanuvchilar profillarni o'zlarining shaxsiy ilovalariga qaraganda ko'proq veb-saytlarda tahrirlashadi
  • Sessiya vaqtlari o'zlarining mahalliy ilovalariga qaraganda Internetda uzoqroq

Ishlash

Tinder Online mobil qurilmalari foydalanuvchilari o'zlarining veb-tajribalariga eng ko'p kiradilar:

  • Apple iPhone va iPad
  • Samsung Galaxy S8
  • Samsung Galaxy S7
  • Motorola Moto G4

Chrome foydalanuvchi tajribasi hisobotidan (CrUX) foydalanib, biz saytga kiradigan ko'pchilik foydalanuvchilar 4G ulanishda ekanliklarini bilib olamiz:

Eslatma: Rik Viscomi yaqinda PerfPlanet-da CrUX-ni taqdim etdi va Inian Parameshwaran rUXt-ni eng yaxshi 1M saytlar uchun ushbu ma'lumotlarni yaxshiroq vizualizatsiya qilish uchun qamrab oldi.

WebPageTest va Lighthouse-da (Galaxy S7 4G-da) yangi tajribani sinab ko'rish orqali biz ular 5 soniya ichida yuklay olamiz va interfaol bo'lamiz:

Ushbu protsedurani mobil protsessorlarida (Moto G4 kabi) yanada takomillashtirish uchun ko'p imkoniyatlar mavjud, bu ko'proq protsessor talab qiladi:

Tinder ularning tajribasini optimallashtirish ustida ishlamoqda va biz yaqin kelajakda ularning veb-ishlashi bo'yicha ishlashlari haqida eshitishni kutamiz.

Ish faoliyatini optimallashtirish

Tinder o'zlarining sahifalari tez yuklanishi va bir qancha texnik vositalar yordamida interaktiv bo'lishi mumkinligini yaxshilashga muvaffaq bo'ldi. Ular marshrutga asoslangan kodlarni ajratishni amalga oshirdilar, samaradorlik byudjetlarini va uzoq muddatli aktivlarni keshlashni taqdim etdilar.

Yo'nalish darajasidagi kodlarni ajratish

Dastlab Tinder katta, monolitik JavaScript to'plamlariga ega edi, bu ularning tajribasi qanchalik tez interaktiv bo'lishini kechiktirdi. Ushbu to'plamlarda asosiy foydalanuvchi tajribasini yuklash uchun zarur bo'lmagan, kodni ajratish yordamida parchalanib ketadigan kod mavjud edi. Odatda, faqat kema kodi foydalanuvchilariga kerak bo'lganda oldindan va dangasa yuklarni ishlatish kerak.

Buni amalga oshirish uchun Tinder React Router va React Loadable dasturlaridan foydalangan. Ularning ilovalari barcha marshrutlarni markazlashtirgan va ma'lumotni konfiguratsiya bazasi bilan ta'minlaganligi sababli, ular yuqori darajadagi kodlarni ajratishni amalga oshirish uchun to'g'ridan-to'g'ri yo'nalishni aniqladilar.

Qisqa bayoni; yakunida:

React Loadable - bu Jeyms Kayl tomonidan reaktsiyada tarkibiy-markazli kodlarni ajratishni osonlashtiradigan kichik kutubxona. Yuklanadigan - yuqori darajadagi tarkibiy qism (tarkibiy qism yaratadigan funktsiya), bu komponentlar darajasida to'plamlarni ajratishni osonlashtiradi.

Aytaylik, bizda ikkita "A" va "B" tarkibiy qismlar mavjud. Kodni ajratishdan oldin Tinder har bir narsani (A, B va hokazo) statik ravishda asosiy to'plamiga olib kirdi. Bu samarasiz edi, chunki bizga A va B darhol kerak emas edi:

Kodni ajratgandan so'ng, A va B komponentlarini kerak bo'lganda yuklash mumkin edi. Tinder buni o'zlarining JS-lariga reaktiv yuklanadigan, dinamik import () va veb-to'plamning sehrli sharh sintaksisini (dinamik qismlarni nomlash uchun) kiritish orqali amalga oshirdi:

"Ta'minotchi" (kutubxona) ni yig'ish uchun Tinder keng tarqalgan ishlatiladigan kutubxonalarni marshrutlar bo'ylab uzoq vaqt saqlanib turadigan bitta to'plam fayliga qadar ko'chirish uchun CommonsChunkPlugin veb-paketidan foydalandi:

Keyinchalik, Tinder boshqarish komponentidagi keyingi sahifaning potentsial manbalarini oldindan yuklash uchun React Loadable dasturining oldindan yuklashdan foydalangan:

Tinder shuningdek, xizmat ko'rsatish ishchilaridan marshrut darajalarining barcha to'plamlarini oldindan aniqlash va foydalanuvchilar asosiy to'plamga kod ajratmasdan kirishlari mumkin bo'lgan yo'nalishlarni kiritish uchun ham foydalangan. Albatta, ular UglifyJS orqali JavaScript minifikatsiya kabi umumiy optimallashtirishlardan ham foydalanadilar:

yangi veb-sahifa.optimize.UglifyJsPlugin ({
      parallel: haqiqiy,
      siqish: {
        ogohlantirishlar: yolg'on,
        screw_ie8: rost
      },
      manba xaritasi: SHOULD_SOURCEMAP
    }),

Ta'sir

Yo'nalishga asoslangan kodlarni ajratgandan so'ng, to'plamlarning asosiy o'lchamlari 166 Kbit dan 101 kB ga tushdi va DCL 5.46 dan 4.69s gacha yaxshilandi:

Uzoq muddatli aktivlarni keshlash

Veb-sahifa orqali statik manbalarni uzoq muddatli keshlashni ta'minlash [chunkhash] har bir faylga kesh-shtrix qo'shish uchun foydalidir.

Tinder bir nechta ochiq manbali (sotuvchi) kutubxonalardan qaramlik daraxtining bir qismi sifatida foydalangan. Ushbu kutubxonalardagi o'zgarishlar dastlab chunxashni o'zgartirishi va keshini bekor qilishi mumkin edi. Ushbu muammoni hal qilish uchun Tinder tashqi bog'liqliklarning oq ro'yxatini aniqlay boshladi va keshlashni yaxshilash uchun ularning veb-paketini asosiy tarmoqdan ajratib chiqardi. To'plam hajmi endi ikkala qism uchun ham 160 KB ni tashkil qiladi.

Kech topilgan manbalarni oldindan yuklash

Qayta tayyorlash sifatida, brauzerga tanqidiy, kech topilgan manbalarni yuklash bo'yicha deklarativ ko'rsatma. Bitta sahifali dasturlarda ushbu manbalar ba'zan JavaScript to'plamlari bo'lishi mumkin.

Asosiy tajriba uchun muhim bo'lgan muhim JavaScript / veb-to'plamlarni qayta yuklash uchun Tinder qo'llab-quvvatladi. Bu yuk vaqtini 1 sekundgacha qisqartiradi va birinchi bo'yoqni 1000 m dan 500 mm gacha qisqartiradi.

Ishlash byudjetlari

Tinder o'zlarining mobil telefonlarida ishlash maqsadlariga erishishda yordam berish uchun ishlash byudjetlarini qabul qildilar. Aleks Rassell ta'kidlaganidek: "Haqiqiy dunyoda ishlash byudjetlari", sizda o'rta 3G mobil qurilmalarida sekin 3G ulanishlarni ko'rib chiqishda tajriba etkazib berish imkoniyati cheklangan.

Tez kirish va interaktiv bo'lish uchun Tinder asosiy va sotuvchilar uchun ~ 155KB byudjetni, asinxron (charchagan) bo'limlar ~ 55KB va boshqa qismlar ~ 35KB ni tashkil qildi. CSS 20KB chegarasiga ega. Bu ular ishlashni takrorlashdan saqlanishlari uchun juda muhim edi.

Veb-to'plam to'plamini tahlil qilish

Webpack Bundle Analyzer sizga JavaScript to'plamlariga bog'liqlik grafigi qanday ko'rinishini aniqlashga imkon beradi, shunda optimallashtirish uchun past osilgan mevalar bor-yo'qligini bilib olasiz.

Tinder yaxshilanish sohalarini aniqlash uchun Webpack Bundle Analyzer-dan foydalandi:

  • Polyfills: Tinder o'zlarining tajribalari bilan zamonaviy brauzerlarga qaratilgan, ammo IE11 va Android 4.4 va undan yuqori versiyalarni qo'llab-quvvatlaydi. Poliffillar va translyatsiya qilingan kodlarni minimal darajaga etkazish uchun ular polyfills uchun babel-preset-env va core-js-dan foydalanadilar.
  • Kutubxonalardan yupqaroq foydalanish: Tinder o'rniga IndexedDB-dan foydalangan holda mahalliyForage dasturi saqlandi.
  • Yaxshiroq bo'linish: Birinchi bo'yoq / interfaol uchun kerak bo'lmagan qismlarni asosiy to'plamlardan ajratib oling
  • Kodni qayta ishlatish: bolalardan uch martadan ko'proq foydalaniladigan mavhum bo'laklarga asinxron umumiy qo'shiqlar yaratildi.
  • CSS: Tinder shuningdek tanqidiy CSS-ni asosiy to'plamlaridan olib tashladi (chunki ular server tomonida ishlashga o'tishgan va bu CSS-ni baribir etkazib berishgan).

To'plam tahlilidan foydalanish Webpack-ning Lodash Module Replading plaginidan ham foydalandi. Plagin modullarning xususiyat to'plamlarini noop, identifikatsiya yoki sodda alternativalarga almashtirish orqali kichikroq Lodash tuzilishini yaratadi:

Veb-to'plam to'plamini tekshirgichni Webpack konfiguratsiyangizga birlashtirish mumkin. Tinderning sozlanishi quyidagicha:

plaginlar: [
      yangi to'plamAnalyzerPlugin ({
        analyzerMode: 'server',
        analizatorPort: 8888,
        reportFilename: 'report.html',
        openAnalyzer: rost,
        generateStatsFile: yolg'on,
        statsFilename: 'stats.json',
        statsOptsiyalar: null
      })

JavaScript-ning ko'p qismi Redux Reducer va Saga Registrlarida me'morchilik o'zgarishisiz tarqalib ketadigan asosiy qismdir.

CSS strategiyasi

Qayta ishlatiladigan CSS uslublarini yaratish uchun Tinder Atomic CSS-dan foydalanadi. Ushbu atom CSS uslublarining barchasi boshlang'ich rasmda ko'rsatilgan va qolgan CSS jihozlar jadvallar jadvaliga (shu jumladan animatsiya yoki bazaviy / asl holatini tiklash) yuklangan. Tanqidiy uslublarning maksimal hajmi 20 kkzzzzzz ni tashkil qiladi, bunda eng so'nggi qurilishi <11KB ga to'g'ri keladi.

O'zgarganlarni kuzatib borish uchun Tinder har nashr uchun CSS statistikasi va Google Analytics-dan foydalanadi. Atomik CSS ishlatilishidan oldin, sahifani yuklashning o'rtacha vaqti ~ 6.75 edi. Ular ~ 5.75dan keyin.

Tinder Online shuningdek CSS-ni tahlil qilish va Can I Foydalanish qoidalari asosida sotuvchi prefikslarini qo'shish uchun PostCSS Autoprefixer plaginidan foydalanadi:

yangi veb-paket.LoaderOptionsPlugin ({
    sozlamalar: {
    kontekst: paths.basePath,
    chiqish: {yo'l: './'},
    kamaytirish: haqiqiy,
    pochta manzili: [
        avtoreferat ({
        brauzerlar: [
            'oxirgi 2 versiya',
            'emas, balki <11',
            'Safari> = 8'
        ]
        })
      ]
    }
}),

Ish vaqti

RequestIdleCallback () bilan muhim bo'lmagan ishni keyinga qoldirish

Ish vaqtini yaxshilash uchun Tinder tanqidiy bo'lmagan harakatlarni bo'sh vaqtga qoldirish uchun requestIdleCallback () dan foydalanishni tanladi.

requestIdleCallback (myNonEssentialWork);

Bunga asboblar mayoqlari kabi ishlar ham kiradi. Shuningdek, ular siljish paytida bo'yoq sonini kamaytirish uchun ba'zi HTML kompozit qatlamlarini soddalashtirdilar.

So'rish paytida asbob mayoqlari uchun requestIdleCallback () -dan foydalanish:

oldin ..

va keyin ..

Mustaqillikni oshirish

3-veb-paket + kengayish

Eski versiyalardagi veb-paketlarda, to'plamingizdagi har bir modul to'planganda, individual funktsiyalar yopiladi. Ushbu doka funktsiyalari brauzerda sizning JavaScript-ni sekinlashtirdi. 3-Webpack-da "qamrovni ko'tarish" joriy etildi - bu sizning barcha modullaringiz hajmini bitta o'chirishga bog'lash va brauzerda sizning kodingizga tezroq ishlashga imkon berish. Buni Module Concatenation plagin yordamida amalga oshiradi:

yangi veb-sahifa.optimize.ModuleConcatenationPlugin ()

Webpack 3-ning ko'tarilishi Tinder-ning birinchi JavaScript-ni tahlil qilish vaqtini 8% ga oshirdi.

16-reaktsiya

16-reaktsiya yaxshilandi, bu oldingi versiyalarga qaraganda React to'plamining hajmini kamaytirdi. Bu qisman yaxshiroq paketlash (Rollup-dan foydalangan holda) va hozirda foydalanilmagan kodni olib tashlash bilan bog'liq.

React 15-dan 16-reaktsiyaga yangilangan holda, Tinder o'zlarining etkazib beruvchilar punktlarining umumiy hajmini ~ 7 foizga kamaytirdi.

Reaktiv + reaksiya domining o'lchamlari ~ 50KB gzipe bo'lib ishlatilgan va hozir atigi ~ 35KB. Dan Abramov, Dominik Gannaway va Neyt Hunzakerlarga rahmat, ular React 16 to'plam hajmini qisqartirishda yordam berishdi.

Tarmoqning barqarorligi va aktivlarni oflayn rejimida keshlash uchun ish qutisi

Tinder shuningdek Workbox Webpack plaginini ham dastur qobig'i, ham asosiy, sotuvchi, manifest to'plami va CSS kabi asosiy aktivlarini keshlash uchun ishlatadi. Bu takroriy tashriflar uchun tarmoqning turg'unligini ta'minlaydi va foydalanuvchi keyingi tashriflar uchun qaytib kelganida dasturni tezroq ishga tushishini ta'minlaydi.

Imkoniyatlar

Source-map-explorer (to'plamni tahlil qilishning boshqa vositasi) yordamida Tinder to'plamlariga qazish, yuk hajmini kamaytirish uchun qo'shimcha imkoniyatlar mavjud. Kirishdan oldin Facebook rasmlari, bildirishnomalar, xabarlar va audio fayllar kabi tarkibiy qismlar olinadi. Bularni tanqidiy yo'ldan uzoqlashtirish asosiy to'plamdan 20% tejashga imkon beradi:

Kritik yo'ldagi yana bir bog'liqlik - bu 200 kb Facebook SDK skriptidir. Ushbu skriptni olib tashlash (kerak bo'lganda uni yuklab olish mumkin) dastlabki yuklash vaqtidan 1 soniyani tejashga qodir.

Xulosa

Tinder hanuzgacha Progressive Web App-da iteratsiya qilmoqda, ammo ular o'z mehnatlarining ijobiy samaralarini ko'rishni boshladilar. Tinder.com-ni tekshiring va yaqin kelajakda yanada rivojlanishga intiling!

Tinder Online-ni ishga tushirganligi va ushbu maqolaga qo'shgan hissasi uchun Roderick Xsiao, Jordan Banafsheha va Erik Xellenbrandga minnatdorchilik va tabriklar bilan. Ceyni Tsayga sharh bergani uchun tashakkur.

O'qish:

  • Pinterest PWA ishlashini o'rganish
  • "Treebo React & Preact" unumdorligi bo'yicha vaziyatni o'rganish
  • Twitter Lite va yuqori darajada ishlaydigan PWA-lar

Ushbu maqola Performance Planet-dan joylashtirilgan. Agar siz yangi reaktsiyaga kirishgan bo'lsangiz, men yangi boshlanuvchilar uchun reaktsiyani keng qamrovli boshlanish nuqtasini topdim.