Node.js: Verpacken und Bereitstellen von Node.js-Anwendungen [COMPLETE GUIDE]

In diesem Tutorial erkläre ich Ihnen, wie Sie mit dem Node Package Manager (NPM) Ihre eigene Node.js-Anwendung verpacken und bereitstellen. Ich gehe davon aus, dass Sie Node.js und NPM bereits in Ihrem lokalen System installiert haben, um dieses Beispiel auszuführen.

  • Einfache Schritte zur Installation von Node.js und NPM unter Windows

In meinem vorherigen Beitrag habe ich Ihnen gezeigt, wie Sie sich bei Twitter authentifizieren und auch die Twitter-API zum Abrufen von Tweets nutzen können. Ich habe mehrere Node-Pakete verwendet, um das zu erreichen, was ich beabsichtigt hatte. Aber was ist, wenn jemand den Quellcode nehmen und ihn auf seinem Computer ausführen möchte? Beispielsweise hat einer der Leser den Quellcode kopiert und möchte nun einfach die Anwendung ausführen, ohne zu wissen, welche Abhängigkeiten vom Code bestehen, und diese dann einzeln installieren. Ist das in Node.js überhaupt möglich? Gibt es so etwas wie Maven, bei dem wir nur die Abhängigkeiten und das erwähnen? mvn lädt die Abhängigkeiten automatisch herunter und kann auch die Anwendung starten.

nodejs-logo

Die Antwort auf die oben genannten Fragen lautet: Ja, die Lösung für die oben genannten Probleme ist Knotenpaketmanager (NPM). So wie Maven Bibliotheken hosten kann, die in Anwendungen wiederverwendet werden, kann auch NPM Bibliotheken hosten, die in Ihren Node.js-Anwendungen wiederverwendet werden. NPM wird im Paket mit Node.js geliefert, sodass Sie Node.js hier herunterladen und installieren können, um auch NPM zu erhalten.

Wählen wir nun die in diesem Beitrag entwickelte Beispiel-App aus und erstellen Sie ein bereitstellbares Paket, das jeder Benutzer herunterladen und in seiner Umgebung ausführen kann.

Die folgenden Node-Pakete werden in dieser Beispiel-App verwendet:

  • äußern
  • Express-Lenker
  • Anfrage
  • Abfragezeichenfolge
  • Erstellen einer leeren Node.js-Codebasis

    Ich erstelle ein neues Verzeichnis mit Namen: node_packaging und führen Sie in diesem Verzeichnis den folgenden Befehl aus:

    npm init
    

    Wenn Sie den obigen Befehl ausführen, werden Ihnen anschließend eine Reihe von Fragen gestellt (genau wie beim Initialisieren eines Projekts mit Maven). Die Reihe von Fragen wird gestellt, um eine neue zu erstellen und zu füllen package.json Datei (betrachten Sie sie als Ihre pom.xml in maven). Wenn Sie mehr über package.json und seine Attribute erfahren möchten, besuchen Sie Hier. Im Folgenden sehen Sie, wie es nach der Initialisierung mit NPM aussieht. Schauen Sie sich den Bildschirm unten an und geben Sie die im Screenshot gezeigten Antworten ein. Diese Werte werden vom NPM verwendet, um eine package.json-Datei zu erstellen.

    NPM-Init

    Danach können Sie eine Datei nach Namen sehen package.json erstellt mit folgendem Inhalt:

    {
      "name": "node-packaging-demo",
      "version": "1.0.0",
      "description": "Demo to show node packaging",
      "main": "social_signin.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "author": "",
      "license": "ISC"
    }
    

    Ich kann die package.json bearbeiten/aktualisieren und beispielsweise die Autorendetails wie unten gezeigt hinzufügen:

    {
      "name": "node-packaging-demo",
      "version": "1.0.0",
      "description": "Demo to show node packaging",
      "main": "social_signin.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "author": "Mohamed Sanaulla",
      "license": "ISC"
    }
    

    Abhängigkeiten mit NPM hinzufügen

    Alle Abhängigkeiten der Anwendung werden in package.json deklariert. Entweder bearbeitet man die Datei direkt oder man nutzt die npm Tool zum Aktualisieren der Abhängigkeiten in package.json. Der folgende Code fügt unserer App die erforderlichen Abhängigkeiten hinzu:

    npm install --save express express-handlebars request querystring
    

    Der obige Befehl fügt zusammen mit der Installation der genannten Pakete diese als Abhängigkeit hinzu pakcage.json. Schauen wir uns nun den Inhalt von package.json an:

    {
      "name": "node-packaging-demo",
      "version": "1.0.0",
      "description": "Demo to show node packaging",
      "main": "social_signin.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "author": "Mohamed Sanaulla",
      "license": "ISC",
      "dependencies": {
        "express": "^4.12.4",
        "express-handlebars": "^2.0.1",
        "querystring": "^0.2.0",
        "request": "^2.57.0"
      }
    }
    

    Oben sind die hervorgehobenen Zeilen die Abhängigkeiten unserer Anwendung und die Zahl daneben ist die Version des Pakets, das wir verwenden. Wenn bei der Ausführung keine Version erwähnt wird npm install --save dann wird das neueste NPM-Repository verwendet.

    Und wenn Sie die Dateien in Ihrem Projektordner auflisten, sehen Sie einen Ordner mit dem Namen „node_modules“. Hier werden alle Ihre Module heruntergeladen.

    Knotenmodule

    Knotenmodule1

    Erstellen der Node.js-Anwendung

    Nachfolgend finden Sie die Verzeichnisstruktur der Anwendung:

    |--social_signin.js
    |--views
      |--home.handlebars
      |--my.handlebars
      |--layouts
        |--main.handlebars
    

    Diese Verzeichnisstruktur ist relativ zu dem Verzeichnis, das wir zuerst erstellt haben, dh node_packaging.

    Nachfolgend finden Sie den Quellcode unserer Anwendung

    Datei: social_signin.js

    //FileName: social_signin.js
    var express = require('express');
    
    //NPM Module to integrate Handlerbars UI template engine with Express
    var exphbs  = require('express-handlebars');
    
    //NPM Module to make HTTP Requests
    var request = require("request");
    
    //NPM Module To parse the Query String and to build a Query String
    var qs = require("querystring");
    
    var app = express();
    
    //Declaring Express to use Handlerbars template engine with main.handlebars as
    //the default layout
    app.engine('handlebars', exphbs({defaultLayout: 'main'}));
    app.set('view engine', 'handlebars');
    
    //URL To obtain Request Token from Twitter
    var requestTokenUrl = "https://api.twitter.com/oauth/request_token";
    
    //To be obtained from the app created on Twitter
    var CONSUMER_KEY = "GET_IT_FROM_TWITTER";
    var CONSUMER_SECRET = "GET_IT_FROM_TWITTER";
    
    //Oauth Object to be used to obtain Request token from Twitter
    var oauth = {
      callback : "http://localhost:3000/signin-with-twitter",
      consumer_key  : CONSUMER_KEY,
      consumer_secret : CONSUMER_SECRET
    }
    var oauthToken = "";
    var oauthTokenSecret = "";
    app.get('/', function (req, res) {
      //Step-1 Obtaining a request token
      request.post({url : requestTokenUrl, oauth : oauth}, function (e, r, body){
    
        //Parsing the Query String containing the oauth_token and oauth_secret.
        var reqData = qs.parse(body);
        oauthToken = reqData.oauth_token;
        oauthTokenSecret = reqData.oauth_token_secret;
    
        //Step-2 Redirecting the user by creating a link
        //and allowing the user to click the link
        var uri = 'https://api.twitter.com/oauth/authenticate'
        + '?' + qs.stringify({oauth_token: oauthToken})
        res.render('home', {url : uri});
      });
    
    });
    
    //Callback to handle post authentication.
    app.get("/signin-with-twitter", function(req, res){
      var authReqData = req.query;
      oauth.token = authReqData.oauth_token;
      oauth.token_secret = oauthTokenSecret;
      oauth.verifier = authReqData.oauth_verifier;
    
      var accessTokenUrl = "https://api.twitter.com/oauth/access_token";
      //Step-3 Converting the request token to an access token
      request.post({url : accessTokenUrl , oauth : oauth}, function(e, r, body){
        var authenticatedData = qs.parse(body);
        console.log(authenticatedData);
    
        //Make a request to get User's 10 latest tweets
        var apiUrl = "https://api.twitter.com/1.1/statuses/user_timeline.json" + "?"
          + qs.stringify({screen_name: authenticatedData.screen_name, count: 10});
    
        var authenticationData = {
          consumer_key : CONSUMER_KEY,
          consumer_secret : CONSUMER_SECRET,
          token: authenticatedData.oauth_token,
          token_secret : authenticatedData.oauth_token_secret
        };
    
        request.get({url : apiUrl, oauth: authenticationData, json:true}, function(e, r, body){
    
          var tweets = [];
          for(i in body){
            var tweetObj = body[i];
            tweets.push({text: tweetObj.text});
          }
    
          var viewData = {
            username: authenticatedData.screen_name,
            tweets: tweets
          };
    
          res.render("my", viewData);
    
        });
    
      });
    });
    
    app.listen(3000, function(){
      console.log('Server up: http://localhost:3000');
    });
    

    Dateiname: main.handlebars

    <!-- FileName: main.handlebars-->
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>Example App</title>
    </head>
    <body>
        {{{body}}}
    </body>
    </html>
    

    Dateiname: home.lenker

    <!-- FileName: home.handlebars-->
    <h1>SignIn With Twitter Sample</h1>
    
    <a href="{{url}}">Signin with Twitter</a>
    

    Dateiname: my.handlebars

    <!-- FileName: my.handlebars-->
    <h1>Welcome {{username}} </h1>
    <h3>Your tweets</h3>
    <ul>
      {{#tweets}}
      <li>{{text}}</li>
      {{/tweets}}
    </ul>
    

    Ausführen der Node.js-Beispielanwendung

    G:\node\node_packaging>node social_signin.js
    Server up: http://localhost:3000
    

    Wenn Sie zu http://localhost:300 navigieren, gelangen Sie zu einer Seite mit dem Link „Mit Twitter signieren“. Wenn wir darauf klicken, werden uns die letzten 10 Tweets angezeigt.

    Nodejs-Server aktiv

    Twitter-Anmeldeknoten

    Pushen des Codes an Github

    Jetzt werde ich den Code auf Github übertragen und Ihnen dann zeigen, wie das Packen mit NPM funktioniert package.json Hilft beim Teilen der Anwendung mit anderen Entwicklern. Bevor Sie die folgende Aufgabe ausführen, installieren Sie Git auf Ihrem Computer.

    Führen Sie die folgenden Schritte aus, um den Code an Github zu übertragen:

  • Erstellen Sie ein neues Repository auf github.com
  • Laufen git init in Ihrem Projektordner, um lokal ein neues Git-Repository zu initialisieren.
  • Laufen git status In Ihrem Projektordner sehen Sie die folgende Ausgabe:
    $ git status
    On branch master
    
    Initial commit
    
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
    
            node_modules/
            package.json
            social_signin.js
            views/
    
    nothing added to commit but untracked files present (use "git add" to track)
    

    Wir müssen den Ordner „node_modules“ entfernen, damit er nicht an Github übergeben wird. Also erschaffen wir etwas Neues .gitignore Datei im Projektstammordner, also in node_packaging Ordner. Der Inhalt der .gitignore-Datei ist:

    $ cat .gitignore
    node_modules
    

    Laufen git status Auch dieses Mal werden Sie feststellen, dass der Ordner „node_modules“ nicht in den Dateien aufgeführt ist, die festgeschrieben werden sollen:

    $ git status
    On branch master
    
    Initial commit
    
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
    
            .gitignore
            package.json
            social_signin.js
            views/
    
    nothing added to commit but untracked files present (use "git add" to track)
    
  • Fügen Sie das Github-Repository, das Sie in Schritt 1 erstellt haben, als Remote-Repository zum lokalen Repository hinzu, das Sie in Schritt 2 erstellt haben. Dies kann mit dem folgenden Befehl erfolgen: git remote add origin GITHUB_REPO_URL. Sie können die GITHUB_REPO_URL von der GitHub-Repository-Seite abrufen, die Sie in Schritt 1 erstellt haben
  • Übertragen Sie nun Ihre Änderungen und übertragen Sie sie in das Github-Repository. Dies kann wie folgt erfolgen:
    $ git add -A
    $ git commit
    $ git push origin master
    
  • Jetzt sollte der Code in Ihrem Github-Repository verfügbar sein. Meins ist unter: https://github.com/sanaulla123/nodejs-package-demo

    Vorteil der Node.js-Verpackung

    Deshalb haben wir alles so eingerichtet, dass jeder Entwickler einfach das Github-Repository klonen und mit der lokalen Ausführung der Anwendung beginnen kann. Versuchen wir auch, das Repository an einem anderen Ort zu klonen und zu sehen, ob diese Verpackung wirklich funktioniert!!

    Mohamed@SANA-LAPTOP /g/node/node_packaging (master)
    $ cd ..
    
    Mohamed@SANA-LAPTOP /g/node
    $ mkdir node_packaging_clone
    
    Mohamed@SANA-LAPTOP /g/node
    $ cd node_packaging_clone/
    
    #Cloning the Github repository
    Mohamed@SANA-LAPTOP /g/node
    $ git clone https://github.com/sanaulla123/nodejs-package-demo.git
    
    Mohamed@SANA-LAPTOP /g/node/node_packaging_clone
    $ ls
    nodejs-package-demo
    
    Mohamed@SANA-LAPTOP /g/node/node_packaging_clone
    $ cd nodejs-package-demo/
    
    #There is no node_modules folder!!
    Mohamed@SANA-LAPTOP /g/node/node_packaging_clone/nodejs-package-demo (master)
    $ ls
    package.json  social_signin.js  views
    
    #This command picks up the dependencies from package.json and installs them to the local project folder.
    Mohamed@SANA-LAPTOP /g/node/node_packaging_clone/nodejs-package-demo (master)
    $ npm install
    
    #The node_modules folder got created after the above command.
    Mohamed@SANA-LAPTOP /g/node/node_packaging_clone/nodejs-package-demo (master)
    $ ls
    node_modules  package.json  social_signin.js  views
    

    Jetzt sollten Sie die Anwendung wie zuvor ausführen können. Dies war eine kleine Einführung in das Packen Ihrer node.js-Anwendungen. Ich hoffe, Sie fanden es leicht verständlich und nützlich. Wenn Sie Fragen zur Node.js-Anwendungsverpackung haben, schreiben Sie diese bitte in den Kommentarbereich. Viel Spaß beim Lesen weiterer Tutorials zu Node.js in unserem Blog.

    Kommentar verfassen

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

    Nach oben scrollen