web-dev-qa-db-fra.com

Comment exiger un fichier autre que le fichier principal npm dans le nœud?

package.json:

...
"name": "mypackage",
"main": "src/index.js"
...

Structure du répertoire:

|- src/
|--- index.js
|--- other.js

Je peux exiger src/index.js Avec require('mypackage');, mais comment puis-je exiger src/other.js?

Si la réponse est require('mypackage/src/other');, existe-t-il un moyen de le faire pour que je puisse l'exiger avec require('mypackage/other'); (c'est-à-dire enseigner au nœud quel est le répertoire du fichier source de votre module?

31
Mike Sherov

AFAIK Vous devrez l'exposer explicitement à la racine:

Structure du répertoire:

|- src/
|--- index.js
|--- other.js
|- other.js

Puis dans /other.js

module.exports = require('src/other.js');

Vous pouvez maintenant faire require('mypackage/other')

12
Creynders

J'examine actuellement exactement la même chose.

Package.json a une propriété appelée 'files':

http://blog.kewah.com/2014/npm-as-a-front-end-package-manager/

https://docs.npmjs.com/files/package.json

Le champ "fichiers" est un tableau de fichiers à inclure dans votre projet. Si vous nommez un dossier dans le tableau, il inclura également les fichiers à l'intérieur de ce dossier.

Mais je n'ai pas encore trouvé comment faire une importation/demande d'un tel fichier. Je ne vois pas vraiment un autre point dans la liste de ces fichiers autre que de pouvoir import/require leur?


J'ai pu importer un fichier à partir d'un package s'il figurait dans ce tableau de fichiers.

{
    "name": "local-ui-utilities",
    "version": "0.0.1",
    "description": "LOCAL UI Utilities",
    "main": "index.jsx",
    "author": "Norbert de Langen",
    "license": "none",
    "dependencies": {
    },
    "files": [
       "/colors/sets/variables.css"
    ]
}

Je suis capable d'importer le fichier css depuis le package en utilisant postcss-import:

@import "local-ui-utilities/colors/sets/a.css";

Ce n'est probablement pas votre cas d'utilisation, mais l'importation postcss utilise juste npm sous le capot. Donc, cela devrait également fonctionner pour votre cas d'utilisation, je pense.

Cette question et la réponse acceptée semblent liées: Node/NPM: Un package npm peut-il exposer plus d'un fichier?

4
Norbert

Vous devrez exposer explicitement le fichier dans le dossier racine, mais de nombreux projets (y compris les anciennes versions de lodash) le font dans le cadre d'une étape de pré-publication. En fait, il y a n package qui fait exactement ce que @Creynders suggère, en ajoutant des fichiers module.exports = require('./path/to/file') dans votre dossier racine. Il y a quelque temps, j'ai rédigé un guide pour commencer, mais le Gist est assez simple.

Installer

npm install --save-dev generate-export-aliases

Configurer

{
  "name": "my-package",
  "scripts": {
    "prepublish": "generate-export-aliases"
  },
  "config": {
    "exportAliases": {
      "other": "./src/other"
    }
  }
}

Utilisez

const other = require('my-package/other')

AVERTISSEMENT: je suis l'auteur du paquet

1
Patrick