Me gustaría solicitar mis archivos siempre por la raíz de mi proyecto y no en relación con el módulo actual.
Por ejemplo, si mira https://github.com/visionmedia/express/blob/2820f2227de0229c5d7f28009aa432f9f3a7b5f9/examples/downloads/app.js línea 6 verá
express = require('../../')
Eso es realmente malo OMI. Imagine que me gustaría poner todos mis ejemplos más cerca de la raíz solo en un nivel. Eso sería imposible, porque tendría que actualizar más de 30 ejemplos y muchas veces dentro de cada ejemplo. A esto:
express = require('../')
Mi solución sería tener un caso especial para raíz basada: si una cadena comienza con un $, entonces es relativa a la carpeta raíz del proyecto.
Cualquier ayuda es apreciada, gracias
Actualización 2
Ahora estoy usando require.js que le permite escribir de una manera y funciona tanto en el cliente como en el servidor. Require.js también te permite crear rutas personalizadas.
Actualización 3
Ahora me mudé a webpack + gulp y uso el requerimiento mejorado para manejar módulos en el lado del servidor. Vea aquí la justificación: http://hackhat.com/p/110/module-loader-webpack-vs-requirejs-vs-browserify/
Respuestas:
Y que hay con:
Requiere el archivo como si fuera necesario desde el archivo js principal, por lo que funciona bastante bien siempre que su archivo js principal esté en la raíz de su proyecto ... y eso es algo que agradezco.
fuente
Hay una sección realmente interesante en el Manual de Browserify :
fuente
node_modules
carpeta es que hace que sea más difícil nukear larm -rf node_modules
carpeta ( )git clean
sintaxis, siempre se puederm -rf node_modules && git checkout node_modules
: asegúrese de quegit stash
haya cambios en losnode_modules
subdirectorios.Me gusta hacer una nueva
node_modules
carpeta para el código compartido, luego dejar que node y require hagan lo que mejor sabe hacer.por ejemplo:
Por ejemplo, si estás dentro
car/index.js
, puedesrequire('helper')
y el nodo lo encontrará.Cómo funcionan los node_modules
El nodo tiene un algoritmo inteligente para resolver módulos que es único entre las plataformas rivales.
Si eres
require('./foo.js')
de/beep/boop/bar.js
, el nodo buscará./foo.js
en/beep/boop/foo.js
. Las rutas que comienzan con./
o../
siempre son locales al archivo que llamarequire()
.Sin embargo, si necesita un nombre no relativo como
require('xyz')
from/beep/boop/foo.js
, el nodo busca estas rutas en orden, deteniéndose en la primera coincidencia y generando un error si no se encuentra nada:Para cada
xyz
directorio que existe, el nodo primero buscará unxyz/package.json
para ver si"main"
existe un campo. El"main"
campo define qué archivo debe encargarse sirequire()
la ruta del directorio.Por ejemplo, si
/beep/node_modules/xyz
es el primer partido y/beep/node_modules/xyz/package.json
tiene:entonces las exportaciones de
/beep/node_modules/xyz/lib/abc.js
serán devueltas porrequire('xyz')
.Si no hay
package.json
o no hay"main"
campo,index.js
se supone:fuente
El panorama
Parece "realmente malo" pero dale tiempo. Es, de hecho, realmente bueno. Los
require()
s explícitos brindan una total transparencia y facilidad de comprensión que es como un soplo de aire fresco durante el ciclo de vida de un proyecto.Piénselo de esta manera: está leyendo un ejemplo, sumergiendo los dedos de los pies en Node.js y ha decidido que es "realmente una mala OMI". Ustedes son líderes dudosos de la comunidad Node.js, personas que han registrado más horas escribiendo y manteniendo aplicaciones Node.js que nadie. ¿Cuál es la posibilidad de que el autor haya cometido un error tan novato? (Y estoy de acuerdo, desde mi experiencia en Ruby y Python, al principio parece un desastre).
Hay muchas exageraciones y contra-exageraciones en torno a Node.js. Pero cuando el polvo se asiente, reconoceremos que los módulos explícitos y los paquetes "locales primero" fueron un importante impulsor de la adopción.
El caso comun
Por supuesto,
node_modules
desde el directorio actual, se busca el padre, el abuelo, el bisabuelo, etc. Entonces, los paquetes que ha instalado ya funcionan de esta manera. Por lo general, puederequire("express")
hacerlo desde cualquier parte de su proyecto y funciona bien.Si se encuentra cargando archivos comunes desde la raíz de su proyecto (tal vez porque son funciones de utilidad comunes), entonces esa es una gran pista de que es hora de hacer un paquete. Los paquetes son muy simples: mueva sus archivos
node_modules/
y colóquelospackage.json
allí. Voila! Se puede acceder a todo en ese espacio de nombres desde todo su proyecto. Los paquetes son la forma correcta de llevar su código a un espacio de nombres global.Otras soluciones
Yo personalmente no uso estas técnicas, pero sí responden a tu pregunta, y por supuesto conoces tu propia situación mejor que yo.
Puede configurar
$NODE_PATH
la raíz de su proyecto. Ese directorio se buscará cuando ustedrequire()
.A continuación, podría comprometer y requerir un archivo local común de todos sus ejemplos. Ese archivo común simplemente reexporta el archivo verdadero en el directorio de abuelos.
examples / downloads / app.js (y muchos otros como este)
ejemplos / descargas / express.js
Ahora, cuando reubica esos archivos, el peor de los casos es arreglar el módulo de una cuña .
fuente
Echa un vistazo a node-rfr .
Es tan simple como esto:
fuente
Si usa hilo en lugar de npm , puede usar espacios de trabajo .
Digamos que tengo una carpeta
services
que deseo requerir más fácilmente:Para crear un espacio de trabajo de Yarn, cree un
package.json
archivo dentro deservices folder
:En su paquete principal.json agregue:
Ejecutar
yarn install
desde la raíz del proyecto.Luego, en cualquier parte de su código, puede hacer:
en lugar de algo como:
fuente
En mi humilde opinión, la forma más fácil es definir su propia función como parte del
GLOBAL
objeto. CreeprojRequire.js
en la raíz de su proyecto con los siguientes contenidos:En su archivo principal antes de
require
incorporar cualquiera de los módulos específicos del proyecto:Después de eso, lo siguiente funciona para mí:
@Totty, he encontrado otra solución que podría funcionar para el caso que describiste en los comentarios. La descripción será
tl;dr
, así que mejor muestro una imagen con la estructura de mi proyecto de prueba .fuente
prj/some
deprj/other
(recién probadorequire('prj/some'
). Todos los módulos comunes de su aplicación pueden ir allí (por ejemplo, la capa de base de datos). No hará ninguna diferencia en sus, digamos,lib
es. Intenta ver si es adecuado.Yo uso
process.cwd()
en mis proyectos. Por ejemplo:Vale la pena señalar que esto dará como resultado
require
un camino absoluto, aunque aún no he tenido problemas con esto.fuente
Hay una buena discusión sobre este tema aquí .
Me encontré con el mismo problema arquitectónico: querer una forma de darle a mi aplicación más organización y espacios de nombres internos, sin:
Al final, decidí organizar mi código usando convenciones de nomenclatura de archivos en lugar de directorios. Una estructura se vería algo así como:
Luego en código:
o solo
y dependencias externas están disponibles desde node_modules como de costumbre:
De esta manera, todo el código de la aplicación se organiza jerárquicamente en módulos y está disponible para todos los demás códigos relativos a la raíz de la aplicación.
La principal desventaja es, por supuesto, que en un explorador de archivos, no puede expandir / colapsar el árbol como si realmente estuviera organizado en directorios. Pero me gusta que sea muy explícito acerca de dónde proviene todo el código, y no usa ninguna 'magia'.
fuente
../x/x
que ya es legible.Suponiendo que la raíz de su proyecto es el directorio de trabajo actual, esto debería funcionar:
fuente
config = require('./config.js');
También es válido.He probado muchas de estas soluciones. Terminé agregando esto a la parte superior de mi archivo principal (por ejemplo, index.js):
Esto agrega la raíz del proyecto a NODE_PATH cuando se carga el script. El me permite requerir cualquier archivo en mi proyecto haciendo referencia a su ruta relativa desde la raíz del proyecto como
var User = require('models/user')
. Esta solución debería funcionar siempre que esté ejecutando un script principal en la raíz del proyecto antes de ejecutar cualquier otra cosa en su proyecto.fuente
Algunas de las respuestas dicen que la mejor manera es agregar el código al nodo_módulo como un paquete, estoy de acuerdo y es probablemente la mejor manera de perder el
../../../
requerimiento, pero ninguno de ellos brinda una forma de hacerlo.desde la versión
2.0.0
, puede instalar un paquete desde archivos locales, lo que significa que puede crear una carpeta en su raíz con todos los paquetes que desee,así que en package.json puede agregar
modules
(ofoo
ybar
) como un paquete sin publicar o usar un servidor externo como este:Después de eso, puede hacerlo
npm install
, y puede acceder al código convar foo = require("foo")
, como lo hace con todos los demás paquetes.Aquí se puede encontrar más información :
https://docs.npmjs.com/files/package.json#local-paths
y aquí cómo crear un paquete:
https://docs.npmjs.com/getting-started/creating-node-modules
fuente
Podrías usar un módulo que hice, Undot . No es nada avanzado, solo un ayudante para que puedas evitar esos infierno de puntos con simplicidad.
Ejemplo:
fuente
Podría definir algo como esto en su app.js:
y luego, cada vez que desee requerir algo de la raíz, sin importar dónde se encuentre, simplemente use requireFromRoot en lugar del require vanilla. Funciona bastante bien para mí hasta ahora.
fuente
requireFromRoot = ((root) => (resource) => require(`${root}/${resource}`))(__dirname);
. Me encanta la solución, pero ¿realmente tienes que unir __dirname así?require
funciona esto?Esta es la forma en que lo estoy haciendo durante más de 6 meses. Utilizo una carpeta llamada node_modules como mi carpeta raíz en el proyecto, de esta manera siempre buscará esa carpeta en todas partes que llamo un requerimiento absoluto:
Esto es más útil cuando está anidado en carpetas y es mucho menos trabajo cambiar la ubicación de un archivo si está configurado de manera absoluta. Solo uso 2 los requisitos relativos en toda mi aplicación .
fuente
node_modules
en/src
, y dejar/node_modules
a los vendedores para mantener las cosas separadas. Así que tengo/src/node_modules
para el código local y/node_modules
para los vendedores.NODE_PATH
variable de entornoEn mi opinión, la forma más fácil de lograr esto es mediante la creación de un enlace simbólico en el inicio de la aplicación
node_modules/app
(o como se llame) que apunta../app
. Entonces puedes simplemente llamarrequire("app/my/module")
. Los enlaces simbólicos están disponibles en todas las plataformas principales.Sin embargo, aún debe dividir sus cosas en módulos más pequeños y fáciles de mantener que se instalan a través de npm. También puede instalar sus módulos privados a través de git-url, por lo que no hay razón para tener un directorio de aplicaciones monolítico.
fuente
En su propio proyecto, puede modificar cualquier archivo .js que se use en el directorio raíz y agregar su ruta a una propiedad de la
process.env
variable. Por ejemplo:Luego puede acceder a la propiedad desde cualquier lugar:
fuente
Otra respuesta:
Imagina esta estructura de carpetas:
pruebas
Luego, en test.js , debe requerir archivos como este:
y en main.js :
Ahora puede usar babel y babel-plugin-module-resolver con esto. archivo babelrc para configurar 2 carpetas raíz:
Ahora puede requerir archivos de la misma manera en pruebas y en src :
y si quieres usar la sintaxis del módulo es6 :
luego importas archivos en pruebas y src como este:
fuente
Acabo de encontrar este artículo que menciona app-module-path . Le permite configurar una base como esta:
fuente
No podría el
examples
directorio de contener unanode_modules
con un enlace simbólico a la raíz del proyectoproject -> ../../
permitiendo así que los ejemplos de usorequire('project')
, aunque esto no elimina el mapeo, sí permite a la fuente a utilizarrequire('project')
en lugar derequire('../../')
.He probado esto y funciona con v0.6.18.
Listado de
project
directorio:El contenido de
index.js
asigna un valor a una propiedad delexports
objeto e invocaconsole.log
con un mensaje que indica que fue requerido. El contenido detest.js
esrequire('project')
.fuente
require('project.a')
? Creo que eso podría significarrequire('project/a')
, aunquerequire('project').a
también es posible?node_modules
directorio en el padre más cercano de ambos archivos y el enlace sería el mismo para ambos. Ver nodejs.org/api/…project/node_modules/project -> ../
.Si alguien está buscando otra forma de solucionar este problema, esta es mi propia contribución al esfuerzo:
La idea básica: crea un archivo JSON en la raíz del proyecto que asigna tus rutas de archivo a nombres abreviados (u obtienes use-automapper para que lo haga por ti). Luego puede solicitar sus archivos / módulos con esos nombres. Al igual que:
Entonces ahí está eso.
fuente
Lo que me gusta hacer es aprovechar cómo se carga el nodo desde el directorio node_module para esto.
Si uno intenta cargar la "cosa" del módulo, haría algo como
Node buscará el directorio 'thing' en el directorio 'node_module'.
Dado que node_module está normalmente en la raíz del proyecto, podemos aprovechar esta coherencia. (Si node_module no está en la raíz, entonces tiene que lidiar con otros dolores de cabeza autoinducidos).
Si entramos en el directorio y luego salimos de él, podemos obtener una ruta coherente a la raíz del proyecto de nodo.
Entonces, si queremos acceder al directorio / happy, haremos esto.
Aunque es bastante hacky, creo que si cambia la funcionalidad de la carga de node_modules, habrá problemas más grandes con los que lidiar. Este comportamiento debe permanecer consistente.
Para aclarar las cosas, hago esto, porque el nombre del módulo no importa.
Lo usé recientemente para angular2. Quiero cargar un servicio desde la raíz.
fuente
src/app/my.service
, también puede configurar VSC para usar importaciones no relativas para archivos de mecanografía.Escribí este pequeño paquete que le permite solicitar paquetes por su ruta relativa desde la raíz del proyecto, sin introducir ninguna variable global o anular los valores predeterminados del nodo
https://github.com/Gaafar/pkg-require
Funciona así
fuente
Solo quiero seguir la gran respuesta de Paolo Moretti y Browserify. Si está utilizando un transpilador (por ejemplo, babel, mecanografiado) y tiene carpetas separadas para el código fuente y el código transpilado como
src/
ydist/
, podría usar una variación de las soluciones comonodo_módulos
Con la siguiente estructura de directorios:
entonces puede dejar que babel, etc. transpile
src
directorio adist
directorio.enlace simbólico
Con el enlace simbólico podemos eliminar algunos niveles de anidamiento:
Una advertencia con babel --copy-files La
--copy-files
bandera debabel
no trata bien los enlaces simbólicos. Puede seguir navegando en el..
enlace simbólico y ver recusivamente archivos interminables. Una solución alternativa es usar la siguiente estructura de directorios:De esta manera, el código debajo
src
aún se habráapp
resueltosrc
, mientras que Babel ya no verá enlaces simbólicos.fuente
Estaba buscando exactamente la misma simplicidad para requerir archivos de cualquier nivel y encontré un alias de módulo .
Solo instale:
Abra su archivo package.json, aquí puede agregar alias para sus rutas, por ejemplo
Y usa tus alias simplemente:
fuente
Creé un módulo de nodo llamado "rekiure"
le permite requerir sin el uso de rutas relativas
es super fácil de usar
fuente
Estamos a punto de probar una nueva forma de abordar este problema.
Tomando ejemplos de otros proyectos conocidos como spring y guice, definiremos un objeto de "contexto" que contendrá toda la declaración "require".
Este objeto se pasará a todos los demás módulos para su uso.
Por ejemplo
Esto requiere que escribamos cada módulo como una función que recibe opciones, lo que nos parece una mejor práctica de todos modos.
y luego te referirás al contexto en lugar de requerir cosas.
var module1Ref = context.moduel1;
Si lo desea, puede escribir fácilmente un bucle para hacer las declaraciones requeridas
Esto debería hacer la vida más fácil cuando quieres simular (pruebas) y también resuelve tu problema en el camino mientras haces que tu código sea reutilizable como un paquete.
También puede reutilizar el código de inicialización de contexto separando la declaración de beans. por ejemplo, su
main.js
archivo podría verse asíEste método también se aplica a bibliotecas externas, no es necesario codificar sus nombres cada vez que los requerimos; sin embargo, requerirá un tratamiento especial ya que sus exportaciones no son funciones que esperen contexto.
Más adelante también podemos definir beans como funciones, lo que nos permitirá
require
diferentes módulos de acuerdo con el entorno, pero fuera del alcance de este hilo.fuente
Estaba teniendo problemas con este mismo problema, así que escribí un paquete llamado include .
Incluya identificadores para averiguar la carpeta raíz de su proyecto a través de la ubicación de su archivo package.json, luego pase el argumento de ruta que le da al require nativo () sin todo el desorden de ruta relativo. Me imagino que esto no es un reemplazo de require (), sino una herramienta para requerir el manejo de archivos o bibliotecas no empaquetadas / de terceros. Algo como
Espero que esto pueda ser útil.
fuente
Si el archivo js del punto de entrada de su aplicación (es decir, en el que realmente ejecuta "nodo") está en el directorio raíz del proyecto, puede hacerlo realmente fácilmente con el módulo rootpath npm . Simplemente instálelo a través de
... luego, en la parte superior del archivo js del punto de entrada, agregue:
A partir de ese momento, todas las llamadas requeridas ahora son relativas a la raíz del proyecto, por ejemplo, se
require('../../../config/debugging/log');
convierte enrequire('config/debugging/log');
(donde la carpeta de configuración está en la raíz del proyecto).fuente
En líneas simples, puede llamar a su propia carpeta como módulo:
Para eso necesitamos: módulo global y de módulo de ruta de aplicación
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 que todo lo que adjunte a este objeto estará disponible en todas partes en su aplicación.
Ahora eche un vistazo a este fragmento:
__dirname es el directorio actual en ejecución del nodo. Puede dar su propia ruta aquí para buscar la ruta del módulo.
fuente