Node.js wächst schnell; Einer der Hauptgründe dafür ist den Entwicklern zu verdanken, die erstaunliche Tools entwickeln, die die Produktivität mit Node erheblich verbessern. In diesem Artikel werden wir die grundlegende Installation von Express, ein Entwicklungsframework, durcharbeiten und ein Basisprojekt damit erstellen.
Node ist im Design ähnlich und wird von Systemen wie Rubys Event Machine oder Python's Twisted beeinflusst. Node führt das Ereignismodell ein wenig weiter aus - es präsentiert die Ereignisschleife als Sprachkonstrukt statt als Bibliothek.
In diesem Lernprogramm kratzen wir die YouTube-Startseite ab, erhalten alle Miniaturansichten in normaler Größe sowie Link- und Videodauerzeit, senden diese Elemente an eine jQueryMobile-Vorlage und geben die Videos mit YouTube Embed ein nette Arbeit beim Erkennen der Unterstützung von Gerätemedien (Flash / HTML5-Video).
Wir werden auch lernen, wie man mit der Anwendung beginnt npm und ausdrücken, npm's Modulinstallationsprozess, einfaches Express-Routing und die Verwendung von zwei Modulen von Node: anfordern
und Jsdom
.
Diejenigen von Ihnen, die mit Node.js noch nicht vertraut sind und wie Sie sie installieren, finden Sie auf der Homepage von node.js
und die npm GitHub-Projektseite.
Sie sollten sich auch auf unsere Serie "Node.js: Step by Step" beziehen.
Hinweis: Dieses Tutorial setzt voraus, dass Sie wissen, was Node.js ist und dass Sie bereits node.js und npm installiert haben.
Was genau ist Express? Nach Angaben der Entwickler ist es ein…
Wahnsinnig schnelles (und kleines) serverseitiges JavaScript-Webentwicklungs-Framework, das auf Node und Connect basiert.
Klingt cool, richtig? Verwenden wir npm, um express zu installieren. Öffnen Sie ein Terminalfenster und geben Sie den folgenden Befehl ein:
npm install express -g
Durchgehen -G
Als Parameter für den Installationsbefehl weisen wir npm an, das Modul global zu installieren.
Ich benutze / home / knotenserver / nettuts
In diesem Beispiel können Sie jedoch alles verwenden, was Sie möchten.
Nachdem wir unser Express-Projekt erstellt haben, müssen wir npm strukturieren, um die Abhängigkeiten von Express zu installieren.
cd nodetube npm install -d
Wenn es mit "ok" endet, können Sie loslegen. Sie können jetzt Ihr Projekt ausführen:
Knoten app.js
Wechseln Sie in Ihrem Browser zu http: // localhost: 3000
.
Eine JavaScript-Implementierung des W3C-DOM.
Gehen Sie zurück zu Ihrem Terminal und installieren Sie, nachdem Sie Ihren aktuellen Server (Strg + C) gestoppt haben Jsdom
:
npm install jsdom
Vereinfachte HTTP-Anforderungsmethode.
Geben Sie Folgendes in das Terminal ein:
npm Installationsanforderung
Jetzt sollte alles eingerichtet sein. Nun ist es an der Zeit, sich mit dem eigentlichen Code auseinanderzusetzen!
Lassen Sie uns zunächst alle unsere Abhängigkeiten einschließen. Öffne dein app.js
Datei und fügen Sie in den allerersten Zeilen folgenden Code an:
/ ** * Modulabhängigkeiten. * / var express = required ('express'), jsdom = required ('jsdom'), request = required ('request'), URL = required ('url'), app = module.exports = express.createServer () ;
Sie werden feststellen, dass Express Code für uns erstellt hat. Was Sie in sehen app.js
ist die grundlegendste Struktur für einen Knotenserver, der Express verwendet. In unserem vorherigen Codeblock haben wir Express aufgefordert, unsere kürzlich installierten Module aufzunehmen: Jsdom
und anfordern
. Außerdem enthalten wir das URL-Modul, mit dessen Hilfe wir die Video-URL analysieren können, die wir später von YouTube scrape.
Innerhalb app.js
, Suchen Sie nach dem Abschnitt "Routen" (um Zeile 40) und fügen Sie den folgenden Code hinzu (lesen Sie die Kommentare durch, um zu verstehen, was los ist):
app.get ('/ nodetube', function (req, res) // Teilen Sie der Anfrage mit, dass Sie youtube.com abrufen möchten, und senden Sie die Ergebnisse an eine Callback-Funktionsanforderung (uri: 'http://youtube.com.) ', function (err, response, body) var self = this; self.items = new Array (); // Ich habe das Gefühl, meine Ergebnisse in einem Array speichern zu wollen. // Nur eine grundlegende Fehlerprüfung if (err && response.statusCode! == 200) console.log ('Request error.'); // Sende den body-Parameter als HTML-Code, den wir in jsdom analysieren werden. // Außerdem wird jsdom angewiesen, in den Scripts jQuery anzuhängen und geladen von jQuery.com jsdom.env (html: body, scripts: ['http://code.jquery.com/jquery-1.6.min.js'], function (err, window) // Nur jQuery verwenden wie in einer regulären HTML-Seite var $ = window.jQuery; console.log ($ ('title'). text ()); res.end ($ ('title'). text ()););) ;);
In diesem Fall holen wir den Inhalt von der YouTube-Startseite ab. Sobald der Vorgang abgeschlossen ist, drucken wir den im Titel-Tag der Seite enthaltenen Text (
Knoten app.js
In Ihrem Browser gehen Sie zu: http: // localhost: 3000 / nodetube
Sie sollten "YouTube - Broadcast Yourself" sehen, der Titel von YouTube.
Nun, da wir alles eingerichtet und ausgeführt haben, ist es an der Zeit, einige Video-URLs zu erhalten. Gehen Sie zur YouTube-Startseite und klicken Sie mit der rechten Maustaste auf ein beliebiges Miniaturbild im Bereich "empfohlene Videos". Wenn Sie Firebug installiert haben (was sehr zu empfehlen ist), sollten Sie etwa Folgendes sehen:
Es gibt ein Muster, das wir identifizieren können und das in fast allen anderen normalen Videolinks vorhanden ist:
div.vide-entry span.clip
Konzentrieren wir uns auf diese Elemente. Gehen Sie zurück zu Ihrem Editor und in app.js
, Fügen Sie dem folgenden Code hinzu / nodetube
Route:
app.get ('/ nodetube', function (req, res) // Teilen Sie der Anfrage mit, dass Sie youtube.com abrufen möchten, und senden Sie die Ergebnisse an eine Callback-Funktionsanforderung (uri: 'http://youtube.com.) ', function (err, response, body) var self = this; self.items = new Array (); // Ich habe das Gefühl, meine Ergebnisse in einem Array speichern zu wollen. // Nur eine grundlegende Fehlerprüfung if (err && response.statusCode! == 200) console.log ('Request error.'); // Senden Sie den body-Parameter als HTML-Code, den wir in jsdom analysieren werden. // weisen Sie jsdom außerdem an, jQuery in das Skript jsdom anzuhängen. env (html: body, scripts: ['http://code.jquery.com/jquery-1.6.min.js'], function (err, window) // Verwenden Sie jQuery wie in jeder normalen HTML-Seite var $ = window.jQuery, $ body = $ ('body'), $ videos = $ body.find ('. video-entry'); // Ich weiß, dass .video-entry-Elemente die Thumbnails in regulärer Größe enthalten, // für Jedes der .video-entry-Elemente fand $ videos.each (Funktion (i, item) // Ich werde reguläre jQuery-Selektoren verwenden. var $ a = $ (item) .children ('a'), // erster Anker Element welches sind Kinder unseres .video-Eintrags $ title = $ (item) .find ('. video-title .video-long-title'). text (), // Videotitel $ time = $ a.find (' .video-time '). text (), // videodauer time $ img = $ a.find (' span.clip img '); // thumbnail // und füge all diese Daten meinem items -Array hinzu self.items [i] = href: $ a.attr ('href'), title: $ title.trim (), time: $ time, // Bei youtube-Video-Miniaturansichten gibt es einige Dinge. Die Bilder, deren data-thumb-Attribut // definiert ist, verwenden die URL in dem zuvor genannten Attribut als "src" für das Vorschaubild. otheriwse // verwendet das standardmäßig bereitgestellte src-Attribut. Vorschaubild: $ img.attr ('data-thumb')? $ img.attr ('data-thumb'): $ img.attr ('src'), urlObj: url.parse ($ a.attr ('href'), true) // analysieren unsere URL und die Abfragezeichenfolge als Gut ; ); // Mal sehen, was wir haben console.log (self.items); res.end ('Done'); ); ); );
Es ist Zeit, unseren Server erneut zu starten und die Seite in unserem Browser neu zu laden (http: // localhost: 3000 / nodetube). In Ihrem Terminal sollten Sie etwa Folgendes sehen:
Das sieht gut aus, aber wir brauchen eine Möglichkeit, unsere Ergebnisse im Browser anzuzeigen. Dafür verwende ich die Jade-Template-Engine:
Jade ist eine Hochleistungsvorlagen-Engine, die stark von Haml beeinflusst wurde, aber mit JavaScript für Node implementiert wurde.
Öffnen Sie in Ihrem Editor Ansichten / Layout.jade
, Dies ist die grundlegende Layoutstruktur, die beim Rendern einer Seite mit Express verwendet wird. Es ist schön, aber wir müssen es ein bisschen ändern.
!!! 5 html (lang = 'en') head meta (charset = 'utf-8') meta (name = 'viewport', content = "initial-scale = 1, maximum-scale = 1") title = title link (rel = 'stylesheet', href = "http://code.jquery.com/mobile/1.0b3/jquery.mobile-1.0b3.min.css") Skript (src = 'http: //code.jquery.com/ jquery-1.6.2.min.js ') Skript (src =' http: //code.jquery.com/mobile/1.0b3/jquery.mobile-1.0b3.min.js ') body! = body
Wenn Sie den obigen Code mit dem Standardcode in vergleichen layout.jade
, Sie werden feststellen, dass sich ein paar Dinge geändert haben - doctype, das Viewport-Meta-Tag, der Stil und die Skript-Tags, die von jquery.com bereitgestellt werden. Erstellen wir unsere Listenansicht:
Bevor Sie beginnen, lesen Sie bitte die Dokumentation zu jQuery Mobile (ab jetzt JQM) zu Seitenlayouts und Anatomie.
Die Grundidee besteht darin, für jedes Element innerhalb der Listenansicht eine JQM-Listenansicht, eine Miniaturansicht, einen Titel und eine Videodauer-Bezeichnung sowie einen Link zu einer Videoseite für jedes der aufgelisteten Elemente zu verwenden.
Hinweis: Seien Sie vorsichtig mit der Einrückung, die Sie in Ihren Jade-Dokumenten verwenden, da nur Leerzeichen oder Tabulatoren zulässig sind, nicht jedoch beide in demselben Dokument.
div (data-role = 'page') header (data-role = 'header') h1 = title div (data-role = 'content') // Nur eine Grundüberprüfung, wir werden zwar immer Elemente von youtube haben - if ( items.length) // Erzeuge einen Listview-Wrapper ul (data-role = 'listview') // foreach der gesammelten Elemente - items.forEach (function (item) // Erzeuge ein // und einen Link mit unserem übergeben urlObj Objekt a (href = '/ watch /' + item ['urlObj'].) query.v, title = item ['title']) // und ein Miniaturbild img (src = item ['thumbnail'], alt = "Thumbnail") // Titel und Zeitmarke h3 = item ['title'] h5 = item ['time'] -)
Das ist alles, was wir brauchen, um unsere Liste zu erstellen. Zurückkommen zu app.js
und ersetzen Sie den folgenden Code:
// Mal sehen, was wir haben console.log (self.items); res.end ('Done');
mit diesem:
// Wir haben alles, wofür wir gekommen sind, jetzt lasst uns unsere Ansicht rendern. Res.render ('list', title: 'NodeTube', items: self.items);
Starten Sie Ihren Server noch einmal neu und laden Sie Ihren Browser neu:
Hinweis: Da wir jQuery Mobile verwenden, empfehle ich die Verwendung eines Webkit-basierten Browsers oder eines iPhone / Android-Handys (Simulator), um bessere Ergebnisse zu erzielen.
Lassen Sie uns eine Ansicht für unsere erstellen /sehen
Route. Erstellen Ansichten / Video.Jade
und fügen Sie den folgenden Code hinzu:
div (data-role = 'page') Header (data-role = 'header') h1 = title div (data-role = 'content') // Unser Video div # video // Iframe von youtube, das dem Recht dient Medienobjekt für das verwendete Gerät iframe (width = "100%", height = 215, src = "http://www.youtube.com/embed/" + vid, frameborder = "0", allowfullscreen)
Gehen Sie wieder zu Ihrem Terminal, starten Sie den Server neu, laden Sie die Seite neu und klicken Sie auf eines der aufgelisteten Elemente. Diesmal wird eine Videoseite angezeigt und Sie können das eingebettete Video abspielen!
Es gibt Möglichkeiten, wie wir unseren Server im Hintergrund laufen lassen können, aber es gibt eine, die ich vorziehen möchte, genannt Forever, ein Knotenmodul, das wir einfach installieren können npm
:
npm für immer installieren -g
Dadurch wird Forever global installiert. Starten wir unsere nodeTube-Anwendung:
Für immer App.js starten
Sie können Ihren Server auch neu starten, benutzerdefinierte Protokolldateien verwenden und Umgebungsvariablen unter anderem weitergeben:
// Führen Sie Ihre Anwendung im Produktionsmodus aus. NODE_ENV = production startet app.js für immer
Ich hoffe, ich habe gezeigt, wie einfach es ist, Node.js, Express und npm zu verwenden. Außerdem haben Sie gelernt, wie Sie Knotenmodule installieren, Routen zu Express hinzufügen, Remote-Seiten mithilfe des Anforderungsmoduls abrufen und viele andere hilfreiche Techniken.
Wenn Sie Anmerkungen oder Fragen haben, teilen Sie mir dies bitte im Abschnitt "Kommentare" mit!