Habr front-end developer cav: refactoring thiab xav txog

Habr front-end developer cav: refactoring thiab xav txog

Kuv ib txwm xav paub txog yuav ua li cas Habr tau teeb tsa los ntawm sab hauv, kev ua haujlwm li cas yog cov qauv, kev sib txuas lus li cas, cov qauv siv li cas thiab cov cai feem ntau sau ntawm no. Hmoov zoo, kuv tau txais lub sijhawm zoo li no, vim kuv nyuam qhuav dhau los ua ib feem ntawm pab pawg habra. Siv cov piv txwv ntawm me me refactoring ntawm lub mobile version, kuv mam li sim teb lo lus nug: dab tsi yog nws nyiam ua hauj lwm ntawm no nyob rau hauv pem hauv ntej. Hauv qhov kev zov me nyuam: Node, Vue, Vuex thiab SSR nrog cov ntses los ntawm cov ntawv sau txog tus kheej kev paub hauv Habr.

Thawj qhov koj yuav tsum paub txog pab pawg txhim kho yog tias muaj ob peb ntawm peb. Tsis txaus - cov no yog peb pem hauv ntej, ob sab nraub qaum thiab kev ua haujlwm ntawm tag nrho Habr - Baxley. Muaj, ntawm chav kawm, kuj yog ib tug tester, tus tsim qauv, peb Vadim, ib tug txuj ci tseem ceeb, tus kws tshaj lij kev lag luam thiab lwm yam Bumburums. Tab sis tsuas muaj rau tus neeg koom ncaj qha rau Habr cov peev txheej. Qhov no yog qhov tsawg heev - ib qhov project nrog cov neeg tuaj saib ntau lab daus las, uas los ntawm sab nraud zoo li lub tuam txhab loj, hauv kev muaj tiag zoo li zoo li kev pib ua haujlwm zoo nrog lub koom haum zoo tshaj plaws.

Zoo li ntau lwm lub tuam txhab IT, Habr tshaj tawm cov tswv yim Agile, CI kev coj ua, thiab txhua yam. Tab sis raws li kuv txoj kev xav, Habr raws li cov khoom lag luam tab tom tsim ntau dua hauv nthwv dej ntau dua li tsis tu ncua. Yog li, rau ntau qhov kev sib tw ua ke, peb mob siab rau code ib yam dab tsi, tsim thiab kho dua tshiab, rhuav qee yam thiab kho nws, daws daim pib thiab tsim cov tshiab, kauj ruam ntawm ib tug rake thiab tua peb tus kheej hauv ko taw, thiaj li yuav thaum kawg tso lub feature rau hauv. ntau lawm. Thiab tom qab ntawd los muaj qee yam lull, lub sijhawm ntawm kev txhim kho, lub sijhawm ua dab tsi hauv qhov "tseem ceeb-tsis ceev" quadrant.

Nws yog qhov tseeb no "tawm-lub caij" sprint uas yuav tau tham hauv qab no. Lub sijhawm no nws suav nrog refactoring ntawm mobile version ntawm Habr. Feem ntau, lub tuam txhab muaj kev cia siab rau nws, thiab yav tom ntej nws yuav tsum hloov tag nrho lub vaj tsiaj ntawm Habr lub incarnations thiab dhau los ua kev daws teeb meem thoob ntiaj teb. Muaj ib hnub yuav muaj kev hloov kho, PWA, hom offline, tus neeg siv kev hloov kho, thiab ntau lwm yam nthuav.

Cia peb teem txoj haujlwm

Ib zaug, ntawm ib qho kev sawv ntsug zoo tib yam, ib qho ntawm sab xub ntiag tau hais txog cov teeb meem hauv kev tsim qauv ntawm cov lus hais ntawm lub xov tooj ntawm tes. Nrog rau qhov no hauv siab, peb tau teeb tsa lub rooj sib tham micro hauv hom kev kho mob hlwb. Txhua leej txhua tus tau hloov hais tias nws mob qhov twg, lawv sau txhua yam rau hauv ntawv, ua siab ntev, lawv nkag siab, tsuas yog tsis muaj leej twg npuaj teg. Qhov tshwm sim yog ib daim ntawv teev npe ntawm 20 qhov teeb meem, uas ua rau nws paub meej tias mobile Habr tseem muaj txoj hauv kev ntev thiab thorny mus rau kev vam meej.

Kuv feem ntau txhawj xeeb txog qhov ua tau zoo ntawm kev siv cov peev txheej thiab qhov hu ua tus interface du. Txhua hnub, ntawm txoj kev hauv tsev-ua haujlwm-tsev, kuv pom kuv lub xov tooj qub tau mob siab ua kom pom 20 lub ntsiab lus hauv qhov pub. Nws ntsia ib yam li no:

Habr front-end developer cav: refactoring thiab xav txogMobile Habr interface ua ntej refactoring

Yuav ua li cas ntawm no? Hauv luv luv, tus neeg rau zaub mov tau ua haujlwm rau nplooj ntawv HTML rau txhua tus tib yam, tsis hais tus neeg siv tau nkag mus lossis tsis tau. Tom qab ntawd tus neeg siv khoom JS tau thauj khoom thiab thov cov ntaub ntawv tsim nyog dua, tab sis hloov kho rau kev tso cai. Qhov ntawd yog, peb tau ua tib txoj haujlwm ob zaug. Lub interface flickered, thiab cov neeg siv downloaded ib puas ntxiv kilobytes. Nyob rau hauv kom meej txhua yam ntsia txawm ntau creepy.

Habr front-end developer cav: refactoring thiab xav txogqub SSR-CSR tswvyim. Kev tso cai tsuas yog ua tau nyob rau theem C3 thiab C4, thaum Node JS tsis ua haujlwm tsim HTML thiab tuaj yeem tso npe thov rau API.

Peb architecture ntawm lub sijhawm ntawd tau piav qhia meej heev los ntawm ib tus neeg siv Habr:

Lub mobile version yog crap. kuv hais li ntawd xwb. Kev sib xyaw txaus ntshai ntawm SSR thiab CSR.

Peb yuav tsum lees nws, txawm nws nyuaj siab npaum li cas.

Kuv tau soj ntsuam cov kev xaiv, tsim ib daim pib hauv Jira nrog cov lus piav qhia ntawm qib "nws tsis zoo tam sim no, ua nws txoj cai" thiab decomposed txoj hauj lwm nyob rau hauv dav strokes:

  • rov siv cov ntaub ntawv,
  • txo tus naj npawb ntawm redraws,
  • tshem tawm cov kev thov duplicate,
  • ua kom cov txheej txheem thauj khoom pom tseeb dua.

Cia peb rov siv cov ntaub ntawv

Nyob rau hauv txoj kev xav, server-sab rendering yog tsim los daws ob qhov teeb meem: tsis txhob raug kev txom nyem los ntawm kev tshawb fawb cav txwv nyob rau hauv cov nqe lus ntawm SPA indexing thiab txhim kho qhov ntsuas FMP (inevitably zuj zus TTI). Nyob rau hauv ib tug classic scenario uas thaum kawg tsim tawm ntawm Airbnb hauv 2013 xyoo (tseem nyob rau Backbone.js), SSR yog tib daim ntawv thov isomorphic JS khiav hauv Node ib puag ncig. Tus neeg rau zaub mov tsuas yog xa cov qauv tsim los ua cov lus teb rau qhov kev thov. Tom qab ntawd rehydration tshwm sim ntawm tus neeg siv khoom sab, thiab tom qab ntawd txhua yam ua haujlwm yam tsis muaj nplooj ntawv reloads. Rau Habr, raws li rau ntau lwm yam kev pab cuam nrog cov ntawv nyeem, cov neeg rau zaub mov rendering yog ib qho tseem ceeb hauv kev tsim kev phooj ywg nrog kev tshawb fawb xyaw.

Txawm tias muaj tseeb hais tias ntau tshaj li rau xyoo tau dhau los txij li thaum lub advent ntawm technology, thiab nyob rau hauv lub sij hawm no lub sij hawm muaj ntau ntau cov dej tau tiag tiag ya nyob rau hauv tus choj nyob rau hauv pem hauv ntej-kawg ntiaj teb no, rau ntau developers lub tswv yim no tseem shrouded nyob rau hauv secrecy. Peb tsis tau sawv ib sab thiab dov tawm daim ntawv thov Vue nrog SSR kev txhawb nqa rau kev tsim khoom, ploj ib qho me me: peb tsis tau xa thawj lub xeev rau tus neeg siv khoom.

Vim li cas? Tsis muaj lus teb meej rau lo lus nug no. Los yog lawv tsis xav kom qhov loj me ntawm cov lus teb los ntawm cov neeg rau zaub mov, lossis vim muaj ntau pawg ntawm lwm yam teeb meem kev tsim vaj tsev, lossis nws tsuas tsis tawm mus. Ib txoj hauv kev los yog lwm qhov, pov tawm lub xeev thiab rov siv txhua yam uas tus neeg rau zaub mov tau ua zoo li tsim nyog thiab muaj txiaj ntsig zoo. Txoj haujlwm yog qhov tsis tseem ceeb - xeev tsuas yog txhaj rau hauv cov ntsiab lus ua tiav, thiab Vue cia li ntxiv nws mus rau qhov tsim tawm tsim raws li lub ntiaj teb sib txawv: window.__INITIAL_STATE__.

Ib qho teeb meem uas tau tshwm sim yog qhov tsis muaj peev xwm hloov cov qauv cyclic rau hauv JSON (yeej siv); tau daws los ntawm tsuas yog hloov cov qauv no nrog lawv cov tiaj tus counterparts.

Tsis tas li ntawd, thaum cuam tshuam nrog UGC cov ntsiab lus, koj yuav tsum nco ntsoov tias cov ntaub ntawv yuav tsum tau hloov mus rau HTML cov chaw kom tsis txhob ua txhaum HTML. Rau cov hom phiaj no peb siv he.

Minimizing redraws

Raws li koj tuaj yeem pom los ntawm daim duab saum toj no, hauv peb qhov xwm txheej, ib qho Node JS piv txwv ua ob txoj haujlwm: SSR thiab "proxy" hauv API, qhov chaw tso cai rau cov neeg siv. Qhov xwm txheej no ua rau nws tsis tuaj yeem tso cai thaum JS code tab tom khiav ntawm lub server, txij li cov node yog ib leeg-xov, thiab SSR muaj nuj nqi yog synchronous. Ntawd yog, tus neeg rau zaub mov tsuas tsis tuaj yeem xa cov lus thov rau nws tus kheej thaum lub callstack tsis khoom nrog ib yam dab tsi. Nws muab tawm tias peb hloov kho lub xeev, tab sis lub interface tsis nres twitching, txij li thaum cov ntaub ntawv ntawm tus neeg siv yuav tsum tau hloov kho coj mus rau hauv tus account tus neeg siv kev sib kho. Peb yuav tsum tau qhia peb daim ntawv thov kom muab cov ntaub ntawv raug rau hauv lub xeev thawj zaug, suav nrog tus neeg siv tus lej nkag.

Tsuas muaj ob txoj kev daws teeb meem rau qhov teeb meem:

  • xa cov ntaub ntawv tso cai rau kev thov hla server;
  • faib Node JS cov khaubncaws sab nraud povtseg rau hauv ob qho piv txwv.

Thawj qhov kev daws teeb meem yuav tsum tau siv cov kev hloov pauv thoob ntiaj teb ntawm tus neeg rau zaub mov, thiab qhov thib ob txuas ntxiv lub sijhawm kawg rau kev ua tiav txoj haujlwm tsawg kawg ib hlis.

Yuav ua li cas xaiv? Habr feem ntau txav mus raws txoj kev uas tsis muaj zog tsawg. Raws li txoj cai, muaj kev xav dav dav los txo lub voj voog ntawm lub tswv yim mus rau tus qauv mus rau qhov tsawg kawg nkaus. Tus qauv ntawm tus cwj pwm ntawm cov khoom yog me ntsis reminiscent ntawm postulates ntawm booking.com, nrog rau qhov sib txawv tsuas yog hais tias Habr yuav siv sij hawm cov neeg siv tswv yim ntau npaum li cas tiag thiab cia siab rau koj, raws li ib tug tsim tawm, txiav txim siab li no.

Ua raws li cov laj thawj no thiab kuv tus kheej lub siab xav daws qhov teeb meem sai sai, kuv xaiv cov kev hloov pauv thoob ntiaj teb. Thiab, raws li feem ntau tshwm sim, koj yuav tsum them rau lawv sai lossis tom qab. Peb them nyiaj yuav luag tam sim: peb ua haujlwm rau hnub so, tshem tawm qhov tshwm sim, sau ncej mortem thiab pib faib cov neeg rau zaub mov ua ob ntu. Qhov yuam kev yog qhov ruam heev, thiab cov kab uas cuam tshuam nrog nws tsis yooj yim rau luam tawm. Thiab yog, nws yog ib qho kev txaj muag rau qhov no, tab sis ib txoj hauv kev los yog lwm qhov, stumbling thiab quaj, kuv PoC nrog lub ntiaj teb hloov pauv txawm li cas los xij tau mus rau hauv kev tsim khoom thiab ua haujlwm zoo heev thaum tos rau kev txav mus rau "ob-node" architecture tshiab. Qhov no yog ib kauj ruam tseem ceeb, vim hais tias lub hom phiaj tau ua tiav - SSR tau kawm kom xa ib nplooj ntawv npaj txhij-rau-siv tag, thiab UI tau ua kom zoo dua.

Habr front-end developer cav: refactoring thiab xav txogMobile Habr interface tom qab thawj theem ntawm refactoring

Thaum kawg, SSR-CSR architecture ntawm mobile version ua rau daim duab no:

οΏΌHabr front-end developer cav: refactoring thiab xav txog"Ob-node" SSR-CSR Circuit Court. Node JS API yeej ib txwm npaj rau asynchronous I / O thiab tsis thaiv los ntawm SSR muaj nuj nqi, txij li tom kawg yog nyob rau hauv ib qho piv txwv. Kev nug saw #3 tsis xav tau.

Tshem tawm cov kev thov sib npaug

Tom qab cov kev tswj hwm tau ua tiav, qhov pib ua haujlwm ntawm nplooj ntawv tsis ua rau muaj mob vwm. Tab sis ntxiv kev siv Habr hauv SPA hom tseem ua rau tsis meej pem.

Txij li lub hauv paus ntawm cov neeg siv ntws yog kev hloov pauv ntawm daim ntawv cov ntawv β†’ kab lus β†’ lus thiab vice versa, nws yog ib qho tseem ceeb rau optimize cov kev pab cuam ntawm cov saw no nyob rau hauv thawj qhov chaw.

Habr front-end developer cav: refactoring thiab xav txogRov qab mus rau tus ncej pub provokes cov ntaub ntawv thov tshiab

Tsis tas yuav khawb tob. Hauv qhov screencast saum toj no koj tuaj yeem pom tias daim ntawv thov rov thov cov npe ntawm cov khoom thaum swiping rov qab, thiab thaum lub sijhawm thov peb tsis pom cov ntawv, uas txhais tau tias cov ntaub ntawv yav dhau los ploj mus rau qhov chaw. Nws zoo li daim ntawv teev npe cov khoom siv siv lub xeev hauv zos thiab poob rau kev puas tsuaj. Qhov tseeb, daim ntawv thov siv lub xeev thoob ntiaj teb, tab sis Vuex architecture tau tsim lub taub hau: modules raug khi rau nplooj ntawv, uas nyob rau hauv lem yog khi rau txoj kev. Ntxiv mus, tag nrho cov modules yog "tso pov tseg" - txhua qhov txuas ntxiv mus rau nplooj ntawv rov sau tag nrho cov module:

ArticlesList: [
  { Article1 },
  ...
],
PageArticle: { ArticleFull1 },

Nyob rau hauv tag nrho, peb muaj ib tug module Cov ntawv teev npe, uas muaj cov khoom ntawm hom tsab xov xwm thiab module Nplooj ntawv, uas yog ib qho txuas ntxiv ntawm cov khoom tsab xov xwm, laj Tsab ntawv puv. Los ntawm thiab loj, qhov kev siv no tsis muaj dab tsi txaus ntshai nyob rau hauv nws tus kheej - nws yog qhov yooj yim heev, ib tug yuav txawm hais tias naive, tab sis tsis tshua muaj to taub. Yog tias koj rov pib dua qhov module txhua zaus koj hloov txoj kev, ces koj tuaj yeem nyob nrog nws. Txawm li cas los xij, txav ntawm kab lus pub, piv txwv li /feed β†’ /tag nrho, yog lav kom pov tseg txhua yam ntsig txog tus kheej pub, txij li peb tsuas muaj ib qho xwb Cov ntawv teev npe, nyob rau hauv uas koj yuav tsum tau muab cov ntaub ntawv tshiab. Qhov no dua coj peb mus rau duplication ntawm kev thov.

Kuv tau sau txhua yam uas kuv muaj peev xwm khawb tau lub ntsiab lus, kuv tau tsim ib lub xeev tshiab thiab nthuav tawm rau kuv cov npoj yaig. Cov kev sib tham tau ntev, tab sis thaum kawg cov kev sib cav hauv kev pom zoo tshaj qhov tsis txaus ntseeg, thiab kuv pib ua.

Lub logic ntawm kev daws yog qhov zoo tshaj plaws qhia nyob rau hauv ob kauj ruam. Ua ntej peb sim decouple Vuex module los ntawm nplooj ntawv thiab khi ncaj qha rau txoj kev. Yog lawm, yuav muaj cov ntaub ntawv me ntsis ntxiv hauv lub khw, getters yuav dhau los ua qhov nyuaj me ntsis, tab sis peb yuav tsis thauj khoom ob zaug. Rau lub mobile version, qhov no yog kab tias qhov kev sib cav muaj zog tshaj plaws. Nws yuav zoo li no:

ArticlesList: {
  ROUTE_FEED: [ 
    { Article1 },
    ...
  ],
  ROUTE_ALL: [ 
    { Article2 },
    ...
  ],
}

Tab sis yuav ua li cas yog tias cov ntawv teev npe tuaj yeem sib tshooj ntawm ntau txoj hauv kev thiab yog tias peb xav rov siv cov ntaub ntawv kwv yees tsab xov xwm mus render tus ncej nplooj ntawv, tig mus rau hauv Tsab ntawv puv? Hauv qhov no, nws yuav yog qhov xav tau ntau dua los siv cov qauv zoo li no:

ArticlesIds: {
  ROUTE_FEED: [ '1', ... ],
  ROUTE_ALL: [ '1', '2', ... ],
},
ArticlesList: {
  '1': { Article1 }, 
  '2': { Article2 },
  ...
}

Cov ntawv teev npe ntawm no nws tsuas yog hom repository ntawm cov khoom. Tag nrho cov kab lus uas tau rub tawm thaum lub sijhawm tus neeg siv sib tham. Peb kho lawv nrog kev saib xyuas zoo tshaj plaws, vim tias qhov no yog kev thauj mus los uas yuav raug rub los ntawm qhov mob ntawm qhov chaw metro ntawm cov chaw nres tsheb, thiab peb yeej tsis xav ua qhov mob no rau tus neeg siv dua los ntawm kev yuam nws kom thauj cov ntaub ntawv uas nws twb muaj lawm. rub tawm. Ib yam khoom Cov ntawvIds tsuas yog ib qho array ntawm IDs (xws li yog "txuas") rau cov khoom tsab xov xwm. Cov qauv no tso cai rau koj kom tsis txhob muab cov ntaub ntawv duplicated rau txoj kev thiab rov siv cov khoom tsab xov xwm thaum rendering ib nplooj ntawv ncej los ntawm merging txuas ntxiv cov ntaub ntawv rau hauv nws.

Cov txiaj ntsig ntawm cov npe ntawm cov khoom tau dhau los ua pob tshab: cov khoom siv iterator iterates los ntawm cov array nrog tsab xov xwm IDs thiab kos cov kab lus teaser tivthaiv, dhau Id raws li cov khoom siv, thiab cov khoom siv menyuam yaus, tig mus, muab cov ntaub ntawv tsim nyog los ntawm Cov ntawv teev npe. Thaum koj mus rau nplooj ntawv tshaj tawm, peb tau txais hnub uas twb muaj lawm los ntawm Cov ntawv teev npe, peb thov kom tau txais cov ntaub ntawv uas ploj lawm thiab tsuas yog ntxiv rau cov khoom uas twb muaj lawm.

Vim li cas txoj kev no zoo dua? Raws li kuv tau sau saum toj no, txoj hauv kev no yooj yim dua nrog kev hwm rau cov ntaub ntawv rub tawm thiab tso cai rau koj rov siv dua. Tab sis dua li qhov no, nws qhib txoj hauv kev rau qee qhov kev muaj peev xwm tshiab uas haum zoo kawg nkaus rau hauv kev tsim qauv zoo li no. Piv txwv li, kev xaiv tsa thiab thauj cov khoom rau hauv qhov pub thaum lawv tshwm sim. Peb tuaj yeem tso cov ntawv tshaj tawm tshiab hauv "kho" Cov ntawv teev npe, txuag ib daim ntawv teev npe tshiab IDs tshiab hauv Cov ntawvIds thiab ceeb toom rau tus neeg siv txog nws. Thaum peb nyem rau ntawm lub pob "Qhia cov ntawv tshaj tawm tshiab", peb tsuas yog ntxig Ids tshiab rau hauv qhov pib ntawm cov npe ntawm cov ntawv tam sim no thiab txhua yam yuav ua haujlwm yuav luag zoo nkauj.

Ua kom download tau zoo dua

Lub icing ntawm lub ncuav mog qab zib refactoring yog lub tswvyim ntawm skeletons, uas ua rau cov txheej txheem ntawm rub tawm cov ntsiab lus hauv Internet qeeb me ntsis disgusting. Tsis muaj kev sib tham txog qhov teeb meem no; txoj hauv kev los ntawm lub tswv yim mus rau tus qauv siv ob teev. Tus qauv tsim tau kos nws tus kheej, thiab peb tau qhia peb cov khoom los ua kom yooj yim, NW nyuam qhuav flickering div blocks thaum tos cov ntaub ntawv. Raws li txoj cai, txoj hauv kev no rau kev thauj khoom tiag tiag txo qhov kev ntxhov siab cov tshuaj hormones hauv tus neeg siv lub cev. Lub cev pob txha zoo li no:

Habr front-end developer cav: refactoring thiab xav txog
Habraloading

Xav txog

Kuv tau ua haujlwm hauv Habre tau rau lub hlis thiab kuv cov phooj ywg tseem nug: zoo, koj nyiam nws nyob ntawd li cas? Okay, xis - yog. Tab sis muaj qee yam uas ua rau txoj haujlwm no txawv ntawm lwm tus. Kuv tau ua haujlwm hauv pab pawg uas tsis txaus siab rau lawv cov khoom, tsis paub lossis nkag siab tias lawv cov neeg siv yog leej twg. Tab sis ntawm no txhua yam txawv. Ntawm no koj xav tias lub luag haujlwm rau qhov koj ua. Nyob rau hauv tus txheej txheem ntawm kev tsim ib tug feature, koj ib feem los ua nws tus tswv, koom nyob rau hauv tag nrho cov khoom rooj sib tham txog koj functionality, ua tswv yim thiab txiav txim siab koj tus kheej. Ua ib yam khoom uas koj siv txhua hnub koj tus kheej yog qhov txias heev, tab sis sau cov cai rau cov neeg uas tej zaum yuav zoo dua ntawm koj yog qhov kev xav tsis txaus ntseeg (tsis muaj sarcasm).

Tom qab tso tawm tag nrho cov kev hloov pauv no, peb tau txais cov lus pom zoo, thiab nws zoo heev, zoo heev. Nws yog kev tshoov siab. Ua tsaug! Sau ntawv ntxiv.

Cia kuv ceeb toom rau koj tias tom qab kev hloov pauv thoob ntiaj teb peb tau txiav txim siab hloov cov qauv tsim thiab faib cov txheej txheem npe rau hauv ib qho piv txwv. Lub "ob-node" architecture twb tau mus txog tso tawm nyob rau hauv daim ntawv ntawm pej xeem beta xeem. Tam sim no leej twg tuaj yeem hloov mus rau nws thiab pab peb ua kom mobile Habr zoo dua. Qhov ntawd yog tag nrho rau hnub no. Kuv yuav zoo siab teb koj cov lus nug hauv cov lus.

Tau qhov twg los: www.hab.com

Ntxiv ib saib