Programování

10 konceptů JavaScriptu, které musí každý vývojář Node.js zvládnout

Rahul Mhatre je vedoucí vývojového týmu ve společnosti Software AG.

Díky JavaScriptu a jádru V8, architektuře založené na událostech a škálovatelnosti ihned po vybalení se Node.js rychle stal de facto standardem pro vytváření webových aplikací a produktů SaaS. Framework Node.js, jako je Express, Sails a Socket.IO, umožňuje uživatelům rychle zavádět aplikace a soustředit se pouze na obchodní logiku.

Node.js vděčí za svou enormní popularitu JavaScriptu. JavaScript je multiparadigmový jazyk, který podporuje mnoho různých stylů programování, včetně funkčního programování, procedurálního programování a objektového programování. Umožňuje vývojářům být flexibilní a využívat výhod různých stylů programování.

JavaScript však může být dvojsečný meč. Multiparadigmová povaha JavaScriptu znamená, že téměř vše je proměnlivé. Při psaní kódu Node.js tedy nemůžete opomenout pravděpodobnost mutace objektu a rozsahu. Protože JavaScript postrádá optimalizaci koncového volání (což umožňuje rekurzivním funkcím znovu použít rámce zásobníku pro rekurzivní volání), je nebezpečné používat rekurzi pro velké iterace. Kromě úskalí, jako jsou tyto, je Node.js s jedním vláknem, takže pro vývojáře je nutné psát asynchronní kód.

JavaScript může být požehnáním, je-li používán opatrně - nebo zhoubou, pokud jste nedbalí. Následující strukturovaná pravidla, návrhové vzory, klíčové koncepty a základní pravidla vám pomohou zvolit optimální přístup k problému. Kterým klíčovým konceptům by měli programátoři Node.js rozumět? Níže uvedu 10 konceptů JavaScriptu, o nichž se domnívám, že jsou nejdůležitější pro psaní efektivního a škálovatelného kódu Node.js.

Související video: Tipy a triky Node.js

V tomto vysvětlujícím videu se naučte několik technik, které mohou zlepšit vaše zkušenosti s vývojem uzlů.

IIFE JavaScriptu: Okamžitě vyvolané funkční výrazy

Okamžitě vyvolaný výraz funkce (IIFE) je funkce, která se provede, jakmile se vytvoří. Nemá žádné spojení s žádnými událostmi nebo asynchronním spuštěním. Můžete definovat IIFE, jak je znázorněno níže:

(funkce () {

// celý váš kód zde

// ...

})();

První dvojice závorek funkce(){...} převede kód uvnitř závorek na výraz. Druhá dvojice závorek volá funkci vyplývající z výrazu. IIFE lze také popsat jako anonymní funkci s vlastním vyvoláním. Jeho nejběžnějším využitím je omezení rozsahu proměnné vytvořené prostřednictvím var nebo zapouzdřit kontext, aby nedocházelo ke kolizím jmen.

Uzávěry JavaScriptu

Uzávěr v JavaScriptu je vnitřní funkce, která má přístup k rozsahu své vnější funkce, a to i poté, co vnější funkce vrátila kontrolu. Uzávěr dělá proměnné vnitřní funkce soukromé. Níže je uveden jednoduchý příklad uzavření:

var count = (funkce () {

var _counter = 0;

návratová funkce () {return _counter + = 1;}

})();

počet();

počet();

počet();

> // počitadlo je nyní 3

Proměnná počet je přiřazena vnější funkce. Vnější funkce běží pouze jednou, což nastaví čítač na nulu a vrátí vnitřní funkci. The _čelit proměnná je přístupná pouze vnitřní funkcí, díky níž se chová jako soukromá proměnná.

Prototypy JavaScript

Každá funkce JavaScriptu má vlastnost prototypu, která se používá k připojení vlastností a metod. Tuto vlastnost nelze vyčíslit. Umožňuje vývojáři připojit ke svým objektům metody nebo členské funkce. JavaScript podporuje dědičnost pouze prostřednictvím vlastnosti prototypu. V případě zděděného objektu odkazuje vlastnost prototypu na rodiče objektu. Běžným přístupem k připojení metod k funkci je použití prototypů, jak je znázorněno níže:

funkce Obdélník (x, y) {

this._length = x;

this._breadth = y;

}

Rectangle.prototype.getDimensions = function () {

návrat {length: this._length, width: this._breadth};

};

Rectangle.prototype.setDimensions = function (len, bred) {

this._length = len;

this._breadth = chován;

};

Soukromé vlastnosti JavaScriptu pomocí uzávěrek

JavaScript umožňuje definovat soukromé vlastnosti pomocí předpony podtržítka, jak je znázorněno ve výše uvedeném příkladu. To však nebrání uživateli v přímém přístupu nebo úpravě vlastnosti, která má být soukromá.

Definování soukromých nemovitostí pomocí uzávěrek vám pomůže tento problém vyřešit. Členské funkce, které potřebují přístup k soukromým vlastnostem, by měly být definovány na samotném objektu. Soukromé nemovitosti můžete vytvořit pomocí uzávěrek, jak je znázorněno níže:

function Rectangle (_length, _breadth) {

this.getDimensions = function () {

návrat {délka: _ délka, šířka: _ šířka};

     };

this.setDimension = function (len, bred) {

_length = len;

_ šířka = vyšlechtěna

    };

}

Vzor modulu JavaScript

Vzor modulu je nejčastěji používaným návrhovým vzorem v JavaScriptu pro dosažení volně vázaného a dobře strukturovaného kódu. Umožňuje vám vytvářet veřejné a soukromé úrovně přístupu. Níže je uveden jeden způsob, jak dosáhnout vzoru modulu:

var Směr = (funkce () {

var _direction = 'vpřed'

var changeDirection = funkce (d) {

_direction = d;

  }

návrat {setDirection: funkce (d) {

changeDirection (d);

console.log (_direction);

          }

  };

})();

Direction.setDirection ('backward'); // Výstupy: 'zpět'

console.log (Direction._direction);

Vzor odhalujícího modulu je podobný vzoru modulu, ve kterém jsou proměnné a metody, které je třeba odhalit, vráceny v literálu objektu. Výše uvedený příklad lze zapsat pomocí vzoru Odhalující modul následujícím způsobem:

var Směr = (funkce () {

var _direction = 'vpřed';

var _privateChangeDirection = funkce (d) {

_direction = d;

  }

vrátit se {

setDirection: _privateChangeDirection

  };

})();

Zvedání JavaScriptu

JavaScript před spuštěním kódu přesune proměnné a deklarace funkcí na vrchol jejich rozsahu. Tomu se říká zvedání. Bez ohledu na to, kam v kódu umístíte deklaraci funkcí a proměnných, jsou interpretem přesunuty na začátek svého oboru. To může nebo nemusí být tam, kde je chcete mít. Pokud ne, bude mít váš program chyby.

Deklarace proměnných jsou zpracovány před provedením libovolného kódu. Je ironií, že nedeklarované proměnné neexistují, dokud jim nebude přiřazena hodnota. To způsobí, že se všechny nedeklarované proměnné stanou globálními proměnnými. Ačkoli jsou deklarace funkcí zvednuty, výrazy funkcí nejsou zvednuty. Při zvedání proměnných a funkcí má JavaScript pořadí priorit.

Priorita je uvedena níže od vyšší po nižší:

  • Variabilní přiřazení
  • Deklarace funkce
  • Proměnná prohlášení

Abyste se vyhnuli chybám, měli byste deklarovat své proměnné a funkce na začátku každého oboru.

Java currying

Currying je metoda, díky níž jsou funkce flexibilnější. U funkce curried můžete předat všechny argumenty, které funkce očekává, a získat výsledek, nebo můžete předat pouze podmnožinu argumentů a získat zpět funkci, která čeká na zbývající argumenty. Jednoduchý příklad kari je uveden níže:

var myFirstCurry = funkce (slovo) {

návratová funkce (uživatel) {

návrat [slovo, ",", uživatel] .join ("");

  };

};

var HelloUser = myFirstCurry ("Hello");

HelloUser ("Rahul"); // Výstup: „Dobrý den, Rahul“

Původní curriedovou funkci lze volat přímo předáním každého z parametrů v samostatné sadě závorek jeden po druhém, jak je znázorněno níže:

myFirstCurry („Hele, wassup!“) („Rahul“); // Výstup: „Hey, wassup !, Rahul“

Metody použití, volání a vazby JavaScriptu

Je nezbytné, aby každý vývojář JavaScriptu pochopil rozdíl mezi volání, aplikovat, a svázat metody. Tři funkce jsou podobné v tom, že jejich prvním argumentem je vždy „tato“ hodnota nebo kontext, kterému chcete dát funkci, na kterou metodu voláte.

Ze tří volání je nejjednodušší. Je to stejné jako vyvolání funkce při určování jejího kontextu. Zde je příklad:

var uživatel = {

jméno: "Rahul Mhatre",

whatIsYourName: function () {

console.log (this.name);

     }

};

user.whatIsYourName (); // Výstup: "Rahul Mhatre",

var user2 = {

název: "Neha Sampat"

};

user.whatIsYourName.call (user2); // Výstup: "Neha Sampat"

Všimněte si, že aplikovat je téměř stejný jako volání. Jediný rozdíl je v tom, že argumenty předáváte jako pole a ne samostatně. S poli se manipuluje snadněji v JavaScriptu, což otevírá větší počet možností pro práci s funkcemi. Zde je příklad použití aplikovat a volání:

var uživatel = {

pozdrav: "Ahoj!",

greetUser: function (userName) {

console.log (this.greet + "" + userName);

     }

};

var greet1 = {

pozdrav: „Hola“

};

user.greetUser.call (greet1, "Rahul") // Výstup: "Hola Rahul"

user.greetUser.apply (greet1, ["Rahul"]) // Výstup: "Hola Rahul"

The svázat metoda umožňuje předat argumenty funkci bez jejího vyvolání. Je vrácena nová funkce s argumenty ohraničenými před dalšími argumenty. Zde je příklad:

var uživatel = {

pozdrav: "Ahoj!",

greetUser: function (userName) {

console.log (this.greet + "" + userName);

}

};

var greetHola = user.greetUser.bind ({greet: "Hola"});

var greetBonjour = user.greetUser.bind ({pozdrav: "Bonjour"});

greetHola ("Rahul") // Výstup: "Hola Rahul"

greetBonjour ("Rahul") // Výstup: "Bonjour Rahul"

Memoizace JavaScriptu

Memoizace je optimalizační technika, která zrychluje provádění funkcí ukládáním výsledků drahých operací a vrácením výsledků v mezipaměti, když se znovu objeví stejná sada vstupů. Objekty JavaScriptu se chovají jako asociativní pole, což usnadňuje implementaci memoizace v JavaScriptu. Například můžeme převést rekurzivní faktoriální funkci na memoárovou faktoriální funkci, jak je znázorněno níže:

funkce memoizeFunkce (func) {

var cache = {};

návratová funkce () {

var key = argumenty [0];

if (mezipaměť [klíč]) {

vrátit mezipaměť [klíč];

          }

else {

var val = func.apply (toto, argumenty);

cache [klíč] = val;

návratová hodnota;

          }

  };

}

var fibonacci = memoizeFunction (funkce (n)

návrat (n === 0);

Přetížení metody JavaScriptu

Přetížení metody umožňuje více metodám mít stejný název, ale různé argumenty. Kompilátor nebo tlumočník určuje, která funkce se má volat, na základě počtu předaných argumentů. Přetížení metody není přímo podporováno v JavaScriptu. Ale můžete dosáhnout něčeho podobného, ​​jak je uvedeno níže:

function overloadMethod (object, name, fn) {

if (! object._overload) {

object._overload = {};

     }

if (! object._overload [name]) {

object._overload [name] = {};

    }

if (! object._overload [name] [fn.length]) {

object._overload [name] [fn.length] = fn;

    }

objekt [název] = funkce () {

if (this._overload [name] [argumenty.length])

vrátit this._overload [name] [argumenty.délka]. použít (toto, argumenty);

     };

funkce Students () {

overloadMethod (this, "find", function () {

// Najít studenta podle jména

  });

přetíženíMetoda (tato, "najít", funkce (první, poslední) {

// Najděte studenta podle jména a příjmení

  });

}

var studenti = noví studenti ();

students.find (); // Najde vše

students.find ("Rahul"); // Vyhledá studenty podle jména

students.find ("Rahul", "Mhatre"); // Vyhledá uživatele podle jména a příjmení

Jakmile se v Node.js dobře zorientujete, všimnete si, že existuje mnoho způsobů, jak vyřešit téměř každý problém. Ale správný přístup je zásadní. Špatný přístup bude mít za následek více vedlejších účinků, jako jsou nepravidelné nebo chybné aplikace nebo regrese, které vás nutí přepsat celou logiku. Na druhou stranu, správný přístup položí základ robustní, efektivní a škálovatelné aplikace.

10 konceptů JavaScriptu popsaných v tomto článku jsou základy, které by měl každý vývojář Node.js znát. Ale oni jsou špičkou ledovce. JavaScript je výkonný a složitý. Čím více jej používáte, tím více pochopíte, jaký obrovský JavaScript ve skutečnosti je. Lepší porozumění tak rozsáhlému jazyku vám jistě pomůže vyhnout se chybám. Mezitím si osvojte správné základy a uvidíte skvělé výsledky.

Rahul Mhatre je vedoucí vývojového týmu ve společnosti Software AG. Dříve působil jako technický architekt ve společnosti Built.io, kterou získala Software AG.

Nové technologické fórum poskytuje místo, kde můžete prozkoumat a diskutovat o nově vznikajících podnikových technologiích v nebývalé hloubce a šíři. Výběr je subjektivní, založený na našem výběru technologií, které považujeme za důležité a pro čtenáře nejzajímavější. nepřijímá marketingové materiály ke zveřejnění a vyhrazuje si právo upravovat veškerý přispěný obsah. Všechny dotazy zasílejte na [email protected].

$config[zx-auto] not found$config[zx-overlay] not found