Hauptparameter Node.js package.json

147

Ich habe schon ziemlich viel gesucht. Ich habe jedoch immer noch Zweifel an dem Hauptparameter in package.json von Node.js.

  1. Wie würde das Ausfüllen dieses Feldes helfen? Kann ich das Modul auf andere Weise in einem anderen Stil starten, wenn dieses Feld angezeigt wird?
  2. Kann ich mehr als ein Skript in den Hauptparameter einfügen lassen? Wenn ja, würden sie als zwei Threads gestartet? Wenn nein, wie kann ich zwei Skripte in einem Modul starten und parallel ausführen lassen?

Ich weiß, dass die zweite Frage ziemlich seltsam ist. Dies liegt daran, dass ich eine Node.js-Anwendung auf OpenShift gehostet habe, die Anwendung jedoch aus zwei Hauptkomponenten besteht. Eine ist eine REST-API und eine ist ein Benachrichtigungsdienst.

Ich befürchte, dass der Benachrichtigungsübermittlungsprozess die REST-API blockieren würde, wenn sie als einzelner Thread implementiert würden. Sie müssen jedoch eine Verbindung mit derselben MongoDB-Kassette herstellen. Außerdem möchte ich einen Gang sparen, wenn beide Komponenten möglichst im gleichen Gang arbeiten könnten.

Anregungen sind willkommen.

Gavin
quelle

Antworten:

149

Aus der npm-Dokumentation :

Das Hauptfeld ist eine Modul-ID, die der primäre Einstiegspunkt für Ihr Programm ist. Das heißt, wenn Ihr Paket den Namen foo trägt und ein Benutzer es installiert und dann benötigt ("foo"), wird das Exportobjekt Ihres Hauptmoduls zurückgegeben.

Dies sollte eine Modul-ID relativ zum Stammverzeichnis Ihres Paketordners sein.

Für die meisten Module ist es am sinnvollsten, ein Hauptskript zu haben und oft nicht viel anderes.

Um es kurz zu machen:

  1. Sie benötigen nur dann einen mainParameter in Ihrem, package.jsonwenn sich der Einstiegspunkt in Ihr Paket von index.jsseinem Stammordner unterscheidet. Beispielsweise setzen Personen häufig den Einstiegspunkt auf lib/index.jsoder lib/<packagename>.jsin diesem Fall muss das entsprechende Skript wie mainin beschrieben werden package.json.
  2. Sie können nicht zwei Skripte als haben main, einfach weil der Einstiegspunkt require('yourpackagename')eindeutig definiert werden muss.
Bredikhin
quelle
Vielen Dank, dann würde ich in Betracht ziehen, die Komponente als untergeordneten Prozess zu implementieren.
Gavin
1
Randnotiz 1 electronberücksichtigt die Hauptparameter, dh electron .startet das Richtige von einem Unterordner aus, wenn es ein z. B. ein "main": "dist/app/index.js",In gibt package.json(gilt möglicherweise auch für andere Plattformen / Frameworks).
Frank Nocke
1
Randnotiz 2: You can't have two scripts as main...- wahr. Wenn Ihr Paket jedoch beispielsweise mehrere CLI-Befehle bereitstellt (während der Entwicklung unter ./node_modules/.bin/<symlink>), überprüfen Sie den Parameter "bin" .
Frank Nocke
Ich habe build / index.js, aber wenn ich es in src / index.js ändere, macht es alles. es zeigt immer noch auf buld / index. Ich benutze npm Link
Carlos
Alle verwenden .jshier Erweiterungen, aber "Modul-IDs" haben keine Erweiterungen. Ich mag die Mehrdeutigkeit, die wir verwenden sollen, nicht
ChaseMoskal
47

Um Ihre erste Frage zu beantworten, hängt die Art und Weise, wie Sie ein Modul laden, vom Moduleinstiegspunkt und dem Hauptparameter von package.json ab .

Angenommen, Sie haben die folgende Dateistruktur:

my-npm-module
|-- lib
|   |-- module.js
|-- package.json

Ohne Hauptparameter in der package.json müssen Sie das Modul laden, indem Sie den Moduleinstiegspunkt angeben : require('my-npm-module/lib/module.js').

Wenn Sie den Hauptparameter package.json wie folgt festlegen"main": "lib/module.js" , können Sie das Modul folgendermaßen laden : require('my-npm-module').

Bastien
quelle
20

Wenn Sie zum Beispiel in Ihrer package.jsonDatei haben:

{
"name": "zig-zag",
"main": "lib/entry.js",
...
}

lib/entry.js wird der Haupteinstiegspunkt für Ihr Paket sein.

Beim Anruf

require('zig-zag');

Im Knoten lib/entry.jswird die tatsächliche Datei angezeigt, die erforderlich ist.

Prosti
quelle
1
Wenn der Code nicht importiert werden soll, können wir dann den Parameter 'main' weglassen?
Kokodoko
@ Kokodoko ja das ist, was in diesem Fall vorgeschlagen wird
Cquezel
7

Eine wichtige Funktion des mainSchlüssels besteht darin, dass er den Pfad für Ihren Einstiegspunkt bereitstellt. Dies ist sehr hilfreich bei der Arbeit mit nodemon. Wenn Sie mit arbeiten nodemonund den mainSchlüssel in Ihrem package.jsonBeispiel definieren "main": "./src/server/app.js", können Sie den Server einfach hochfahren, indem Sie nodemondie CLI mit root als pwd anstelle von eingeben nodemon ./src/server/app.js.

Akash
quelle
3

Soweit ich weiß, ist dies der Haupteinstiegspunkt für Ihr Knotenpaket (Bibliothek) für npm. Es wird nur benötigt, wenn Ihr npm-Projekt zu einem Knotenpaket (Bibliothek) wird, das von anderen über npm installiert werden kann.


Angenommen, Sie haben eine Bibliothek mit einem Ordner build /, dist / oder lib /. In diesem Ordner haben Sie die folgende kompilierte Datei für Ihre Bibliothek:

-lib/
--bundle.js

Dann teilen Sie npm in Ihrer package.json mit , wie auf die Bibliothek zugegriffen werden soll (Knotenpaket):

{
  "name": "my-library-name",
  "main": "lib/bundle.js",
  ...
}

Nach der Installation des Knotenpakets mit npm in Ihrem JS-Projekt können Sie Funktionen aus Ihrer gebündelten Datei bundle.js importieren :

import { add, subtract } from 'my-library-name';

Dies gilt auch, wenn Sie Code Splitting (z. B. Webpack) für Ihre Bibliothek verwenden. Diese webpack.config.js verwendet beispielsweise Code, der das Projekt in mehrere Bundles anstatt in eines aufteilt .

module.exports = {
  entry: {
    main: './src/index.js',
    add: './src/add.js',
    subtract: './src/subtract.js',
  },
  output: {
    path: `${__dirname}/lib`,
    filename: '[name].js',
    library: 'my-library-name',
    libraryTarget: 'umd',
  },
  ...
}

Dennoch würden Sie in Ihrem package.json einen Haupteinstiegspunkt für Ihre Bibliothek definieren :

{
  "name": "my-library-name",
  "main": "lib/main.js",
  ...
}

Wenn Sie dann die Bibliothek verwenden, können Sie Ihre Dateien von Ihrem Haupteinstiegspunkt importieren:

import { add, subtract } from 'my-library-name';

Sie können jedoch auch Bypass - Haupteintrittspunkt aus dem package.json und Import der Code gespaltet Bündel:

import add from 'my-library-name/lib/add';
import subtract from 'my-library-name/lib/subtract';

Schließlich verweist die Haupteigenschaft in Ihrer package.json nur auf Ihre Haupteinstiegspunktdatei Ihrer Bibliothek.

Robin Wieruch
quelle
0

Für OpenShift erhalten Sie nur ein PORT- und IP-Paar zum Binden (pro Anwendung). Es hört sich so an, als ob Sie in der Lage sein sollten, beide Dienste von einer einzelnen Knoteninstanz aus zu bedienen, indem Sie interne Routen für jeden Dienstendpunkt hinzufügen.

Ich habe einige Informationen darüber, wie OpenShift die package.json Ihres Projekts verwendet, um Ihre Anwendung hier zu starten: https://www.openshift.com/blogs/run-your-nodejs-projects-on-openshift-in-two-simple-steps #package_json

ʀɣαɳĵ
quelle
-5

Betrachten Sie es einfach als "Ausgangspunkt".

Im Sinne einer objektorientierten Programmierung, sagen wir C #, ist es der init () oder Konstruktor der Objektklasse, was "Einstiegspunkt" bedeutet.

Beispielsweise

public class IamMain  // when export and require this guy
{
    public IamMain()  // this is "main"
    {...}

    ...   // many others such as function, properties, etc.
}
Jeb50
quelle