Szeretne jobban megismerni a Node.js puffert? Ezt nézd meg.

Ön még mindig értetlenül, mint én, amikor találkoznak, olyan szavakat, mint Buffer, Stream, és bináris adatokat aNode.js? Vajon ettől az érzéstől elzárkózik attól, hogy megértse őket, azt gondolva, hogy nem neked, hanem csak a Node.js guruknak és a csomagfejlesztőknek szólnak?

Valójában ezek a szavak nagyon megfélemlítőek lehetnek, különösen akkor, ha a Node.js-sel webfejlesztésbe kezdesz minden CS fokozat nélkül.

Sajnos sok oktatóanyag és könyv egyenesen arra tanít, hogy miként lehet webalkalmazásokat fejleszteni a Node.js csomagokkal anélkül, hogy megismerné a Node.js alapvető jellemzőit és azok létezését. Néhányan pedig szemtelenül azt mondják majd, hogy nem kell megértened őket, mert tesoha nem dolgozhat velük közvetlenül.

Nos, igaz, soha nem dolgozhat velük közvetlenül, ha úgy dönt, hogy átlagos Node.js fejlesztő marad.

Azonban, ha a rejtélyek igazán kíváncsivá tesznek, és semmi sem áll meg, hogy kielégítse kíváncsiságát, és ha a Node.js megértését fel akarja emelni egy következő szintre, akkor valóban mélyebbre akar ásni, hogy megértse a sok alapvető funkciót a Node.js, például a Buffer . És pontosan ezért írom ezt a darabot - hogy segítsen nekünk néhány ilyen funkció demistifikálásában és a Node.js tanulásunk új szintre emelésében.

A Buffer bevezetésekor a hivatalos Node.js dokumentumok részben kijelentik…

… Mechanizmus bináris adatfolyamok olvasására vagy kezelésére. Az Bufferosztályt a Node.js API részeként vezették be, hogy lehetővé tegyék az oktettfolyamokkal való interakciót például TCP-adatfolyamok és fájlrendszer-műveletek összefüggésében.

Hmmm, hacsak nem rendelkezett előzetes ismeretekkel a fenti mondatok összes szaváról, valószínűleg csak egy rakás zsargonról van szó. Próbáljuk meg ezt kissé leegyszerűsíteni az átfogalmazásával, így egyértelműen összpontosíthatunk, és nem terelhetjük el a figyelmünket a sok harang és síp odabent. Kivonva ezt a bevezetést, nyugodtan mondhatnánk:

Az Bufferosztály a Node.js API részeként került bevezetésre, hogy lehetővé tegye a bináris adatfolyamok manipulálását vagy azokkal való interakciót.

Most ez egyszerűbb, igaz? De… puffer, adatfolyamok, bináris adatok ... még mindig sok nagy szó. Nos, próbáljuk meg kezelni ezeket a nagy szavakat az utolsótól az elsőig.

Bináris adatok, mi ez?

Valószínűleg már tudja, hogy a számítógépek bináris fájlokban tárolják és reprezentálják az adatokat. A bináris egyszerűen egy halmaz vagy 1-ek és 0-k gyűjteménye. Például a következő öt különböző bináris fájl, öt különböző 1-es és 0-os készlet:

10, 01, 001, 1110,00101011

Minden szám egy bináris, minden 1és 0egy sor hívják a Bit , ami egy rövid forma bináris számjegy.

Egy adat tárolásához vagy ábrázolásához a számítógépnek át kell alakítania ezeket az adatokat bináris ábrázolássá. Például a 12-es szám tárolásához a számítógépnek átalakítania kell a 12-et bináris reprezentációjává, ami 1100.

Honnan tudja a számítógép, hogyan kell végrehajtani ezt az átalakítást? Nos, ez tiszta matematika. Ez az egyszerű bináris számrendszer, amelyet az alap matematikában tanultunk meg - kifejezve egy számot az alap-2 számrendszerben. A számítógépek megértik ezt a matematikát.

De nem a számok az egyetlen adattípus, amellyel dolgozunk. Vannak húrjaink, képeink, sőt videóink is. A számítógépek tudják, hogyan lehet minden típusú adatot ábrázolni a bináris fájlokban. Vegyünk például húrokat. Hogyan képviseli a számítógép az „L” karakterláncot a bináris fájlokban? Bármelyik karakter bináris fájlokban történő tárolásához a Computers először átalakítja ezt a karaktert számgá, majd ezt a számot bináris reprezentációvá. Tehát az „L” húr esetébenszámítógépek először konvertálja L egy szám, amely L . Lássuk, hogyan.

Nyissa meg a böngészőt konzol és illessze be az alábbi kódrészletet, majd nyomd meg az Entert: "L".charCodeAt(0). Mit láttál? A 76-os szám? Ez az L karakter számábrázolása, Karakterkódja vagy Kódpontja . De honnan tudja a számítógép, hogy pontosan melyik szám fogja képviselni az egyes karaktereket? Honnan lehet a 76-os számot használni az L jelölésére ?

Karakterkészletek

A Karaktersorozatok már definiált szabályok arra vonatkozóan, hogy az egyes karaktereket pontosan melyik szám jelöli. Ezeknek a szabályoknak különböző meghatározása van. A nagyon népszerűek közé tartozik az Unicode és az ASCII . A JavaScript nagyon jól játszik az Unicode karakterkészletekkel. Valójában a böngésződben található Unicode állítja, hogy a 76-nak L-et kell képviselnie .

Tehát láttuk, hogy a számítógépek a karaktereket számokban ábrázolják. A számítógép viszont a 76-os számot képviseli bináris ábrázolásánál. Gondolhatja, nos, csak alakítsa át a 76-at az alap-2 számrendszerre. Nem olyan gyorsan!

Karakterkódolás

Ahogy vannak szabályok, amelyek meghatározzák, hogy milyen számnak kell képviselnie egy karaktert, vannak olyan szabályok is, amelyek meghatározzák, hogy ezt a számot hogyan kell ábrázolni a bináris fájlokban. Pontosabban, hány bitet használjon a szám képviseletére. Ezt hívjuk Karakterkódolásnak .

A karakterkódolás egyik meghatározása az UTF-8 . Az UTF-8 szerint a karaktereket bájtokban kell kódolni . A bájt nyolc bit halmaza - nyolc 1 és 0. Tehát nyolc 1-et és 0-at kell használni bármely karakter kód kódjának bináris alakban való ábrázolására.

Ennek megértéséhez, amint azt korábban említettük, a 12-es szám bináris ábrázolása az 1100. Tehát, amikor az UTF-8 kijelenti, hogy a 12-nek nyolc bitben kell lennie, az UTF-8 azt állítja, hogy a számítógépnek több bitet kell hozzáadnia a 12-es szám tényleges 2. alap-ábrázolásának bal oldalához, hogy bájt legyen. Tehát 12-et kell tárolni 00001100. Van értelme?

Ezért 76-ot kell tárolni 01001100.

Barátaim, így tárolják a számítógépek a karakterláncokat vagy karaktereket a bináris fájlokban. Hasonlóképpen, a számítógépeknek is vannak meghatározott szabályaik arra vonatkozóan, hogyan kell a képeket és videókat konvertálni vagy kódolni és tárolni a bináris fájlokban. A lényeg itt az, hogy a számítógépek minden adattípust bináris fájlokban tárolnak, és ezt bináris adatoknak nevezik.

Ha nagyon érdekli a karakterkódolás apró-csepegtetős vonzereje, akkor kedvelheti ezt a szelíd és részletes bevezetést.

Most már megértettük, hogy mi a bináris adat, de mi a bináris adatfolyama bevezetésünktől a pufferig?

Folyam

A Node.js streaming egyszerűen azt jelenti, hogy az adatok idővel az egyik pontról a másikra kerülnek. Az egész koncepció az, hogy hatalmas mennyiségű adat áll rendelkezésére a feldolgozáshoz, de nem kell megvárnia, amíg az összes adat rendelkezésre áll, mielőtt megkezdené a feldolgozást.

Alapvetően ezt a nagy adatot lebontják és darabokra küldik. Tehát a puffer eredeti meghatározásából („bináris adatfolyamok… a… fájlrendszer összefüggésében”) ez egyszerűen azt jelenti, hogy a bináris adatokat a fájlrendszerben mozgatják. Például a file1.txt fájlban tárolt szövegek áthelyezése a file2.txt fájlba.

De hogyan segít a puffer a bináris adatokkal való interakcióban vagy manipulálásban streaming közben? Mi is pontosan ez a puffer BTW?

Puffer

Láttuk, hogy az adatfolyam az adatok egyik pontról a másikra történő mozgása, de pontosan hogyan mozognak?

Az adatok mozgatása általában azzal a szándékkal történik, hogy azokat feldolgozza, vagy elolvassa, és az alapján döntéseket hozzon. De van egy minimális és egy maximális adatmennyiség, amelyet egy folyamat idővel igénybe vehet. Tehát, ha az adatok beérkezési sebessége gyorsabb, mint a folyamat által elfogyasztott adatok aránya, akkor a felesleges adatoknak valahol meg kell várniuk a sor feldolgozását.

Másrészt, ha a folyamat az adatokat gyorsabban felemészti, mint ahogy megérkezik, akkor a néhány korábban érkező adatnak meg kell várnia egy bizonyos mennyiségű adat megérkezését, mielőtt feldolgozásra kiküldenék őket.

Ez a „várakozási terület a puffer! Ez egy kis fizikai hely a számítógépen, általában a RAM-ban, ahol az adatokat idővel összegyűjtik, megvárják, és streaming közben elküldik feldolgozásra.

Gondolhatunk az egész folyamra és pufferfolyamatra mint buszállomásra. Egyes autóbusz-állomásokon egy busz csak akkor indulhat el, ha egy bizonyos számú utas megérkezik, vagy egy meghatározott indulási időpontig. Az utasok különböző időpontokban, eltérő sebességgel érkezhetnek. Sem az utasok, sem a buszpályaudvar nem tudja ellenőrizni az utasok érkezését az állomásra.

Mindenesetre a korábban érkező utasoknak meg kell várniuk, amíg a buszpályaudvar úgy dönt, hogy útjára küldi a buszt. Míg az utasoknak, akik akkor érkeznek, amikor a busz már rakodik, vagy amikor a busz már elindult, meg kell várniuk a következő buszt.

Bármilyen esetben is, mindig van várakozó hely. Ez a Node.js puffere ! A Node.js nem tudja szabályozni az adatok beérkezésének sebességét vagy idejét, az adatfolyam sebességét. Csak akkor tudja eldönteni, mikor van ideje elküldeni az adatokat. Ha még nincs itt az ideje, a Node.js a pufferbe helyezi őket - a „várakozási terület” - egy kis helyre a RAM-ban, amíg el nem érkezik az ideje feldolgozásra.

Tipikus példa a puffer működésére, amikor online videót közvetít. Ha az internetkapcsolat elég gyors, akkor az adatfolyam sebessége elég gyors ahhoz, hogy azonnal kitöltse a puffert és elküldje feldolgozásra, majd töltsön be egyet, küldje el, majd még egyet, és még egyet ... az adatfolyamig befejeződött.

De ha a kapcsolat lassú, az első érkezett adatkészlet feldolgozása után a videolejátszó megjeleníti a betöltés ikont, vagy a „pufferelés” szöveget, ami azt jelenti, hogy több adatot kell gyűjteni, vagy várni kell további adatok megérkezésére. És amikor a puffert feltöltik és feldolgozzák, a lejátszó megmutatja az adatokat, a videót. Ennek lejátszása közben továbbra is több adat érkezik, és várja a puffert.

Ha a lejátszó befejezte az előző adatok feldolgozását vagy lejátszását, és a puffer még nincs feltöltve, akkor ismét megjelenik a „pufferelés” szöveg, és arra vár, hogy további adatokat gyűjtsön a feldolgozáshoz.

Ez Buffer!

A puffer eredeti definíciójából kiderül, hogy miközben a pufferben vagyunk, manipulálhatjuk vagy interakcióba léphetünk a közvetített bináris adatokkal. Milyen kölcsönhatásban lehet részünk ezzel a nyers bináris adatokkal? A Node.js puffer implementációja egy teljes listát nyújt számunkra a megvalósítható lehetőségekről. Nézzük meg néhányukat.

Interakció egy pufferrel

Még saját puffert is létrehozhat! Eltekintve attól, amelyet a Node.js automatikusan létrehoz egy adatfolyam során, lehetőség van saját puffereinek létrehozására és kezelésére. Érdekes igaz? Hozzunk létre egyet!

Attól függően, hogy mit szeretne elérni, különböző módon lehet puffert létrehozni. Lássunk néhányat.

// 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");

Miután létrehozta a pufferét, elkezdheti a kapcsolatot

// 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

Nagyon sok interakció lehet egy pufferrel. Irány a hivatalos dokumentumok, hogy többet játsszon ezekkel a módszerekkel.

Végül meghagyom ezt a kis kihívást: Olvassa el a zlib.js forrását, a Node.js egyik alapkönyvtárát , és nézze meg, hogyan használja ki a puffer erejét a bináris adatfolyamok manipulálása. Ezekről kiderül, hogy gziped fájlok. Olvasás közben dokumentálja a tanultakat, és szívesen ossza meg velünk itt a megjegyzéseket.

Remélem, hogy ez a bevezetés segített jobban megismerni a Node.js puffert.

Ha úgy érzi, hogy szép munkát végeztem, és hogy mások is megérdemelnék az esélyt, hogy ezt meglássa, kérjük, tapsolja meg a cikket, hogy segítsen a Buffer jobb megértésében a Node.js közösségünkben.

Ha olyan kérdése van, amelyre még nem érkezett válasz, vagy másképp értelmezi az itt felsoroltakat, nyugodtan írjon ide vagy a Twitteren keresztül kommenteket.