Bizning kodimiz shunchaki * ENG ENG * emasmi?

Do'zax ichidagi 6 xafta davomida ko'rilganlar, men bamperlarga reaktsiya yozish uchun sarflaganman.

Men shunchaki reaktsiya yordamida Bamperlar veb-ilovasini to'liq yozdim. (Agar siz bamperlarning nima ekanligini bilmasangiz, bu telefoningizda audio hikoyalarni yozib olish / almashish uchun juda ajoyib dastur. Uni yuklab oling, u aslida butun hayotingizni yakunlaydi. Bu eng yaxshi ilova. Reaktsiyangizmi? Bu aniq.)

Qanday bo'lmasin, ushbu jarayon haqida mening barcha eslatmalarim, fikrlarim va boshqalar. (Men boshlashdan oldin o'qigan narsalarim). Umid qilamanki, undan biron narsa olasiz.

Kirish

XUDO. Men ramkalarni yomon ko'raman. Ko'p.

Men shuningdek, ramkaga ega bo'lmasligimdan nafratlanaman, va har kim o'zining "ramkasini" aylantiradi. Men umuman kodlashni yomon ko'raman. Va eng muhimi, men kod haqida yozishni yomon ko'raman.

Men bilan birga bo'linglar.

So'nggi paytlarda mening kodlash uslubim qandaydir sotsiopatik, nogiron bo'lgan o'z-o'zidan shubha uyg'otadigan narsalar va ekstremal kanye-xudo majmuasi o'rtasidagi tebranishdir. Men u erda yoki o'z aptam atrofida kun bo'yi yolg'iz yig'layapman yoki onamni ruxsat berishga chaqiraman. uning 30 yoshli o'g'lini “o'yinni yaxshi tashkil etish” ekanligini biladi. Shunday qilib, tabiiyki, dam olish va bu haqida yozish uchun yaxshi vaqt kabi tuyuldi.

(loyihaning hayot tarzi bilan bog'liq odatlar, qizil eslatmalar minasi) - https://medium.com/@iano/moral-over-a-project-lifecycle-975792b54c12#.uwkzt7x4v)

Reaktsiyani tanlash

Bir oz tarix: bamperlar "veb-sayti" juda yaxshi edi. Taxminan 7 es6 sinflari mavjud edi, tashqi qaramliklar yo'q edi va faqat 759 kod satrlari mavjud edi. Jami.

Uning sxemalari bizning Go ilovamiz tomonidan serverda namoyish etilgan. Biz postcsslardan foydalanardik. Bizda juda oddiy aktivlar katalogi bor edi, u erda biz barcha svglarimizni va ikkita yoki ikkita videoni joylashtirdik. Judaham zo'r bo'ldi. Biz javascript yozdik. Biz bu haqda unutdik.

Judaham zo'r bo'ldi. Biz javascript yozdik. Biz bu haqda unutdik.

Shu bilan birga, Nikolas Gallagher React-da Twitter-ning mobil-veb-mahsulotini qayta yozish loyihasini bir yil davomida yakunlagan jamoaning bir qismi edi.

Men Nikolani uzoq vaqtdan beri bilaman. Va u osonlikcha men biladigan o'ychan odamlardan biri. Shunday qilib, shundan keyin u menga "React" Front End Development kosmosidagi barcha muammolarni hal qilganini va boshqa narsalar haqida tashvishlanishni davom ettirganini aytganda, men unga f *** darhol murojaat qilishimni aytdim.

Nominal qiymati bo'yicha React quyidagi maqsadlarni ko'zlagan:

  • do'stlar tomonidan ma'qullanganlar, keyin men kabi Nikolas Gallagher, Aleks Makkaw, Gillermo Rauch
  • mijoz tomonida ishlash (audio ilovalar uchun juda yaxshi, shuning uchun navigatsiyani tinglashda davom etish mumkin)
  • o'ychan komponent modeli
  • odamlar CSS-dan uzoqlashayotgan edilar (yoki hech bo'lmaganda qiyin)
  • buni facebook nerds yozdi
  • instagram, twitter va boshqalar kabi ishlab chiqarish ilovalari undan foydalangan
  • Aftidan odamlar ma'lumotlar paradigmasini redux-ga joylashtirmoqdalar (va uni yoqtirish uchun)

Ammo, shu bilan birga, meni hayajonlantirmagan narsalarga munosabat bildiring:

  • Mening 700 qatorli javascript to'plamim ~ 1.5mb bo'lmoqchi edi
  • ishlab chiqarish server tomonida ishlash uchun tugun serveri kerak (va shunga qaramay echimlar yarim pishirilgan bo'lib tuyuladi)
  • Styling amaliyoti butun jamoada juda ajralib ketgan (siz afrodita, css-modullar, uslub teglaridan foydalanasizmi - sizning qaramligingiz haqida nima deyish mumkin?)
  • buni facebook nerds yozdi
  • veb-paket → babel → jsx → qizg'in yuklash → manbalar xaritalari → xrom asboblari, mening kambag'al mittim Macbook-ni ishdan chiqardi.
  • Reduxni o'rganish uchun ushbu "tuxumdon" videolarini ko'rishim kerak edi
  • asboblar xiralashgan va eng zo'r tuyuldi ...

Shunga qaramay, biz bunga borishga qaror qildik. (Asosiy umid reaktsiya qandaydir tarzda bizni ko'proq "app-y" deb hisoblaydigan narsani yaratishga imkon beradi).

"Qolganini" tanlash

O'zingizning munosabatingiz haqida qaror qabul qilganingizdan so'ng (aslida sizning qarashingiz), sizda bir nechta boshqa qarorlar qoladi: davlatni qanday boshqarish kerak? O'zingizning tarkibiy qismingizni qanday uslubda yaratmoqchisiz Siz es6-dan foydalanmoqchimisiz? es7? es2015? jsx? Bular nimani anglatadi? Veb-sahifadan foydalanmoqchimisiz? yoki browserify? Hamma narsa qaerda yashaydi? …

Men TJ Xolovaychukning qozonxona repo (https://github.com/tj/frontend-boilerplate/tree/master/client) ni birgalikda yig'ishni boshladim (u o'qishda asosan eskirganligini tan oladi) va Nikolay bu uzun elektron pochtani yozgan edi. menga twitter qayerga tushganligi to'g'risida (o'sha paytda yarmini tushunmadim, lekin nima bo'lishidan qat'iy nazar, siz elektron pochtani to'liq o'qishingiz mumkin: https://gist.github.com/fat/9ab5325ab39acfe242bc7849eb9512c4).

Men shuningdek, "universal reaktsiya-redux-glahblbhalkd" gitubadagi bir nechta qozonxonalarga qaradim, ammo ularning barchasi menga vahima hujumlarini keltirib chiqardi.

Qanday bo'lmasin, men qandaydir darajada mamnun bo'lgan joyga etib oldim:

  • Babel ("oldindan sozlash" bilan: ["es2015", "bosqich-0", "reaktsiya"]) Shunday qilib, men barcha tarqatish operatorlari, strelka funktsiyalari va boshqalar kabi aqldan ozgan yangi qismlardan foydalanishim mumkin.
  • Aniq ilova holatlarida uslubni yangilashda men o'zimni qulay deb bilgan issiq yuklagichlar bilan veb-paket. Ammo, albatta, menga juda ko'p tashvish tug'dirdi. Rostini aytsam, hech kim veb-sahifa qanday ishlashini aniq tushunmayotganday his qilaman. Va barchamiz shunchaki tasodifiy xususiyatlar va plaginlarni tashlashni davom ettiramiz, bu hammasi chiqadi. AgressivMergingPluginmi? aniq. VoqealarOrderPlugin? ok. DedupePlugin? yaxshi.
  • Redux api reaktsiyalarini buzish va keyinchalik qayta tiklashda yordam berish uchun normilzr va denormalizr bilan birlashadi.
  • Afrodita / ahamiyatsiz js uslublari, css emas, lekin hamma narsadan muhim! Hamma joyda muhim.
  • Svg-reaktsion tarkibiy qismlar sifatida yuklangan Svg-reaktsion yuklagich.
  • Agar siz qaramlik ro'yxatida boshqa nimani ko'rmoqchi bo'lsangiz, bir nechta boshqalar yozuv qoldiring va men buni tushuntirib beraman.

Katalog tuzilmasi

XOP. 38 ta qaramlik bumpers.fm-ga joylashib olganimdan so'ng, veb-sayt talab qilmaganida, haqiqiy kodni yozish vaqti keldi.

Bizning katalog tuzilmasi ikkita kirish joyida tashkil etilgan:

  • marshrutizatorni qo'zg'atadigan va bizning asosiy dastur to'plamimiz uchun saqlaydigan index.js.
  • bizning kichikroq ichki to'plamimiz uchun javob beradigan embed.js (sust, twitter, o'rta va hokazo).

U erdan biz yo'nalishlarimizni aniq nomlangan "marshrutizator" katalogidan tortib olamiz, va hozirda bu shunchaki oddiy, bitta reaktsion yo'riqnoma komponentlaridan iborat:

E'tibor bergan bo'lsangiz, ushbu marshrutlar biz "ekran konteynerlari" deb ataydigan narsaga ishora qiladi.

Bamperlarda bizning reaktsion tarkibiy qismlar aslida ularning funktsiyalariga qarab 3 xil kataloglarga bo'lingan (agar siz marshrutlar katalogini qo'shsangiz 4). Komponentlarni tashkil qilishning bunday usuli asosan to'g'ridan-to'g'ri Twitter-dan o'g'irlangan, menimcha, uni Facebook-dan va boshqa ko'plab loyihalardan olganman. Bu quyidagicha:

  • Bu erda bizning funktsional ui komponentlarimiz yashaydigan joy
  • konteynerlar bu erda bizning ui komponentlarimiz uchun harakatlarni amalga oshiruvchilar ishlaydi
  • texnik jihatdan ekranlar - bu shunchaki konteynerlar - lekin odatda ko'proq yuqori darajadagi sahifalarni yuklab olishni amalga oshiradilar va harakatlarni boshqarish bilan kamroq shug'ullanadilar.
Yon tomonda Eslatma, men aslida hech qanday "ekranlar" bo'lmagan konteynerlar katalogidan boshladim (bu reaktsion hamjamiyatda ko'rgan narsalarimdan juda keng tarqalgan). Men Nikolayning tavsiyasi bilan bu narsadan uzoqlashdim va "ekran" bo'lmagan "ekran" qo'shimchalari bilan aralashtirilgan bir nechta fayllarni ko'rib, do'zax meni bezovta qildi.

So'nggi ikkita kataloglar "do'kon" katalogi va "doimiylar" katalogidir. "Do'kon" bizning barcha mantiqiy mantiqiy harakatlarimiz, reduktorlar, selektorlar, api tugatish nuqtalari va hkzni o'z ichiga oladi (men ularni yanada chuqurroq o'rganaman), shu bilan birga "doimiylar" katalogida ... yaxshi ... konstantalar mavjud.

UI komponentlari

Bizning foydalanuvchi interfeysi komponentlari juda standart, funktsional, fuqaroligi yo'q, taqdimotchi, reaktiv komponentlardir. Mana bu epizodning standart komponenti (boshqa kichik, standart, funktsional, fuqaroligi yo'q, taqdimotchi, reaktiv komponentlardan tashkil topgan).

Yuqorida aytib o'tganimdek, biz CSS-ni yaratish uchun Xan akademiyasining Afroditaidan foydalanamiz.

Qisqa eslatma: Dasturni men "style-loader" to'plamidan foydalangan holda yozdim, ammo uning ishonchli server strategiyasini (oxirida men kashf etmoqchi bo'lgan narsa) ta'minlay olmasligi, men boshqa narsani sinab ko'rishim uchun etarli edi. (Shuningdek, men doim Reaktiv-Native deb o'ylaganman, bu Nikolya menga doimo eslatib turishi yaxshiroq edi, chunki u yozganligi uchun men mustaqil ravishda kelganman).

Shunga qaramay, mening uslublarimni javascript-ga yozish juda tabiiy holga keldi va yangi ES6 xususiyatlari yordamida uni juda oqlangan qilish mumkin edi.

Men Medium-da ishlaganimda qilgan ishimiz bilan o'xshash uslubga erisha oldim, tip o'lchamlarini, ranglar shkalalarini, zIndex shkalalarini va boshqalarni yaratdim va hatto men media so'rovlarimni o'zgaruvchilarga mavhumlashtirish uchun ES6-ning hisoblangan xususiyat nomlaridan foydalanish imkoniyatiga ega bo'ldim. .

Men kira olmagan narsalardan biri - barcha sinf nomlarimni, masalan, "quti" yoki "konteyner" yoki "asosiy" yoki "ildiz" deb nomlash edi. Men butun mahalliy miqyosdagi css meme-ni olaman, ammo bu xatolikning bahosiga to'g'ri keladi. Buning o'rniga, men aslida SuitCSS-da keltirilgan semantik nomlashga, javascript uchun biroz o'zgartirilgan ("-" o'rniga "_" -dan foydalangan holda) keldim. Amalda bu quyidagicha ko'rinardi:

Tezda ta'kidlab o'tadigan yana bir narsa, bizning barcha tegishli fayllar ularning tarkibiy kataloglarida joylashgan.

Uslublar to'g'ridan-to'g'ri svg-reaktsiya yuklovchi yordamida import qilinadigan tegishli svg aktivlari bilan birga style.js nomli alohida faylga joylashtirilgan. Buni bajarish tarkibiy qismlarni / xususiyatlarni o'chirishni juda osonlashtiradi va o'zingizga doimiy ravishda savol bermaslik kerak: kuting, menga hali ham bu css kerakmi? menga hali ham bu svg kerakmi?

Konteynerlar oralig'i

Rostini aytsam, men konteynerlar haqida ko'p narsa aytmoqchi emasman. Bu erda biz ekran / konteyner kataloglarini ajratishdan tashqari maxsus ish qilmayapmiz (men yuqorida aytib o'tgan edim).

Ammo men siz uchun yana bir rasm chizdim (voy, shu erdadir), chunki idishlar haqida ko'p gapira olmaganim uchun o'zimni yomon his qilardim. Va bu sizga dam olish uchun yaxshi vaqt bo'lgan deb o'yladim. Stretch?

Kechirasiz.

Do'kon

~ ALRIGHT ~. Ushbu do'kon bo'limi osongina uning "OWN ENTER" MAQOLASI bo'lishi mumkin, ammo men uni bosib o'tishga harakat qilaman ... shuning uchun men bilan birga bo'ling. Shuningdek, adolatli ogohlantirish - DENSE olish arafasida.

Yon tomonda E'tibor bergan bo'lsangiz, ehtimol siz redux bilan tanishmasangiz (http://redux.js.org/), mutlaqo nol ma'noga ega bo'lishi mumkin. Agar siz Redux haqida ko'proq ma'lumotga ega bo'lishni va uni reaktsion ilovalaringiz holatini boshqarish uchun ishlatishni xohlasangiz - men ushbu boshlang'ich qo'llanmalarni tekshirishni tavsiya etaman, ular bepul va ularning barchasi juda yaxshi deb o'ylashadi: https://egghead.io/courses/getting -boshlagan-redux

Bizning do'kon 4 ta yuqori darajadagi fayllardan iborat (men quyida ularning har birini batafsil ko'rib chiqaman, lekin shunchaki haqiqiy) ...

  • index.js - bizning do'konni boshlovchi
  • reduktor.js - turli xil ob'ektlardagi barcha reduktorlarni bitta ulkan "kombinatsiyalangan reduktorlar" usuliga tortadi
  • schema.js - bizning barcha normalizr modellarimiz
  • api.js - bizning do'konimiz uchun api yordamchisi

Bundan tashqari, bizning do'kon modellar atrofida tuzilgan, bunda foydalanuvchilar, ko'rsatmalar va boshqalar kabi kataloglar mavjud - bu an'anaviy redux yuqori darajadagi funktsiyalar kataloglari i /, reduktorlar /, selektorlar /, blahlardan ko'ra.

Albatta, bizda hali ham redux talab qiladigan harakatlar, reduktorlar va hokazolarning an'anaviy bo'linishi mavjud - ammo bu hozir fayl darajasida, uning namunaviy katalogida joylashtirilgan (chapdagi rasmdagi kengaytirilgan foydalanuvchi papkasini ko'rib chiqing). men aytmoqchi bo'lgan narsaning tasviri).

OKAY, lekin nima uchun? Ushbu dasturni yaratishda men doimo: "dang, men rn-user-larda ishlashni xohlayman" kabi so'zlarni aytadigan bo'lib qoldim va deyarli hech qachon: "dang, men bir vaqtning o'zida bir nechta reduktorni o'zgartirmoqchiman, shubhasiz xursandman" ularning barchasi ushbu massiv reduktorlar katalogida ".

Yon tomonda Eslatma: Men ushbu strategiyani birinchi marta qaerda ko'rganimni eslay olmayman ... lekin amin emasman. Agar siz buni qilgan yoki bilgan odamni bilsangiz, yozuv qoldiring va men buni odamlarga aytib berishdan xursand bo'laman. Bundan tashqari, menimcha ~ twitter shunga o'xshash narsani qiladi. Ammo men buni amalga oshirishim mumkin edi.

Ildiz darajasidagi fayllarning shaffof emasligi

Yaxshi, shuning uchun do'konning index.js (yuqorida qisqacha aytib o'tilgan) uchta asosiy vazifaga javob beradi:

  1. Oldindan olingan, ko'milgan ma'lumotlarni redux-do'konimizga import qilish va do'konning dastlabki holatini o'rnatish (Foydalanuvchi bumpers.fm/fat kabi biror narsaga kirganda, bizning dasturimiz oldindan aniqlanadi, shunda reaksiya ilova yuklanganda u darhol ma'lumotni yaratishi shart emas). foydalanuvchi ma'lumotlarini xhr so'rashi va buning o'rniga u sahifani tezda to'ldirishi mumkin).
  2. redux do'konini ildiz reduktorlarimiz bilan boshlash.
  3. zerikarli kabi o'rta vositalarni qo'llash, yo'riqnoma brauzer tarixiga, devtools va boshqalarga munosabat ...

Amalda, bularning barchasi quyidagi usulga o'xshash narsa bilan yakunlandi - ammo nima uchundir ko'p qayg'u keltirdim:

Endi keling, bizning reduktorlar.js faylimizga qisqacha to'xtalib o'tamiz, bu aslida bitta kombinatsiyalanganReducers usuli bo'lib, u bizning boshqa kataloglardan reduktorlarni tortib oladi va ularni sharsharali yirik gigant reduktor sifatida ochib beradi. tbqh, bu fayl juda zerikarli va men uni endigina index.js put-ga qo'ygan bo'lishim mumkin. qiya

Ammo! Bu erda ta'kidlash kerak bo'lgan narsa, bizning "ob'ektlar" reduktorimiz (yuqorida ko'rib chiqilgan) bizning do'konimiz keshi kabi ishlaydi.

Buni echish uchun biz normal joylashtirilgan (https://github.com/paularmstrong/normalizr) loyihadan foydalanib, chuqur joylashtirilgan JSON api javoblarimizni boshqariladigan / keshlanadigan ID-indekslangan ob'ektlarga majburlash uchun foydalandik. Aytish kerakki, biz api javobini an'anaviyroq javob bilan boshlaymiz va keyin uni saucier, ID indekslangan shaxs hashiga aylantiramiz:

Siz tasavvur qilganingizdek, bu keshlash usuli juda foydalidir ~ reaktsiya ilovasi bo'ylab harakatlanishni boshlaganda - siz biron bir epizodni keltirsangiz, ehtimol siz allaqachon foydalanuvchi (muallif sifatida) olgansiz, endi uni ID yordamida qidirishingiz mumkin. sizning tanlaganingizni urmasdan, selektor usullaridan biri (o'qing: deyarli bir zumda navigatsiya. voy).

Bizning sxema.js bizning keshimiz (va normalizatsiya) uchun yuqoridagi ob'ektni olib tashlash mantig'ini belgilaydigan joy. Ushbu munosabatlar xaritalarini yozish juda sodda, ammo unutish oson. Agar siz keshlarni qayta yo'naltirishga borishni istasangiz, ularga qarashga to'g'ri kelmaydi.

Yon tomoni Eslatma Yuqorida tasvirlanmagan, Schema.js shuningdek biz bamperlar uchun maxsus yozgan maxsus mergeStrategy-ni ham o'z ichiga oladi. Qanday bo'lmasin, normalizr tomonidan taqdim etilgan "mergeStrategy" o'z-o'zidan o'tib ketayotgan edi, lekin men bu erga kirmoqchi emasman, chunki bu deyarli foydalanuvchi xatosi edi . (Agar shunga o'xshash muammolarga duch kelsangiz, yozuv qoldiring va men qaerga borganimizni baham ko'rganimdan xursandman.)

Do'kon katalogidagi eng so'nggi faylimiz api.js.

Boshimni juda ko'p urganimdan so'ng, men (async harakatlariga tayanadigan) o'rta dasturlar sizning barcha qo'shimcha harakatlaringizga qo'shimcha ravishda (jo'natish va getState-ning yuqori qismida) qo'shimcha dalillarni o'tkazishga imkon berishini payqadim.

Buni do'kondan eslang / index.js

Bu juda kuchli va men uni butun harakatlarimizga global api yordamchisini berish uchun ishlatdim. Ushbu api yordamchi (api.js bilan belgilangan) barcha api tugatish nuqtalariga tezkor kirishni ta'minlaydi, JSON-ni tahlil qilish, xatolarni tekshirish va boshqa qo'shimcha yordamchilar bilan. Buni… harakat… fayllarga kirganimizda, quyida amalda ko'rasiz ...

Kamaytiruvchilar

Redux reduktorlarimiz uchta asosiy funktsiyaga ega bo'ldilar.

  1. Dastlabki holatni aniqlang
  2. PreloadData ishlov beruvchisini aniqlang (o'rnatilgan ma'lumotlar uchun)
  3. Amalni qayta ishlaydigan reduktorlarni namoyish qiling

Bizning boshlang'ich holatimiz ko'pincha shunga o'xshash ko'rinadi, so'rov holati va faol identifikatorning statusi uchun doimiy va doimiy:

Oldindan yuklaydigan ishlov beruvchilar bizning dastlabki ma'lumot ob'ektlarimizni olib ketishadi va ma'lumotlar omborlarini olib tashlash, bu holda standart faol foydalanuvchi o'rnatish:

Va odatiy reduktor shunga o'xshash ko'rinadi (hisoblangan mulk nomlaridan foydalanishga e'tibor bering (Es2015). Biz buni quyida keltirilgan harakat ta'riflaridan to'g'ridan-to'g'ri olib chiqamiz).

Harakatlar

Bizning harakatlar faylimizda ba'zi sehrli narsalar ro'y beradi. Avval biz harakat nomlarini aniqlash uchun "redux-action" createActions usulidan foydalanamiz:

Buni biz reduktorlar faylida (yuqorida aytib o'tilgan) hisoblangan mulk nomlaridan foydalanishimiz mumkin, chunki bizning harakatlarimiz nomlari bitta joyda aniqlanishi kerak. Shuningdek, o'z harakatlarimizni qanday nomlashimiz usulini ko'rib chiqing: method + object + property. Bu barcha reduktor tugmachalarini o'qilishi va noyobligi uchun juda muhimdir. Men Internetda dangasa, umumiy ismlar "foydalanuvchi nomi" yoki "sozUsername" kabi tugmachalar uchun ishlatadigan ko'plab misollarni ko'rdim ... ishonch, agar shunday qilsangiz, haqiqiy yomon vaqtni boshdan kechirasiz (esingizdami, kalitlar global va nomlash mojarolaridan kelib chiqadigan xatolar - bu kuzatib borish uchun muhim vosita).

Async harakatlari uchun biz yuqorida aytib o'tgan reduksion va api yordamchisidan foydalanamiz. Bu bizning asink usullarimizni juda qattiq va diqqatli bo'lishga yordam beradi.

Yuqoridagi misolda biz foydalanuvchi ob'ekti ustida isFet ni o'rnatdik, api-ga so'rovni yuboramiz, xato holati kodi uchun javobni tekshiramiz, jwt tokenimizni o'rnatamiz, json-ga javobni o'zgartiramiz, normalizr-dan foydalanib javobni normalizatsiya qilamiz (keshlash uchun) , keyin faol foydalanuvchi holatini o'rnating.

Bu men ilgari ko'rgan redux-da asinx usulini qo'llashning eng toza usuli (meni emas).

Yakuniy nuqtalar

Men ushbu so'nggi nuqta fayllarini boshqa hech kim bilan ko'rayotganini ko'rmadim - lekin men barcha tegishli api qo'ng'iroqlarini bir joyda yashab turishning toza usulini topdim (eslamasangiz stubing sinovlari juda oson). Shuningdek, "izomorf-fetch" ga e'tibor bering - bir kun kelib biz bu narsalarni serverda namoyish qilamiz. Shu bilan birga, xom ashyoni ishlatishning yoqimli tomoni shundaki, bu va'da beradi va bizning asinx harakatlarimizga kirishganda juda toza api qiladi.

Tanlovchilar

Nihoyat, bizning tanlagan faylimiz keshimizdan ishlaydigan ma'lumotlarni qayta qurish uchun denormalizr kutubxonasidan (https://github.com/gpbl/denormalizr) foydalanadi (normalizrning singlisi loyihasi). Asosan nomlangan modellarni katta ichki ob'ektni rekonstruktsiya qilish uchun ishlatadi - sizda buni qilish shart emas ~ lekin men ma'lumotlar bilan shu tarzda ishlash juda ham yoqimli / oldindan aytib bo'ladigan deb topdim.

Bulardan tashqari, bizning selektsion usullarimiz kutganingiz kabi juda yaxshi:

Xulosa

QOYIL. Yaxshi, bu jiddiy sayohatday tuyuldi. Va do'kon buyumlari, ehtimol juda zerikarli bo'lib, 90% o'quvchilar kabi yo'qolgan edi, shuning uchun uzr so'rayman.

O'qiganingiz uchun katta rahmat va bu xabarni tushunib bo'lmaydigan bo'lsa uzr so'rayman. Men shunchaki o'zimga shunday bir narsani nashr etaman, deb va'da berdim, chunki men bu narsalarning barchasini shu qadar dahshatli tarqoq / qattiq ekanligini bilib oldim.

Agar biron-bir savolingiz bo'lsa, sharh yoki izoh qoldiring va men javob berishga harakat qilaman.

❤ yog '

BA'ZI Q / A

Ha, men albatta baxtiyorman! Agar men bu katta pita deb aytmagan bo'lsam, yolg'on gapirardim, lekin Bamperlar bu shunchaki ommaviy pleyer ilovasi - va navigatsiyalarda va bizda mavjud bo'lgan ozgina geribildirim elementlarida vaziyatni boshqarish juda qiyin bo'lardi.

O'ylaymanki, sizda "tanish" vositalarni ishlatish haqida ham gapirish kerak - va umid qilamanki, agar biz "Bamperlar" da ko'proq ishchilarni yollashga majbur bo'lsak va ular umuman his qilmasdan ancha osonlikcha sho'ng'iy olishlariga umid qilaman. haddan tashqari tushdi (va ular hamma narsani noldan o'rganishlari kerak).

Ha, juda ko'p. Men ham u erda bo'lganimda, biz Mediumda shunga o'xshash ishni qildik. Skriptni in'ektsiya qilish hacklari tufayli siz buni qanday bajarishingizga ehtiyot bo'lishingiz kerak, ammo serverda reaktsiya shablonini ko'rsatmasdan turib, "server tomonini ko'rsatish" hissi kabi narsaga murojaat qilishning ajoyib usuli.