Top 5 pogrešaka čvor programera čine

Node je fantastična platforma za pisanje pozadina. Osim kada ne razumijete sve kako treba.


Ovisno o kojoj se strani ograde događa, Node je ili najbolja ili najgora stvar u svijetu web razvoja. No, bez obzira na mišljenja, ne može se raspravljati o popularnosti Node. Pojavio se na popularnosti način brže nego što je iko očekivao, čak i njegov autor (rekao je to na neki drugi način pesimistično) intervju)!

Što se tiče pisanja, to je zadana platforma za pokretanje novih aplikacija, za koju priznajem da je često rezultat mentaliteta stada, ali neto učinak je da u Nodeu ima više radnih mjesta, više novca i uzbudljivijih projekata nego na drugim tradicionalnim jezicima skriptiranja.

Nažalost, došlo je do trenutka da kada me netko zatraži da im preporučim početni niz za razvoj web stranica ili nove startup proizvode, Node je moja prva preporuka iako sam dobro upoznat s PHP-om i Laravelom.

Ako mi se dopusti da malo nastavim s rasturanjem (što ću i biti s obzirom na to da sam ja onaj koji piše?), Node mrzitelji imaju točku kad kažu da njihov omiljeni web stack može raditi stvari jednako dobro kao i Node, ali obratno je također istinito. I tu su stvari asinhronog programiranja i događaja, koji su pečeni u Node od 1. dana, a drugi ekosustavi očajnički pokušavaju kopirati.

Danas imamo opcije asinkronizacije na PHP-u i Python-u, ali nažalost jezgra postojećih, popularnih knjižnica, čisto je sinkrona, tako da je gotovo kao da se borite protiv sustava. Ali svejedno, dovoljno rejtinga za dan. ��

Dakle, ako ste programer čvora (početnik ili poznati), vjerovatno je da radite jednu od ovih velikih pogrešaka koje negativno utječu na vašu aplikaciju. To može biti zato što niste upoznati s određenim načinom poboljšanja stvari u Nodeu, ili su to jednostavno navike koje ste prenijeli iz nekog drugog ekosustava.

Ne poštujući petlju događaja

Kada osoba migrira na Node, dijelom je to zato što je čula priče o tome kako LinkedIn skalira koristeći Node, ili su vidjeli referentne vrijednosti koje prikazuju čvor kako kruži oko PHP-a, Ruby-a itd. Kada je u pitanju posluživanje zahtjeva u sekundi ili rukovanje otvaranje utičnica.

Tako grade svoju aplikaciju, očekujući iste trenutke odziva eksplozija kakvi su sanjali – osim što se ništa slično ne dogodi.

Jedan od glavnih razloga toga je nerazumijevanje petlje događaja ispravno. Razmotrite sljedeći kôd koji iz baze podataka dobiva skup knjiga i zatim ih razvrstava po ukupnom broju stranica:

db.Library.get (libraryId, function (err, library) {
neka knjige = library.books;
books.sort (funkcija (a, b) {
vratiti a.stranice < b.stranice? -1: 1
});
});

Slažem se da ovaj kôd nema ništa s nizom razvrstanih knjiga, ali to nije stvar ovdje. Poanta je u tome što je takav nevin izgledni kod dovoljan da se raznese petlja događaja čim se počnete baviti ne-trivijalnim brojem knjiga.

Razlog je taj što se događa da petlja događaja izvodi neblokirajući I / O. Dobar primjer je primjerice pakera za pizzu na zajedničkom mjestu za pizzu – osoba se specijalizirala za rezanje pizze, sklapanje prekrivača u kutije za dostavu, stavljanje pizze, pričvršćivanje pravih etiketa i guranje prema dostavljaču.

Nevjerojatno, zar ne? Baš kao i Node!

Izvor: stackoverflow.com

Ali razmislite što će se dogoditi ako i ta osoba mora pomiješati, pripremiti i pakirati začine. Ovisno o tome kako je postupak zamršen, stopa pakiranja pizza smanjit će se na jednu trećinu, ili će se možda potpuno zaustaviti.

To mislimo pod zadacima koji se “blokiraju” – sve dok Node jednostavno mora prosljeđivati ​​informacije, vrlo je brz i idealno najbolja opcija, ali čim treba napraviti opsežne proračune, zaustavlja se i sve ostalo mora čekati. To se događa jer je petlja događaja jednodijelna (više detalja) ovdje.)

Dakle, nemojte vršiti proračune unutar petlje događaja, ma koliko oni bili važni. Mislim, dodavanje brojeva i uzimanje prosjeka u redu je, ali veliki skupovi podataka natjerati će vašu aplikaciju Node da indeksira.

Nada se da će async kôd surađivati

Razmotrimo ovaj vrlo jednostavan primjer čvora koji čita podatke iz datoteke i prikazuje ih:

const fs = tražiti (‘fs’);

neka sadržaj = fs.readFile (‘tajni.txt’, (pogreška, podaci) => {
povratni podaci;
});

console.log (‘Sadržaj datoteke je:’);
console.log (sadržaji);

Ako se izložite klasičnim jezicima (kao što su PHP, Python, Perl, Ruby, C ++, itd.), Primijenit ćete zdrav razum da će nakon pokretanja ovog koda sadržaj varijable imati sadržaj datoteke. Ali evo što se događa kada zapravo izvršite kôd:

Dobivamo nedefiniranu (). To je zato što, iako vas možda briga za Čvor, njegova asinkronizacija ne brine za vas (to je značilo da je to šala! Nemojte ovdje spametovati komentare mržnje ��). Naš je posao razumjeti njegovu asinkronu prirodu i raditi s njom. readFile () je asinhrona funkcija, što znači da, čim se pozva, petlja događaja čvora prebaci rad na komponentu datotečnog sustava i krene dalje.

Vraća se na funkciju kasnije kad je datoteka pročitana, ali do tada se sadržaj tretira kao neinicijalizirana varijabla i na taj način sadrži nedefiniranu. Ispravan način je obrada podataka datoteke unutar funkcije povratnog poziva, ali ne mogu ulaziti u više detalja jer ovo nije Vodič za čvor. ��

Povratni poziv koji poziva povratni poziv koji poziva povratni poziv koji poziva . . .

JavaScript je bliži funkcionalnom programiranju nego bilo koji drugi stariji, mainstream jezik (zapravo, sve rečeno i učinjeno, meni je najdraži kada je u pitanju objektno orijentirani dizajn i funkcionalne mogućnosti – stavljam ga iznad Python, PHP, Perl, Java i čak i Ruby kada je u pitanju pisanje “ugodnog” koda).

Odnosno, funkcije dobivaju više prava građana nego u drugim jezicima. Uporedite to s činjenicom da asinkroni kod djeluje pružanjem funkcije povratnog poziva, a mi završavamo s receptom za katastrofu poznat kao Callback Hell.

Evo nekoliko primjera elektronskog koda na koje sam naišao na Quori. Što mislite, što čini??

var opcije;

zahtijevaju ( ‘elektron’). app.once (
‘spreman’,

funkcija () {

opcije = {
okvir: lažno,
visina: 768,
širina: 1024,
x: 0,
y: 0
};

options.BrowserWindow = zahtjev (‘elektron’).
options.browserWindow = nove opcije.BrowserWindow (opcije);
options.browserWindow.loadURL ( ‘http://electron.atom.io’);
options.browserWindow.webContents.once (
‘Učinio-stop-loading’,

funkcija () {
options.browserWindow.capturePage (
opcije,

funkcija (podaci) {
zahtijevaju ( ‘fs’). writeFileSync (
‘/Tmp/screenCapture.testExampleJs.browser..png’,
data.toPng ()
);

process.exit (0);
}
);
}
);
}
);

Ako vam je teško, pridružite se klubu!

Funkcije unutar funkcija unutar funkcija teško su za čitanje i vrlo ih je teško objasniti, zbog čega su je nazvali “pakleni povratni poziv” (pretpostavljam da je Pakao zbunjujuće mjesto za izlazak!). Dok ovo tehnički radi, ti od svog koda pripremaš budućnost bez pokušaja razumijevanja i održavanja.

Mnogo je načina za izbjegavanje vražjih povratnih poziva, uključujući obećanja i Reaktivna proširenja.

Ne koristi sve CPU jezgre

Suvremeni procesori imaju nekoliko jezgara – 2, 4, 8, 16, 32. , , broj se stalno uspinje.

Ali to nije ono što je tvorac čvora imao na umu kada je izdao čvor. Kao rezultat, Node je jednosmetan, što znači da se pokreće unutar jedne niti (ili procesa, ako ga želite tako nazvati, iako nisu isti), koristeći samo jednu jezgru CPU-a.

To znači da ako ste naučili čvor s vodičima i prijateljima i isječcima koda koji lebde okolo i ako je vaša aplikacija raspoređena na 8-jezgrenom poslužitelju, trošite 7/8 dostupne procesne snage!

Ne treba ni reći da je to ogroman otpad. Ako slijedite ovaj put, kraj ćete platiti za osam poslužitelja kada vam je potreban samo jedan. Odnosno, trošite 16.000 USD mjesečno kad će činiti 2.000 dolara (gubitak novca uvijek boli, zar ne?). Sve to, kad je rješenje prilično jednostavno: korištenje Klastera modul.

Ne mogu ovdje ulaziti u sve pojedinosti, ali to je jednostavna tehnika otkrivanja koliko jezgri trenutnog stroja, a zatim pokretanje toliko instance Node. Kada su otkrivene pogreške, instanca se ponovno pokreće. Evo kako je to jednostavno implementirati (udžbenik ovdje):

var cluster = zahtjev (‘cluster’);

ako (cluster.isMaster) {
var numWorkers = tražiti (‘os’). cpus (). dužina;

console.log (‘Postavljanje glavnog klastera’ + numWorkers + ‘radnici …’);

za (var i = 0; i < numWorkers; ja ++) {
cluster.fork ();
}

cluster.on (‘online’, funkcija (radnik) {
console.log (“Radnik” + radnik.process.pid + ‘je na mreži’);
});

cluster.on (‘izlaz’, funkcija (radnik, kôd, signal) {
console.log (‘Radnik’ + radnik.process.pid + ‘umro je s kodom:’ + kod + ‘, i signalom:’ + signal);
console.log (‘Pokretanje novog radnika’);
cluster.fork ();
});
} else {
var app = zahtjev (‘express’) ();
app.all (‘/ *’, funkcija (req, res) {res.send (‘proces’ + process.pid + ‘pozdravlja!’). end ();})

var server = app.listen (8000, funkcija () {
console.log (‘Proces’ + process.pid + ‘preslušava sve dolazne zahtjeve’);
});
}

Kao što vidite, cluster.fork () čini magiju, a ostalo je jednostavno preslušavanje nekoliko bitnih događaja klastera i obavljanje potrebnog čišćenja.

Ne koristi TypeScript

U redu, to nije greška, i tako je puno i mnogo čvorova aplikacija bilo i napisano bez TypeScript-a.

U skladu s tim, TypeScript nudi jamstva i bezbrižnost koji je Node uvijek potreban, a u mojim je očima greška ako razvijate Node 2019. i ako ne upotrebljavate TypeScript (pogotovo kada se A (ugaoni) u snopu MEAN pomaknuo u TypeScript davno).

Prijelaz je blag, a TypeScript je gotovo točno poput JavaScript kojeg znate, sa sigurnošću tipova, ES6 i nekoliko drugih čekova koji su ubačeni:

// /lib/controllers/crmController.ts
uvoz * kao mangoose iz ‘mongoose’;
import {ContactSchema} iz ‘../models/crmModel’;
import {Zahtjev, odgovor} iz ‘expressa’;

const Contact = mongoose.model (‘Kontakt’, ContactSchema);
izvozna klasa ContactController {

javni addNewContact (zahtjev: zahtjev, res: odgovor) {
neka newContact = novi kontakt (req.body);

newContact.save ((pogreška, kontakt) => {
if (err) {
res.send (err);
}
res.json (kontakt);
});
}

Preporučam da provjerite ovo lijepo i prijateljski Vodič za TypeScript.

Zaključak

Čvor je impresivan, ali nije bez njegovih (mnogih?) Problema. To je rečeno, to se odnosi na sve tehnologije vani, nove i stare, i bolje ćemo razumjeti Node i raditi s njim.

Nadam se da će vas ovih pet savjeta spriječiti da se udubite u katranu jama višegodišnjih grešaka i problema sa performansama. Ako mi propusti nešto zanimljivo, javite mi i bit ću više nego sretna (u stvari zahvalna!) Da ih uključim u članak. ��

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map