Tengo una pregunta sobre las mejores prácticas para incluir node_modules
en un sitio web HTML.
Imagina que tengo Bootstrap dentro de mi node_modules
carpeta. Ahora, para la versión de producción del sitio web, ¿cómo incluiría el script Bootstrap y los archivos CSS ubicados dentro de la node_modules
carpeta? ¿Tiene sentido dejar Bootstrap dentro de esa carpeta y hacer algo como lo siguiente?
<script src="./node_modules/bootstrap/dist/bootstrap.min.js"></script>
¿O tendría que agregar reglas a mi archivo Gulp que luego copiar esos archivos en mi carpeta dist? ¿O sería mejor dejar que Gulp elimine por completo el bootstrap local de mi archivo HTML y reemplazarlo con la versión CDN?
Respuestas:
Por lo general, no desea exponer ninguna de sus rutas internas de cómo está estructurado su servidor al mundo exterior. Lo que puede hacer es hacer una
/scripts
ruta estática en su servidor que recupere sus archivos de cualquier directorio en el que residan. Entonces, si sus archivos están en"./node_modules/bootstrap/dist/"
. Luego, la etiqueta del script en sus páginas se ve así:Si estaba utilizando express con nodejs, una ruta estática es tan simple como esta:
Luego, cualquier solicitud del navegador se
/scripts/xxx.js
obtendrá automáticamente de sudist
directorio en__dirname + /node_modules/bootstrap/dist/xxx.js
.Nota: Las versiones más nuevas de NPM ponen más cosas en el nivel superior, no anidadas tan profundamente, por lo que si está utilizando una versión más nueva de NPM, los nombres de ruta serán diferentes a los indicados en la pregunta del OP y en la respuesta actual. Pero, el concepto sigue siendo el mismo. A averiguar donde los archivos están ubicados físicamente en la unidad de servidor y de hacer una
app.use()
conexpress.static()
para hacer un pseudo-camino a esos archivos para que no se está exponiendo a la organización del sistema de archivos del servidor real para el cliente.Si no desea hacer una ruta estática como esta, entonces probablemente sea mejor que simplemente copie los scripts públicos en una ruta que su servidor web trate como
/scripts
o la designación de nivel superior que desee usar. Por lo general, puede hacer que esta copia sea parte de su proceso de compilación / implementación.Si desea hacer público solo un archivo en particular en un directorio y no todo lo que se encuentra en ese directorio, puede crear manualmente rutas individuales para cada archivo en lugar de utilizarlo
express.static()
como:Y el código para crear una ruta para eso
O, si aún desea delinear rutas para scripts
/scripts
, puede hacer esto:Y el código para crear una ruta para eso
fuente
/scripts
porque de esa manera se mantendrían las dependencias dentro del módulo.express.static()
envía la primera coincidencia que encuentra. Como cadaexpress.static()
declaración solo crea una ruta de coincidencia posible, no debe haber duplicados de unaexpress.static()
declaración. Si tiene variasexpress.static()
declaraciones de que cada una podría tener una coincidencia, entonces la primera en su código es aquella cuya coincidencia se utilizará. Además, realmente no debería tener varios archivos con el mismo nombre y ruta relativa a los que puedan acceder lasexpress.static()
declaraciones. La mejor práctica es no hacer eso.express.static()
a un directorio que SOLO contenga archivos públicos (incluya subdirectorios). Por lo tanto, no puedo imaginar un proyecto en el que sedist
publicaran muchos directorios. Eso me parece muy inusual. Quizás desee hacer una ruta específica a un archivo específico o a 2-3 archivos. En ese caso, usted es responsable de desambiguar esos archivos. Descript.js
todos modos, no te hará ningún bien tener cuatro archivos./script.js
el navegador lo solicita. Entonces, la respuesta abstracta es que no debe permitir que exista la situación de nombres de archivo duplicados porque no es un problema solucionable a menos que requiera un prefijo único para cada directorio de archivos. Entonces, los nombres raíz duplicados no son un problema de todos modos. Para obtener una respuesta más específica con una recomendación detallada, deberá publicar su propia pregunta con detalles exactos.Usaría el módulo path npm y luego haría algo como esto:
IMPORTANTE: utilizamos path.join para hacer que las rutas se unan de manera independiente del sistema, es decir, en Windows y Unix tenemos diferentes separadores de ruta (/ y)
fuente
Como mencionó jfriend00, no debe exponer la estructura de su servidor. Puede copiar los archivos de dependencia de su proyecto a algo así
public/scripts
. Puede hacer esto muy fácilmente con dep-linker como este:fuente
src
s serán algo así como/scripts/[package-name]/dist/file.min.js
.Si desea una solución rápida y fácil (y tiene un trago instalado).
En mi
gulpfile.js
, ejecuto una tarea simple de copiar y pegar que coloca todos los archivos que pueda necesitar en el./public/modules/
directorio.La desventaja de esto es que no está automatizado. Sin embargo, si todo lo que necesita son algunos scripts y estilos copiados (y guardados en una lista), esto debería hacer el trabajo.
fuente
'scripts': {'install':'yarn gulp copy-modules'}
, suponiendo que yarn es el administrador de paquetes y gulp está instalado en el paquete.El directorio 'node_modules' puede no estar en el directorio actual, por lo que debe resolver la ruta dinámicamente.
fuente
Quiero actualizar esta pregunta con una solución más fácil. Cree un enlace simbólico a node_modules.
La forma más fácil de otorgar acceso público a node_modules es crear un enlace simbólico que apunte a sus node_modules desde su directorio público. El enlace simbólico hará que los archivos existan donde se cree el enlace.
Por ejemplo, si el servidor de nodo tiene código para servir archivos estáticos
y __dirname se refiere a / path / to / app para que sus archivos estáticos se sirvan desde / path / to / app / dist
y node_modules está en / path / to / app / node_modules, luego cree un enlace simbólico como este en mac / linux:
o así en windows:
Ahora una solicitud de obtención de:
recibirá una respuesta con el archivo en
que es realmente el archivo en
Si su directorio en / path / to / app / dist no es una ubicación segura, quizás debido a la interferencia de un proceso de compilación con gulp o gruñido, entonces puede agregar un directorio separado para el enlace y agregar una nueva llamada serveStatic como:
y en el nodo agregar:
fuente
No encontré ninguna solución limpia (no quiero exponer la fuente de todos mis node_modules), así que simplemente escribí un script de Powershell para copiarlos:
fuente
Hice los siguientes cambios para INCLUIR AUTOMÁTICAMENTE los archivos en el índice html. De modo que cuando agrega un archivo en la carpeta, se recogerá automáticamente de la carpeta, sin tener que incluir el archivo en index.html
fuente
Esto es lo que configuré en mi
express
servidor:Buena suerte...
fuente