web-dev-qa-db-fra.com

Paramètre principal de package.json de Node.js

J'ai déjà fait pas mal de recherches. Cependant, vous avez toujours des doutes sur le paramètre principal dans package.json de Node.js.

  1. En quoi le fait de remplir ce champ est-il utile? En posant une autre question, puis-je démarrer le module dans un style différent si ce champ est présent?
  2. Puis-je avoir plusieurs scripts en cours de remplissage dans le paramètre principal? Si oui, seraient-ils démarrés comme deux threads? Si non, comment puis-je démarrer deux scripts dans un module et les faire fonctionner en parallèle?

Je sais que la deuxième question est assez étrange. C'est parce que j'ai hébergé une application Node.js sur OpenShift, mais que cette application est composée de deux composants principaux. L'une étant une API REST et l'autre étant un service d'envoi de notifications.

Je crains que le processus de livraison de notification ne bloque l'API REST si elles étaient implémentées en tant que thread unique. Cependant, ils doivent se connecter à la même cartouche MongoDB. De plus, je voudrais économiser un rapport si les deux composants peuvent servir dans le même rapport si possible.

Toutes les suggestions sont les bienvenues.

117
Gavin

De la documentation npm :

Le champ principal est un ID de module qui constitue le point d'entrée principal de votre programme. En d’autres termes, si votre paquet est nommé foo et qu’un utilisateur l’installe, puis requiert ("foo"), l’objet exports de votre module principal sera renvoyé.

Cela devrait être un ID de module relatif à la racine de votre dossier de paquets.

Pour la plupart des modules, il est plus logique d’avoir un script principal et souvent pas grand chose d’autre.

En bref:

  1. Vous n'avez besoin que d'un paramètre main dans votre package.json si le point d'entrée de votre package diffère de index.js dans son dossier racine. Par exemple, les gens placent souvent le point d'entrée sur lib/index.js ou lib/<packagename>.js, dans ce cas, le script correspondant doit être décrit comme main dans package.json.
  2. Vous ne pouvez pas avoir deux scripts comme main, simplement parce que le point d'entrée require('yourpackagename') doit être défini sans ambiguïté.
121
bredikhin

Pour répondre à votre première question, la façon dont vous chargez un module dépend du point d’entrée du module et du paramètre principal de package.json.

Disons que vous avez la structure de fichier suivante:

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

Sans paramètre principal dans le package.json, vous devez charger le module en indiquant son point d'entrée: require('my-npm-module/lib/module.js').

Si vous définissez le paramètre principal package.json comme suit "main": "lib/module.js", vous pourrez charger le module de cette façon: require('my-npm-module').

38
Bastien

Si vous avez par exemple dans votre fichier package.json:

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

lib/entry.js sera le point d’entrée principal de votre paquet. En appelant

require( 'zig-zag' );

dans le noeud, lib/entry.js sera le fichier réellement requis.

17
prosti

Une fonction importante de la touche main est qu'elle fournit le chemin d'accès à votre point d'entrée. Ceci est très utile lorsque vous travaillez avec nodemon. Si vous travaillez avec nodemon et que vous définissez la touche main dans votre package.json comme on le dit "main": "./src/server/app.js", vous pouvez simplement activer le serveur en tapant nodemon dans la CLI avec la racine sous la forme pwd au lieu denodemon ./src/server/app.js.

7
Akash

Pour OpenShift, vous ne devez vous lier qu’à une paire de port et IP (par application). Il semble que vous devriez pouvoir desservir les deux services à partir d’une seule instance de nodejs en ajoutant des itinéraires internes pour chaque point de terminaison de service.

J'ai quelques informations sur la manière dont OpenShift utilise le package.json de votre projet pour démarrer votre application ici: https://www.openshift.com/blogs/run-your-nodejs-projects-on-openshift-in-two -simple-steps # package_json

0
ʀɣαɳĵ

Pensez-y simplement comme "le point de départ".

Dans le sens de la programmation orientée objet, disons C #, il s’agit de init () ou du constructeur de la classe d’objets, c’est ce que signifie "point d’entrée".

Par exemple

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

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