Jeden Tag wenden sich Millionen von Entwicklern beim Erstellen ihrer JavaScript-Anwendungen an npm (oder an Yarn). Das Ausführen von Befehlen wie
npm init
oder
npx create-react-app
ist eine vertraute Methode, um mit der Arbeit an fast jedem JavaScript-Projekt zu beginnen. Dies kann ein Server, ein Client oder sogar eine Desktop-Anwendung sein.
Das Dienstprogramm npm kann jedoch nicht nur Projekte initialisieren oder Pakete installieren. Der Autor des Materials, dessen Übersetzung wir heute veröffentlichen, möchte über 13-npm-Tricks sprechen, mit denen Sie alles herausholen können, was mit diesem System möglich ist. Hier werden Techniken verschiedener Größen betrachtet - von der Verwendung von Verknüpfungen bis zur Anpassung des Verhaltens von
npm init
.

Viele Programmierer verwenden täglich npm. Dies bedeutet, dass auf lange Sicht bereits eine geringe Zeitersparnis etwas zum Besseren verändern kann. Dieses Material richtet sich in erster Linie an Anfänger und mittelständische Entwickler. Selbst wenn Sie ein Profi sind, hofft der Autor des Materials, dass Sie hier einige interessante Dinge finden, die Sie zuvor noch nicht kennengelernt haben.
Wenn Sie mit npm nicht vertraut sind, beachten Sie, dass das für uns interessante Programm mit
Node.js installiert ist. Wenn Sie unter Windows arbeiten, wird empfohlen,
Git Bash zu installieren, um einige der hier beschriebenen Themen zu reproduzieren.
1. Kurze Optionen zum Aufzeichnen grundlegender Befehle
Beginnen wir mit den Grundlagen. Wenn Sie ein wenig Zeit damit verbringen, gekürzte Versionen der gängigsten npm-Befehle zu untersuchen, sparen Sie sich in Zukunft viel Zeit.
- Installieren Sie Pakete. Normale Option:
npm install
. Abkürzung: npm i
. - Ausführen von Tests. Normale Option:
npm test
. Verknüpfung: npm t
. - Hilfe anrufen. Allgemeine Option:
npm --help
. Verknüpfung: npm -h
. - Globales Einstellungsflag. Häufige Option:
--global
. Verknüpfung: -g
. - Paketinstallationsflag als Entwicklungsabhängigkeit. Die übliche Option ist
--save-dev
. Verknüpfung: -D
. npm init
Standardeinstellungen für npm init
. Die übliche Option ist npm init --yes
oder npm init --force
. Verknüpfung: npm init -y
oder npm init -f
.
Jetzt müssen Sie nicht mehr das
--save
oder
-S
verwenden, um Pakete zu speichern. Pakete werden standardmäßig gespeichert. Und um ein Paket zu installieren, ohne es zu speichern, können Sie das Flag
--no-save
verwenden.
▍Kurze Aufnahmeoptionen für weniger gebräuchliche Befehle
Hier sind einige weitere nützliche Abkürzungen, die jedoch nicht so häufig verwendet werden wie die, die wir gerade besprochen haben.
- Speichern eines Pakets als optionale Abhängigkeit. Die übliche Option:
--save-optional
. Verknüpfung: -O
. - Speichern von Informationen zur genauen Version des Pakets. Die übliche Option ist
--save-exact
. Verknüpfung: -E
.
Wenn Sie den Befehl
npm install
mit dem
--save-bundle
oder
-B
bundledDependencies
Einträge in installierten Bundles in
package.json
im Abschnitt
bundledDependencies
. Diese Pakete werden bei Veröffentlichung zusammen mit dem Projekt verpackt. Mit dem Befehl
npm pack
können Sie eine Tarball-Datei erstellen, die Projektdateien und Pakete enthält, die in
bundledDependencies
aufgeführt sind.
▍ Abkürzung für das Stammverzeichnis
In der Regel wird das Punktsymbol (
.
) Zur Darstellung des Stammverzeichnisses einer Anwendung oder (je nach Kontext) zur Darstellung eines Einstiegspunkts in eine Anwendung verwendet. In npm wird dies als Wert der
main
in der Datei
package.json
:
{ "main": "index.js" }
Diese Abkürzung kann zum Beispiel mit Befehlen wie
npx create-react-app
. Anstatt diesen Befehl in Form von
npx create-react-app my-app
(was zur Erstellung eines neuen
my-app
Ordners führt), können Sie diesen Befehl wie
npx create-react-app .
:
npx create-react-app .
(Achten Sie auf den Punkt, der nach dem Befehl kommt). Auf diese Weise können Sie ein React-Anwendungsvorlagenprojekt in dem Ordner erstellen, in dem Sie sich zum Zeitpunkt der Ausführung des Befehls befinden.
2. Festlegen von Standardwerten für npm init
Wenn Sie den Befehl
npm init
ständig
npm init
, um ein neues Projekt zu erstellen, werden Sie höchstwahrscheinlich feststellen, dass Sie bei der Beantwortung von Systemfragen immer wieder dieselben Daten eingeben. Zum Beispiel - es ist wahrscheinlich, dass Sie der Autor der meisten von Ihnen erstellten Projekte sind. Um Zeit bei der Eingabe derselben Daten zu sparen, können Sie Ihre eigenen Standardwerte für die entsprechenden Felder festlegen:
npm config set init.author.name "Joe Bloggs" npm config set init.author.email "joebloggs@gmail.com" npm config set init.author.url "joebloggs.com" npm config set init.license "MIT"
npm config edit
Befehl
npm config edit
, um die Richtigkeit des Hinzufügens solcher Informationen zum System zu überprüfen. Dadurch wird die Konfigurationsdatei im Systemeditor geöffnet. Wenn Sie die globalen npm-Parameter bearbeiten möchten, verwenden Sie den Befehl
npm config edit -g
.
Um zu den Standardeinstellungen zurückzukehren, können Sie das folgende Skript verwenden. In der ersten Zeile werden Konfigurationsdaten aus der Datei gelöscht, in der zweiten Zeile werden sie mit Standardwerten gefüllt.
echo "" > $(npm config get userconfig) npm config edit
Das obige Skript setzt die Standardwerte für den Benutzer zurück. Das folgende Skript setzt die globalen Standardeinstellungen zurück:
echo "" > $(npm config get globalconfig) npm config --global edit
3. Plattformübergreifende Skripte
Jeder Code, der in der Befehlszeile ausgeführt wird, kann auf Kompatibilitätsprobleme stoßen. Dies gilt insbesondere für Inkompatibilitäten zwischen Windows- und Unix-basierten Systemen (einschließlich Mac und Linux). Dies ist kein Problem, wenn Sie und nur Sie an einem bestimmten Projekt arbeiten. In vielen Fällen ist jedoch die plattformübergreifende Skriptkompatibilität wichtig. Zum Beispiel ist das Arbeiten unabhängig vom Betriebssystem ein großes Plus für jedes Open Source-, Schulungs- oder Demonstrationsprojekt.
Glücklicherweise ist die Lösung des Skriptkompatibilitätsproblems nicht besonders schwierig. Wir haben mehrere Möglichkeiten zur Verfügung. Hier möchte ich jedoch über einen von ihnen sprechen, mit dessen Hilfe ich die besten Ergebnisse erzielt habe. Dies ist ein
Cross-Env- Paket. Es muss als Entwicklungsabhängigkeit mit dem Befehl
npm i -D cross-env
installiert werden. Dann müssen Sie
cross-env
vor jede Umgebungsvariable stellen. Zum Beispiel könnte es so aussehen:
{ "scripts": { "build": "cross-env NODE_ENV=production webpack --config build/webpack.config.js" }
Ich fand, dass das
cross-env
Paket das bequemste Tool ist, um plattformübergreifende Scripting-Kompatibilität zu erreichen. Es ist jedoch hilfreich, wenn Sie sich die folgenden zwei beliebten Tools ansehen, die zur Lösung dieses Problems beitragen können:
- Rimraf- Paket. Es kann zum Ausführen plattformübergreifender Skripts global installiert werden.
- ShellJS- Paket. Dies ist eine portable Node.js-Implementierung der Unix-Befehlsshell.
4. Parallele Skriptausführung
Um die sequentielle Ausführung von Befehlen in der Linux-Shell zu organisieren, wird das Konstrukt
&&
verwendet. Was ist mit parallelen Skripten? Um dies zu erreichen, können Sie das entsprechende npm-Paket auswählen. Die beliebtesten Pakete dieser Art sind
gleichzeitig und
npm-run-all . Hier demonstrieren wir die Verwendung des gleichzeitigen Pakets.
Zunächst muss das ausgewählte Paket als Entwicklungsabhängigkeit installiert werden:
npm i -D concurrently
. Dann
package.json
Sie in
package.json
eine Konstruktion der folgenden Form verwenden:
{ "start": "concurrently \"command1 arg\" \"command2 arg\"" }
5. Ausführen von Skripten in verschiedenen Verzeichnissen
Manchmal stoßen Sie auf Anwendungen, die mehrere
package.json
Dateien in verschiedenen Verzeichnissen haben. Es wäre beispielsweise praktisch, darin deklarierte Skripte auszuführen, die sich im Stammverzeichnis des Projekts befinden. Dies ist viel besser, als in verschiedene Ordner wechseln zu müssen, wenn Sie ein Skript ausführen müssen. Zu diesem Zweck können Sie die folgenden zwei Ansätze verwenden.
Zu Beginn können Sie mit dem
cd
automatisch zum gewünschten Verzeichnis navigieren. Es könnte ungefähr so aussehen:
cd folder && npm start && cd ..
Dieses Problem kann jedoch auf interessantere Weise gelöst werden. Es besteht aus der Verwendung des
--prefix
, mit dem Sie den Pfad angeben können:
npm start --prefix path/to/your/folder
Das Folgende ist ein Beispiel für die Anwendung dieser Lösung aus einer realen Anwendung. Hier müssen wir
npm start
für die Client- und Serverteile des Projekts ausführen. Ihr Code befindet sich jeweils in den
client
und Serverordnern.
"start": "concurrently \"(npm start --prefix client)\" \"(npm start --prefix server)\"",
6. Verzögern Sie den Start des Skripts, bis eine Ressource verfügbar ist
Bei der Entwicklung von Full-Stack-Anwendungen besteht häufig die Notwendigkeit, sowohl den Client- als auch den Serverteil der Anwendung auszuführen. Mit dem
Wartepaket können Sie die Ausführung bestimmter Prozesse synchronisieren. In unserem Fall muss vor dem Starten des Client-Teils der Anwendung ein bestimmter Port verfügbar sein.
Beispielsweise gibt es ein Entwicklungsskript, das in einer Electron-Anwendung verwendet wird, deren Schnittstelle mit React geschrieben wurde. Das Skript führt
concurrently
die Präsentationsschicht der Anwendung und das Elektronenfenster parallel aus. Mit
wait-on
Sie das Electron-Fenster jedoch nur öffnen, wenn die React-Präsentationsschicht einsatzbereit ist und unter
http://localhost:3000
verfügbar ist. So sieht die Verwendung von
wait-on
aus:
"dev": "concurrently \"cross-env BROWSER=none npm run start\" \"wait-on http://localhost:3000 && electron .\"",
Darüber hinaus besteht das Standardverhalten von React-Projekten darin, automatisch ein Browserfenster zu öffnen. Bei Verwendung von React with Electron ist dies nicht erforderlich. Dies kann mit der Umgebungsvariablen
BROWSER=none
werden.
BROWSER=none
dieser
BROWSER=none
steht aus Gründen der plattformübergreifenden Kompatibilität der Lösung der Befehl
cross-env
.
7. Auflisten und Arbeiten mit verfügbaren Skripten
Um die in
package.json
verfügbaren Skripte
package.json
, gehen
package.json
einfach in das Stammverzeichnis des Projekts und führen Sie den Befehl
npm run
im Terminal aus.
Es gibt jedoch eine noch bequemere Möglichkeit, Skripte aufzulisten. Bei Verwendung kann das gewünschte Skript sofort aus der Liste ausgewählt und ausgeführt werden. Um diese Art der Arbeit mit Skripten verwenden zu können, müssen wir das Modul
ntl
(Npm Task List) global installieren:
npm i -g ntl
Dann müssen Sie im
ntl
Befehl
ntl
. Es wird eine Liste der verfügbaren Skripte angezeigt und Sie haben die Möglichkeit, das Skript auszuwählen, das Sie ausführen möchten. So sieht es aus.
Verwenden Sie den Befehl ntlDiese Funktion kann sehr nützlich sein, wenn Sie nicht genau wissen, welche Skripte sich im Projekt befinden. Dies ist auch in Fällen sinnvoll, in denen der Programmierer die Eingabe eines langen Befehls zum Ausführen eines Skripts durch die Eingabe eines kurzen Befehls und das schnelle Drücken einiger weiterer Tasten auf der Tastatur ersetzen möchte.
8. Ausführen von Vorskripten und Nachskripten
Möglicherweise sind Sie mit den
prebuild
und
postbuild
Skripten vertraut, mit
prebuild
Sie vor und nach dem Ausführen des
build
Skripts Code ausführen können. Solche Vor- und Nachskripte können für jedes andere Skript definiert werden. Einschließlich derer, deren Beschreibungen vom Programmierer zu p
ackage.json
hinzugefügt werden.
Auf diese Weise können Sie nicht nur den Code übersichtlicher gestalten, sondern auch Pre- und Post-Skripte isoliert ausführen.
9. Versionskontrolle der Anwendung
Anstatt die Version der Anwendung manuell zu ändern, kann der Programmierer spezielle
npm
Befehle verwenden. Um den entsprechenden Teil der Versionsnummer der Anwendung zu erhöhen, können Sie den Befehl
npm version
gefolgt von
major
,
minor
oder
patch
:
// 1.0.0 npm version patch // 1.0.1 npm version minor // 1.1.0 npm version major // 2.0.0
Abhängig davon, wie oft Sie Ihre Anwendung aktualisieren, können Sie Zeit sparen, indem Sie die Versionsnummer bei jeder Bereitstellung einer neuen Version der Anwendung automatisch erhöhen. Zum Beispiel so:
{ "predeploy": "npm version patch" }
10. Bearbeiten von package.json über die Befehlszeile
Die Datei package.json ist eine reguläre json-Datei, sodass sie mit dem Dienstprogramm
json direkt über die Befehlszeile bearbeitet werden kann. Dies eröffnet neue Möglichkeiten in Situationen, in denen Sie
package.json
ändern
package.json
, sodass Sie Ihre eigenen verkürzten Versionen von Befehlen erstellen können. Installieren Sie das
json
Paket global:
npm install -g json
Dann kann das Dienstprogramm
json
verwendet werden,
um die Datei mit dem
-I
schnell zu
bearbeiten . Um beispielsweise der Datei ein neues
foo
Skript mit der
foo
hinzuzufügen, können Sie den folgenden Befehl verwenden:
json -I -f package.json -e 'this.scripts.foo="bar"'
Im nächsten Abschnitt sehen Sie ein praktischeres Beispiel für die Verwendung des Dienstprogramms
json
.
11. Automatisierung der Einrichtung und des Öffnens des Repositorys
Wenn Ihre
package.json
Datei einen
"repository"
package.json
enthält, bedeutet dies, dass Sie die Repository-Seite in dem vom System standardmäßig verwendeten Browser öffnen können. Verwenden Sie dazu den Befehl
npm repo
.
Wenn Ihr Projekt bereits mit einem Remote-Repository verbunden ist und Sie das Befehlszeilenprogramm
git
installiert haben, können Sie die Adresse Ihres Repositorys mit dem folgenden Befehl ermitteln:
git config --get remote.origin.url
Das ist aber noch nicht alles. Wenn Sie gemäß dem vorherigen Tipp das Dienstprogramm
json
installiert haben, können Sie mithilfe des folgenden Skripts automatisch die richtigen Repository-Informationen zu
package.json
:
json -I -f package.json -e "this.repository=\"$(git config --get remote.origin.url)\""
12. Erstellen Sie ein eigenes Skript zur Steuerung des Befehls npm init
Lassen Sie uns nun über das Lösen einer größeren Aufgabe sprechen. Wir werden nämlich ein eigenes Skript entwickeln, das den Betrieb des Befehls
npm init
steuert, der die URL des GitHub-Repositorys akzeptiert und automatisch das erste Commit an dieses sendet. Hier sprechen wir darüber, wie solche Skripte erstellt werden. Und im nächsten Abschnitt, der unser letzter Tipp sein wird, werden wir über die Arbeit mit
git
sprechen.
Sie können das Verhalten des Befehls
npm init
mithilfe der
.npm-init.js
. Erstellen wir eine solche Datei im Home-Verzeichnis des aktuellen Benutzers (unter Windows ist dies normalerweise
C:/Users/<username>
und auf dem Mac ist es
/Users/<username>
). Führen Sie danach den folgenden Befehl aus, der npm mitteilt, wo genau sich diese Datei befindet:
npm config set init-module ~\.npm-init.js
Schauen wir uns vor der Integration in
git
ein einfaches Beispiel für die
.npm-init.js
, in der die Fragen wiedergegeben werden, die das System dem Benutzer stellt, wenn der Befehl
npm init
ohne zusätzliche Einstellungen verwendet wird:
module.exports = { name: prompt('package name', basename || package.name), version: prompt('version', '0.0.0'), decription: prompt('description', ''), main: prompt('entry point', 'index.js'), repository: prompt('git repository', ''), keywords: prompt(function (s) { return s.split(/\s+/) }), author: prompt('author', 'Joe Bloggs <joe.bloggs@gmail.com> (joebloggs.com)'), license: prompt('license', 'ISC') }
Jede Frage basiert auf der folgenden Vorlage:
nameInPackage: prompt('nameInPrompt', 'defaultValue')
Entfernen Sie einfach die
prompt
, um einen bestimmten Wert anzugeben und dem Benutzer keine Frage zu stellen.
Wenn Sie zu den Standardeinstellungen für
npm init
zurückkehren möchten, löschen
.npm-init.js
einfach die
.npm-init.js
.
13. Senden des ersten Commits an das GitHub-Repository mit npm init
Um
git
Befehle in der
.npm-init.js
auszuführen
.npm-init.js
wir einen Weg finden, mit der Befehlszeile zu arbeiten.
child_process
können Sie das Modul
child_process
. Wir verbinden es oben in der Datei, und da wir nur die
execSync
Funktion benötigen, importieren wir es nur mithilfe der Destrukturierung:
const { execSync } = require('child_process');
Zusätzlich erstellen wir eine Hilfsfunktion, die die Ergebnisse unserer Funktion in der Konsole anzeigt:
function run(func) { console.log(execSync(func).toString()) }
Zum Schluss erstellen wir den entsprechenden Eingabeaufforderungsblock für die URL des GitHub-Repositorys. Wenn das Skript die URL hat, erstellen wir die Datei
README.md
und senden das erste Commit an das Repository.
Eines der Elemente des
module.exports
Objekts der
.npm-init.js
sollte daher der folgende Code sein:
repository: prompt('github repository url', '', function (url) { if (url) { run('touch README.md'); run('git init'); run('git add README.md'); run('git commit -m "first commit"'); run(`git remote add origin ${url}`); run('git push -u origin master'); return url; })
So sollte der vollständige Code für die Datei
.npm-init.js
nach diesem Zusatz aussehen:
const { execSync } = require('child_process'); function run(func) { console.log(execSync(func).toString()) } module.exports = { name: prompt('package name', basename || package.name), version: prompt('version', '0.0.0'), decription: prompt('description', ''), main: prompt('entry point', 'index.js'), keywords: prompt(function (s) { return s.split(/\s+/) }), author: prompt('author', 'Joe Bloggs <joe.bloggs@gmail.com> (joebloggs.com)'), license: prompt('license', 'ISC'), repository: prompt('github repository url', '', function (url) { if (url) { run('touch README.md'); run('git init'); run('git add README.md'); run('git commit -m "first commit"'); run(`git remote add origin ${url}`); run('git push -u origin master'); return url; }), }
So
package.json
Datei
package.json
, die das System mit dieser
.npm-init.js
:
{ "name": "Custom npm init", "version": "0.0.0", "decription": "A test project, to demonstrate a custom npm init script.", "main": "index.js", "keywords": [], "author": "Joe Bloggs <joe.bloggs@gmail.com> (joebloggs.com)", "license": "ISC", "repository": { "type": "git", "url": "git+https://github.com/JoeBloggs/custom.git" }, "bugs": { "url": "https://github.com/JoeBloggs/custom/issues" }, "homepage": "https://github.com/JoeBloggs/custom#readme" }
Wenn Sie den Prozess zum Initialisieren neuer Projekte einrichten, können Sie noch weiter gehen. Um beispielsweise sicherzustellen, dass beim Erstellen eines Projekts ein neues Repository dafür erstellt wird.
Zusammenfassung
Ich hoffe, dieses Material hat Ihnen geholfen zu sehen, was Sie mit npm erreichen können. Ich möchte glauben, dass Sie hier etwas gefunden haben, mit dem Sie produktiver arbeiten können - ob es sich um die Verwendung verkürzter Versionen von Befehlen, um Skripte aus
package.json
oder um das Einrichten von
npm init
, das Ihren Anforderungen entspricht.
Liebe Leser! Automatisieren Sie die Arbeit mit npm?
