javascript - ¿Cómo puedo cargar un módulo de nodo como si el módulo actual estuviera ubicado en otro lugar?
node.js module (5)
Tengo algún código nodejs corriendo en un módulo en algún lugar. Desde este módulo, me gustaría cargar un módulo ubicado en un lugar completamente diferente en el sistema de archivos, por ejemplo, dada la ruta "/another/dir"
y el nombre del módulo "foo"
, me gustaría que Node actúe como si un módulo que se ejecuta en /another/dir
había llamado require("foo")
, en lugar de mi propio módulo.
My code is running here
/some/folder/node_modules/mine/my_module.js
I have the path "/another/dir/", the string "foo",
and want to load this module
/another/dir/node_modules/foo/index.js
En otras palabras, la documentación del módulo se refiere al proceso "requiere (X) del módulo en la ruta Y" , y me gustaría especificar mi propio valor para Y
¿Se puede lograr esto? ¿Si es así, cómo? ¿Si no, porque no?
Un enlace simbólico con enlace npm
Para evitar problemas o modificar el código fuente, usaría el enlace npm , de su ejemplo:
Primero:
cd /another/dir/node_modules/foo # go into the package directory
npm link # creates global link
Esto creará un enlace global para el módulo foo
, en Linux necesita permisos de root para hacer esto.
Entonces:
cd /some/folder/ # go into some other package directory.
npm link foo # link-install the package
/some/folder/package.json
debe contener foo
como un dep, no es obligatorio, sin él npm ls
una advertencia extraneous
con npm ls
:
"dependencies": {
[...]
"foo": "*"
}
No enlace simbólico con NODE_PATH local
¿No te gustan los enlaces simbólicos? Aún puede usar NODE_PATH
pero localmente, en lugar de establecer una variable global como se sugiere @rocketspacer, porque, como él dijo correctamente, no se recomienda usarla globalmente.
Nota : En cualquier caso, usaría una variable de usuario y no una variable de todo el sistema , un compañero de trabajo podría iniciar sesión con un nombre de usuario diferente en la misma máquina y aún así obtener un NODE_PATH
modificado.
Pero para hacer esto localmente por una sola invocación en Linux, simplemente puede llamar:
NODE_PATH=$NODE_PATH:/another/dir/node_modules npm start
Utilizará ese NODE_PATH
solo para esa invocación.
La misma invocación única en Windows:
@ECHO OFF
SET BASE_NODE_PATH=%NODE_PATH%
SET NODE_PATH=%BASE_NODE_PATH%;C:/another/dir/node_modules/
node index.js
SET NODE_PATH=%BASE_NODE_PATH%
Y...
También puede utilizar un departamento local como:
"dependencies": {
"foo": "file:/another/dir/node_modules/foo"
}
Pero requeriría una npm install
y copiaría el contenido de foo
en la carpeta de node_modules
paquete actual.
"requiere (X) del módulo en la ruta Y"
Significa que las llamadas requieren (X) desde un archivo ubicado en la ruta Y. Por lo tanto, prácticamente no se puede cambiar Y.
Aún más, la modificación de module.paths no es oficialmente compatible. Así que no se garantiza que funcione en futuras actualizaciones de nodo.
Introduciendo NODE_PATH
NODE_PATH es una variable de entorno que se establece en una lista de rutas de acceso absolutas delimitadas por dos puntos.
Dentro de esas rutas absolutas, Node.js buscará un módulo que coincida con su declaración de requerimiento cuando todo lo demás haya fallado (después de haber indexado los node_modules hasta la raíz del sistema de archivos y aún no se encontró ninguna coincidencia)
Se admite oficialmente, aunque no se recomienda ya que va en contra de la convención (es posible que su compañero de trabajo no esté al tanto del uso de NODE_PATH , ya que no hay una forma descriptiva de decirlo en su propio proyecto)
Notas:
- En Windows, NODE_PATH está delimitado por punto y coma en lugar de dos puntos.
- Node no busca node_modules dentro de esas rutas como su comportamiento predeterminado, por lo que sus rutas deben estar exactamente donde contiene los módulos necesarios. Por ejemplo: "/ another / dir / node_modules"
https://nodejs.org/api/modules.html#modules_loading_from_the_global_folders
Para aquellos de ustedes que desconocen qué variables de entorno son y cómo configurarlas, tengo una captura de pantalla de Windows que lo ayudará a comenzar
En líneas simples, u puede llamar a su propia carpeta como módulo:
Para eso necesitamos: módulo global y app-module-path.
aquí "App-module-path" es el módulo, le permite agregar directorios adicionales a la ruta de búsqueda del módulo Node.js. Y "global" es, todo lo que adjunte a este objeto estará disponible en todas partes en su aplicación.
Ahora mira este fragmento:
global.appBasePath = __dirname;
require(''app-module-path'').addPath(appBasePath);
__dirname es el directorio actual del nodo. Puede ingresar su propia ruta aquí para buscar la ruta del módulo.
Es bastante fácil de lograr, solo agregue rutas absolutas al objeto de módulo
en su script actual /some/folder/node_modules/mine/my_module.js
agregue esto
module.paths.push(''/another/dir/node_modules'');
//this must be absolute, like /Users/John/another/dir/node_modules
var foo = require(''foo'');
Para la demostración, abra el nodo en la terminal y escriba module.paths
, mostrará todo lo que el nodo de la ruta buscará, solo tiene que agregar la ruta.
Lo más simple, es simplemente resolver la ruta en una ruta absoluta, este será el enfoque recomendado para la mayoría, si no todos los casos.
var path = require(''path'');
var basedir = ''/another/dir'';
var dirname = ''foo'';
var filepath = path.join(basedir, ''node_modules'', filename);
var imports = require(filepath);
Si realmente necesita hacer que actúe como si estuviera en un directorio diferente, puede empujar el directorio base a module.paths
module.paths.unshift(''/another/dir/node_modules'');
var imports = require(''foo'');
module.paths.shift();
module.paths
también pueden modificarse externamente a través de la variable de entorno NODE_PATH
, aunque sería el enfoque menos recomendado, pero esto se aplica globalmente en todos los módulos.