Kas soovite paremat arusaamist puhvrist Node.js-is? Vaata seda.

Kas olete alati Müstifitseeritud nagu mina, kui te kohanud sõnu nagu puhver, Voog ja binaarandmete sisseNode.js? Kas see tunne sunnib teid nende mõistmisest kahanema, arvates, et need pole mõeldud teile, vaid ainult Node.js gurude ja pakettide arendajate mõistmiseks?

Tõepoolest, need sõnad võivad olla väga hirmutavad, eriti kui jõuate veebiarendusse Node.js-ga ilma CS-kraadita.

Kahjuks lähevad paljud õpetused ja raamatud otse õpetuse juurde, kuidas Node.js-pakettidega veebirakendusi arendada, laskmata teil mõista Node.js-i põhifunktsioone ja nende olemasolu. Ja mõned ütlevad sulle jultunult, et sa ei pea neist aru saama, sest sina iseei pruugi kunagi nendega otseselt töötada.

Noh, tõsi, te ei pruugi kunagi nendega otse koostööd teha, kui otsustate jääda keskmiseks Node.js arendajaks.

Kui aga saladused muudavad teid tõeliselt uudishimulikuks ja te ei peatu oma uudishimu rahuldamiseks midagi ning kui soovite oma Node.js-i mõistmise viia järgmisele tasemele, siis soovite tõesti süveneda, et mõista paljusid põhijooni näiteks Node.js-st, näiteks Buffer . Ja just sellepärast kirjutangi selle kirjatüki - et aidata meil mõnda neist funktsioonidest demüstifitseerida ja viia meie Node.js õppimine uuele tasemele.

Puhvri kasutuselevõtmisel märgitakse ametlikes Node.js dokumentides osaliselt…

... binaarandmete voogude lugemise või manipuleerimise mehhanism. BufferKlassi võeti kasutusele osana Node.js API võimaldab suhelda oktett ojad kontekstis asju nagu TCP ojad ja failisüsteemi.

Hmmm, kui teil pole eelteadmisi kõigist ülaltoodud lausetes olevatest sõnadest, on need tõenäoliselt ainult hunnik žargooni. Proovime seda veidi ümber sõnastada, sõnastades selle ümber, nii et saaksime olla selgelt fookuses ja meid ei häiriks sealsed paljud kellad ja viled. Sellest sissejuhatusest välja võttes võiksime julgelt öelda:

BufferKlassi võeti kasutusele osana Node.js API võimaldab manipuleerida või interakteeruvad ojad binaarandmete.

Nüüd on see lihtsam? Kuid ... puhver, voogud, binaarandmed ... ikka palju suuri sõnu. Noh, proovime neid suuri sõnu viimasest esimeseni lahendada.

Binaarandmed, mis see on?

Tõenäoliselt teate juba, et arvutid salvestavad ja esindavad andmeid kahendfailides. Binaarne on lihtsalt komplekt või kogum 1-st ja 0-st. Näiteks on järgmised viis erinevat kahendfaili, viis erinevat 1-de ja 0-d:

10, 01, 001, 1110,00101011

Iga number on binaarne, iga 1ja 0komplektis on nn Bit , mis on lühike vorm kahendnumbri.

Andmejupi salvestamiseks või esitamiseks peab arvuti need andmed teisendama binaarseks esituseks. Näiteks numbri 12 salvestamiseks peab arvuti teisendama selle 12 binaarseks kujutiseks, mis on 1100.

Kuidas arvuti teab, kuidas seda teisendust teha? Noh, see on puhas matemaatika. See on lihtne binaarne arvsüsteem, mille õppisime põhimatemaatikas - numbri väljendamine baas-2 numbrisüsteemis. Arvutid saavad sellest matemaatikast aru.

Kuid numbrid pole ainus andmetüüp, millega me töötame. Meil on ka stringe, pilte ja isegi videoid. Arvutid teavad, kuidas esindada igat tüüpi andmeid kahendfailides. Võtame näiteks stringid. Kuidas kujutab arvuti binaarfailides stringi “L”? Mis tahes tähemärgi salvestamiseks kahendfailidesse teisendab arvuti kõigepealt selle märgi numbriks, seejärel teisendab selle numbri binaarseks esituseks. Nii et stringi “L” puhularvutid teisendavad L kõigepealt numbriks, mis tähistab L-d . Vaatame kuidas.

Avage brauser konsooli ja kleebi järgmine koodilõik ja vajuta Enter: "L".charCodeAt(0). Mida sa nägid? Number 76? See on tähemärgi L numbriesitus või märgikood või koodipunkt . Kuid kuidas saab arvuti teada, milline täpne arv tähemärki tähistab? Kust saab teada, et numbrit 76 kasutatakse L tähistamiseks ?

Märgistikud

Tähemärkide komplektid on juba määratletud reeglid selle kohta, milline täpne arv tähistab iga märki. Meil on nende reeglite erinevad määratlused. Väga populaarsed on Unicode ja ASCII . JavaScript mängib Unicode'i märkekomplektidega väga hästi. Tegelikult ütleb teie brauseri Unicode, et 76 peaks tähistama L-i .

Nii et oleme näinud, kuidas arvutid tähistavad numbreid. Nüüd tähistab arvuti omakorda numbrit 76 oma binaarse esituse järgi. Võite mõelda, et noh, teisendage lihtsalt 76 baas-2 numbrisüsteemiks. Mitte nii kiiresti!

Tähemärkide kodeerimine

Nii nagu on reegleid, mis määratlevad, milline number peaks tähemärki tähistama, on ka reegleid, mis määratlevad, kuidas seda numbrit kahendfailides esindama peaks. Täpsemalt, mitu bitti numbri tähistamiseks kasutada. Seda nimetatakse märkide kodeerimiseks .

Üks märgi kodeerimise definitsioonidest on UTF-8 . UTF-8 ütleb, et märgid peaksid olema kodeeritud baitidesse. Bait on kaheksa bitti komplekt - kaheksa 1 ja 0. Seega tuleks kaheksa 1- ja 0-tähte kasutada mis tahes binaarse märgi koodipunkti tähistamiseks.

Selle mõistmiseks, nagu me varem mainisime, on numbri 12 binaarne esitus 1100. Nii et kui UTF-8 väidab, et 12 peaks olema kaheksa bitti, ütleb UTF-8, et arvuti peab baidiks muutmiseks lisama arvu 12 tegeliku baas-2 tegeliku kujutise vasakule küljele rohkem bitte. Nii et 12 tuleks salvestada kujul 00001100. Kõlab loogiliselt?

Seetõttu tuleks 76 säilitada kujul 01001100.

Nii, mu sõbrad, hoiavad arvutid stringe või märke binaarfailides. Samuti on arvutites täpsustatud reeglid selle kohta, kuidas pilte ja videoid teisendada või kodeerida ja binaarfailidesse salvestada. Mõte on selles, et arvutid salvestavad kõiki andmetüüpe kahendfailidesse ja seda nimetatakse kahendandmeteks.

Kui teid huvitab märkide kodeerimise nõtke sisu, võib see õrn ja üksikasjalik sissejuhatus teile meeldida.

Nüüd saame aru, mis on binaarandmed, kuid mis on binaarandmete voogudalates meie sissejuhatusest kuni puhvrini?

Voog

Voog Node.js-s tähendab lihtsalt andmete jada, mida aja jooksul ühest punktist teise liigutatakse. Kogu kontseptsioon seisneb selles, et teil on töötlemiseks tohutult palju andmeid, kuid enne nende töötlemise alustamist ei pea te ootama, kuni kõik andmed on saadaval.

Põhimõtteliselt jagatakse need suured andmed ja saadetakse tükkidena. Nii et puhvri algsest määratlusest (“binaarandmete voog… failisüsteemi kontekstis”) tähendab see lihtsalt binaarsete andmete teisaldamist failisüsteemis. Näiteks failis1.txt salvestatud tekstide teisaldamine faili2.txt.

Kuid kuidas aitab puhver meil voogesituse ajal binaarandmetega suhelda või nendega manipuleerida? Mis see puhver btw täpsemalt on?

Puhver

Oleme näinud, et andmevoog on andmete liikumine ühest punktist teise, kuid kuidas neid täpselt liigutatakse?

Tavaliselt toimub andmete liikumine kavatsusega neid töödelda või neid lugeda ja nende põhjal otsuseid langetada. Kuid on minimaalne ja maksimaalne andmemaht, mille protsess võib aja jooksul võtta. Nii et kui andmete saabumise kiirus on kiirem, kui protsess andmeid kulutab, peavad üleliigsed andmed oma järjekorra töötlemist kuskil ootama.

Teisalt, kui protsess kulutab andmeid kiiremini kui saabub, peavad vähesed varem saabunud andmed enne töötlemiseks väljasaatmist ootama teatud hulga andmete saabumist.

See “ooteala on puhver! See on väike füüsiline asukoht teie arvutis, tavaliselt RAM-is, kuhu andmed ajaliselt kogutakse, ootavad ja lõpuks voogesituse ajal töötlemiseks välja saadetakse.

Võime mõelda kogu voo ja puhvri protsessist kui bussijaamast. Mõnes bussijaamas ei tohi buss väljuda enne, kui saabub teatud hulk reisijaid või kuni konkreetse väljumisajani. Samuti võivad reisijad saabuda erinevatel aegadel erineva kiirusega. Reisijad ja bussijaam ei kontrolli reisijate jaama saabumist.

Igal juhul peavad varem saabunud reisijad ootama, kuni bussijaam otsustab bussi teele saata. Kui reisijad, kes saabuvad siis, kui buss juba laadib või kui buss on juba väljunud, peavad ootama järgmist bussi.

Ükskõik millisel juhul on ootekoht alati olemas. See on puhver Node.js-le! Node.js ei saa kontrollida andmete saabumise kiirust ega aega, voo kiirust. See saab otsustada ainult siis, kui on aeg andmed välja saata. Kui pole veel aeg, paneb Node.js need puhvrisse - "ooteala" - RAMi väikesesse asukohta, kuni on aeg need töötlemiseks välja saata.

Tüüpiline näide puhvri toimimisest on video voogesituse ajal. Kui teie Interneti-ühendus on piisavalt kiire, on voo kiirus piisavalt kiire, et puhver koheselt täita ja töötlemiseks välja saata, seejärel täita veel üks ja saata see välja, siis veel üks ja veel ... kuni voogeni on lõpetatud.

Kuid kui teie ühendus on aeglane, kuvab videopleier pärast esimese saabunud andmekogumi töötlemist laadimisikooni või teksti „puhverdamine”, mis tähendab rohkemate andmete kogumist või rohkemate andmete saabumist. Ja kui puhver on täidetud ja töödeldud, näitab mängija andmeid, videot. Selle esitamise ajal jätkub andmete lisamine ja ootamine puhvris.

Kui mängija on eelmiste andmete töötlemise või esitamise lõpetanud ja puhver pole veel täis, kuvatakse uuesti tekst „puhverdamine”, oodates töötlemiseks rohkem andmeid.

See on puhver!

Puhvri algsest määratlusest näitab see, et puhvris olles saame voogedastatavate binaarandmetega manipuleerida või nendega suhelda. Millist koostoimet võiksime selle toore binaarandmetega teha? Puhvri juurutamine Node.js-is annab meile terve loetelu tehtavatest. Vaatame mõnda neist.

Puhvriga suhtlemine

On isegi võimalik luua oma puhver! Lisaks sellele, mille Node.js voo ajal automaatselt loob, on võimalik luua ja oma puhvrit käsitseda. Huvitav eks? Loome ühe!

Sõltuvalt sellest, mida soovite saavutada, on puhvri loomiseks erinevaid viise. Vaatame mõnda.

// Create an empty buffer of size 10. // A buffer that only can accommodate 10 bytes.
const buf1 = Buffer.alloc(10);
// Create a buffer with content
const buf2 = Buffer.from("hello buffer");

Kui puhver on loodud, saate sellega suhelda

// Examine the structure of a buffer
buf1.toJSON()// { type: 'Buffer', data: [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] }// an empty buffer
buf2.toJSON()// { type: 'Buffer', data: [ 104, 101, 108, 108, 111, 32, 98, 117, 102, 102, 101, 114 ] }
// the toJSON() method presents the data as the Unicode Code Points of the characters
// Examine the size of a buffer
buf1.length // 10
buf2.length // 12. Auto-assigned based on the initial content when created.
// Write to a bufferbuf1.write("Buffer really rocks!") 
// Decode a buffer
buf1.toString() // 'Buffer rea'
//oops, because buf1 is created to contain only 10 bytes, it couldn't accommodate the rest of the characters
// Compare two buffers

Me võime puhvriga suhelda väga palju. Nende meetoditega rohkem mängimiseks minge ametlikesse dokumentidesse.

Lõpuks jätan teile selle väikese väljakutse: lugege läbi Node.js ühe tuumikukogude zlib.js allikas , et näha, kuidas see kasutab binaarandmete voogude manipuleerimiseks puhvrit. Need osutuvad gzipitud failideks. Lugedes dokumenteerige õpitu ja jagage lahkesti meiega siin kommentaarides.

Loodan, et see sissejuhatus aitas teil paremini mõista Node.js puhvrit.

Kui tunnete, et olen teinud toredat tööd ja et teised väärivad võimalust seda näha, plaksutage lahkelt artiklit, et aidata meie Node.js kogukonnas paremini mõista puhvrit.

Kui teil on küsimus, millele pole vastatud, või kui teil on mõnest siinsest punktist erinev arusaam, võite julgelt kommentaare lisada siin või Twitteri kaudu.