Estoy usando npm para administrar jQuery, Bootstrap, Font Awesome y bibliotecas de cliente similares que necesito para mi aplicación ASP.NET Core.
El enfoque que funcionó para mí comenzó agregando un archivo package.json al proyecto, que se ve así:
{
"version": "1.0.0",
"name": "myapp",
"private": true,
"devDependencies": {
},
"dependencies": {
"bootstrap": "^3.3.6",
"font-awesome": "^4.6.1",
"jquery": "^2.2.3"
}
}
npm restaura estos paquetes en la carpeta node_modules que está en el mismo nivel que wwwroot en el directorio del proyecto:
Como ASP.NET Core sirve los archivos estáticos de la carpeta wwwroot, y node_modules no está allí, tuve que hacer un par de cambios para que esto funcione, el primero: agregar app.UseFileServer justo antes de app.UseStaticFiles en mi Startup. archivo cs:
app.UseFileServer(new FileServerOptions()
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), @"node_modules")),
RequestPath = new PathString("/node_modules"),
EnableDirectoryBrowsing = true
});
app.UseStaticFiles();
y el segundo, que incluye node_modules en mis publishOptions en el archivo project.json:
"publishOptions": {
"include": [
"web.config",
"wwwroot",
"Views",
"node_modules"
]
},
Esto funciona en mi entorno de desarrollo y también funciona cuando lo implemento en mi instancia de Azure App Service, los archivos estáticos jquery, bootstrap y font-awesome se sirven bien, pero no estoy seguro de esta implementación.
¿Cuál es el enfoque correcto para hacer esto?
Esta solución vino después de recopilar muchos bits de información de varias fuentes y probar algunos que no funcionaron, y parece un poco extraño tener que entregar estos archivos desde fuera de wwwroot.
cualquier consejo será apreciado enormemente.
fuente
Bundler and Minifier
- Especificar que la fuente es Fuera de wwwroot y cuando lo construyes, construye el JS en wwwroot. Esa es la forma correcta ... No debería servir contenido de node_modulesnode_modules
carpeta. a) no es así como está diseñado el ecosistema b) es un riesgo de seguridad, uno de sus paquetes instalados podría filtrar información confidencial. La forma correcta es configurar una canalización de construcción (grunt / gulp / node / webpack) que publique archivos en una carpetasrc
owhatever
dedicada a servir archivos frontales estáticosRespuestas:
Publicando todo tu
node_modules
carpeta , está implementando muchos más archivos de los que realmente necesitará en producción.En su lugar, utilice un ejecutor de tareas como parte de su proceso de compilación para empaquetar los archivos que necesita e implementarlos en su
wwwroot
carpeta. Esto también le permitirá concanear y minimizar sus activos al mismo tiempo, en lugar de tener que servir cada biblioteca individual por separado.A continuación, también puede eliminar completamente el
FileServer
configuración y confiar en ellaUseStaticFiles
.Actualmente, gulp es el corredor de tareas VS preferido. Agrega un
gulpfile.js
a la raíz de su proyecto y configúrelo para procesar sus archivos estáticos al publicar.Por ejemplo, puede agregar la siguiente
scripts
sección a suproject.json
:Que funcionaría con el siguiente gulpfile (el predeterminado cuando se hace un andamio con
yo
):fuente
node_modules
porque eso es lo que hace npm. La tarea de tragar es necesaria para mover las cosas al lugar correcto, es decir, donde realmente las necesita. Creo que el problema es que Microsoft proporcionó una integración tan hermosa con Bower, pero ahora Bower está muerto (o al menos muriendo) y Microsoft no ha proporcionado ninguna herramienta alternativa.npm
para administrar bibliotecas del lado del cliente es una buena opción (a diferencia de Bower o NuGet), está pensando en la dirección correcta :)FileServer
, teniendoStaticFiles
debería ser suficiente para servir archivos estáticos (.js, imágenes, etc.)wwwroot
apublic
, de lo contrario, la estructura de carpetas en Azure Web Apps será confusa (D:\Home\site\wwwroot\wwwroot
vsD:\Home\site\wwwroot\public
)node_modules
a un servidor de alojamiento web). Veatools/deploy.js
como ejemplo.Visite ASP.NET Core Starter Kit en GitHub (descargo de responsabilidad: soy el autor)
fuente
Instalar el Bundler y Minifier en Extensiones de Visual Studio
Luego crea un
bundleconfig.json
e ingresa lo siguiente como:Por lo tanto, el empaquetador y el minificador (basado en gulp) tiene acceso a los archivos de origen (que deben excluirse de Visual Studio y también de GIT) y los coloca en wwwroot como se especifica
solo el efecto secundario cada vez que lo guarde ejecutará esto (pero puede configurarlo para que lo ejecute manualmente)
fuente
Te doy dos respuestas. npm combinado con otras herramientas es poderoso pero requiere algo de trabajo para configurarlo. Si solo desea descargar algunas bibliotecas, es posible que desee utilizar el Administrador de bibliotecas lugar (lanzado en Visual Studio 15.8).
NPM (avanzado)
Primero agregue package.json en la raíz de su proyecto. Agrega el siguiente contenido:
Esto hará que NPM descargue Bootstrap, JQuery y otras bibliotecas que se utilizan en un nuevo proyecto principal de asp.net en una carpeta llamada node_modules. El siguiente paso es copiar los archivos en un lugar apropiado. Para hacer esto usaremos gulp, que también fue descargado por NPM. Luego agregue un nuevo archivo en la raíz de su proyecto llamado gulpfile.js . Agrega el siguiente contenido:
Este archivo contiene un código JavaScript que se ejecuta cuando el proyecto se crea y se limpia. Copiará todos los archivos necesarios en lib2 ( no lib; puede cambiarlo fácilmente ). He usado la misma estructura que en un proyecto nuevo, pero es fácil cambiar archivos a una ubicación diferente. Si mueve los archivos, asegúrese de actualizar también _Layout.cshtml . Tenga en cuenta que todos los archivos del directorio lib2 se eliminarán cuando se limpie el proyecto.
Si hace clic derecho en gulpfile.js , puede seleccionar Task Runner Explorer . Desde aquí puede ejecutar gulp manualmente para copiar o limpiar archivos.
Gulp también podría ser útil para otras tareas como minificar archivos JavaScript y CSS:
https://docs.microsoft.com/en-us/aspnet/core/client-side/using-gulp?view=aspnetcore-2.1
Administrador de biblioteca (simple)
Haga clic con el botón derecho en su proyecto y seleccione Administrar bibliotecas del lado del cliente . El archivo libman.json ahora está abierto. En este archivo, especifica qué biblioteca y archivos usar y dónde deben almacenarse localmente. ¡Realmente simple! El siguiente archivo copia las bibliotecas predeterminadas que se usan al crear un nuevo proyecto ASP.NET Core 2.1:
Si mueve los archivos, asegúrese de actualizar también _Layout.cshtml .
fuente
gulpfile.js
degulp.task('default', function (done) {
y luego añadir como última línea en esa función la siguiente:done();
De lo contrario me gustaría conseguir el mensaje de errorThe following tasks did not complete: Did you forget to signal async completion?
En lugar de intentar servir la carpeta de módulos de nodo, también puede usar Gulp para copiar lo que necesita en wwwroot.
https://docs.asp.net/en/latest/client-side/using-gulp.html
Esto también podría ayudar
Visual Studio 2015 ASP.NET 5, la tarea Gulp no copia archivos de node_modules
fuente
Hay muchos enfoques "correctos", solo tiene que decidir cuál se adapta mejor a sus necesidades. Parece que no está entendiendo cómo usar
node_modules
...Si está familiarizado con NuGet , debería pensar en npm como su contraparte del lado del cliente. Donde el
node_modules
directorio es como elbin
directorio de NuGet . La idea es que este directorio sea solo una ubicación común para almacenar paquetes, en mi opinión es mejor tomardependency
los paquetes que necesita como lo ha hecho en elpackage.json
. Luego use un corredor de tareas como,Gulp
por ejemplo, para copiar los archivos que necesita en lawwwroot
ubicación deseada .Escribí una publicación de blog sobre esto en enero que detalla npm , Gulp y un montón de otros detalles que aún son relevantes hoy. Además, alguien llamó la atención sobre mi pregunta SO que hice y finalmente me respondí aquí , lo que probablemente sea útil.
Creé un
Gist
que muestragulpfile.js
como ejemplo.En su
Startup.cs
sigue siendo importante utilizar archivos estáticos:Esto asegurará que su aplicación pueda acceder a lo que necesita.
fuente
Un enfoque mucho más simple es usar el paquete OdeToCode.UseNodeModules Nuget. Lo acabo de probar con .Net Core 3.0. Todo lo que necesita hacer es agregar el paquete a la solución y hacer referencia a él en el método Configure de la clase Startup:
Lo aprendí del excelente curso Creación de una aplicación web con ASP.NET Core, MVC, Entity Framework Core, Bootstrap y Angular Pluralsight de Shawn Wildermuth.
fuente
Shawn Wildermuth tiene una buena guía aquí: https://wildermuth.com/2017/11/19/ASP-NET-Core-2-0-and-the-End-of-Bower
El artículo enlaza con el archivo gulp en GitHub donde implementó la estrategia en el artículo. Puede copiar y pegar la mayor parte del contenido del archivo gulp en el suyo, pero asegúrese de agregar los paquetes apropiados en package.json en devDependencies: gulp gulp-uglify gulp-concat rimraf merge-stream
fuente
Encontré una mejor manera de administrar los paquetes JS en mi proyecto con los corredores de tareas NPM Gulp / Grunt. No me gusta la idea de tener un NPM con otra capa de biblioteca javascript para manejar la "automatización", y mi requisito número uno es simplemente ejecutar la actualización npm sin ninguna otra preocupación si necesito ejecutar gulp. si copió todo con éxito y viceversa.
La forma NPM:
La forma de Python:
fuente
Disculpe la longitud de esta publicación.
Este es un ejemplo funcional con ASP.NET Core versión 2.5.
Algo a destacar es que project.json está obsoleto ( ver aquí ) a favor de .csproj . Un problema con .csproj . archivo es la gran cantidad de funciones y el hecho de que no hay una ubicación central para su documentación ( ver aquí ).
Una cosa más, este ejemplo es ejecutar ASP.NET core en un contenedor Docker Linux (alpine 3.9); para que los caminos reflejen eso. También usa gulp ^ 4.0. Sin embargo, con algunas modificaciones, debería funcionar con versiones anteriores de ASP.NET Core, Gulp, NodeJS y también sin Docker.
Pero aquí tienes una respuesta:
gulpfile.js vea el ejemplo de trabajo real aquí
Agregue un destino en el archivo .csproj . Tenga en cuenta que también agregamos un reloj para ver y excluir si aprovechamos
dotnet run watch
comando.app.csprod
Ahora, cuando
dotnet run build
se ejecute, también instalará y creará módulos de nodo.fuente