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 enter
wird die Rückruffunktion ausgeführt.
In diesem Rückruf schließen wir die Schnittstelle
readline
.
readline
enthä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 inquirer
und 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.js
sich 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.exports
die vom modularen System bereitgestellte Schnittstelle .
Wenn Sie ein Objekt zuweisen oder als neue Eigenschaft des Objekts fungieren
exports
Wenn 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.exports
und exports
?
Der erste exportiert das referenzierte Objekt, der zweite eine Eigenschaft des Objekts.
Eine Einführung in den npm-Paketmanager
Einführung in npm
npm
Ist 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.
npm
macht mehrere Dinge.
Eine Alternative zu npm ist Garn .
Wird geladen
npm
verwaltet das Laden von Projektabhängigkeiten.
Wenn im Projekt eine Datei vorhanden ist, wird beim
package.json
Starten npm install
alles, was für das Projekt erforderlich ist, in dem Verzeichnis installiert, das node_modules
erstellt 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
.
npm
prü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
npm
folgt sie anerkannten Standards.
Aufgaben ausführen
package.json
unterstü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
npm
können Sie zwischen zwei Installationsarten wählen:
- lokal
- global
Standardmäßig, wenn Sie
npm install
beispielsweise Folgendes eingeben :
npm install lodash
Das Paket wird in einem Ordner
node_modules
im aktuellen Verzeichnis installiert .
Nach der Installation wird dem Dateibereich im aktuellen Verzeichnis
npm
ein o-Datensatz hinzugefügt.
Verwenden Sie für eine globale Installation das Flag :lodash
dependencies
package.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
nvm
für die Versionierung von Node.j unterschiedlich sein.
Wie verwende ich installierte Pakete?
Verwendung eines in einem Ordner
node_modules
oder global installierten Pakets.
Angenommen, Sie haben eine
lodash
beliebte JavaScript-Hilfsbibliothek mit installiert npm install lodash
.
Dieser Befehl wird
lodash
in 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 cowsay
werden das Paket selbst und einige seiner Abhängigkeiten installiert:
Der Ordner
.bin
ist 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/cowsay
und es sollte funktionieren, aber npx in npm (seit 5.2) ist die beste Option. Du tust es einfachnpx cowsay
und 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.json
Ist 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 npm
und yarn
).
Dateistruktur
Hier ist ein Beispiel
package.json
:
{}
Wie Sie sehen können, ist es leer. Es
package.json
gibt 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 Paketsversion
- Anwendungs- / Paketversiondescription
- eine kurze Beschreibung der Anwendung / des Paketsmain
- Hauptdatei (Einstiegspunkt) der Anwendungprivate
- Der Werttrue
verhindert eine versehentliche Veröffentlichung des Antrags annpm
scripts
- eine Reihe von Skripten (Befehlen), die ausgeführt werden könnendependencies
- ProjektabhängigkeitendevDependencies
- Projektabhängigkeiten, die nur während der Entwicklung verwendet werdenengines
- Versionen, auf denen die Anwendung / das Paket ausgeführt wirdbrowserlist
- 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
npm
Paket 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
npm
bestimmte 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
true
verhindert, 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 XXXX
oder ausführen yarn run XXXX
, wobei XXXX
der 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.json
kann spezielle Eigenschaften für Werkzeuge wie Babel, ESLint usw. enthalten.
Jedes dieser Werkzeuge hat seine eigenen Eigenschaften, zum Beispiel
eslintConfig
, babel
und 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.0
bedeutet, dass nur Patch-Updates zulässig sind, d. h. Release ist0.13.1
gültig, Release jedoch0.14.0
nicht^
- Schreiben^0.13.0
bedeutet, 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…