Jste vývojář PHP. Chápu to. Já také. Moje cesta k PHP nevedla běžnou cestou, kterou se vydává většina vývojářů PHP při hledání dokonalého programovacího jazyka. Původně jsem začínal jako vývojář Javy a zhruba 10 let jsem žil v této zemi. Byl jsem jedním z těch zarytých vývojářů v Javě, kteří když se v konverzaci objevilo PHP, začal jsem ze sebe chrlit věci jako enterprise, škálovatelnost a další nesmysly.

Přibližně před 5 lety jsem začal pracovat na open source projektu, který potřeboval front-end pro sociální web, a tým potřeboval vybrat programovací jazyk pro tento web. Zkoumal jsem Javu a většinu dalších jazyků, ale z několika důvodů jsem se rozhodl pro PHP. Bylo těžké spolknout svou hrdost a začít programovat v PHP, ale to, co se stalo během tohoto projektu, nebylo nic jiného než zázrak. Jazyk jsem si zamiloval a začal jsem ho používat pro co nejvíce projektů, které jsem našel, přičemž jsem nechal své kořeny v Javě v prachu. Posledních pět let mi PHP sloužilo dobře, ale stále jsem hledal onen svatý grál programovacího jazyka, ve kterém se dá rychle vyvíjet, který má podporu podniků, je výkonný a škálovatelný a zároveň poskytuje silnou komunitu vývojářů. Věřím, že Node.js splňuje všechny mé požadavky a zároveň je stále rychle rostoucím a vyvíjejícím se jazykem.

První věc, kterou musíte pochopit, je, že Node.js není jen pro hipsterské vývojáře nebo early adopters. Používají ho některé z nejnavštěvovanějších webových stránek na internetu v současnosti a nadále si získává srdce a mysl vývojářů. Je skutečně ve fázi, kdy mu můžete svěřit i ty nejsložitější systémy.

Node.js je JavaScript##

Pokud si myslíte, že se musíte naučit úplně nový jazyk, abyste byli s Node.js produktivní, pravděpodobně se mýlíte. Většina vývojářů již zná jazyk JavaScript a právě s tímto jazykem a sémantikou budete při kódování v Node.js pracovat. V nedávném článku publikovaném společností Red Monk, který se snaží z projektů na githubu vyčíst nejoblíbenější jazyky, ostatně kraluje JavaScript. Tři nejlepší jazyky jsou následující:

  • JavaScript
  • Java
  • PHP

Vzhledem k popularitě JavaScriptu a jeho širokému rozšíření v našem odvětví, pokud ho ještě neznáte, je pravděpodobně na čase se zapřít a začít se ho učit.

Pokud Node.js používá pouze JavaScript, co to vlastně je?##

V kostce řečeno, Node.js je platforma pro činnosti na straně serveru. Používá programovací jazyk Javascript a má k dispozici nepřeberné množství knihoven ve formě modulů npm. Tyto moduly npm si můžete představit jako závislosti na knihovnách, které mohou být uspokojeny nástrojem Composer, pokud přicházíte ze země PHP. Ve skutečnosti byl výchozí systém správy závislostí pro PHP (Composer) podle oficiálních stránek inspirován systémem Node.js. Je pravděpodobné, že pokud potřebujete trochu funkcí a nemáte chuť psát celý kód sami, je k dispozici modul npm, který již poskytuje funkce, které hledáte.

Nodové aplikace se obvykle implementují, když potřebujete maximalizovat efektivitu využitím neblokujících I/O a asynchronních událostí. Vývojáři PHP by měli znát jednu záludnost: Aplikace Node.js běží v jednom vlákně. Backendový kód Node.js však používá více vláken pro operace, jako je přístup k síti a souborům. Vzhledem k tomu je Node ideální pro aplikace, kde je požadován provoz téměř v reálném čase.

Začínáme s ukázkovým projektem##

Ve zbytku tohoto příspěvku na blogu vám ukážu, jak se dostat do tempa s Node.js, když pocházíte z prostředí PHP. Ukázková aplikace, kterou budeme psát, je jednoduchá backendová služba, která bude poskytovat polohu každého obchodu Walmart. Walmart jsem si pro tento příklad vybral proto, že se jednoduše řečeno jedná o svatý grál všech obchodních domů. Pokud ji Walmart nemá, nepotřebujete ji.

Na konci tohoto příspěvku na blogu uvidíte, jak rychlé a snadné je vytvořit rozhraní API založené na protokolu REST pomocí Node.js, které je poháněno populární databází MongoDB. Tento příklad založený na REST jsem vybral proto, že vytvoření backendového API se rychle stalo běžným případem použití ve většině moderních aplikací.

Původně jsem plánoval vytvořit stejnou aplikaci jak v PHP, tak v Node.js, abych vám usnadnil přechod, ale abychom pokryli všechny různé frameworky a způsoby vytváření služeb založených na REST v PHP, vydalo by to na celou knihu a jednoduše to nelze pokrýt v jednom příspěvku na blogu. Pak mě napadlo použít právě framework Laravel, protože jeho popularita stále roste. Stále bych však oslovil jen čtvrtinu vývojářů PHP. Osobně je mým nejoblíbenějším frameworkem CodeIgniter, ale ten rychle ztrácí půdu pod nohama a nyní představuje pouze necelých 8 % populace vývojářů PHP. Sitepoint nedávno publikoval článek, který se zabývá právě touto věcí, a uvádí následující graf znázorňující frameworky, které jsou pro rok 2014 nejslibnější.

Vzhledem k obrovským rozdílům v tom, jak konfigurovat připojení k databázi a vytvářet služby REST pro jednotlivé frameworky, budu předpokládat, že víte, jak to udělat pro svůj framework v PHP, a místo toho se zaměřím jen na Node.js.

Vytvoření naší aplikace Node.js##

Po zbytek tohoto příspěvku budeme vytvářet aplikaci Walmart locator pomocí frameworku LoopBack API od společnosti StrongLoop. Jako bonus vás provedu instalací Node.js na OSX. Takže si vezměte šálek kávy, pohodlně se usaďte a pusťte se do práce.

Krok 1: Instalace Node.js##

Nejjednodušší způsob instalace Node.js je prostřednictvím některého z dostupných binárních balíčků, které jsou k dispozici pro většinu operačních systémů. Nasměrujte prohlížeč na následující adresu URL a stáhněte si správný pro váš operační systém:

http://nodejs.org/download/

Po načtení této stránky byste měli vidět následující:

Pokud používáte Mac OSX, klikněte na univerzální soubor .pkg. Tím se instalační program uloží do vašeho místního počítače. Po stažení souboru spusťte instalační program dvojitým kliknutím na stažený soubor .pkg a zobrazí se instalační dialog:

Dokončete instalační proces pomocí všech výchozích nastavení a nakonec kliknutím na tlačítko zavřít ukončete program, jakmile bude instalace úspěšná. Docela snadné, co říkáte?“

Krok 2: Instalace LoopBack pomocí NPM

Teď, když máme nainstalovaný Node.js v našem lokálním systému, chceme nainstalovat balíčky LoopBack, které poskytuje společnost StrongLoop. LoopBack je open source framework API, který poskytuje funkce, které vám usnadní život, až se začnete učit psát a nasazovat software napsaný v Node.js.

Pro instalaci LoopBack budeme používat příkaz npm, který je součástí základní distribuce Node.js. NPM je oficiální správce balíčků pro instalaci knihoven nebo modulů, na kterých závisí vaše aplikace. Vzhledem k tomu, že tento příspěvek je psán pro vývojáře PHP, je snadné si moduly NPM představit v souvislosti s programem Composer. Pomocí systému závislostí Composeru mohou vývojáři specifikovat závislosti ve svém souboru composer.json. Jakmile jsou balíčky definovány v souboru composer.json, vývojář PHP musí jednoduše vydat příkaz install, který by měl být podobný následujícímu:

$ php composer.phar install

Moduly NPM fungují stejným způsobem a používají soubor package.json, který umožňuje specifikovat závislosti pro konkrétní aplikaci. Závislosti můžete také nainstalovat z příkazového řádku a zpřístupnit je tak v místním systému. Nebojte se, pokud tomu ještě nerozumíte, protože souborem package.json se budeme podrobněji zabývat v některém z dalších kroků.

Pro instalaci LoopBacku můžeme vydat jediný příkaz, který stáhne a nainstaluje všechny závislosti, které pro balíček potřebujeme. Otevřete okno terminálu a vydejte následující příkaz:

$ npm install -g strongloop

Poznámka: V závislosti na instalaci možná budete muset použít sudo

Co se právě stalo? Řekli jsme npm, že chceme nainstalovat balíček strongloop, a zároveň jsme poskytli možnost -g. Volba -g zpřístupní balíček jako globální balíček, který může používat kdokoli v systému a je dostupný pro všechny aplikace. Po spuštění výše uvedeného příkazu NPM stáhne balíček i všechny potřebné závislosti. V závislosti na rychlosti vašeho systému to může trvat několik minut.

Krok 3: Vytvoření naší aplikace##

Vytvoření aplikace pomocí rozhraní API LoopBack je velmi snadné a jednoduché. Stačí otevřít okno terminálu a zadat následující příkaz pro vytvoření nové aplikace s názvem locatewalmart.

$ slc loopback _-----_ | | .--------------------------. |--(o)--| | Let's create a LoopBack | `---------´ | application! | ( _´U`_ ) '--------------------------' /___A___\ | ~ | __'.___.'__ ´ ` |° ´ Y ` Enter a directory name where to create the project: locatewalmart create locatewalmart/ info change the working directory to locatewalmart

Utilita slc nyní vytvoří nový projekt založený na LoopBack s názvem locatewalmart a nakonfiguruje projekt. Až budeme vyzváni k zadání názvu aplikace, můžeme ponechat výchozí.

What's the name of your application? locatewalmart

Po spuštění výše uvedeného příkazu bude pro vaši aplikaci vytvořen nový adresář projektu. Do adresáře aplikace přejděte příkazem cd:

$ cd locatewalmart

Když už máme aplikaci vytvořenou, chceme přidat podporu pro MongoDB jako datový zdroj pro zpětnou smyčku.

Krok 4: Definování našeho datového zdroje##

Pro komunikaci s MongoDB musíme do naší aplikace přidat datový zdroj. To provedeme spuštěním:

$ slc loopback:datasource mymongo Enter the data-source name: mymongo Select the connector for mymongo:PostgreSQL (supported by StrongLoop)Oracle (supported by StrongLoop)Microsoft SQL (supported by StrongLoop)❯ MongoDB (supported by StrongLoop)SOAP webservices (supported by StrongLoop)REST services (supported by StrongLoop)Neo4j (provided by community)(Move up and down to reveal more choices)

Krok 5: Ukázání na skutečný datový zdroj##

Pro komunikaci s MongoDB musíme datový zdroj ukázat na skutečnou instanci MongoDB. LoopBack definuje veškerou konfiguraci datasource v souboru datasource.json, který se nachází v adresáři aplikací root/server. Otevřete tento soubor a přidejte datový zdroj pro MongoDB podle následujícího kódu:

{ "db": { "name": "db", "connector": "memory" }, "mymongo": { "name": "mymongo", "connector": "mongodb" "url": "mongodb://localhost:27017/locatewalmart" }}

Poznámka: Nezapomeňte uvést správnou adresu URL připojení pro vaši databázi MongoDB. Pro tento příklad mám lokálně vytvořenou databázi s názvem locatewalmart, kterou chci použít pro svůj datový zdroj.

Teď, když máme definovanou naši databázi, je třeba udělat několik dalších věcí. Především musíme určit, že naše aplikace závisí na balíčku loopback-connector-mongodb. Chcete-li určit závislost, upravte soubor package.json, což je podobné úpravě souboru composer.json v PHP. Otevřete soubor package.json, který se nachází v kořenovém adresáři vaší aplikace, a do sekce závislostí přidejte loopback-connector-mongodb. Poté můžete spustit npm install.

Alternativně stačí spustit:

$ npm install loopback-connector-mongodb --save

Tím se automaticky aktualizuje package.json. Sekce by měla vypadat následovně:

"dependencies": { "compression": "^1.0.3", "errorhandler": "^1.1.1", "loopback": "^2.0.0", "loopback-boot": "^2.0.0", "loopback-connector-mongodb": "^1.4.1", "loopback-datasource-juggler": "^2.0.0", "serve-favicon": "^2.0.1" }

Krok 6: Import dat do MongoDB##

Teď, když máme nakonfigurovaný zdroj dat, musíme načíst sadu dat do naší databáze MongoDB.

První věc, kterou chceme udělat, je stáhnout soubor JSON, který obsahuje všechna data, která chceme vrátit. Ten si můžete stáhnout na následující adrese URL:

https://dl.dropboxusercontent.com/u/72466829/walmart.json

Jakmile máte soubor dat stažený, jednoduše jej importujte do databáze pomocí příkazu mongoimport, jak je uvedeno níže:

$ mongoimport --jsonArray -d locatewalmart -c store --type json --file walmart.json -h yourMongoHost --port yourMongoPort -u yourMongoUsername -p yourMongoPassword

Měli byste vidět následující výsledky:

connected to: 127.0.0.12014-08-17T13:07:26.301-0400 check 9 31762014-08-17T13:07:26.305-0400 imported 3176 objects

Krok 7: Vytvoření našeho modelu Store##

Model si můžete představit ve stejném smyslu, v jakém si představujete modely v zemi PHP, pokud používáte MVC framework. Je to reprezentace objektu, kterým je v tomto případě obchod Walmart. LoopBack poskytuje pohodlný způsob vytváření objektů modelu pomocí příkazového řádku. Otevřete okno terminálu, přejděte do složky projektu a zadejte následující příkaz:

$ slc loopback:model

Tím zahájíte interaktivní relaci, ve které můžete definovat svůj model. První, na co budete dotázáni, je datový zdroj, ke kterému chcete model přiřadit. Vybereme datový zdroj mymongo, který jsme před chvílí vytvořili. Dále bude požadován množný název modelu. Použijeme výchozí (stores) a stiskneme enter.

 Enter the model name: store Select the data-source to attach store to:db (memory)❯ mymongo (mongodb) Expose store via the REST API? Yes Custom plural form (used to build REST URL):

Po stisknutí klávesy enter budete vyzváni k zadání vlastností modelu store. Můžete si to představit jako var(y), které definujete na třídě v PHP.

Enter an empty property name when done. Property name:

Vlastnosti, které chceme přidat, jsou typ obchodu, datum otevření, zeměpisná šířka a délka.

 Property name: opendate invoke loopback:property

Po stisknutí klávesy enter budete vyzváni k zadání datového typu pro každou zadanou vlastnost. První položkou bude opendate a my chceme vybrat, že je typu date. Vyberte datum a stiskněte klávesu enter.

 Property type: string number boolean object array❯ date buffer geopoint (other)

Poté budete dotázáni, zda chcete tuto vlastnost uvést jako povinnou pro validaci schématu. Zadáme „ano“.

 Required? (y/N) : y

Poté budete dotázáni na datový typ pro jednotlivé zbývající vlastnosti. Zadejte následující odpovědi:

 Property name: type_store invoke loopback:property Property type: (Use arrow keys)❯ string number boolean object array date buffer geopoint (other) Required? (y/N) : yLet's add another store property.Enter an empty property name when done. Property name: latitude invoke loopback:property Property type: (Use arrow keys)❯ string number boolean object array date buffer geopoint (other) Required? (y/N) : yLet's add another store property.Enter an empty property name when done. Property name: longitude invoke loopback:property Property type: (Use arrow keys)❯ string number boolean object array date buffer geopoint (other) Required? (y/N) : y

Zadejte „yes“ a stiskněte klávesu enter.

Gratulujeme, právě jste vytvořili svůj první objekt modelu pomocí LoopBack ve spojení s Node.js. Chcete-li se podívat, co bylo vlastně vytvořeno pod pokličkou, otevřete soubor store.json, který se nachází v adresáři root/common/models adresáře vaší aplikace. Najděte položku stores, která bude vypadat následovně:

{ "name": "store", "base": "PersistedModel", "properties": { "opendate": { "type": "date", "required": true }, "type_store": { "type": "string", "required": true }, "latitude": { "type": "string", "required": true }, "longitude": { "type": "string", "required": true } }, "validations": , "relations": {}, "acls": , "methods": }

Jak vidíte, máme vytvořený model a vlastnosti, které jsme definovali, jsou přiřazeny modelu store. Pole public určuje, že chceme tento model vystavit světu prostřednictvím webové služby REST.

Mapování modelu na zdroj dat je definováno v poli model-config.json v kořenové složce aplikace/serveru. Pole datasource určuje datový zdroj, který bude tento model používat pro operace CRUD.

"store": { "dataSource": "mymongo", "public": true }

Krok 8: Otestujte rozhraní API založené na protokolu REST##

Hádejte co? Právě jste vytvořili svou první webovou službu založenou na protokolu REST pomocí Node.js. To nebylo tak špatné, že? Vyzkoušejme to tak, že nasměrujeme prohlížeč na aplikaci, kterou jsme právě vytvořili. Můžete to udělat tak, že přejdete na následující adresu URL:

http://0.0.0.0:3000/api/stores/

Zobrazí se vám reprezentace JSON všech obchodů Walmart, které jsme importovali do databáze, jak ukazuje následující obrázek:

Použití průzkumníka StrongLoop##

No, to je skvělé. Máme koncový bod REST, který vrátí všechny sklady Walmart v databázi, ale zdá se, že věci stále trochu chybí, protože nemáme rozhraní pro správu, které by s daty pracovalo nebo ověřovalo, zda všechny operace CRUD fungují. Naštěstí StrongLoop poskytuje pohodlný prohlížeč, který vám umožní prozkoumat všechny koncové body, které vaše aplikace má. Chcete-li to vyzkoušet, otevřete prohlížeč a přejděte na následující adresu URL:

http://0.0.0.0:3000/explorer/

Po načtení stránky Průzkumník rozbalte stores API a zobrazte všechny dostupné operace, které jsou povoleny nad objektem modelu. To je znázorněno na následujícím obrázku:

Jako příklad toho, co můžete s Průzkumníkem dělat, rozbalte /stores/findOne API a klikněte na odkaz Try it out!, který provede dotaz do databáze a vrátí jeden záznam, jak je znázorněno na následujícím obrázku:

Ještě o kousek dál přidáním reprezentace mapy##

Úžasné, vytvořili jsme koncový bod založený na protokolu REST, který vrátí seznam všech obchodů Walmart v naší databázi. Abychom dále ilustrovali rychlost, s jakou lze se systémem StrongLoop vyvíjet plnohodnotné aplikace, vytvoříme responzivní front end, který bude obsahovat mapu se špendlíky pro každou prodejnu Walmart.

Krok 1: Vytvoření veřejného adresáře##

Ve výchozím nastavení, jak je uvedeno v souboru app.js projektu, budou žadateli doručeny všechny soubory ve veřejném adresáři umístěném v kořenovém adresáři aplikace. Tento adresář však ve výchozím nastavení nemusí existovat, takže jej musíme vytvořit. Otevřete terminál, přejděte do kořenového adresáře aplikace a zadejte následující příkaz:

$ mkdir public

Krok 2: Vytvoření responzivní mapy##

Další věc, kterou musíme udělat, je vytvořit pěknou reprezentaci dat. Protože máme zeměpisnou šířku a délku každého obchodu, bylo by skvělé vyjádřit tento obsah pomocí mapy, kterou může uživatel přetahovat, přibližovat a oddalovat atd. Tento úkol je ve skutečnosti mnohem jednodušší, než byste možná čekali, pokud využijeme některé existující knihovny. Na konci vytvoření tohoto responzivního zobrazení bude výsledek vypadat takto:

Uživatel si navíc bude moci mapu přiblížit na velmi podrobnou úroveň a zobrazit nejbližší Walmart, jak ukazuje následující obrázek:

Kód pro webové zobrazení aplikace využívá vlastnosti zeměpisné délky a šířky, které jsme definovali na našem objektu modelu a importovali do databáze. Pro vytvoření mapy a umístění špendlíků neboli značek na mapu použijeme také populární knihovnu Leaflet.

Pro vytvoření této mapy vytvořte ve veřejném adresáři nový soubor s názvem locatewalmart.html a přidejte následující kód JavaScriptu:

<!doctype html><html lang="en"><head> <title>Walmart Stores</title> <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.5.1/leaflet.css" /><!--> <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.5.1/leaflet.ie.css" /><!--><script src="https://code.jquery.com/jquery-2.0.0.min.js"></script><link href='http://fonts.googleapis.com/css?family=oswald' rel='stylesheet' type='text/css'><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /><style type="text/css">body { padding: 0; margin: 0;}html, body, #map { height: 100%; font-family: 'oswald';}.leaflet-container .leaflet-control-zoom { margin-left: 13px; margin-top: 70px;}#map { z-index: 1;}#title { z-index: 2; position: absolute; left: 10px; }</style></head><body><h1>Walmart Stores</h1><div></div><script src="http://cdn.leafletjs.com/leaflet-0.5.1/leaflet.js"></script><script>center = new L.LatLng(39.83, -98.58);zoom = 5;var map = L.map('map').setView(center, zoom);var markerLayerGroup = L.layerGroup().addTo(map);L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {maxZoom: 18,attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>'}).addTo(map);function getPins(e){url = "http://0.0.0.0:3000/api/stores";$.get(url, pinTheMap, "json")}function pinTheMap(data){//clear the current pinsmap.removeLayer(markerLayerGroup);//add the new pinsvar markerArray = ;var lastNumber = 0;for (var i = 0; i < data.length; i++){store = data;if(store.latitude.length > 0 && store.longitude.length>0) {markerArray.push(L.marker());}}markerLayerGroup = L.layerGroup(markerArray).addTo(map);}map.whenReady(getPins)</script></body></html>

Jak vidíte, kód je pouze standardní HTML a JavaScript. Zajímavou částí je funkce getPins(e), kde provedeme volání REST na rozhraní API, které jsme vytvořili dříve v tomto příspěvku na blogu. Poté iterujeme nad každým obchodem a vytvoříme pin vzhledem k zeměpisné šířce a délce každého obchodu. Pěkně šikovné, co říkáte?“

Závěr##

V tomto příspěvku na blogu jsem vám ukázal, jak vytvořit webovou službu založenou na protokolu REST, která vrátí seznam prodejen Walmart ve Spojených státech. Poté, co jsme vytvořili webovou službu pomocí Loopbacku, jsme přidali frontendovou reprezentaci dat. S velmi malým množstvím práce jsme byli schopni vytvořit plně funkční aplikaci mnohem rychleji, než by se někomu mohlo podařit s jeho současným vybraným jazykem. Probrali jsme také některé podobnosti mezi Node.js a PHP. I když PHP stále považuji za skvělý jazyk, osobně jsem zjistil, že Node.js je vzhledem k bohatému ekosystému knihoven a rychlosti, s jakou jsem schopen vytvářet aplikace, skvělým dalším jazykem k učení.

Přiložil jsem stručnou tabulku, na kterou se můžete odvolat při porovnávání Node.js s PHP.

Funkce

PHP

Node.js

Skvělé IDE

Ano, více možností s IntelliJ, Zend Studio, Netbeans atd

Ano, více možností včetně Eclipse, Visual Studio, Codenvy atd.

Správa závislostí

Composer, PEAR

NPM

Enterprise Ready

Ano

Ano

Velký ekosystém knihoven

Ano, ale někdy je těžké je najít

Ano

Běžné frameworky

CodeIgniter, CakePHP, Laravel atd

Express, Meteor, atd

Podpora databází

Ano

Ano

Ne-blokující IO

Ne

Ano

Testování rámce

Ano

Ano

Skutečné-časové aplikace

Ano, s dalšími procesy, jako je Apache WebSocket atd.

Ano

Vestavěný webový server

Ne, většina lidí používá ve spojení s Apache

Ano

  • Připraveno pro vývoj API v Node.js a napojit je na svá data? Podívejte se na framework Node.js LoopBack. Umožnili jsme vám snadno začít buď lokálně, nebo na vašem oblíbeném cloudu pomocí jednoduché instalace npm.

.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.