Ne tikai mūsu kods ir * BEST *

Viedokļi no 6 ellē pavadītajām nedēļām es pavadīju, pārrakstot buferus, reaģējot.

Es vienkārši pilnībā pārrakstīju tīmekļa lietotni Bumpers, izmantojot reaģēt. (Ja jūs nezināt, kas ir buferi, tā ir šī super chill lietotne audio stāstu ierakstīšanai / kopīgošanai tālrunī. Lejupielādējiet to, un tā faktiski aizpildīs visu jūsu dzīvi. Tā ir labākā lietotne, kas jebkad izgatavota. Reaģēt? Tas ir labi.)

Katrā ziņā sekojošās ir visas manas piezīmes, domas utt. Par šo procesu. (Lietas, kuras es vēlētos, lai es būtu lasījusi, pirms sāku). Cerams, ka jūs kaut ko no tā iegūsit.

Priekšvārds

DIEVS. Es ienīstu ietvarus. Daudz.

Es ienīstu arī to, ka man nav karkasa, un ikvienu, kurš “rullē” pats savu “karkasu”. Es arī vispār ienīstu kodēšanu. Un visvairāk es ienīstu rakstīt par kodu.

Tāpēc lāci ar mani.

Pēdējā laikā mans kodēšanas stils ir bijis kaut kāds sociopātisks, svārstības starp kropļojošām pašapšaubām un ārkārtīgu kanye veida dievu kompleksu - kur es vai nu visu dienu soļoju apkārt savam skartajam raudādams, vai arī aicinu māti ļaut viņa zina, ka viņas 30 gadus vecais dēls “gatavojas spēlēt spēli (labā veidā)”. Tāpēc dabiski šķita, ka ir piemērots laiks paņemt pārtraukumu un par to rakstīt.

(morāle par projekta dzīves ciklu, sarkano piezīmju raktuve) - https://medium.com/@iano/moral-over-a-project-lifecycle-975792b54c12#.uwkzt7x4v)

Izvēloties Reaģēt

Neliela vēsture: buferu “vietne” bija tik jauka. Bija apmēram 7 es6 klases, bez ārējām atkarībām un tikai aptuveni 759 koda rindiņas. Kopā.

Tās izkārtojumus serverī atveidoja mūsu lietotne Go. Mēs izmantojām postcss. Mums bija patiešām vienkāršs līdzekļu direktorijs, kurā tika ievietoti visi svgs, kā arī videoklips vai divi. Tas bija lieliski. Mēs uzrakstījām JavaScript. Mēs par to aizmirsām.

Tas bija lieliski. Mēs uzrakstījām JavaScript. Mēs par to aizmirsām.

Tikmēr Nikolā Gallaghers bija daļa no komandas, kura nupat bija pabeigusi gadu ilgu projektu, pārrakstot Twitter mobilo tālruni React.

Es Nikolaju esmu pazinis jau sen. Un viņš viegli ir viens no domājošākiem cilvēkiem, kurus es pazīstu. Tad, kad pēc tam viņš man teica, ka React būtībā ir atrisinājis visas problēmas Front End Development telpā un ka viņš ir pārcēlies uztraukties par citām lietām, es viņam teicu, lai viņš tūlīt sāk rīkoties.

Pēc nominālvērtības Reačam bija sekojošas lietas:

  • kuru apstiprinājuši gudrāki draugi, piemēram, mani, piemēram, Nikolā Gallaghera, Alekss Makkavs, Guillers Raučs
  • klienta puses renderēšana (piemērota audio lietotnēm, lai jūs varētu turpināt atskaņošanu, izmantojot navigācijas)
  • pārdomāts komponenta modelis
  • cilvēki attālinājās no (vai vismaz izaicināja) CSS
  • facebook nerds to uzrakstīja
  • Ražošanas lietotnes, piemēram, instagram, twitter utt., to izmantoja
  • likās, ka cilvēki beidzot apmetas pie datu paradigmas reduksā (un tas patīk)

Bet tajā pašā laikā reaģēšanai bija vairākas lietas, par kurām es nebiju sajūsmā:

  • Mana 700 līnijas javascript pakete drīzumā kļūs par ~ 1,5 MB
  • ražošanas servera puses renderēšanai nepieciešams mezgla serveris (un pat tad šķita, ka risinājumi ir puscepti)
  • stila veidošanas prakse ir ļoti sadrumstalota visā sabiedrībā (vai jūs izmantojat afrodītu, CSS moduļus, stila tagus utt. - kā ir ar jūsu atkarībām?)
  • facebook nerds to uzrakstīja
  • webpack → babel → jsx → karstā ielāde → avotu kartes → hroma rīki kā kaudze kropļoja manu nabaga mazo MacBook
  • Man bija jānoskatās šie f *** ing “egghead” video, lai iemācītos redux
  • instrumenti šķita nesavienoti un pāri visam ...

Neskatoties uz visu to, mēs nolēmām to meklēt. (Galvenā cerība uz reakciju kaut kādā veidā liktu mums izveidot kaut ko tādu, kas jutās vairāk “lietotne-y”).

Izvēloties “pārējo”

Izrādās, ka pēc tam, kad esat izlēmis reaģēt (jūsu uzskats - lib), jums patiešām atliek tikai daži citi lēmumi: kā jūs pārvaldīsit valsti? Kā jūs plānojat veidot savas sastāvdaļas? Vai jūs izmantojat es6? es7? es2015? jsx? Ko tie pat nozīmē? Vai jūs izmantosit tīmekļa paketi? vai pārlūkot? Kur viss dzīvos? …

Es sāku ar TJ Holowaychuk katla repo (https://github.com/tj/frontend-boilerplate/tree/master/client) masēšanu kopā (kuru viņš atzīst, ka readme pamatā ir novecojis), un šo garo e-pastu Nikolā bija saņēmis es par to, kur bija nolaidies twitter (no kuriem pusi es toreiz nesapratu, bet neatkarīgi no tā, e-pastu kopumā varat izlasīt šeit: https://gist.github.com/fat/9ab5325ab39acfe242bc7849eb9512c4).

Es apskatīju arī dažus no daudzajiem katlu plākšņu “universal-react-redux-glahblbhalkd” repo github, bet tie lielākoties visi radīja man panikas lēkmes.

Katrā ziņā man kaut kā izdevās nokļūt vietā, ar kuru esmu nedaudz apmierināta, un kura izskatās šādi:

  • Bābele (ar “presets”: [“es2015”, “stage-0”, “reaģēt”]). Tāpēc es varu izmantot visus trakos jaunos sūdus, piemēram, sprostu operatorus, bultas funkcijas utt.
  • Webpack ar karstajiem iekrāvējiem, kas (kad tas darbojās) man noderēja, atjauninot stilu noteiktos lietotņu stāvokļos. Bet tas noteikti izraisīja daudz satraukuma. Ja godīgi, es jūtu, ka neviens īsti nesaprot, kā darbojas Webpack. Un mēs visi tikai metām tajā nejaušus rekvizītus un spraudņus, lūdzot, lai tas viss izrādīsies. AggressiveMergingPlugin? protams. NotikumsOrderPlugin? labi. DedupePlugin? labi.
  • Redux kopā ar normilzr un denormalizr, lai palīdzētu iznīcināt un pēc tam rehidrēt api reakcijas.
  • Afrodīte / nav svarīgi js stili, nevis css, bet bez visiem tiem! Svarīgi visur.
  • Svg-react-loader, kas ielādē svg kā reaģējošu komponentu līniju.
  • Sauja citu, ja tajā atkarīgo sarakstā redzat kaut ko citu, kas jūs interesē, atstājiet piezīmi un es to izskaidrošu.

Direktorija struktūra

LABI. Kad es norēķinājos par 38 atkarībām bumpers.fm vietne nebija pieprasījusi, bija laiks uzrakstīt kādu faktisko kodu.

Mūsu direktoriju struktūra ir sadalīta divos ieejas punktos:

  • index.js, kas nekavējoties maršrutētāju un glabā mūsu galveno lietotņu paketi.
  • embed.js, kas ir atbildīgs par mūsu mazāku iegultu paketi (kā redzams tukšajā, twitter, vidējā, utt.)

No turienes mēs ievelkim savus maršrutus no trāpīgi nosauktā direktorija “maršruts”, kas šobrīd ir tikai vienkāršs, viena reaģenta maršrutētāja komponents, kurš izskatās šādi:

Ievērojiet, ka šie maršruti norāda uz to, ko mēs saucam par “ekrāna konteineriem”.

Bamperos mūsu reaģējošie komponenti faktiski tiek sadalīti 3 dažādos direktorijos, atkarībā no to funkcijas (4, ja iekļaujat maršrutu direktoriju). Šis komponentu organizēšanas veids būtībā tika nozagts tieši no Twitter, kurš, savukārt, es domāju, ka to aizņēmās no Facebook un daudziem citiem projektiem. Tas izskatās:

  • komponenti, šeit dzīvo mūsu funkcionālie ui komponenti
  • konteineros šajā vietā dzīvo mūsu ui komponentu apstrādātāji
  • ekrāni tehniski ir tikai konteineri, bet parasti tiek ielādēti vairāk augšējā līmeņa lapu un ir mazāk saistīti ar darbību apstrādi.
SIDE PIEZĪME Es faktiski sāku tikai ar konteineru direktoriju, bez “ekrāniem” (kas ir diezgan izplatīts no tā, ko esmu redzējis ap reaģējošo kopienu). Pēc Nikolāsa ieteikuma es atteicos no tā, un tāpēc, ka, redzot ķekars ar “ekrāna” piedēvētiem failiem, kas sajaukti ar maniem, kas nebija “ekrāna”, ar piedēkļiem, mani satrauca no manis.

Pēdējie divi direktoriji ir direktorijs “store” un “constants”. Veikals satur visu mūsu redux loģiku, piemēram, darbības, reduktorus, selektorus, api galapunktus utt. (Ko es iedziļināšos tālāk), savukārt direktorijā “konstantes” ir… labi… konstantes.

UI komponenti

Mūsu lietotāja interfeisa komponenti ir diezgan standarta, funkcionāli, bez valsts, prezentācijas un reaģējoši komponenti. Šeit ir standarta epizodes komponents (kas sastāv no daudziem citiem mazākiem, standarta, funkcionāliem, bez valsts, prezentācijas un reaktīviem komponentiem).

Kā es minēju iepriekš, mēs izmantojam Khan Academy's Aphrodite, lai izveidotu mūsu css.

ĀTRA PIEZĪME Sākotnēji es rakstīju lietotni, izmantojot style-loader pakotni, taču ar to nespēju nodrošināt pārliecinošu servera stratēģiju (kaut ko es beidzot vēlos izpētīt), man pietika, lai izmēģinātu kaut ko citu. (Es arī parasti uzskatīju, ka React-Native, ko Nikolā man vienmēr atgādināja, bija labāks nekā jebkurš risinājums, pie kura patstāvīgi nonācu, jo viņš to bija uzrakstījis).

Neskatoties uz to, manu stilu rakstīšana javascript izdevās diezgan dabiski, un, izmantojot jaunās ES6 funkcijas, to varēja padarīt diezgan elegantu.

Man bija iespēja sasniegt līdzīgu stilu tam, ko mēs darījām, strādājot Medium, veidojot tipa skalas, krāsu skalas, zIndex skalas utt. Un pat varēju izmantot ES6 aprēķināto rekvizītu nosaukumu funkciju, lai manu multivides vaicājumus pārveidotu mainīgajos. .

Viena lieta, kurā es nevarēju iedziļināties, bija vispārīgi nosaukt visus manus klases nosaukumus, piemēram, “lodziņš” vai “konteiners” vai “galvenais” vai “sakne”. Man tiek piešķirta visa vietējā mēroga DSM, taču šķiet, ka tas notiek par attaisnojamības cenu. Tā vietā es faktiski nosēdos uz nosaukuma semantiku netālu no tā, kas tika aprakstīts SuitCSS, tikai nedaudz pārveidots par javascript (izmantojot “_”, nevis “-”). Praksē tas izskatījās apmēram šādi:

Pēdējā lieta, ko es ātri pieminēšu, ir visi mūsu attiecīgie faili, kas atrodas to attiecīgajos komponentu direktorijos.

Stili tiek ievietoti atsevišķā failā ar nosaukumu style.js līdzās attiecīgajiem svg aktīviem, kas tiek importēti tieši, izmantojot svg-react-loader. To darot, ir ļoti viegli izdzēst komponentus / funkcijas un nekautrējieties uzdot sev jautājumu: pagaidiet, vai man joprojām ir vajadzīga šī CSS? vai man joprojām ir vajadzīgs šis svg?

Konteineru pārtraukšana

Ja godīgi, es neko daudz neteikšu par konteineriem ™. Mēs šeit nedarām neko īpašu, izņemot ekrāna / konteinera direktoriju atdalīšanu (ko es jau apskatīju iepriekš).

Es tomēr uzzīmēju jums citu attēlu (wow, turpat), jo jutos slikti, jo man nebija daudz ko teikt par konteineriem . Un es domāju, ka šis ir piemērots laiks, lai jūs varētu paņemt pārtraukumu. Stiept?

Piedod.

Veikals

~ ALRIGHT ~. Šī veikala sadaļa viegli varētu būt tā PAŠAM VISAM PANTAM , bet es mēģināšu to visu iestrēgt, lai jūs visi būtu… tāpēc nēsājiet līdzi. Arī taisnīgs brīdinājums - tas paredzēts DENSE saņemšanai.

PIEZĪME, kas izriet no šī, visticamāk, būs absolūti niecīga, ja vien jūs nezināt par redux (http://redux.js.org/). Ja jūs interesē uzzināt vairāk par Redux un to izmantot, lai pārvaldītu stāvokli savās reaģējošajās lietotnēs, es iesaku izpētīt šīs olšūņu apmācības, tās ir bezmaksas un visas ir diezgan labas: https://egghead.io/courses/getting -sākts-ar-redux

Mūsu veikals sastāv no 4 augstākā līmeņa failiem (es sīkāk iedziļinos katrā no tiem zemāk, bet vienkārši reāli ātri) ...

  • index.js - mūsu veikala inicializētājs
  • reducer.js - apvieno visus reduktorus no dažādiem objektiem vienā milzu “combReducers” metodē
  • schema.js - visi mūsu normalizr modeļi
  • api.js - mūsu veikala api palīgs

Turklāt mūsu veikals ir veidots pēc modeļiem, izmantojot direktorijus, piemēram, lietotājus, uzvednes utt., Nevis tradicionālās redux augstākā līmeņa funkcionālā direktoriju darbību hierarhiju /, reduktorus /, selektorus /, bleh.

Protams, mums joprojām ir tradicionālās darbību, reduktoru utt. Atdalīšana, kas nepieciešama redux - taču tas tiek darīts faila līmenī, kas ir ligzdots tā modeļa direktorijā (apskatiet paplašināto lietotāja mapi attēlā pa kreisi, lai ilustrācija tam, ko cenšos pateikt).

Labi, bet kāpēc tu? Veidojot šo lietotni, es nemitīgi sacīju tādas lietas kā “dang i rly gribu strādāt pie lietotāju lietām rn” un gandrīz nekad neteicu kaut ko līdzīgu: “dang, i rly gribu mainīt visu reduktoru virkni uzreiz, protams, esmu priecīgs viņi visi atrodas šajā masīvajā f *** ing reduktoru direktorijā ”.

SIDE NOTE Es neatceros, kur es pirmo reizi redzēju šo stratēģiju ... bet es esmu pārliecināts, ka to neizgudroju. Ja jūs zināt kādu, kurš to izdarīja vai kurš to labi izskaidro, atstājiet piezīmi, un es labprāt norādītu uz to cilvēkiem. Arī es ~ domāju ~ twitter dara kaut ko līdzīgu. Bet es varētu to panākt.

Nepatīkami sakņu līmeņa faili

Labi, tāpēc veikala index.js (īsi minēts iepriekš) ir atbildīgs par 3 galvenajiem uzdevumiem:

  1. Iepriekš importētu, iegultu datu importēšana mūsu redux veikalā un veikala sākotnējā stāvokļa iestatīšana (mūsu aizmugures programma pirmsielādē datus, kad lietotājs piekļūst kaut kam, piemēram, bumpers.fm/fat, tā, ka, reaģējot lietotnei, tā nav nekavējoties jāizveido. xhr pieprasījums pēc lietotāja datiem, un tā vietā lapu var vienkārši ātri aizpildīt).
  2. inicializējot mūsu redux veikalu ar mūsu sakņu reduktoriem.
  3. izmantojot starpprogrammatūru, piemēram, lielu daļu, reaģē uz maršrutētāja pārlūka vēsturi, devātiem un citu.

Praksē tas viss beidzās ar kaut kā līdzīgas metodes izskatīšanu, taču jebkādu iemeslu dēļ man radīja daudz skumju:

Tālāk īsumā apskatīsim mūsu failu reduktorus.js, kas būtībā ir tikai viena kombinētās reduktoru metode, kas no citiem mūsu direktorijiem atvelk reduktorus un pakļauj tos kā vienu milzu reduktoru ūdenskrituma lietu. tbqh, šis fails ir diezgan garlaicīgs, un es droši vien būtu varējis to vienkārši ievietot index.js . čau.

Tomēr! Šeit ir vērts pievērst uzmanību tam, ka mūsu “entītiju” reduktors (redzams iepriekš) darbojas tāpat kā mūsu veikala kešatmiņa.

Lai to panāktu, mēs izmantojām projektu normalizr (https://github.com/paularmstrong/normalizr), lai piespiestu mūsu dziļi ligzdotās JSON api atbildes vairāk pārvaldāmos / kešatmiņā saglabājamos ID indeksētos objektos. Citiem vārdiem sakot, mēs sākam ar tradicionālāku api atbildi un pēc tam pārveidojam to par saucierīgāku, ID indeksētu entītijas jaucēju:

Kā jūs varētu iedomāties, šī kešatmiņas metode ir ļoti noderīga ~, kad sākat navigēt pa reaģējošu lietotni - it kā, atvelkot epizodi, jūs, iespējams, jau esat atnācis lietotājs (kā autors), kuru jūs tagad varat meklēt pēc ID, izmantojot viena no selektoru metodēm, nepieskaroties aizmugurei (lasīt: gandrīz tūlītējas navigācijas. wow).

Tad mūsu schema.js ir norādīta loģika iepriekšminēto entītiju transformāciju noņemšanai mūsu kešatmiņā (un normalizr). Šīs attiecību kartes galu galā ir diezgan vienkārši uzrakstīt - bet noteikti viegli aizmirstas. Ja esat izvēlējies reducētās kešatmiņas ceļu, ir vērts to apskatīt.

SIDE PIEZĪME Nav parādīts iepriekš, Schema.js satur arī pielāgotu mergeStrategy, kuru mēs speciāli uzrakstījām buferiem. Jebkura iemesla dēļ noklusējuma mergeStrategy, ko nodrošināja normalizr, darbojās pats par sevi, taču es šeit neiedziļināšos, jo gandrīz noteikti tā bija lietotāja kļūda . (Tas nozīmē, ka, ja jums rodas līdzīgas problēmas, atstājiet piezīmi un es ar prieku padalos, kur mēs piestājām.)

Mūsu pēdējais saknes fails veikala direktorijā ir api.js.

Pēc daudzām pukstēšanas galvām es pamanīju, ka lēnais starpprogrammatūra (uz kuru mēs paļāvāmies uz async darbībām) ļauj mums nodot papildu argumentu visām jūsu redux darbībām (papildus nosūtīšanai un getState).

Atcerieties to veikalā / index.js

Tas ir neticami spēcīgi, un es galu galā to izmantoju, lai nodotu globālo aktīvo palīgu visās mūsu darbībās. Šis api palīgs (definēts api.js) nodrošina ātru piekļuvi visiem mūsu api galapunktiem, izmantojot papildu palīgus JSON parsēšanai, kļūdu pārbaudei un daudz ko citu. Jūs to redzēsit zemāk ... kad mēs nokļūsim ... darbības ... failos ...

Reduktori

Mūsu reduktoru reduktoriem ir 3 galvenās funkcijas.

  1. Definējiet sākotnējo stāvokli
  2. Definējiet preloadData apstrādātāju (mūsu iegultajiem datiem)
  3. Atklājiet darbību apstrādātāja reduktorus

Mūsu sākotnējais stāvoklis bieži izskatās apmēram šāds, ar pieprasījuma stāvokļa un aktīvā ID statusa konstantēm:

Mūsu priekšielādes apstrādātāji ņem mūsu izejas datu objektus un izpako datu entītijas, šajā gadījumā iestatot aktīvo noklusējuma lietotāju:

Un tipisks reduktors izskatās apmēram šādi (ņemiet vērā aprēķināto īpašumu nosaukumu izmantošanu (Es2015). Mēs tos iegūstam tieši no darbību definīcijām, kas apskatītas zemāk).

Darbības

Mūsu darbību failos notiek dažas maģiskas lietas. Vispirms mēs izmantojam “redux-action” createActions metodi, lai definētu mūsu darbību nosaukumus:

Mēs to darām tā, lai mūsu reduktoru failā mēs varētu izmantot aprēķinātos īpašumu nosaukumus (minēts iepriekš), lai mūsu darbību nosaukumi būtu definēti tikai vienā vietā. Apskatiet arī to, kā mēs nosaucam mūsu darbības: metode + objekts + īpašums. Tas ir ļoti svarīgi, lai visas jūsu reduktora atslēgas būtu lasāmas un unikālas. Esmu redzējis daudz piemēru tīmeklī, kurā cilvēki izmanto slinkus, vispārīgus nosaukumus, piemēram, “lietotājvārds” vai “setUsername” taustiņiem. Uzticieties, ja jums tas notiks (atcerieties, ka atslēgas ir globālā mēroga problēmas un konfliktu nosaukšanas radītie kļūdu cēloņi ir galvenā izsekojamība).

Async darbībās mēs izmantojam redux thunk un api palīgu, kuru mēs minējām iepriekš. Tas palīdz mūsu async metodes saglabāt pārāk stingras un koncentrētas.

Iepriekš minētajā piemērā mēs iestatām lietotāja objekta atgūšanu, aktivizējam pieprasījumu uz mūsu api, pārbaudiet atbildes uz kļūdas statusa kodu, iestatiet mūsu jwt pilnvaru, pārveidojiet atbildi uz json, normalizējiet atbildi, izmantojot normalizr (kešatmiņā). un pēc tam iestatiet aktīvo lietotāja stāvokli.

Šis ir tīrākais veids, kā jebkad esmu redzējis reduktoru async metodes (don’t @ me).

Galapunkti

Neesmu redzējis, ka kāds cits veiktu šos parametru failus, bet es uzskatu, ka tas ir patiešām tīrs veids, kā saglabāt jūsu attiecīgos api zvanus visiem, kas dzīvo vienā vietā (nemaz nerunājot par to, ka spiešanas testi ir ļoti vienkārši). Ņemiet vērā arī “isomorphic-fetch” - es zvēru, ka kādreiz mēs šos materiālus atveidosim serverī . Tikmēr foršā lieta, izmantojot atnest, ir tas, ka tas atdod solījumu un padara to par diezgan tīru api, kad tas tiek iesaistīts mūsu async darbībās.

Atlasītāji

Visbeidzot, mūsu atlasītāju failā tiek izmantota denormalizr bibliotēka (https://github.com/gpbl/denormalizr) (normalizr's māsas projekts), lai no mūsu kešatmiņas izveidotu vēl efektīvākus datus. Tas būtībā tikai izmanto nosaukuma modeļus, lai rekonstruētu lielu ligzdotu objektu - jums tas nav ~ jādara, bet man šķita, ka šādā veidā strādāt ar datiem ir daudz patīkamāk / paredzamāk.

Bez tam mūsu selektora metodes izskatās diezgan tādas, kā jūs varētu gaidīt:

Secinājums

WOW. Labi, ka jutos kā nopietns ceļojums. Iespējams, ka veikalu preces bija pārāk garlaicīgas un pazuda tāpat kā 90% lasītāju, tāpēc es atvainojos.

Liels paldies par lasīšanu un atvainojamies, ja šī ziņa bija neizturama. Es tikai sev apsolīju, ka publicēšu kaut ko līdzīgu, jo man šķita, ka visu šo sūdu apgūšana ir tik ārprātīgi izkliedēta / smaga.

Ja jums ir kādi jautājumi, atstājiet komentāru vai piezīmi, un es darīšu visu iespējamo, lai atbildētu.

❤ tauki

DAŽI Q / A

Jā, es noteikti priecājos! Es melotu, ja neteiktu, ka tā bija liela pita, bet buferi būtībā ir tikai masīva audio atskaņotāja lietotne - citādi pārvaldīt stāvokli visā navigācijas režīmā un daudzos mazajos atsauksmes elementos, kas mums ir, būtu prātīgi grūti.

Es domāju, ka ir arī ko teikt par “pazīstamu” rīku izmantošanu, ja jums tie ir - un es ceru, ka, ja kādreiz iegūsim darbā Bumpers vairāk frontend's, viņi spēs ienirt diezgan viegli, pilnībā nejūtoties. satriekti (un tāpat kā viņiem viss jāapgūst no nulles).

Jā, diezgan daudz. Mēs rīkojāmies līdzīgi Medium, kamēr es arī tur biju. Skriptu iesmidzināšanas dēļ jums ir jābūt uzmanīgam, kā jūs to darāt, taču tas ir diezgan foršs veids, kā tuvināties kaut kam līdzīgam kā “servera puses atveidošanas” sajūtai, un jums nav jāveido reaģējošas veidnes uz servera.