Ma question concerne une bibliothèque existante que je souhaite publier en tant que module NPM. La bibliothèque est déjà utilisée et, à l'heure actuelle, require
d via le système de fichiers local.
Comment puis-je spécifier le répertoire racine des fichiers de mon module?
Si j'ai une structure comme:
.
├── package.json
├── src
| ├── js
| └────── lib
| └───────── my
| └───────────── thing.js
| └───────────── that.js
Comment spécifier que la racine de mon module et des fichiers accessibles est src/js/lib/my/
?
Je voudrais utiliser comme suit d'un projet extérieur:
var thing = require('my/thing'),
that = require('my/that');
J'ai vu la propriété "files"
dans package.json, est-ce la bonne façon de faire?
Pour une solution native, consultez ce problème de noeud https://github.com/nodejs/node/issues/14970
La demande de fonctionnalité suggère un champ mainDir
dans le package.json en regard de main.
Plus il y a de gens qui votent, plus la mise en œuvre sera rapide/probable
Comme le doc dit:
Le champ principal est un ID de module qui constitue le point d'entrée principal de votre programme.
Donc, vous aurez quelque chose comme "main": "src/js/lib/my/app.js"
dans votre fichier package.json.
Je vous suggère de créer un fichier app.js
et module.exports
vos différents enfants. Par exemple:
module.exports.thing = require('./thing');
module.exports.that = require('./that');
Et utilisez-les comme ceci:
var mylib = require('mylib')
, thing = mylib.thing
, that = mylib.that;
package.json
est principalement un fichier utilisé par npm
pour installer et gérer les dépendances.
la construction require
ne se soucie pas beaucoup de package.json
et vous ne pourrez donc pas l'utiliser pour subvertir le fonctionnement de require
et lui faire croire que les paquets ne sont pas ceux où le schéma de chargement require
est prévu.
Voir la documentation sur https://nodejs.org/api/modules.html et le schéma de chargement ici: https://nodejs.org/api/modules.html#modules_all_together
vous pourriez peut-être utiliser la technique selon laquelle la documentation appelle «Chargement à partir des dossiers globaux» et définir la variable d'environnement NODE_PATH
.
mais je vous conseille de vous en tenir à une manière plus standard: - Placez vos modules dans un répertoire node_modules - ou démarrez la hiérarchie de vos modules dans le même répertoire que votre app.js ou index.js
Il s’agit maintenant d’une solution de contournement moche qui pollue la racine de votre package. Mais jusqu'à ce que la réponse de Jordan fonctionne, cela semble être le moyen de réaliser ce que vous demandez.
Ajoutez simplement un fichier à la racine de votre paquet pour chacun des modules que vous souhaitez exporter en utilisant la notation require with slash. Ce fichier aura le même nom que le module en cours d’exportation et sera simplement réexporté.
.
├── package.json
├── thing.js <--
├── that.js <--
├── src
| ├── js
| └────── lib
| └───────── my
| └───────────── thing.js
| └───────────── that.js
Par exemple, le fichier ./thing.js
contiendra:
module.exports = require('./src/js/lib/my/thing');
Et vous pouvez donc en avoir besoin comme:
const thing = require('mypackage/thing');
De même, comme indiqué dans le bogue relatif à l'ajout de la propriété mainDir
à package.json
, vous pouvez simplement copier temporairement vos sources et le fichier package.json dans un répertoire et les publier à partir de là.
Dans webpack, vous pouvez spécifier resolve.alias
comme ceci:
{
resolve: {
alias: {
'my': 'my/src'
}
}
}
ou vous pouvez spécifier l'option directions
dans package.json
{
directions: {
'lib': 'src/lib'
}
}