Искате ли по-добро разбиране на буфера в Node.js? Виж това.

Винаги ли сте замислени като мен, когато попадате на думи като буфер, поток и двоични данни вNode.js? Това чувство кара ли ви да се откажете от разбирането им, мислейки, че те не са предназначени за вас, а само за разбирането на гурутата и разработчиците на пакети на Node.js?

Всъщност тези думи могат да бъдат много смущаващи, особено когато влизате в уеб разработката с Node.js без CS степени.

За съжаление, много уроци и книги ще се насочат директно към обучението за разработване на уеб приложения с пакетите Node.js, без да ви позволяват да разберете основните характеристики на Node.js и защо те съществуват. А някои нагло ще ви кажат, че не е нужно да ги разбирате, защото виеможе никога да не работи директно с тях.

Е, вярно, може би никога няма да работите директно с тях, ако сте избрали да останете среден разработчик на Node.js.

Ако обаче мистериите ви накарат да станете наистина любопитни и няма да се спрете пред нищо, за да задоволите любопитството си, и ако искате да пренесете разбирането си за Node.js на следващото ниво, тогава наистина искате да се задълбочите, за да разберете многото основни функции на Node.js, като Buffer например. И точно затова пиша това парче - за да ни помогне да демистифицираме някои от тези функции и да изведем нашето обучение по Node.js на следващото ниво.

При въвеждането на буфера официалните документи на Node.js посочват отчасти ...

... механизъм за четене или манипулиране на потоци от двоични данни. Най- Bufferклас е въведена като част от API Node.js, за да може да взаимодейства с октетите потоци в контекста на неща като TCP потоци и операции на файловата система.

Хммм, освен ако не сте знаели предварително всички думи в горните изречения, те вероятно са просто куп жаргон. Нека се опитаме да опростим това малко, като го префразираме, за да можем да имаме ясен фокус и да не се разсейваме от многото камбани и свирки там. Изваждайки от това въведение, можем спокойно да кажем:

Най- Bufferклас е въведена като част от API Node.js, за да може да манипулира или да взаимодейства с потоци от двоични данни.

Сега това е по-просто, нали? Но ... Буфер, потоци, двоични данни ... все още много големи думи. Е, нека се опитаме да се справим с тези големи думи от последната до първата.

Двоични данни, какво е това?

Вероятно вече знаете, че компютрите съхраняват и представляват данни в двоични файлове. Binary е просто набор или колекция от 1s и 0s. Например, по-долу са пет различни двоични файлове, пет различни набора от 1s и 0s:

10, 01, 001, 1110,00101011

Всяко число в двоичен файл, всеки 1и 0в набор се наричат бит , което е кратка форма на двоичен digIT.

За да съхрани или представи част от данните, компютърът трябва да преобразува тези данни в тяхното двоично представяне. Например, за да съхранява числото 12, компютърът трябва да преобразува 12 в неговото двоично представяне, което е 1100.

Как компютърът знае как да направи това преобразуване? Е, това е чиста математика. Това е простата двоична цифрова система, която научихме по основна математика - изразяване на число в системата с основни числа 2. Компютрите разбират тази математика.

Но числата не са единственият тип данни, с който работим. Имаме и струни, изображения и дори видеоклипове. Компютрите знаят как да представят всички видове данни в двоични файлове. Да вземем например струни. Как компютърът ще представя низа „L“ в двоични файлове? За да съхраняват всеки символ в двоични файлове, Компютрите първо ще преобразуват този символ в число, след което го преобразуват в неговото двоично представяне. Така че за низа „L“,компютри първо ще конвертира L с номер, който представлява L . Да видим как.

Отворете браузъра си конзола и поставете следния фрагмент от кода и след това натиснете въведете: "L".charCodeAt(0). Какво видя? Числото 76? Това е представителството номер или код характер или Code Point на характер L . Но как компютърът знае какво точно число ще представлява всеки знак? Откъде знае да използва числото 76 за представяне на L ?

Набори от символи

Наборите от символи са вече дефинирани правила за това какво точно число представлява всеки знак. Имаме различни дефиниции на тези правила. Много популярните включват Unicode и ASCII . JavaScript играе много добре с Unicode символни набори. В действителност, това е най-Unicode във вашия браузър, който се посочва, че 76 трябва да представляват L .

Така че видяхме как компютрите представляват символи в числа. Сега компютърът от своя страна ще представлява числото 76 в двоичното си представяне. Може би си мислите, добре, просто преобразувайте 76 в числовата система на база 2. Не толкова бързо!

Кодиране на знаци

Точно както има правила, които определят кое число трябва да представлява символ, има и правила, които определят как този номер трябва да бъде представен в двоични файлове. По-конкретно колко бита да се използват за представяне на числото. Това се нарича кодиране на знаци .

Едно от определенията за кодиране на символи е UTF-8 . UTF-8 гласи, че символите трябва да бъдат кодирани в байтове. Байтът е набор от осем бита - осем 1s и 0s. Така че осем 1 и 0 трябва да се използват за представяне на кодовата точка на всеки символ в двоичен файл.

За да разберем това, както споменахме по-рано, бинарното представяне на числото 12 е 1100. Така че, когато UTF-8 заявява, че 12 трябва да бъде в осем бита, UTF-8 казва, че компютърът трябва да добави повече битове от лявата страна на действителното представяне на base-2 на числото 12, за да стане байт. Така че 12 трябва да се съхраняват като 00001100. Има смисъл?

Следователно 76 трябва да се съхраняват като 01001100.

Това, приятели, е как компютрите съхраняват низове или символи в двоични файлове. По същия начин компютрите също имат определени правила за това как изображенията и видеоклиповете трябва да се преобразуват или кодират и съхраняват в двоични файлове. Въпросът тук е, че компютрите съхраняват всички типове данни в двоични файлове и това е известно като двоични данни.

Ако се интересувате супер от мекотата на кодирането на символи, може да ви хареса това нежно и подробно въведение.

Сега разбираме какво са двоични данни, но какво представляват потоците от двоични данниот нашето въведение до буфера?

Поток

Потокът в Node.js просто означава последователност от данни, които се преместват от една точка в друга с течение на времето. Цялата концепция е, че имате огромно количество данни за обработка, но не е нужно да чакате всички данни да са налични, преди да започнете да ги обработвате.

По принцип тези големи данни се разбиват и изпращат на парчета. Така че от първоначалната дефиниция на буфер („потоци от двоични данни ... в контекста на ... файлова система“) това означава просто преместване на двоични данни във файловата система. Например преместване на текстовете, съхранени в file1.txt, във file2.txt.

Но как точно буферът ни помага да взаимодействаме или манипулираме двоични данни по време на поточно предаване? Какво точно представлява този буфер между другото?

Буфер

Видяхме, че потокът от данни е движението на данни от една точка до друга, но как точно се преместват?

Обикновено движението на данни обикновено е с намерението да се обработи или прочете и да се вземат решения въз основа на тях. Но има минимално и максимално количество данни, които процесът може да отнеме с течение на времето. Така че ако скоростта, която данните пристигат, е по-бърза от скоростта, която процесът консумира данните, излишните данни трябва да изчакат някъде своя ред да бъдат обработени.

От друга страна, ако процесът консумира данните по-бързо, отколкото пристига, малкото данни, които пристигат по-рано, трябва да изчакат да пристигне определено количество данни, преди да бъдат изпратени за обработка.

Тази „зона за изчакване е буферът! Това е малко физическо място във вашия компютър, обикновено в RAM, където данните се събират във времето, изчакват и в крайна сметка се изпращат за обработка по време на стрийминг.

Можем да възприемем целия поток и буферния процес като автогара. На някои автогари автобусът няма право да тръгва, докато не пристигне определено количество пътници или до определено време на тръгване. Също така пътниците могат да пристигнат по различно време с различна скорост. Нито пътниците, нито автогарата имат контрол върху пристигането на пътниците на гарата.

Във всеки случай пътниците, които пристигат по-рано, ще трябва да изчакат, докато автогарата реши да изпрати автобуса по пътя си. Докато пътниците, които пристигат, когато автобусът вече се зарежда или когато автобусът вече е тръгнал, трябва да изчакат следващия автобус.

Независимо от случая, винаги има място за чакане. Това е буферът за Node.js! Node.js не може да контролира скоростта или времето на пристигане на данни, скоростта на потока. Той може само да реши кога е време да изпрати данните. Ако все още не е време, Node.js ще ги постави в буфера - „зоната за изчакване“ - малко място в RAM, докато дойде време да ги изпрати за обработка.

Типичен пример, при който можете да видите буфер в действие, е когато стриймирате видео онлайн. Ако вашата интернет връзка е достатъчно бърза, скоростта на потока ще бъде достатъчно бърза, за да запълни незабавно буфера и да го изпрати за обработка, след това да попълни друг и да го изпрати, след това друг и още един ... до потока е завършен.

Но ако връзката ви е бавна, след обработката на първия пристигнал набор от данни, видеоплейърът ще покаже икона за зареждане или ще покаже текста „буфериране“, което означава събиране на повече данни или изчакване на пристигането на повече данни. И когато буферът се напълни и обработи, плейърът показва данните, видеото. Докато играете това, повече данни ще продължат да пристигат и да чакат в буфера.

Ако плейърът приключи с обработката или възпроизвеждането на предишните данни, а буферът все още не е запълнен, текстът „буфериране“ ще се покаже отново в очакване да събере повече данни за обработка.

Това е буфер!

От първоначалната дефиниция на буфер показва, че докато сме в буфера, можем да манипулираме или да взаимодействаме с бинарните данни, които се излъчват. Какъв вид взаимодействие бихме могли да имаме с тези сурови двоични данни? Реализацията на буфера в Node.js ни предоставя пълен списък на това, което може да се изпълни. Нека да видим някои от тях.

Взаимодействие с буфер

Възможно е дори да създадете свой собствен буфер! Освен тази, която Node.js автоматично ще създава по време на поток, е възможно да създадете и манипулирате свой собствен буфер. Интересно нали? Нека създадем такъв!

В зависимост от това, което искате да постигнете, има различни начини за създаване на буфер. Нека да видим някои.

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

След като вашият буфер е създаден, можете да започнете да взаимодействате с него

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

Има много взаимодействия, които бихме могли да имаме с буфер. Насочете се към официалните документи, за да играете повече с тези методи.

И накрая, ще ви оставя с това малко предизвикателство: Прочетете източника на zlib.js , една от основните библиотеки на Node.js, за да видите как използва мощността на буфера за манипулиране на потоци от двоични данни. Това се оказват файлове в gziped. Докато четете, документирайте наученото и любезно споделете с нас тук в коментарите.

Надявам се, че това въведение ви е помогнало да разберете по-добре Node.js буфера.

Ако смятате, че съм свършил хубава работа и че другите заслужават шанс да видят това, любезно пляскайте за статията, за да помогнете за разпространението на по-добро разбиране на буфера в нашата общност Node.js.

Ако имате въпрос, на който не е отговорено или имате различно разбиране за някои от точките тук, не се колебайте да пуснете коментари тук или чрез Twitter.