Node este o platformă fantastică pentru scrierea de backend-uri. Cu excepția cazului în care nu veți înțelege lucrurile.


În funcție de ce parte a gardului se întâmplă să fii, Node este cel mai bun sau cel mai rău lucru care se întâmplă în lumea Dezvoltării Web. Cu toate acestea, păreri, nu există nici o argumentare a popularității Node. S-a filmat în popularitate într-un mod mai rapid decât s-ar fi așteptat oricine, chiar și creatorul său (a spus-o într-un mod altfel pesimist interviu)!

În ceea ce scrie, este platforma implicită pentru pornirea de noi aplicații, ceea ce recunosc este adesea rezultatul mentalității efective, dar efectul net este că există mai multe locuri de muncă, mai mulți bani și proiecte mai interesante în nod decât în ​​alte limbaje tradiționale de script..

S-a ajuns într-un punct, din păcate, că atunci când cineva îmi cere să le recomand un stack de pornire pentru dezvoltare web sau produse noi de pornire, Node este recomandarea mea # 1, chiar dacă sunt versatil în PHP și Laravel.

Dacă mi-ar fi permis să continui rafinamentul puțin (ceea ce voi fi din moment ce eu sunt cel care scriu?), Nodurile hater au un punct când spun că stiva lor web preferată poate face lucrurile la fel de bine cum face Node, dar conversația este, de asemenea, adevărată. Și atunci există lucruri de programare asincină și evenimente, care au fost coapte în Nod din ziua 1, iar alte ecosisteme încearcă acum să dispere.

Astăzi avem opțiuni async în PHP și Python, dar, din păcate, nucleul bibliotecilor populare existente este pur și simplu sincron, așa că aproape ca te-ai luptat împotriva sistemului. Dar oricum, suficient de acordat pentru o zi. ��

Așadar, dacă sunteți un dezvoltator Node (începător sau cunoscut), este posibil să faceți una dintre aceste mari greșeli care afectează în mod negativ aplicația. S-ar putea să se datoreze faptului că nu cunoașteți un anumit mod de a face lucrurile mai bine în Node, sau poate sunt doar obiceiurile pe care le-ați preluat de pe un alt ecosistem.

Nerespectând bucla evenimentului

Atunci când o persoană migrează către Node, este parțial pentru că au auzit povești despre cum scalează LinkedIn folosind Node sau au văzut repere care arată cercurile care rulează Node în jurul PHP, Ruby, etc. conexiuni cu soclu deschis.

Așa că își construiesc aplicația, așteptând aceleași momente de răspuns explozive la care visau – cu excepția faptului că nu se întâmplă nimic apropiat.

Unul dintre motivele principale pentru aceasta este să nu înțelegem corect bucla evenimentului. Luați în considerare următorul cod care primește un set de cărți din baza de date și apoi le sortează după numărul total de pagini:

db.Library.get (libraryId, funcție (err, biblioteca) {
let books = library.books;
books.sort (funcția (a, b) {
returnați a.pagini < b.pagini? -1: 1
});
});

Sunt de acord că acest cod nu face nimic cu tabloul de cărți sortate, dar nu este ideea aici. Ideea este că un astfel de cod cu aspect nevinovat este suficient pentru a arunca bucla evenimentului de îndată ce începi să te ocupi de un număr non-banal de cărți.

Motivul este că bucla de evenimente este menită să efectueze E / S care nu blochează. Un exemplu bun este cel al unui pachet de pizza la o articulație de pizza – persoana este specializată în tăierea pizza, plierea copertinelor în cutii de livrare, introducerea pizza, atașarea etichetelor potrivite și împingerea acesteia către tipul de livrare.

Uimitor, nu? La fel ca Node!

Sursa: stackoverflow.com

Dar ia în considerare ce se va întâmpla dacă această persoană trebuie să amestece, să pregătească și să împacheteze condimentele. În funcție de cât de complex este procesul, rata de ambalare a pizza va fi redusă la o treime sau poate chiar va opri.

La asta ne referim prin sarcini care „blochează” – atâta timp cât Node trebuie să transmită pur și simplu informații, este foarte rapid și, în mod ideal, cea mai bună opțiune, dar imediat ce trebuie să facă niște calcule extinse, se oprește și totul altceva trebuie să aștepte. Acest lucru se întâmplă deoarece bucla de eveniment este cu un singur filet (mai multe detalii) aici.)

Deci, nu efectuați calcule în bucla evenimentului, indiferent cât de importante sunt. Adică, adăugarea de numere și luarea mediilor este în regulă, dar seturi mari de date vor face ca aplicația dvs. Node să se târască.

În speranța că codul async va coopera

Luați în considerare acest exemplu de nod foarte simplu care citește datele dintr-un fișier și le afișează:

const fs = necesită (‘fs’);

let contents = fs.readFile (‘secret.txt’, (err, date) => {
returnare date;
});

console.log („Conținutul fișierului este:”);
console.log (conținuturi);

Expunerea la limbi clasice (cum ar fi PHP, Python, Perl, Ruby, C ++, etc.) va avea să aplicați bunul simț că după ce acest cod se execută, conținutul variabil va avea conținutul fișierului. Dar iată ce se întâmplă atunci când executați efectiv codul:

Obținem nedefinit (). Acest lucru se datorează faptului că, deși te poți interesa profund de Node, natura sa asincică nu îi pasă de tine (este vorba despre o glumă! Vă rugăm să nu păstrați comentariile de ură aici ��). Treaba noastră este să-i înțelegem natura asincină și să lucrăm cu ea. readFile () este o funcție asincronă, ceea ce înseamnă că de îndată ce este apelat, bucla de eveniment Node trece de la componenta sistemului de fișiere și continuă.

Se întoarce la funcția mai târziu când fișierul a fost citit, dar până la acel moment conținutul este tratat ca o variabilă neinițializată și astfel conține nedefinit. Modul corect este de a procesa datele fișierului în funcția de apelare, dar nu pot intra în mai multe detalii, deoarece aceasta nu este o Tutorial cu noduri. ��

Callback care apelează apelul care apelează apelul care apelează . . .

JavaScript se apropie mai mult de programarea funcțională decât orice alt limbaj mai vechi (mainstream), de fapt, toate spuse și făcute, este preferatul meu atunci când vine vorba de proiectarea orientată spre obiect și de capacitățile funcționale – îl așez deasupra Python, PHP, Perl, Java și chiar și Ruby când vine vorba de scrierea codului „plăcut”).

Adică funcțiile obțin mai multe drepturi ale cetățenilor decât în ​​alte limbi. Împerechează acest lucru cu faptul că codul asincron funcționează oferindu-ți o funcție de apelare, iar noi terminăm cu o rețetă pentru dezastru cunoscută sub numele de Callback Hell.

Iată câteva exemple de cod electronice pe care le-am întâlnit pe Quora. Ce crezi că face?

opțiuni var;

necesită ( ‘electron’). app.once (
‘gata’,

function () {

options = {
cadru: fals,
inaltime: 768,
latime: 1024,
x: 0,
y: 0
};

options.BrowserWindow = necesită (‘electron’). BrowserWindow;
options.browserWindow = new options.BrowserWindow (opțiuni);
options.browserWindow.loadURL ( ‘http://electron.atom.io’);
options.browserWindow.webContents.once (
‘A făcut-stop-încărcare’,

function () {
options.browserWindow.capturePage (
Opțiuni,

function (date) {
necesită ( ‘fs’). writeFileSync (
‘/Tmp/screenCapture.testExampleJs.browser..png’,
data.toPng ()
);

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

Dacă aveți timp dificil, alăturați-vă clubului!

Funcțiile din interiorul funcțiilor din interiorul funcțiilor sunt greu de citit și foarte greu de motivat, motiv pentru care a fost denumit „iadul de apel invers” (presupun că Iadul este un loc confuz din care să ieși!). În timp ce acest lucru funcționează din punct de vedere tehnic, faceți ca codul dvs. să fie viitor din orice încercări de înțelegere și întreținere.

Există multe modalități de a evita apelul de apel invers, inclusiv promisiuni și Extensii reactive.

Nu folosiți toate nucleele procesorului

Procesoarele moderne au mai multe nuclee – 2, 4, 8, 16, 32. . . numărul continuă să urce.

Dar acest lucru nu a avut în vedere creatorul Node când a lansat Node. Drept urmare, Nodul este cu o singură filă, ceea ce înseamnă că rulează într-un singur thread (sau proces, dacă doriți să îl numiți, deși nu sunt la fel), utilizând un singur nucleu de procesor.

Asta înseamnă că dacă ai învățat Node de la tutoriale și prieteni și fragmente de cod care plutesc și dacă aplicația este dislocată pe un server cu 8 nuclee, pierzi 7/8 din puterea de procesare disponibilă!

Inutil să spun, este o deșeuri masive. Dacă urmați această cale, veți ajunge să plătiți pentru opt servere atunci când aveți nevoie de unul singur. Adică cheltuiți 16.000 de dolari pe lună când vor face 2.000 de dolari (pierderea de bani întotdeauna doare, nu?). Toate acestea, când soluția este destul de simplă: folosirea grup modul.

Nu pot intra în toate detaliile aici, dar este o simplă tehnică de a detecta câte nuclee are mașina curentă și de a lansa mai multe instanțe de nod. Când sunt detectate erori, instanța este repornită. Iată cât de simplu este de implementat (tutorial aici):

var cluster = necesită (‘cluster’);

if (cluster.isMaster) {
var numWorkers = necesită (‘os’). lungime cpus ().

console.log (‘Configurare master cluster’ + numWorkers + ‘muncitori …’);

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

cluster.on (‘online’, funcție (muncitor) {
console.log (‘Worker’ + working.process.pid + ‘este online’);
});

cluster.on (‘ieșire’, funcție (muncitor, cod, semnal) {
console.log (‘Worker’ + worker.process.pid + ‘a murit cu codul:’ + cod + ‘, iar semnalul:’ + semnal);
console.log („Pornirea unui nou muncitor”);
cluster.fork ();
});
} altfel {
var app = necesită (‘expres’) ();
app.all (‘/ *’, funcție (req, res) {res.send (‘proces’ + process.pid + ‘spune salut!’). end ();})

var server = app.listen (8000, funcție () {
console.log („Proces” + process.pid + ”ascultă toate cererile primite”);
});
}

După cum puteți vedea, cluster.fork () face magia, iar restul ascultă pur și simplu câteva evenimente esențiale de cluster și face curățarea necesară.

Nu utilizați TypeScript

Bine, nu este o greșeală, ca atare, și o mulțime de aplicații Node au fost și sunt scrise fără TypeScript.

Acestea fiind spuse, TypeScript oferă garanțiile și liniștea sufletească de care Node a avut întotdeauna nevoie, iar în ochii mei, este o greșeală dacă te dezvolți pentru Node în 2019 și nu folosești TypeScript (mai ales când A (Angular) din stiva MEAN s-a mutat. la TypeScript cu mult timp în urmă).

Tranziția este blândă, iar TypeScript este aproape exact ca JavaScript pe care îl cunoașteți, cu siguranța tipurilor, ES6 și a altor câteva verificări introduse în:

// /lib/controllers/crmController.ts
import * sub formă de mongoose din „mongoose”;
import {ContactSchema} din „../models/crmModel”;
import {Cerere, răspuns} din „expres”;

const Contact = mongoose.model (‘Contact’, ContactSchema);
export class ContactController {

public addNewContact (cerere: solicitare, res: răspuns) {
let newContact = new Contact (req.body);

newContact.save ((err, contact) => {
if (err) {
res.send (err);
}
res.json (contact);
});
}

Vă recomand să verificați acest lucru frumos și prietenos Tutorial TypeScript.

Concluzie

Nodul este impresionant, dar nu are fără (multe?) Probleme. Acestea fiind spuse, acest lucru se aplică tuturor tehnologiilor de acolo, noi și vechi și vom face mai bine să înțelegem Nodul și să lucrăm cu acesta.

Sper că aceste cinci sfaturi vă vor împiedica să fiți aspirați în gropile de gudron ale unor erori perene și probleme de performanță. Dacă mi-a fost dor de ceva interesant, vă rugăm să mă anunțați și voi fi mai mult decât fericit (de fapt, recunoscător!) Să le includ în articol. ��

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me