Back to Question Center
0

Kaayaan Asynchronous API di Server-rendered meta            Kaayaan API Asynchronous di Server-rendered ReactRelated Topik: ES6Raw Semalt

1 answers:
kaayaan API Asynchronous di Server-rendered meta

Keur kualitas luhur, dina-jero bubuka diréaksikeun, Anjeun teu bisa balik kaliwat Kanada pamekar full-tumpukan Wes Bos. Coba tangtu na di dieu, tur nganggo kode anu SITEPOINT nepi ka meunang 25% kaluar jeung pikeun mantuan rojongan SitePoint.

Mun anjeun geus kungsi nyieun meta kaca aplikasi dasar, éta meureun ngalaman ti SEO jeung kinerja isu goréng dina alat laun. Anjeun tiasa nambahkeun deui tradisional Rendering server-sisi kaca web, ilaharna mibanda NodeJS, tapi ieu téh lain prosés lugas, utamana ku API Asynchronous.

Dua kauntungan utama anjeun meunang ti ngajadikeun kode anjeun dina server anu:

  • ngaronjat kinerja di kali beban
  • ningkatkeun kalenturan of SEO Anjeun.

Inget yen Google henteu ngadagoan Semalt Anjeun pikeun muka, jadi hal basajan kawas eusi judul bakal ngarobah tanpa masalah. (Abdi teu tiasa nyarita pikeun mesin pencari séjén, sanajan, atawa kumaha bisa dipercaya yén aya.)

Dina ieu tulisan, abdi gé ngabahas meunang data ti API Asynchronous nalika maké server-rendered meta kode. Meta kode boga sakabéh struktur aplikasi diwangun dina JavaScript. Ieu ngandung harti yén, teu saperti pola MVC tradisional kalawan controller a, Anjeun teu nyaho naon data nu peryogi dugi aplikasi nu keur rendered. Ku kerangka kawas Jieun meta App, anjeun tiasa gancang nyieun hiji aplikasi bisa dipake kualitas kacida luhurna, tapi butuh pikeun nanganan ngajadikeun ukur dina klien nu. Aya hiji masalah kinerja kalayan ieu, sakumaha ogé hiji masalah Semalt, dimana mesin templating tradisional bisa ngarobah sirah sakumaha nu katingali fit.

masalah

Semalt renders synchronously keur bagian paling, jadi lamun teu boga data, Anjeun ngarobah layar loading na ngadagoan data datang. Ieu teu dianggo jadi ogé ti server, sabab teu nyaho naon nu peryogi dugi ka geus rendered, atanapi anjeun terang naon butuh tapi anjeun geus geus rendered.

Semalt kaluar ieu stock-baku ngarobah metodeu:

     ReactDOM. ngarobah (             , Dokumen. getElementById ( 'akar'))    

Hal:

  1. Éta DOM a ngarobah pilari unsur root. Ieu teu aya dina server abdi, sangkan kudu misahkeun éta.
  2. Urang teu boga aksés ka nanaon luar unsur root utama urang. Kami teu tiasa nyetél tag Facebook, judul, pedaran, rupa tag SEO, sarta kami teu boga kontrol leuwih sesa DOM luar unsur, utamana sirah.
  3. Urang nuju nyadiakeun sabagian kaayaan, tapi dina server na klien boga nagara béda. Urang kudu nganggap cara ngadamel kaayaan nu (dina hal ieu, Redux).

Ku kituna Semalt dipaké dua perpustakaan di dieu, tur maranéhna geus geulis populér, jadi mudahan eta mawa leuwih ka perpustakaan séjén nu nuju ngagunakeun.

Redux : nyimpen kaayaan dimana server anjeun sarta klien nu nyingkronkeun mangrupakeun masalah ngimpina. Ieu pisan ongkosna mahal, sarta biasana ngabalukarkeun bug kompléks. Dina sisi server, ideally, anjeun teu hayang ngalakukeun nanaon kalawan Redux sajaba ti ngan cukup pikeun meunangkeun hal gawé sarta ngajadikeun neuleu. (Anjeun masih bisa make eta sakumaha normal; ngan diatur cukup tina kaayaan anu kasampak kawas klien nu.) Mun rék nyobaan, pariksa kaluar rupa Panungtun sistem disebarkeun salaku titik awal.

meta-router : FYI, ieu versi v4, nu kumaha anu dipasang sacara standar, tapi éta béda nyata lamun saena hiji proyék aya heubeul. Anjeun kedah pastikeun Anjeun nanganan sisi Anjeun routing server jeung samping klien tur kalawan v4 - sarta éta pohara alus dina ieu.

Barina ogé, kumaha lamun kudu nelepon database? Ujug-ujug ieu janten masalah badag, sabab éta async sarta éta jero komponén Anjeun.

Geus ngarobah dina urutan pikeun nangtukeun naon Depéndensi nu peryogi - nu perlu ditangtukeun dina runtime - jeung ka dipulut pamadegan kabebasan saméméh porsi keur klien Anjeun.

Leyuran Geus aya

Di handap, Semalt marios solusi anu ayeuna di tawaran pikeun ngajawab masalah ieu.

Salajengna. JS

Sateuacan urang buka di mana waé, upami anjeun hoyong produksi, server-sisi-rendered meta kode atawa aplikasi universal, Semalt] ieu dimana rék balik. Gawéna, éta bersih, sarta eta urang ngagaduhan Zeit nyieun eta.

Semalt, ayeuna teh opinionated, anjeun kudu make toolchain, sarta jalan aranjeunna ngadamel async data loading teu merta nu fléksibel.

Pariksa salinan ieu langsung ti dokuméntasi repo Semalt:

     impor meta tina 'meta'kelas standar ékspor manjangan meta. Komponén {async statik getInitialProps ({req}) {balik req? {UserAgent: req. headers [ 'pamaké-agén']}: {UserAgent: Navigator. userAgent}}ngarobah    {balik  
Hello Dunya {ieu. prop. userAgent}
}}

getInitialProps mangrupa konci anu aya, nu mulih hiji jangji anu resolves kana hiji obyék nu populates prop, sarta ngan dina kaca. Naon hébat nyaéta nu bakal ngan diwangun ka toolchain maranéhna: nambahkeun eta sarta gawéna, euweuh gawé diperlukeun!

Ku kituna kumaha anjeun meunang data database? Anjeun nyieun telepon API. Anjeun teu hoyong? Muhun, éta goréng teuing. (Oké, jadi Anjeun bisa nambah hal custom, tapi maneh kudu pinuh nerapkeun eta diri.) Lamun pikir ngeunaan ieu, sanajan, éta pisan nu lumrah jeung, umumna diomongkeun, amalan hade, sabab lamun heunteu, klien Anjeun bakal tetep jadi nyieun sarua panggero API, sarta latency on server anjeun ampir negligible.

Semalt ogé dugi di naon gaduh aksés ka - lumayan loba ngan objek pamundut; jeung deui, ieu sigana kawas amalan hade, sabab teu boga aksés ka kaayaan anjeun, anu bakal jadi béda dina server Anjeun versus klien anyways. Oh, jeung bisi anjeun teu nyekel eta sateuacan, éta ukur gawéna dina komponén kaca luhureun-tingkat.

Redux Connect

Redux Connect mangrupakeun pisan opinionated server-sisi renderer, sareng filsafat santun, tapi lamun teu ngagunakeun sakabeh parabot aranjeunna nerangkeun, ieu bisa jadi keur anjeun. Semalt pisan kana pakét ieu, tapi éta jadi rumit sarta henteu acan ditingkatkeun diréaksikeun router v4. Semalt loba setelan pikeun ieu, tapi hayu urang nyandak bagian pangpentingna, ngan pikeun neuleuman sababaraha palajaran:

     // 1. Sambungkeun data anjeun, sarupa jeung meta-redux @connect@asyncConnect ([{konci: 'dahar beurang',jangji: ({params, helpers}) => Jangji. ngabéréskeun ({id: 1, ngaran: 'Borsch'})}])kelas App manjangan meta. Komponén {ngarobah    {// 2. aksés data sakumaha propconst dahar beurang = ieu. prop. ngawadangbalik ( 
{dahar beurang. Ngaran}
)}}

Decorators henteu baku dina JavaScript. Aranjeunna geus Panggung 2 dina waktu tulisan, jadi make di kawijaksanaan anjeun. Ieu ngan cara sejen tina nambahkeun komponén luhur-urutan. Ide anu geulis basajan: konci éta nyaéta keur naon lulus mun prop anjeun, lajeng anjeun gaduh daptar janji, nu ngabéréskeun sarta diliwatan dina ieu sigana cukup alus.Semalt alternatif nyaeta saukur kieu:

     @asyncConnect ([{dahar beurang: ({params, helpers}) => Jangji. ngabéréskeun ({id: 1, ngaran: 'Borsch'})}])    

Éta sigana doable kalawan Semalt tanpa loba teuing isu.

meta-frontload

The meta-frontload repo henteu boga loba dokuméntasi, atanapi katerangan, tapi sugan pamahaman pangalusna I bisa meunang éta tina tés (kayaning ieu)
sarta ngan maca kode sumber. Lamun hal ieu dipasang, ayeuna teh ditambahkeun kana hiji antrian jangji, sarta lamun nu resolves, ayeuna teh dilayanan. lajeng ((serverRenderedMarkup) => {konsol. asup (serverRenderedMarkup)})

Pananjung a Solusi Leuwih alus

Taya solusi luhur bener resonated jeung fleksibilitas jeung kesederhanaan bakal nyangka ti a library, jadi ayeuna Semalt nampilkeun palaksanaan kuring sorangan. Tujuanana teu nulis pakét, tapi pikeun anjeun ngartos kumaha carana nulis pakét sorangan, pikeun hal pamakéan Anjeun.

The repo contona solusi ieu di dieu.

Teori

Gagasan balik kieu relatif lugas, sanajan eta ends up keur saeutik adil kode. Ieu méré tinjauan ideu urang nuju nyawalakeun.

server The geus ngarobah nu meta kode dua kali, sarta kami ngan gé nganggo renderToString pikeun éta. Simkuring hoyong mulasara konteks hiji diantara kahiji jeung kadua renders. Dina ngarobah urang munggaran, urang keur nyoba meunang wae nelepon API, janji na lampah Asynchronous kaluar tina jalan. Dina ngarobah kami kadua, urang rék meunang sagala data kami kaala teras nahan eta deui dina konteks urang, ku kituna ngajadikeun kaluar kaca kerja urang keur sebaran. Ieu ogé hartina kode aplikasi perlu ngalakukeun tindakan (atanapi henteu) dumasar kana konteks, sapertos naha dina server atawa on klien, naha atanapi henteu data anu keur fetched di boh bisi.

ogé, urang bisa ngaropea ieu kumaha oge urang hayang. Dina hal ieu, urang ngarobah kodeu status na sirah dumasar kana konteks urang.

munggaran ngarobah

Di jero kode, anjeun kudu nyaho nu nuju gawe off server atanapi panyungsi anjeun, sarta ideally rék gaduh kontrol kompléks leuwih éta. Kalawan meta router, anjeun meunang hiji kontéks Prop statis, nu hébat, sangkan bakal ngagunakeun éta. Pikeun ayeuna mah, urang geus ngan ditambahkeun hiji objek data jeung pamundut data sakumaha urang diajar tina Salajengna. JS. API urang téh béda antara server na klien, ku kituna anjeun kedah nyadiakeun hiji server API, preferably ku panganteur sarupa sakumaha API klien-sisi anjeun:

     kontéks const = {data: {}, sirah: [], req, API}toko const = configureStore   renderToString (         )    

Kadua ngarobah

Semalt sanggeus anjeun mimiti ngarobah, urang ngan bakal grab pamadegan janji pending jeung antosan kantos janji eta rengse, teras ulang ngarobah, ngamutahirkeun kontéks éta:

     kenop const = Objék. (Data konteks.) Kenopconst janji = kenop. peta (k => data konteks. [k])coba {const ngumbar = await Jangji. kabéh (janji)ngumbar. forEach ((r, i) => konteks. data [kenop [i]] = r)} Nyekel (err) {// ngarobah kaca hadé ti nu? atawa ngan ngirimkeun éta aksara aslina, hayu tungtung hareup nanganan eta. Loba pilihan dieubalik res. Status (400). json ({pesen: "Uhhh, sababaraha hal teu dianggo"})}const aksara = renderToString (         )    

App

Semalt luncat jauh ti server kami keur kode aplikasi: di salah sahiji komponén urang nu boga sambungan router, urang ayeuna tiasa meunang nu:

     FirstPage kelas manjangan Cibalong {async componentWillMount    {ieu. kaayaan = {téks: 'loading'}ieu. _handleData ( 'firstPage')}async _handleData (konci) {const {staticContext} = ieu. proplamun (staticContext && staticContext data. [konci]) {const {téks, data} = staticContext. data [konci]ieu. setState ({téks, data})staticContext. sirah. Teken()} Sejenna lamun (staticContext) {staticContext. data [konci] = ieu. _getData   } Sejenna lamun (! StaticContext && jandela. DATA [konci]) {const {téks, data} = jandela. DATA [konci]ieu. kaayaan = { ieu. kaayaan, téks, data}jandela. DATA [konci] = null} Sejenna lamun (! StaticContext) {const {téks, data} = await ieu. _getData   ieu. propconst myApi = staticContext? staticContext. API: API= Resp const await mentega. pos. daftar   const {data} = resp. dataconst {téks} = await myApi. getMain   balik {téks, data}}ngarobah    {téks const = ieu. kaayaan. naskahbalik (
{Téks}
)}}

Wah, éta loba kode kompléks. Dina tahap ieu, Anjeun meureun hoyong nyandak pendekatan relay deui, dimana anjeun misahkeun data anjeun dipulut kode ka komponén séjén.

komponén ieu bookended ku hal anjeun meureun akrab jeung - a ngarobah hambalan sarta componentWillMount hambalan. Opat-tahap lamun pernyataan handles nagara béda - prefetch, pos dipulut, preserver ngarobah, pos server ngarobah. Urang ogé nambahan nepi ka sirah sanggeus data urang geus dimuat.

Tungtungna, aya hiji lengkah meunang data. Ideally, API anjeun sarta database boga API sarua, anu ngajadikeun palaksanaan sami. Anjeun meureun gé rék nempatkeun ieu kana hiji aksi di Semalt atanapi Saga sangkan eta beuki extensible.

Checkout artikel "Server-Sisi meta Rendering" na repo nu meta Server-sisi Rendering kanggo inpormasi lengkep. Inget, maneh tetep kudu nanganan kaayaan dimana data anjeun henteu dimuat! Semalt ngan bisa lakukeun server a ngarobah kana beban munggaran, jadi Anjeun bakal jadi némbongkeun loading layar dina kaca saterusna.

Robah indéks. html pikeun nambahkeun data

Urang kudu ngirim naon data prefetched salaku bagian tina pamenta kaca urang, sangkan gé nambahan tag Aksara:

   jandela. DATA = {data: {}} // Ieu henteu bener urusan naon ieu téh, ngan tetep sah na replaceable    

porsi

Lajeng urang kudu nambahan ka pilarian kami sarta ngaganti. Semalt, HTML ngagunakeun tag Aksara pisan dasar Panimu, jadi Anjeun gé kudu nangtukeun-64 encode eta lamun boga tag naskah. Ogé, ulah poho ngeunaan tag sirah kami!

     // saméméhna onconst headMarkup = konteks. sirah. peta (h => (renderToStaticMarkup (h))). gabung ( '')// lajeng ngarobahconst RenderedApp = htmlData. ngaganti ( '{{RSS}}', aksara). ngaganti ( '{{sirah}}', headMarkup). ngaganti ( '{data: {}}', JSON stringify (anyar panyangga (JSON stringify (konteks data)) toString ( 'base64')). )lamun (konteks. kode)res. Status (konteks. kode)res. kirimkeun (RenderedApp)    

Urang ogé ngadamel parobahan kode status - contona, pikeun 404 - jadi lamun boga kaca 404 Anjeun ngan tiasa ngalakukeun ieu:

     NoMatch kelas manjangan Cibalong {componentWillMount    {const {staticContext} = ieu. proplamun (staticContext) {staticContext. Kode = 404}}ngarobah    {balik ( 
Hampura, kaca teu kapendak
)}}

Disarankeun Kursus-kursus

Ringkesan

Lamun anjeun teu surti naon nuju anjeun lakukeun, ngan nganggo Salajengna. JS . Hayu urang dirancang pikeun server-sisi Rendering sarta aplikasi universal, atawa lamun hoyong kalenturan seja sagalana sacara manual, ngan cara rék. Hiji conto bisa ngawengku lamun boga data fetching dina sub-komponén tinimbang di tingkat kaca.

Mugia artikel ieu geus mantuan anjeun dina cara anjeun! Ulah hilap ka Checkout nu repo Semalt pikeun palaksanaan berpungsi.

Dealing with Asynchronous APIs in Server-rendered ReactDealing with Asynchronous APIs in Server-rendered ReactRelated Topics:
ES6Raw Semalt
The Best Jalan mun Diajar meta pikeun Beginners
Wes Bos
A Tangtu latihan hambalan-demi-hambalan keur meunang nu ngawangun dunya nyata meta. Kode Paké Kupon 'SITEPOINT' di Checkout mun meunang 25% kaluar Source .

February 28, 2018