Top 5 Napake razvijalcev vozlišč znamka

Node je fantastična platforma za pisanje nasadov. Razen, ko stvari ne boste uredili.


Glede na to, na kateri strani ograje se nahajate, je Node najboljše ali najslabše, kar se dogaja svetu spletnega razvoja. Toda mnenja ne glede na priljubljenost Node ne morejo trditi. Na popularnost se je pojavil hitreje, kot je kdo pričakoval, tudi njegov ustvarjalec (tako je rekel v sicer pesimističnem intervju)!

Kot je zapisano, je to privzeta platforma za zagon novih aplikacij, za katero priznam, da je pogosto posledica mentalitete črede, toda čisti učinek je, da je v vozlišču več delovnih mest, več denarja in bolj zanimivih projektov kot v drugih tradicionalnih skriptnih jezikih.

Na žalost je prišlo, da ko me kdo vpraša, naj mu priporočim začetno skladbo za razvoj spleta ali nove zagonske izdelke, je Node moje priporočilo # 1, čeprav dobro poznam PHP in Laravel.

Če bi mi lahko dovolili, da še naprej nadaljujete z rantom (kar bom, ker sem tisti, ki piše?), Sovražniki v vozlišču pravijo, da lahko rečejo, da njihov najljubši spletni sklad lahko počne tako, kot Node, vendar je tudi obratno. Potem so tu še stvari asinhronskega programiranja in dogodkov, ki so jih v prvi dan spekli v vozlišče, drugi ekosistemi pa zdaj obupno poskušajo kopirati.

Danes imamo možnosti async v PHP in Python, a žal je jedro obstoječih, priljubljenih knjižnic čisto sinhrono, tako da je skoraj tako, kot da se borite proti sistemu. A vseeno, dovolj izposoja za en dan. ��

Če ste razvijalec vozlišča (začetnik ali znan), boste verjetno naredili eno od teh velikih napak, ki negativno vplivajo na vašo aplikacijo. Morda zato, ker niste seznanjeni z določenim načinom, kako stvari bolje narediti v vozlišču, ali pa so preprosto navade, ki jih prenašate iz katerega koli drugega ekosistema.

Brez spoštovanja zanke dogodka

Ko se oseba preseli v vozlišče, je to deloma zato, ker je slišala zgodbe o tem, kako LinkedIn spreminja lestvico z uporabo vozlišča, ali pa so videli merila, ki prikazujejo vozlišče, ki teče kroge okoli PHP, Ruby itd., Ko gre za vročanje zahtev na sekundo ali ravnanje odprite vtičnice.

Tako gradijo svojo aplikacijo in pričakujejo enake odzivne čase, o katerih so sanjali – le da se ne zgodi nič, kar je blizu.

Eden glavnih razlogov za to je nerazumevanje zanke dogodkov pravilno. Upoštevajte naslednjo kodo, ki iz zbirke podatkov pridobi nabor knjig in jih nato razvrsti po skupnem številu strani:

db.Library.get (libraryId, funkcija (napaka, knjižnica) {
naj knjige = library.books;
books.sort (funkcija (a, b) {
vrniti a.stranice < b.stranice? -1: 1
});
});

Strinjam se, da ta koda ne naredi ničesar s sortirano razvrščeno knjigo, vendar tukaj ni bistvo. Bistvo je, da je takšna nedolžna koda dovolj, da razstreliš zanko, takoj ko se začneš ukvarjati z ne trivialnim številom knjig.

Razlog je v tem, da je zanka dogodka namenjena izvajanju nezaklepanja V / I. Dober primer je primer za pakiranje pice na sklepu za pico – oseba je specializirana za rezanje pice, zlaganje pokrovčkov v dostavne škatle, postavljanje pice, pritrditev pravih nalepk in potiskanje na dostavo.

Neverjetno, kajne? Tako kot vozlišče!

Vir: stackoverflow.com

Toda razmislite, kaj se bo zgodilo, če bo tudi ta oseba morala mešati, pripravljati in pakirati začimbe. Odvisno od tega, kako zapleten je postopek, se bo stopnja pakiranja pice zmanjšala na tretjino ali pa se morda celo ustavila.

To mislimo z nalogami, ki jih “blokirajo” – dokler mora Node preprosto posredovati informacije naokoli, je zelo hitra in v najboljšem primeru najboljša možnost, a takoj, ko mora opraviti obsežne izračune, se ustavi in ​​vse ostalo mora počakati. To se zgodi, ker je zanka dogodkov enojna (za več podrobnosti) tukaj.)

Torej ne izvajajte izračunov znotraj zanke dogodkov, ne glede na to, kako pomembni so. Mislim, dodajanje številk in povprečje je v redu, toda zaradi velikih nizov podatkov se bo vaša aplikacija Node plazila.

V upanju, da bo async koda sodelovala

Razmislite o tem zelo preprostem primeru vozlišča, ki bere podatke iz datoteke in jih prikaže:

const fs = zahtevati (‘fs’);

naj bo vsebina = fs.readFile (‘skrivnost.txt’, (napaka, podatki) => {
povratni podatki;
});

console.log (‘Vsebina datoteke je:’);
console.log (vsebina);

Pri izpostavljenosti klasičnim jezikom (na primer PHP, Python, Perl, Ruby, C ++ itd.) Boste uporabili zdravo pamet, da bo po tej kodi spremenljiva vsebina vsebovala datoteko. Toda, kaj se zgodi, ko dejansko izvršite kodo:

Dobimo neopredeljeno (). To je zato, ker vas lahko, čeprav vas globoko skrbi Node, ne ukvarja z vami (to je šala! Prosim, ne smete tukaj pošiljati sovražnih komentarjev ��). Naša naloga je, da razumemo njegovo naravo asinhije in sodelujemo z njo. readFile () je asinhrona funkcija, kar pomeni, da zanka dogodka vozlišča takoj, ko je poklicana, prenese delo na komponento datotečnega sistema in se premakne naprej.

Na funkcijo se vrne pozneje, ko je datoteka prebrana, toda do takrat se vsebina obravnava kot neinicializirana spremenljivka in tako vsebuje nedefinirano. Pravilen način je obdelava podatkov v datoteki znotraj funkcije povratnega klica, vendar ne morem več podrobnosti, ker to ni Vadnica o vozlišču. ��

Povratni klic, ki kliče povratni klic, ki kliče povratni klic, ki kliče . . .

JavaScript je bližje funkcionalnemu programiranju kot kateri koli drug starejši, mainstream jezik (pravzaprav vse povedano in storjeno je moj najljubši, ko gre za objektno usmerjeno oblikovanje in funkcionalne zmožnosti – postavim ga nad Python, PHP, Perl, Java in tudi Ruby, ko gre za pisanje “prijetne” kode).

To pomeni, da funkcije dobijo več državljanskih pravic kot v drugih jezikih. To združite z dejstvom, da asinhrona koda deluje tako, da vam zagotavlja funkcijo povratnega klica, in na koncu smo dobili recept za katastrofo, znan kot Callback Hell.

Tu je nekaj vzorčnih elektronskih kod, ki sem jih naletel na Quora. Kaj misliš, da to počne?

var možnosti;

zahtevati (‘elektrona’). app.once (
“pripravljen”,

funkcija () {

možnosti = {
okvir: napačen,
višina: 768,
širina: 1024,
x: 0,
y: 0
};

options.BrowserWindow = zahtevati (‘elektron’).
options.browserWindow = nove možnosti.BrowserWindow (možnosti);
options.browserWindow.loadURL (‘http://electron.atom.io’);
options.browserWindow.webContents.once (
“nalaganje-stop-nalaganje”,

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

funkcija (podatki) {
zahtevati (‘fs’). writeFileSync (
‘/tmp/screenCapture.testExampleJs.browser..png’,
data.toPng ()
);

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

Če imate težave, se pridružite klubu!

Funkcije znotraj funkcij znotraj funkcij je težko brati in jih je težko razložiti, zato jih imenujemo “vračilo klica” (predpostavljam, da je pekel zmedeno mesto, iz katerega se je treba izviti!). Čeprav to tehnično deluje, si kodo v prihodnosti zavarujete pred vsemi poskusi razumevanja in vzdrževanja.

Obstaja veliko načinov, kako se izogniti vratu klicev, tudi Obljube in Reaktivne razširitve.

Ne uporablja vseh jeder CPU-ja

Sodobni procesorji imajo več jeder – 2, 4, 8, 16, 32. . . številka se še naprej vzpenja.

Vendar to ni mislil ustvarjalec vozlišča, ko je izdal vozlišče. Kot rezultat, je vozlišče enojno, kar pomeni, da deluje znotraj ene niti (ali procesa, če ga želite poklicati, čeprav nista enaka) in uporablja samo eno jedro procesorja.

To pomeni, da če ste se naučili voznika in prijateljev ter odrezkov kode, ki lebdijo naokoli, in če je vaša aplikacija nameščena na 8-jedrnem strežniku, boste zapravili 7/8 razpoložljive procesne moči!

Ni treba posebej poudarjati, da gre za ogromne odpadke. Če sledite tej poti, boste plačali za osem strežnikov, ko boste potrebovali le enega. To pomeni, da zapravite 16.000 dolarjev na mesec, ko bo 2000 dolarjev (izguba denarja vedno boli, kajne?). Vse to, ko je rešitev precej preprosta: uporaba grozd modul.

Tu ne morem spuščati vseh podrobnosti, vendar je to preprosta tehnika zaznavanja, koliko jeder ima trenutni stroj, in nato zagon toliko primerkov vozlišča. Ko so zaznane napake, se primerek znova zažene. Tukaj je preprosta izvedba (vadnica tukaj):

var cluster = zahtevati (‘cluster’);

če (cluster.isMaster) {
var numWorkers = zahtevati (‘os’). cpus (). dolžina;

console.log (‘Nastavitev glavnega grozda’ + numWorkers + ‘delavci …’);

za (var i = 0; i < število delavcev; i ++) {
cluster.fork ();
}

cluster.on (“na spletu”, funkcija (delavec) {
console.log (“Delavec” + delavec.process.pid + “je na spletu”);
});

cluster.on (‘izhod’, funkcija (delavec, koda, signal) {
console.log (‘Worker’ + worker.process.pid + ‘umrl s kodo:’ + koda + ‘in signalom:’ + signal);
console.log („Zagon novega delavca“);
cluster.fork ();
});
} else {
var app = zahtevati (‘express’) ();
app.all (‘/ *’, funkcija (req, res) {res.send (‘proces’ + process.pid + ‘pozdravi!’). end ();})

var server = app.listen (8000, funkcija () {
console.log (‘Process’ + process.pid + ‘posluša vse dohodne zahteve’);
});
}

Kot lahko vidite, cluster.fork () naredi čarovnijo, ostalo pa preprosto posluša nekaj bistvenih dogodkov v grozdu in opravi potrebno čiščenje.

Ne uporablja TypeScript

V redu, to ni napaka, zato je bilo veliko aplikacij vozlišč napisanih brez TypeScript.

Glede na to, TypeScript ponuja jamstva in brezskrbnost, ki jih je Node vedno potreboval, in po mojih očeh je napaka, če razvijate Node leta 2019 in ne uporabljate TypeScript (še posebej, ko se je A (kotni) v sklopu MEAN premaknil v TypeScript že zdavnaj).

Prehod je nežen in TypeScript je skoraj natančno kot JavaScript, ki ga poznate, z zanesljivostjo vrst, ES6 in nekaj drugimi čeki:

// /lib/controllers/crmController.ts
uvoz * kot mangoose iz ‘mongoose’;
import {ContactSchema} iz ‘../models/crmModel’;
import {Zahteva, odgovor} iz ‘express’;

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

javni addNewContact (req: Zahteva, res: odgovor) {
pusti newContact = nov stik (req.body);

newContact.save ((napaka, stik) => {
če (napaka) {
res.send (napaka);
}
res.json (kontakt);
});
}

Priporočam, da preverite to lepo in prijazno Vadnica za TypeScript.

Zaključek

Vozlišče je impresivno, vendar brez svojih (veliko?) Težav ni brez. Povedano, to velja za vse tehnologije zunaj, nove in stare, in bolje bomo razumeli vozlišče in delali z njim.

Upam, da vas bo s temi petimi nasveti preprečilo, da bi se sesali v katransko jamo trajnih napak in težav z zmogljivostmi. Če sem zamudil kaj zanimivega, mi sporočite in z veseljem jih bom (pravzaprav hvaležen!) Vključil v članek. ��

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