5 parimat viga, mida sõlmede arendajad teevad

Sõlm on fantastiline platvorm taustaprogrammide kirjutamiseks. Välja arvatud siis, kui sul ei ole asjad korras.


Sõltuvalt sellest, millisel tara küljel te asute, on sõlme kas parim või halvim asi, mis veebiarenduse maailmas juhtuda saab. Kuid vaatamata arvamustele, pole Node populaarsuse üle vaielda. See tõusis populaarsuse poolest kiiremini, kui keegi oskas oodata, isegi selle looja (ta ütles seda muidu pessimistlikult intervjuu)!

Alates kirjutamisest on see uute rakenduste käivitamise vaikeplatvorm, mis, tunnistan, on sageli karja mentaliteedi tulemus, kuid netomõju on see, et sõlmis on rohkem töökohti, rohkem raha ja põnevamaid projekte kui teistes traditsioonilistes skriptikeeltes.

Kahjuks on jõudnud punktini, et kui keegi palub mul soovitada neil veebiarenduse või uute käivitamistoodete alustamiseks, on Node minu soovitus nr 1, isegi kui olen PHP ja Laraveliga hästi kursis.

Kui mul võidakse lubada natukenegi edasikandmist jätkata (mis ma siis olen, kuna kirjutan seda?), On sõlmede vihkajatel mõte, kui nad ütlevad, et nende lemmikveebipakk saab teha asju sama hästi kui Node, kuid ka vastupidi on tõsi. Ja siis on veel asünkroonimise programmeerimise ja sündmuste asjad, mis olid sõlme sisse küpsetatud alates esimesest päevast ja teised ökosüsteemid üritavad nüüd meeleheitlikult kopeerida.

Täna on meil PHP-s ja Pythonis asünkroonimisvõimalused, kuid paraku on olemasolevate populaarsete raamatukogude tuum puhtalt sünkroonne, nii et see on peaaegu selline, nagu võitleksite süsteemi vastu. Kuid igatahes piisavalt rantimist päevaks. ��

Seega, kui olete sõlme arendaja (algaja või tuttav), on tõenäoline, et teete ühe neist suurtest vigadest, mis mõjutavad teie rakendust negatiivselt. Selle põhjuseks võib olla asjaolu, et te pole tuttav konkreetse moodusega, kuidas sõlmis asju paremini teha, või võib-olla on tegemist lihtsalt harjumustega, mille olete teisest ökosüsteemist üle kandnud.

Ei austata sündmuse silmust

Kui inimene migreerub sõlme, on see osaliselt sellepärast, et nad on kuulnud lugusid sellest, kuidas LinkedIn skaalab sõlme, või nad on näinud võrdlusaluseid, mis näitavad, et sõlme töötab ringides PHP, Ruby jne, kui tegemist on sekundis taotluste esitamise või käitlemisega. avatud pistikupesa ühendused.

Nii et nad loovad oma rakenduse, oodates samu plahvatusohtlikke reageerimise aegu, millest nad unistasid – välja arvatud see, et midagi lähedast sellele ei juhtu.

Selle üheks peamiseks põhjuseks on sündmuse ahela õige mõistmine. Mõelge järgmisele koodile, mis hangib andmebaasist komplekti raamatuid ja sorteerib need seejärel lehtede koguarvu järgi:

db.Library.get (libraryId, function (viga, teegi) {
las raamatud = raamatukogu.raamatud;
raamatud.sort (funktsioon (a, b) {
tagasi a.lehed < b.lehed? -1: 1
});
});

Olen nõus, et see kood ei tee sorteeritud raamatute massiiviga midagi, kuid see pole siin mõte. Asi on selles, et sellisest süütu välimusega koodist piisab sündmuse ahela puhumiseks kohe, kui hakkate tegelema mittetriviaalse arvu raamatutega.

Põhjus on see, et sündmuse ahel on mõeldud mitte blokeeriva I / O teostamiseks. Hea näide on pitsapakendaja pitsaühenduse juures – inimene on spetsialiseerunud pitsa tükeldamisele, kaanede kokkupakkimisele tarnimiskastidesse, pitsa sisse panemisele, õigete siltide kinnitamisele ja kohaletoimetajale surumisele..

Hämmastav, eks? Täpselt nagu Node!

Allikas: stackoverflow.com

Kuid mõelge, mis juhtub, kui see inimene peab ka maitseaineid segama, valmistama ja pakendama. Sõltuvalt sellest, kui keeruline protsess on, vähendatakse pitsa pakkimise määra kuni kolmandikuni või võib-olla isegi lõpetatakse.

Seda mõtleme “blokeerivate” ülesannete all – kui sõlme peab lihtsalt teavet edastama, on see väga kiire ja ideaaljuhul parim valik, kuid niipea, kui ta peab tegema põhjalikud arvutused, see peatub ja kõik muidu tuleb oodata. See juhtub seetõttu, et sündmuse ahel on ühe keermega (rohkem üksikasju siin.)

Seega ärge tehke arvutusi sündmuse ahelas, hoolimata sellest, kui olulised need on. Ma mõtlen, et numbrite lisamine ja keskmiste arvutamine on hea, kuid suured andmekogumid panevad teie Node rakenduse indekseerima.

Lootes, et async-kood hakkab koostööd tegema

Vaatleme seda väga lihtsat sõlme näidet, mis loeb failist andmeid ja kuvab selle:

const fs = nõuda (‘fs’);

olgu sisu = fs.readFile (‘secret.txt’, (eksinud, andmed) => {
andmed tagasi saata;
});

console.log (‘Faili sisu on:’);
console.log (sisu);

Klassikaliste keelte (nt PHP, Python, Perl, Ruby, C ++ jne) kasutamisel rakendate tavamõistet, et pärast selle koodi käivitamist saab muutujate sisu faili sisu. Kuid koodi tegelikul täitmisel juhtub järgmine:

Me saame määratlemata (). Põhjus on selles, et ehkki kui te võite sõlmest sügavalt hoolida, ei huvita see asünklik olemus teid (see on mõeldud naljaks! Palun ärge rämpsposti vihkamise kommentaare siia sisestage ��). Meie ülesanne on mõista selle asünklikku olemust ja sellega töötada. readFile () on asünkroonne funktsioon, mis tähendab, et kohe pärast selle kutsumist edastab sõlme sündmuse ahel töö failisüsteemi komponendile ja liigub edasi.

See naaseb funktsiooni juurde hiljem, kui fail on läbi loetud, kuid selleks ajaks käsitletakse sisu nagu initsialiseerimata muutujat ja sisaldab seega määratlemata. Õige viis on töödelda faili andmeid tagasihelistamisfunktsioonis, kuid ma ei saa üksikasjalikumalt uurida, kuna see pole Sõlme õpetus. ��

Tagasihelistamine, mis kutsub tagasihelistamist, mis kutsub tagasihelistamist, mis helistab . . .

JavaScript on funktsionaalsele programmeerimisele lähemal kui mis tahes muu vanem mainstream-keel (tegelikult on kõik öeldud ja tehtud, see on mu lemmik objektorienteeritud disaini ja funktsionaalsete võimaluste osas – ma panen selle Pythoni, PHP, Perli, Java ja isegi nauditava koodi kirjutamisel isegi rubiin).

See tähendab, et funktsioonid saavad rohkem kodanike õigusi kui teistes keeltes. Seostage see tõsiasjaga, et asünkroonne kood toimib teile tagasihelistamise funktsiooni abil ja lõpuks jõuame katastroofi retseptini, mida nimetatakse tagasihelistamise põrguks.

Siin on mõned elektronide näidised, millega Quora kaudu kokku puutusin. Mida see teie arvates teeb??

var võimalusi;

vaja (‘elektron’). app.once (
‘valmis’,

funktsioon () {

valikud = {
kaader: vale,
kõrgus: 768,
laius: 1024,
x: 0,
y: 0
};

options.BrowserWindow = nõuda (‘elektron’). BrowserWindow;
options.browserWindow = uued valikud.BrowserWindow (suvandid);
options.browserWindow.loadURL (‘http://electron.atom.io’);
options.browserWindow.webContents.once (
‘lõpetas laadimise’,

funktsioon () {
options.browserWindow.capturePage (
võimalusi,

funktsioon (andmed) {
nõudma (‘fs’). writeFileSync (
‘/tmp/screenCapture.testExampleJs.browser..png’,
data.toPng ()
);

protsess.exit (0);
}
);
}
);
}
);

Liituge klubiga, kui teil on raske!

Funktsioonide sees olevad funktsioonid on raskesti loetavad ja väga raskesti põhjendatavad, mistõttu nimetatakse seda nn tagasihelistamise põrguks (ma arvan, et põrgu on segane koht, kust välja pääseda!). Kuigi see tehniliselt töötab, muudate oma koodi igast arusaamise ja hooldamise katsest tulevikukindlaks.

Tagasihelistamise põrgu vältimiseks on palju viise, sealhulgas Lubadused ja Reaktiivsed laiendid.

Ei kasuta kõiki protsessori südamikke

Kaasaegsetel protsessoritel on mitu südamikku – 2, 4, 8, 16, 32. . . number muudkui ronib.

Kuid seda ei pidanud Node looja sõlme vabastades silmas. Selle tulemusel on sõlme ühe keermega, mis tähendab, et see töötab ühes keermes (või kui soovite seda nimetada protsessiks, kui see pole sama), kasutatakse ainult ühte protsessori tuuma.

See tähendab, et kui olete sõlme õppinud õpetuste ja sõprade hulgast ning ringi hõljuvatest koodilõikudest ja kui teie rakendus on installitud kaheksatuumalisse serverisse, siis raiskate 7/8 saadaolevast töötlemisjõust!

Ütlematagi selge, et see on tohutu raiskamine. Kui teete seda teed, maksate kaheksa serveri eest, kui teil on vaja ainult ühte. See tähendab, et kulutage 16 000 dollarit kuus, kui 2000 dollarit seda teeb (raha kaotamine teeb alati haiget, eks??). Kõike seda, kui lahendus on üsna lihtne: kasutades klaster moodul.

Ma ei saa siin kõigisse üksikasjadesse süveneda, kuid see on lihtne meetod, kuidas tuvastada, mitu tuuma praegusel masinal on, ja käivitada see siis palju sõlme eksemplare. Vigade tuvastamisel taaskäivitatakse eksemplar. Siit saate aru, kui lihtne on seda rakendada (juhendaja siin):

var klaster = vaja (‘klaster’);

if (klaster.isMaster) {
var numWorkers = vaja (‘os’). cpus (). pikkus;

console.log (‘Master klastri seadistamine’ + numWorkers + ‘töötajad …’);

jaoks (var i = 0; i < numWorkers; i ++) {
klaster.fork ();
}

cluster.on (‘võrgus’, funktsioon (töötaja) {
console.log (‘Töötaja’ + töötaja.protsess.pid + ‘on võrgus’);
});

cluster.on (‘exit’, funktsioon (töötaja, kood, signaal) {
console.log (‘Töötaja’ + töötaja.protsess.pid + + suri koodiga: ‘+ kood +’ ja signaal: ‘+ signaal);
console.log (‘Uue töötaja alustamine’);
klaster.fork ();
});
} veel {
var app = nõuda (‘express’) ();
app.all (‘/ *’, funktsioon (req, res) {res.send (‘process’ + process.pid + ‘say hello!’). end ();})

var server = app.listen (8000, funktsioon () {
console.log (‘Process’ + process.pid + ‘kuulab kõiki sissetulevaid taotlusi’);
});
}

Nagu näete, teeb klaster.fork () võlujõu ja ülejäänud on lihtsalt paari olulise klastriürituse kuulamine ja vajaliku puhastamine.

Ei kasuta TypeScripti

Olgu, see pole iseenesest viga ja palju sõlmerakendusi on kirjutatud ja kirjutatakse ilma TypeScriptita.

Sellegipoolest pakub TypeScript tagatisi ja meelerahu, mida Node alati vajas, ja minu silmis on see viga, kui arendate sõlme 2019. aastal ja ei kasuta TypeScripti (eriti siis, kui A (nurkne) MEANi virnas teisaldatud TypeScripti ammu).

Üleminek on õrn ja TypeScript on peaaegu täpselt selline nagu JavaScripti teate, koos tüüpide käenduse, ES6 ja veel mõne muu kontrolliga:

// /lib/controllers/crmController.ts
import * mongoosist ‘mongoose’;
importige {ContactSchema} saidist ‘../models/crmModel’;
importige {Request, Response} rakendusest ‘express’;

const Kontakt = mongoose.model (‘Kontakt’, ContactSchema);
ekspordiklass ContactController {

avalik addNewContact (päring: taotlus, res: vastus) {
lase newContact = uus kontakt (vastus keha);

newContact.save ((ekslik, kontakt) => {
if (eks) {
res.send (eksinud);
}
res.json (kontakt);
});
}

Ma soovitaksin seda toredat ja sõbralikku vaadata TypeScripti õpetus.

Järeldus

Sõlm on muljetavaldav, kuid see pole ilma (paljude?) Probleemideta. See tähendab, et see kehtib kõigi olemasolevate tehnoloogiate kohta, nii uute kui vanade kohta ning me mõistame paremini sõlme ja mõistame seda paremini.

Loodan, et need viis näpunäidet takistavad teid sattumast mitmeaastaste vigade ja jõudlusprobleemide tõrva auku. Kui mul jäi midagi huvitavat puudu, palun andke mulle sellest teada ja mul on rohkem kui hea meel (tegelikult olen tänulik!), Kui lisan need artiklisse. ��

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