Ein Leitfaden für Anfänger zu Node.js. Teil 3





Guten Tag, Freunde!



Ich poste weiterhin eine Übersetzung dieses Node.js-Tutorials .



Andere Teile:



Teil 1

Teil 2

Teil 3

Teil 4



Vom Benutzer eingegebene Daten in Node.js



Wie mache ich ein Node.js-Programm interaktiv?



Zu diesem Zweck wird in Version 7 von Node.js das Readline- Modul eingeführt : Es wird verwendet, um Daten aus einem Stream zum Lesen abzurufen, z. B. process.stdin- die Befehlszeile während der Ausführung eines Node.js-Programms.



const readline = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout
})

readline.question(`What is your name?`, name => {
    console.log(`Hi ${name}!`)
    readline.close()
})


Dieser Code fragt nach dem Benutzernamen. Nachdem der Benutzer eingegeben und geklickt hat enter, wird eine Begrüßung angezeigt.



Die Methode question()druckt den ersten Parameter (Frage) an die Konsole und wartet auf die Antwort des Benutzers. Beim Drücken enterwird die Rückruffunktion ausgeführt.



In diesem Rückruf schließen wir die Schnittstelle readline.



readlineenthält andere Methoden, über die Sie in der Dokumentation lesen können.



Wenn Sie nach einem Kennwort fragen müssen, geben Sie es am besten nicht explizit zurück, sondern verwenden Sie Symbole *.



Eine Möglichkeit hierfür ist die Verwendung des Readline-Sync- Pakets , das einfach zu verstehen und zu konfigurieren ist.



Eine vollständigere und abstraktere Lösung bietet das Inquirer.js- Paket .



Wir installieren es mit Hilfe npm install inquirerund verwenden es wie folgt:



const inquirer = require('inquirer')

const questions = [
    {
        type: 'input',
        name: 'name',
        message: `What's your name?`
    }
]

inquirer.prompt(questions).then(answers => {
    console.log(`Hi ${answers['name']}!`)
})


Mit Inquirer.js können Sie viele coole Dinge tun, z. B. mehrere Auswahlmöglichkeiten vorschlagen, Optionsfelder bereitstellen, um Bestätigung bitten usw.



Es ist besser als Alternative zu integrierten Lösungen bekannt. Wenn Sie jedoch die Benutzererfahrung auf die nächste Stufe heben möchten, ist Inquirer.js die beste Lösung.



Erweitern der Node.js-Dateifunktionalität mithilfe des Exports



Node.js verfügt über ein integriertes modulares System.



Die Datei Node.js kann Funktionen aus anderen Node.js-Dateien importieren.



Wenn Sie etwas importieren möchten, das Sie const library = require('./library')

zum Importieren von Funktionen verwenden, die in eine Datei exportiert wurden, die library.jssich im aktuellen Verzeichnis befindet.



In dieser Datei muss die Funktionalität exportiert werden, bevor sie in eine andere Datei importiert werden kann.



Jedes andere in einer Datei definierte Objekt oder jede andere Variable ist standardmäßig privat (privat) und kann nicht in anderen Dateien verwendet werden.



Dies ermöglicht uns module.exportsdie vom modularen System bereitgestellte Schnittstelle .



Wenn Sie ein Objekt zuweisen oder als neue Eigenschaft des Objekts fungierenexportsWenn Sie sie exportieren, können sie an anderer Stelle in der Anwendung oder in einer anderen Anwendung importiert werden.



Dies kann auf zwei Arten erfolgen.



Die erste Möglichkeit besteht darin, einen Wert zuzuweisen module.exports, der das vom modularen System bereitgestellte Standardobjekt ist. Mit dieser Methode können Sie nur dieses Objekt exportieren:



const car = {
    brand: 'Ford',
    model: 'Fiesta'
}

module.exports = car 

//   
const car = require('./car')


Die zweite Möglichkeit besteht darin, das exportierte Objekt als Eigenschaft des Objekts hinzuzufügen exports. Mit dieser Methode können Sie viele Objekte, Funktionen oder Daten exportieren:



const car = {
    brand: 'Ford',
    model: 'Fiesta'
}

exports.car = car


oder so



exports.car = {
    brand: 'Ford',
    model: 'Fiesta'
}


Um dieses Objekt in einer anderen Datei zu verwenden, müssen Sie einen Link zum Import erstellen:



const items = require('./items')
items.car 


oder



const car = require('./items').car 


Was ist der Unterschied zwischen module.exportsund exports?



Der erste exportiert das referenzierte Objekt, der zweite eine Eigenschaft des Objekts.



Eine Einführung in den npm-Paketmanager



Einführung in npm


npmIst der Standard-Node.js-Paketmanager.



Bis Januar 2017 verfügte npm über 350.000 Pakete und war damit das größte Code-Repository in einer einzigen Programmiersprache der Welt. Sie können sicher sein, dass es Pakete gibt, die so gut wie alles tun können.



Alles begann mit dem Herunterladen und Verwalten von Abhängigkeiten in Node.js, aber bald wurde dieses Tool aktiv bei der Entwicklung der Client-Seite von Anwendungen eingesetzt.



npmmacht mehrere Dinge.



Eine Alternative zu npm ist Garn .



Wird geladen


npmverwaltet das Laden von Projektabhängigkeiten.



Wenn im Projekt eine Datei vorhanden ist, wird beim package.jsonStarten npm installalles, was für das Projekt erforderlich ist, in dem Verzeichnis installiert, das node_moduleserstellt wird, wenn es nicht vorhanden ist.



Ein bestimmtes Paket kann mit installiert werden npm install <package-name>.



Oft wird die Installation eines Pakets von Flags begleitet:



  • --save - Installieren Sie das Paket und fügen Sie einen Eintrag darüber zum Abschnitt "Abhängigkeiten" der Datei hinzu package.json
  • --save-dev - Installieren Sie das Paket und fügen Sie einen Eintrag darüber zum Abschnitt devDependencies der Datei hinzu package.json


Der Hauptunterschied besteht darin, dass devDependencies für Entwicklungszwecke verwendet wird, beispielsweise zum Testen, und Abhängigkeiten in der Produktion verwendet werden (beim Erstellen eines Projekts).



Pakete aktualisieren


Das Aktualisieren ist mit einfach npm update.



npmprüft alle Pakete auf neue Versionen, die die festgelegten Einschränkungen erfüllen.



Sie können auch ein bestimmtes Paket aktualisieren : npm update <package-name>.



Versionierung


Zusätzlich zu Standard-Downloads unterstützt npm die Versionierung, sodass Sie eine bestimmte Version eines Pakets angeben oder eine neuere oder ältere Version anfordern können.



Sie werden häufig feststellen, dass eine Bibliothek nur mit einer bestimmten (Haupt-) Version einer anderen Bibliothek kompatibel ist.



Und auch mit den Fehlern der neuesten Versionen, die seit langem nicht mehr behoben wurden.



Die Versionierung unterstützt auch die Teamentwicklung, da jedes Teammitglied weiß, welche Version verwendet werden muss, bevor die Datei aktualisiert wird package.json.



In all diesen Fällen hilft die Versionierung, in dieser Hinsicht npmfolgt sie anerkannten Standards.



Aufgaben ausführen


package.jsonunterstützt ein Format zur Angabe von Befehlen, die im Terminal mit ausgeführt werden sollen npm run <task-name>.



Beispielsweise:



{
    "scripts": {
        "start-dev": "node lib/server-development",
        "start": "node lib/server-production"
    },
}


Es ist üblich, diese Funktion zum Ausführen von Webpack zu verwenden:

{
    "scripts": {
        "watch": "webpack --watch --progress --colors --config webpack.conf.js",
        "dev": "webpack --progress --colors --config webpack.conf.js",
        "prod": "NODE_ENV=production webpack -p --config webpack.conf.js"
    },
}


Dies ermöglicht anstelle einer Reihe langer Befehle, die leicht zu vergessen sind oder die leicht Fehler zu machen sind, Folgendes:



npm run watch 
npm run dev 
npm run prod 




Wo installiert npm Pakete?



Bei der Installation von Paketen mit npmkönnen Sie zwischen zwei Installationsarten wählen:



  • lokal
  • global


Standardmäßig, wenn Sie npm installbeispielsweise Folgendes eingeben :



npm install lodash 


Das Paket wird in einem Ordner node_modulesim aktuellen Verzeichnis installiert .



Nach der Installation wird dem Dateibereich im aktuellen Verzeichnis npmein o-Datensatz hinzugefügt. Verwenden Sie für eine globale Installation das Flag :lodashdependenciespackage.json



-g



npm install -g lodash 


Bei einer globalen Installation wird das Paket nicht im aktuellen, sondern im globalen Verzeichnis installiert.



Aber wo genau?



Um dies festzustellen, müssen Sie den Befehl ausführen npm root -g.



Unter MacOS oder Linux kann dieses Verzeichnis sein /usr/local/lib/node_modules. Unter Windows - C:\Users\YOU\AppData\Roaming\npm\node_modules. Dieses Verzeichnis kann



bei Verwendung nvmfür die Versionierung von Node.j unterschiedlich sein.



Wie verwende ich installierte Pakete?



Verwendung eines in einem Ordner node_modulesoder global installierten Pakets.



Angenommen, Sie haben eine lodashbeliebte JavaScript-Hilfsbibliothek mit installiert npm install lodash.



Dieser Befehl wird lodashin einem lokalen Verzeichnis installiert node_modules.



Um das Programm zu verwenden, müssen Sie das Paket importieren mit require:



const _ = require('lodash')


Was ist, wenn das Paket ausführbar ist (Datei)?



In diesem Fall wird die ausführbare Datei im Verzeichnis abgelegt node_modules/.bin/.



Dies kann leicht mit der Cowsay- Bibliothek demonstriert werden .



Dieses Paket enthält ein Befehlszeilenprogramm, bei dessen Ausführung die Kuh (und andere Tiere) etwas "spricht".



Bei der Installation eines Pakets über npm install cowsaywerden das Paket selbst und einige seiner Abhängigkeiten installiert:







Der Ordner .binist ausgeblendet und enthält symbolische Links zu den Binärdaten-Caysay:







Wie werden sie ausgeführt?



Sie können natürlich tippen ./node_modules/.bin/cowsayund es sollte funktionieren, aber npx in npm (seit 5.2) ist die beste Option. Du tust es einfachnpx cowsayund npx findet die Datei automatisch: Die





Kuh sagt "bring mich hier raus".



Package.json Handbuch



Wenn Sie mit JavaScript arbeiten, mit einem JavaScript-Projekt, Node.js oder dem Front-End einer Anwendung interagieren, werden Sie wahrscheinlich auf a stoßen package.json.



Was ist das? Was solltest du über ihn wissen? Und was kannst du damit machen?



package.jsonIst eine Art Projektmanifest. Er kann viele Dinge tun, die völlig unabhängig voneinander sind. Beispielsweise kann es die Hauptdatei für die Einstellungen der verwendeten Werkzeuge sein. Außerdem werden die Namen und Versionen aller installierten Pakete gespeichert (diese Informationen werden verwendet npmund yarn).



Dateistruktur


Hier ist ein Beispiel package.json:



{}


Wie Sie sehen können, ist es leer. Es package.jsongibt keine Anforderungen für den Inhalt . Die einzige Voraussetzung ist das Format (JSON), andernfalls können Programme nicht darauf zugreifen.



Wenn Sie ein Node.js-Paket erstellen, über das Sie es verteilen möchten npm, ändert sich die Situation dramatisch und Sie müssen Eigenschaften hinzufügen, damit andere Benutzer das Paket verwenden können. Wir werden uns das später ansehen.



Hier ist ein weiteres Beispiel package.json:



"name": "test-project"


Hier haben wir den Namen des Pakets oder der Anwendung definiert, die sich im selben Verzeichnis wie befindet package.json.



Hier ist ein Beispiel für eine komplexere package.json, die aus einer Vue.js-Anwendung entlehnt wurde:



{
  "name": "test-project",
  "version": "1.0.0",
  "description": "A Vue.js project",
  "main": "src/main.js",
  "private": true,
  "scripts": {
    "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
    "start": "npm run dev",
    "unit": "jest --config test/unit/jest.conf.js --coverage",
    "test": "npm run unit",
    "lint": "eslint --ext .js,.vue src test/unit",
    "build": "node build/build.js"
  },
  "dependencies": {
    "vue": "^2.5.2"
  },
  "devDependencies": {
    "autoprefixer": "^7.1.2",
    "babel-core": "^6.22.1",
    "babel-eslint": "^8.2.1",
    "babel-helper-vue-jsx-merge-props": "^2.0.3",
    "babel-jest": "^21.0.2",
    "babel-loader": "^7.1.1",
    "babel-plugin-dynamic-import-node": "^1.2.0",
    "babel-plugin-syntax-jsx": "^6.18.0",
    "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0",
    "babel-plugin-transform-runtime": "^6.22.0",
    "babel-plugin-transform-vue-jsx": "^3.5.0",
    "babel-preset-env": "^1.3.2",
    "babel-preset-stage-2": "^6.22.0",
    "chalk": "^2.0.1",
    "copy-webpack-plugin": "^4.0.1",
    "css-loader": "^0.28.0",
    "eslint": "^4.15.0",
    "eslint-config-airbnb-base": "^11.3.0",
    "eslint-friendly-formatter": "^3.0.0",
    "eslint-import-resolver-webpack": "^0.8.3",
    "eslint-loader": "^1.7.1",
    "eslint-plugin-import": "^2.7.0",
    "eslint-plugin-vue": "^4.0.0",
    "extract-text-webpack-plugin": "^3.0.0",
    "file-loader": "^1.1.4",
    "friendly-errors-webpack-plugin": "^1.6.1",
    "html-webpack-plugin": "^2.30.1",
    "jest": "^22.0.4",
    "jest-serializer-vue": "^0.3.0",
    "node-notifier": "^5.1.2",
    "optimize-css-assets-webpack-plugin": "^3.2.0",
    "ora": "^1.2.0",
    "portfinder": "^1.0.13",
    "postcss-import": "^11.0.0",
    "postcss-loader": "^2.0.8",
    "postcss-url": "^7.2.1",
    "rimraf": "^2.6.0",
    "semver": "^5.3.0",
    "shelljs": "^0.7.6",
    "uglifyjs-webpack-plugin": "^1.1.1",
    "url-loader": "^0.5.8",
    "vue-jest": "^1.0.2",
    "vue-loader": "^13.3.0",
    "vue-style-loader": "^3.0.1",
    "vue-template-compiler": "^2.5.2",
    "webpack": "^3.6.0",
    "webpack-bundle-analyzer": "^2.9.0",
    "webpack-dev-server": "^2.9.1",
    "webpack-merge": "^4.1.0"
  },
  "engines": {
    "node": ">= 6.0.0",
    "npm": ">= 3.0.0"
  },
  "browserslist": ["> 1%", "last 2 versions", "not ie <= 8"]
}


Hier gibt es viel:



  • name - Name der Anwendung / des Pakets
  • version - Anwendungs- / Paketversion
  • description - eine kurze Beschreibung der Anwendung / des Pakets
  • main - Hauptdatei (Einstiegspunkt) der Anwendung
  • private- Der Wert trueverhindert eine versehentliche Veröffentlichung des Antrags annpm
  • scripts - eine Reihe von Skripten (Befehlen), die ausgeführt werden können
  • dependencies - Projektabhängigkeiten
  • devDependencies - Projektabhängigkeiten, die nur während der Entwicklung verwendet werden
  • engines - Versionen, auf denen die Anwendung / das Paket ausgeführt wird
  • browserlist - unterstützte Browser (und deren Versionen)


Alle diese Eigenschaften werden verwendet npm.



Eigenschaften


In diesem Abschnitt werden einige der Eigenschaften erläutert, die Sie verwenden können. Wir werden den Begriff "Paket" verwenden, aber das meiste, was gesagt wurde, gilt auch für Anwendungen.



Die meisten Eigenschaften werden zum Veröffentlichen des Pakets benötigt npm, einige für die Interaktion mit dem Paket.



Name Name)


Gibt den Namen des Pakets an.



Beispielsweise:



"name": "test-project"


Der Name sollte 214 Zeichen nicht überschreiten, keine Leerzeichen enthalten und darf nur aus Kleinbuchstaben (Kleinbuchstaben), Bindestrichen (-) und Unterstrichen (_) bestehen.



Dies liegt daran, dass dem npmPaket eine URL zugewiesen wird , wenn es basierend auf seinem Namen veröffentlicht wird.



Wenn das Paket auf GitHub veröffentlicht wird, empfiehlt es sich, eine Verknüpfung zum Repository herzustellen.



Autor


Identifiziert den Autor des Pakets.



Beispielsweise:



{
    "author": "Joe <joe@whatever.com> (https://whatever.com)"
}


oder so:



{
  "author": {
    "name": "Joe",
    "email": "joe@whatever.com",
    "url": "https://whatever.com"
  }
}


Mitwirkende


Gibt einen oder mehrere Mitwirkende am Paket an. Diese Eigenschaft ist ein Array von Zeichenfolgen.



Beispielsweise:



{
  "contributors": ["Joe <joe@whatever.com> (https://whatever.com)"]
}


oder so:



{
  "contributors": [
    {
      "name": "Joe",
      "email": "joe@whatever.com",
      "url": "https://whatever.com"
    }
  ]
}


Fehler


Definiert einen Link zu einem Issue-Tracker, normalerweise einem Issue-Tracker auf GitHub.



Beispielsweise:



{
  "bugs": "https://github.com/whatever/package/issues"
}


Startseite


Definiert die Adresse der Homepage.



Beispielsweise:



{
  "homepage": "https://whatever.com/package"
}


Ausführung


Bestimmt die aktuelle Version des Pakets.



Beispielsweise:



"version": "1.0.0"


Diese Eigenschaft folgt dem semantischen Versionsstandard. Dies bedeutet, dass es immer aus drei durch Punkte getrennten Zahlen bestehen muss x.x.x.



Die erste Nummer ist die Hauptversion, die zweite ist die Nebenversion, die dritte ist der Patch.



Jede Nummer hat eine bestimmte Bedeutung: Ein Update zur Behebung von Fehlern ist ein Patch, eine Version abwärtskompatibler Änderungen ist eine Nebenversion, und eine Hauptversion kann Änderungen bedeuten, die mit der vorherigen Version nicht kompatibel sind.



Lizenz


Gibt die Lizenz für das Paket an.



Beispielsweise:



"license": "MIT"


Stichworte


Diese Eigenschaft ist ein Array von Schlüsselwörtern, die dem Paket zugeordnet sind.



Beispielsweise:



"keywords": [
  "email",
  "machine learning",
  "ai"
]


Sie helfen Menschen, Pakete zu finden.



Beschreibung


Definiert eine kurze Beschreibung für das Paket.



Beispielsweise:



"description": "A package to work with strings"


Wenn Sie ein Paket für eine npmbestimmte Eigenschaft veröffentlichen, können Sie besser verstehen, wofür es gedacht ist.



Repository


Bestimmt, wo sich der Quellcode für das Paket befindet.



Beispielsweise:



"repository": "github:whatever/testing",


Achten Sie auf das Präfix github. Es gibt andere ähnliche Dienste:



"repository": "gitlab:whatever/testing",


"repository": "bitbucket:whatever/testing",


Sie können auch ein Versionskontrollsystem definieren:



"repository": {
  "type": "git",
  "url": "https://github.com/whatever/testing.git"
}


Sie können mehrere Versionskontrollsysteme angeben:



"repository": {
  "type": "svn",
  "url": "..."
}


Main


Definiert die Hauptdatei (Einstiegspunkt) für das Paket.



Beim Importieren eines Pakets in eine Anwendung sucht die Anwendung in dieser Datei nach exportierten Modulen.



Beispielsweise:



"main": "src/main.js"


Privat


Durch Festlegen dieser Eigenschaft auf einen Wert wird trueverhindert, dass das Paket versehentlich in veröffentlicht wird npm.



Beispielsweise:



"private": true 


Skripte


Definiert eine Liste von Befehlen (Skripten), die ausgeführt (ausgeführt) werden können.



Beispielsweise:



"scripts": {
  "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
  "start": "npm run dev",
  "unit": "jest --config test/unit/jest.conf.js --coverage",
  "test": "npm run unit",
  "lint": "eslint --ext .js,.vue src test/unit",
  "build": "node build/build.js"
}


Diese Skripte sind Befehlszeilenanwendungen. Sie können sie mit npm run XXXXoder ausführen yarn run XXXX, wobei XXXXder Befehlsname lautet. Zum Beispiel : npm run dev.



Sie können einen beliebigen Namen als Befehlsnamen verwenden. Das Skript führt alles aus, was Sie darin angeben.



Abhängigkeiten


Definiert eine Liste von Paketabhängigkeiten.



Bei der Installation eines Pakets mit npm oder Garn:



npm install <PACKAGENAME>
yarn add <PACKAGENAME>


Der Datensatz für dieses Paket wird automatisch zu der betreffenden Eigenschaft hinzugefügt.



Beispielsweise:



"dependencies": {
  "vue": "^2.5.2"
}


devDependencies


Definiert eine Liste von Abhängigkeiten für Entwicklungszwecke.



Sie unterscheiden sich von dependencies, da sie nur auf dem Computer des Entwicklers installiert sind und nicht in Produktion gehen.



Bei der Installation eines Pakets mit npm oder Garn:



npm install --save-dev <PACKAGENAME>
yarn add --save-dev <PACKAGENAME>


Der Datensatz darüber wird automatisch zur betrachteten Eigenschaft hinzugefügt.



Beispielsweise:



"devDependencies": {
  "autoprefixer": "^7.1.2",
  "babel-core": "^6.22.1"
}


Motoren


Legt fest, auf welchen Versionen von Node.js oder anderen Tools das Paket / die Anwendung ausgeführt wird.



Beispielsweise:



"engines": {
  "node": ">= 6.0.0",
  "npm": ">= 3.0.0",
  "yarn": "^0.13.0"
}  


Browserliste


Definiert eine Liste der unterstützten Browser (und ihrer Versionen). Diese Informationen werden von Babel, Autoprefixer und anderen Tools verwendet, um Polyfills zu erstellen und die Kompatibilität mit den angegebenen Browsern sicherzustellen.



Beispielsweise:



"browserslist": [
  "> 1%",
  "last 2 versions",
  "not ie <= 8"
]    


Diese Einstellung bedeutet, dass Sie die beiden neuesten Versionen aller Browser unterstützen möchten, die laut CanIUse- Statistiken von mehr als 1% der Benutzer verwendet werden , mit Ausnahme von IE8 und älteren Versionen.



Besondere Eigenschaften


package.jsonkann spezielle Eigenschaften für Werkzeuge wie Babel, ESLint usw. enthalten.



Jedes dieser Werkzeuge hat seine eigenen Eigenschaften, zum Beispiel eslintConfig, babelund so weiter. Einzelheiten zu speziellen Eigenschaften finden Sie in der entsprechenden Dokumentation.



Paketversionen


In den obigen Beispielen haben Sie wahrscheinlich Einträge wie diesen bemerkt: ~3.0.0, ^0.13.0. Was meinen sie? Und welche anderen Versionsspezifizierer kann ich verwenden?



Diese Bezeichner werden verwendet, um Aktualisierungsbedingungen zu definieren.



Die Regeln lauten wie folgt:



  • ~- Schreiben ~0.13.0bedeutet, dass nur Patch-Updates zulässig sind, d. h. Release ist 0.13.1gültig, Release jedoch 0.14.0nicht
  • ^- Schreiben ^0.13.0bedeutet, dass Patches und kleinere Updates zulässig sind
  • *- Aufzeichnung *bedeutet, dass Aktualisierungen zulässig sind
  • > - Alle neuen Versionen sind erlaubt
  • >= - Ähnliche oder neuere Versionen sind zulässig
  • <= - Ähnliche oder ältere Versionen sind zulässig
  • < - Alle alten Versionen sind erlaubt


Hier sind noch ein paar Regeln:



  • Kein führendes Zeichen - nur die angegebene Version ist zulässig
  • latest - Nur die neueste Version ist erlaubt


Diese Zeichen können auf verschiedene Arten kombiniert werden, zum Beispiel : 1.0.0 || >=1.1.0 <1.2.0.



Vielen Dank für Ihre Aufmerksamkeit.



Fortsetzung folgt…



All Articles