Programování

Co je Node.js? Vysvětlení modulu runtime JavaScript

Škálovatelnost, latence a propustnost jsou klíčové ukazatele výkonu webových serverů. Udržování nízké latence a vysoké propustnosti při škálování nahoru a ven není snadné. Node.js je běhové prostředí JavaScriptu, které dosahuje nízké latence a vysoké propustnosti přijetím „neblokujícího“ přístupu k poskytování požadavků. Jinými slovy, Node.js neztrácí čas ani prostředky čekáním na návrat vstupně-výstupních požadavků.

V tradičním přístupu k vytváření webových serverů je pro každý příchozí požadavek nebo připojení server založí nový vlákno popravy nebo dokonce vidličky nový proces zpracovat požadavek a odeslat odpověď. Koncepčně to dává dokonalý smysl, ale v praxi to vyžaduje velkou režii.

Při tření vlákna způsobí méně paměti a režii CPU než rozvětvení procesy, to může být stále neúčinné. Přítomnost velkého počtu podprocesů může způsobit, že silně načtený systém stráví drahocenné cykly plánováním podprocesů a přepínáním kontextu, což přidává latenci a omezuje škálovatelnost a propustnost.

Node.js má jiný přístup. Spustí smyčku událostí s jedním vláknem zaregistrovanou v systému pro zpracování připojení a každé nové připojení způsobí JavaScript funkce zpětného volání střílet. Funkce zpětného volání dokáže zpracovat požadavky s neblokujícími I / O voláními a v případě potřeby může vytvořit vlákna z fondu k provádění blokování nebo operací náročných na CPU a k vyvážení zátěže mezi jádry CPU. Přístup Node k škálování pomocí funkcí zpětného volání vyžaduje méně paměti pro zvládnutí více připojení než většina konkurenčních architektur, které se škálovají pomocí vláken, včetně Apache HTTP Server, různých aplikačních serverů Java, IIS a ASP.NET a Ruby on Rails.

Ukázalo se, že Node.js je kromě serverů docela užitečný i pro desktopové aplikace. Upozorňujeme, že aplikace uzlů nejsou omezeny pouze na čistý JavaScript. Můžete použít libovolný jazyk, který se převádí do JavaScriptu, například TypeScript a CoffeeScript. Node.js obsahuje JavaScriptový modul Google Chrome V8, který podporuje syntaxi ECMAScript 2015 (ES6) bez nutnosti transportéru ES6 na ES5, jako je Babel.

Hodně z nástroje Node pochází z jeho velké knihovny balíků, která je přístupná z npm příkaz. NPM, správce balíčků uzlů, je součástí standardní instalace Node.js, přestože má vlastní web.

Nějaká historie JavaScriptu

V roce 1995 Brendan Eich, tehdejší dodavatel společnosti Netscape, vytvořil jazyk JavaScript, který se bude spouštět ve webových prohlížečích - za 10 dní, jak příběh pokračuje. JavaScript měl původně umožňovat animace a další manipulace s objektovým modelem prohlížeče (DOM). Krátce nato byla představena verze JavaScriptu pro server Netscape Enterprise Server.

Název JavaScript byl vybrán pro marketingové účely, protože jazyk Java Sun byl v té době široce medializovaný. Ve skutečnosti byl jazyk JavaScript ve skutečnosti založen především na jazycích Scheme a Self, s povrchní sémantikou podobnou Javě.

Mnoho programátorů zpočátku odmítlo JavaScript jako zbytečný pro „skutečnou práci“, protože jeho tlumočník běžel řádově pomaleji než kompilované jazyky. To se změnilo, protože několik výzkumných snah zaměřených na zrychlení JavaScriptu začalo přinášet ovoce. Nejvýznamnější je, že open-source JavaScriptový motor Google Chrome V8, který provádí kompilaci, inlining a dynamickou optimalizaci kódu v reálném čase, může ve skutečnosti překonat kód C ++ u některých zátěží a překonat Python ve většině případů použití.

Platforma Node.js založená na JavaScriptu byla představena v roce 2009 Ryanem Dahlem pro Linux a MacOS jako škálovatelnější alternativa k HTTP serveru Apache. NPM, autor Isaac Schlueter, uvedený na trh v roce 2010. Nativní verze Node.js pro Windows debutovala v roce 2011.

Joyent po mnoho let vlastnil, řídil a podporoval vývojové úsilí Node.js. V roce 2015 byl projekt Node.js převeden na Node.js Foundation a stal se řízen technickým řídícím výborem nadace. Node.js byl také přijat jako Linux Foundation Collaborative Project. V roce 2019 se Node.js Foundation a JS Foundation spojily a vytvořily OpenJS Foundation.

Základní architektura Node.js

Na vysoké úrovni Node.js kombinuje JavaScriptový engine Google V8, jednozávitovou neblokovací smyčku událostí a nízkoúrovňové I / O API. Níže uvedený ukázkový kód ořezaný níže ilustruje základní vzor serveru HTTP pomocí funkcí šipek ES6 (anonymní funkce Lambda deklarované pomocí operátoru šipky tuku, =>) pro zpětná volání.

Začátek kódu načte modul HTTP, nastaví server název hostitele proměnná až localhost (127.0.0.1) a nastaví přístav proměnná na 3000. Poté vytvoří server a funkci zpětného volání, v tomto případě funkci tlusté šipky, která vždy vrátí stejnou odpověď na jakýkoli požadavek: statusCode 200 (úspěch), typ obsahu prostý text a textová odpověď z „Ahoj světe \ n“. Nakonec řekne serveru, aby naslouchal localhost port 3000 (přes soket) a definuje zpětné volání pro tisk zprávy protokolu na konzole, když server začal poslouchat. Pokud spustíte tento kód v terminálu nebo konzole pomocí uzel a poté přejděte na localhost: 3000 pomocí libovolného webového prohlížeče na stejném počítači, ve vašem prohlížeči se zobrazí „Hello World“. Server zastavíte stisknutím klávesy Ctrl-C v okně terminálu.

Všimněte si, že každé volání v tomto příkladu je asynchronní a neblokující. Funkce zpětného volání jsou vyvolány v reakci na události. The createServer zpětné volání zpracovává událost požadavku klienta a vrací odpověď. The poslouchat zpětné volání zpracovává Naslouchání událost.

Knihovna Node.js

Jak můžete vidět na levé straně obrázku níže, Node.js má ve své knihovně širokou škálu funkcí. Modul HTTP, který jsme dříve použili v ukázkovém kódu, obsahuje třídy klienta i serveru, jak vidíte na pravé straně obrázku. Funkce serveru HTTPS využívající TLS nebo SSL žije v samostatném modulu.

Jedním inherentním problémem smyčky událostí s jedním vláknem je nedostatek vertikálního škálování, protože vlákno smyčky události bude používat pouze jedno jádro CPU. Mezitím moderní čipy CPU často vystavují osm a více jader a moderní serverové stojany mají často více čipů CPU. Aplikace s jedním vláknem plně nevyužije výhod jádra 24 plus v robustním serverovém stojanu.

Můžete to opravit, i když to vyžaduje nějaké další programování. Za prvé, Node.js může vytvářet podřízené procesy a udržovat roury mezi rodičem a podřízenými, podobně jako systém popen (3) volání funguje pomocí child_process.spawn () a související metody.

Modul klastru je pro vytváření škálovatelných serverů ještě zajímavější než modul podřízeného procesu. The cluster.fork () metoda založí pracovní procesy, které sdílejí porty nadřazeného serveru pomocí child_process.spawn () pod kryty. Master klastru distribuuje příchozí připojení mezi své pracovníky pomocí standardního algoritmu round-robin, který je citlivý na načtení pracovního procesu.

Všimněte si, že Node.js neposkytuje směrovací logiku. Chcete-li zachovat stav napříč připojeními v klastru, budete muset udržovat relaci a přihlašovací objekty na jiném místě než v pracovní paměti RAM.

Ekosystém balíčku Node.js

V registru NPM je umístěno více než 1,2 milionu balíků bezplatného opakovaně použitelného kódu Node.js, což z něj dělá největší softwarový registr na světě. Všimněte si, že většina NPM balíčky (v podstatě složky nebo položky registru NPM obsahující program popsaný v souboru package.json) obsahují více moduly (programy, které načtete vyžadovat prohlášení). Je snadné zaměnit tyto dva pojmy, ale v této souvislosti mají konkrétní význam a neměly by být zaměňovány.

NPM může spravovat balíčky, které jsou lokálními závislostmi konkrétního projektu, stejně jako globálně nainstalované nástroje JavaScriptu. Při použití jako správce závislostí pro místní projekt může NPM nainstalovat pomocí jednoho balíčku všechny závislosti projektu prostřednictvím souboru package.json. Při použití pro globální instalace vyžaduje NPM často systémová (sudo) oprávnění.

Vy ne mít použít příkazový řádek NPM pro přístup k veřejnému registru NPM. Jiní správci balíčků, například Facebook's Yarn, nabízejí alternativní zážitky na straně klienta. Balíky můžete také vyhledávat a procházet pomocí webových stránek NPM.

Proč byste chtěli použít balíček NPM? V mnoha případech je instalace balíčku pomocí příkazového řádku NPM nejrychlejší a nejpohodlnější pro získání nejnovější stabilní verze modulu běžícího ve vašem prostředí a je obvykle méně práce než klonování zdrojového úložiště a budování instalace z úložiště. Pokud nechcete nejnovější verzi, můžete zadat číslo verze pro NPM, což je zvláště užitečné, když jeden balíček závisí na jiném balíčku a může se rozbít s novější verzí závislosti.

Například rámec Express, minimální a flexibilní rámec webových aplikací Node.js, poskytuje robustní sadu funkcí pro vytváření jednostránkových a vícestránkových a hybridních webových aplikací. Zatímco snadno klonovatelné úložiště Expresscode se nachází na //github.com/expressjs/express a dokumentace Express je na //expressjs.com/, rychlý způsob, jak začít používat Express, je instalace do již inicializovaného místního pracovního vývoje adresář s npm příkaz, například:

$ npm install express - uložit

The -Uložit Možnost, která je ve výchozím nastavení ve verzi NPM 5.0 a novější, řekne správci balíčků, aby po instalaci přidal modul Express do seznamu závislostí v souboru package.json.

Dalším rychlým způsobem, jak začít používat Express, je instalace spustitelného souboru generátorexpresní (1) globálně a poté ji použít k lokálnímu vytvoření aplikace v nové pracovní složce:

$ npm install -g express-generator @ 4

$ express / tmp / foo && cd / tmp / foo

Díky tomu můžete NPM použít k instalaci všech potřebných závislostí a spuštění serveru na základě obsahu souboru package.json vytvořeného generátorem:

$ npm instalace

$ npm start

Z více než milionu balíčků v NPM je těžké vybrat to nejlepší, ale několik kategorií vyniká. Express je nejstarší a nejvýznamnější příklad rámců Node.js. Další velkou kategorií v úložišti NPM jsou nástroje pro vývoj JavaScriptu, včetně prohlížeče, modulu svazku modulů; bower, správce balíčků prohlížeče; grunt, běžec úkolu JavaScript; a gulp, streamovací systém sestavení. Konečně důležitou kategorií pro podnikové vývojáře Node.js jsou klienti databáze, kterých je více než 8 000, včetně populárních modulů, jako jsou redis, mongoose, firebase a pg, klient PostgreSQL.

Abychom to shrnuli, Node.js je multiplatformní běhové prostředí JavaScriptu pro servery a aplikace. Je postaven na jednovláknové neblokující smyčce událostí, JavaScriptovém enginu Google Chrome V8 a nízkoúrovňovém I / O API. Různé techniky, včetně modulu clusteru, umožňují aplikacím Node.js škálovat nad rámec jediného jádra CPU. Kromě svých základních funkcí inspiroval Node.js ekosystém více než milionu balíčků, které jsou registrovány a opatřeny verzemi v úložišti NPM a lze je nainstalovat pomocí příkazového řádku NPM nebo alternativy, jako je Yarn.