Mi pregunta se refiere a una biblioteca existente que deseo publicar como módulo NPM. La biblioteca ya está en uso y actualmente require d a través del sistema de archivos local.
¿Cómo puedo especificar el directorio raíz de los archivos de mi módulo?
Si tengo una estructura como:
. ├── package.json ├── src | ├── js | └────── lib | └───────── my | └───────────── thing.js | └───────────── that.js ¿Cómo especifico que la raíz de mi módulo y los archivos accesibles son src/js/lib/my/ ?
Me gustaría usar lo siguiente de un proyecto externo:
var thing = require('my/thing'), that = require('my/that'); Vi la propiedad "files" en package.json, ¿es este el camino correcto?
El problema que sugiere mainDir ahora está cerrado. En su lugar, hay un nuevo campo llamado exports que se puede usar casi como mapas de importación para asignar una carpeta a un alias de exportación:
// ./node_modules/es-module-package/package.json { "exports": { "./my/": "./src/js/lib/my/" } } import thing from 'es-module-package/my/thing.js'; // Loads ./node_modules/es-module-package/src/js/lib/my/thing.js Como se sugiere en el problema vinculado en la respuesta original a continuación, es posible asignar la raíz a una carpeta para acceder a la import thing from pkg/thing.js de la siguiente manera:
{ "type": "module", "main": "./dist/index.js", "exports": { "./": "./src/js/lib/my/" } }Para una solución nativa, vea este problema de nodo https://github.com/nodejs/node/issues/14970
La solicitud de función sugiere un campo mainDir en el archivo package.json junto a main.
Cuanta más gente vote, más rápido/más probable será implementado
Como dice el documento :
El campo principal es un ID de módulo que es el punto de entrada principal a su programa.
Entonces tendrá algo como "main": "src/js/lib/my/app.js" en su archivo package.json.
Le sugiero que cree un archivo app.js y module.exports sus diferentes hijos. Por ejemplo:
module.exports.thing = require('./thing'); module.exports.that = require('./that');Y úsalos así:
var mylib = require('mylib') , thing = mylib.thing , that = mylib.that;package.json es principalmente un archivo utilizado por npm para instalar y administrar dependencias.
A la construcción require no le importa mucho el package.json , por lo que no podrá usarlo para subvertir la forma en require funciona y hacer creer que los paquetes no están donde el esquema de carga require los espera.
Consulte la documentación en https://nodejs.org/api/modules.html y el esquema de carga aquí: https://nodejs.org/api/modules.html#modules_all_together
tal vez podría usar la técnica que la documentación llama 'Cargar desde las carpetas globales' y definir la variable de entorno NODE_PATH .
pero le aconsejo que se adhiera a una forma más estándar: - coloque sus módulos en un directorio node_modules - o inicie su jerarquía de módulos en el mismo directorio donde se encuentra su app.js o index.js