J'utilise npm pour gérer les bibliothèques client jQuery, Bootstrap, Font Awesome et similaires dont j'ai besoin pour mon application ASP.NET Core.
L'approche qui a fonctionné pour moi a commencé par l'ajout d'un fichier package.json au projet, qui ressemble à ceci:
{
"version": "1.0.0",
"name": "myapp",
"private": true,
"devDependencies": {
},
"dependencies": {
"bootstrap": "^3.3.6",
"font-awesome": "^4.6.1",
"jquery": "^2.2.3"
}
}
npm restaure ces packages dans le dossier node_modules qui est au même niveau que wwwroot dans le répertoire du projet:
Comme ASP.NET Core sert les fichiers statiques du dossier wwwroot et que node_modules n'est pas là, j'ai dû apporter quelques modifications pour que cela fonctionne, le premier: ajouter app.UseFileServer juste avant app.UseStaticFiles dans mon démarrage. fichier cs:
app.UseFileServer(new FileServerOptions()
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), @"node_modules")),
RequestPath = new PathString("/node_modules"),
EnableDirectoryBrowsing = true
});
app.UseStaticFiles();
et le second, y compris node_modules dans mes publishOptions dans le fichier project.json:
"publishOptions": {
"include": [
"web.config",
"wwwroot",
"Views",
"node_modules"
]
},
Cela fonctionne dans mon environnement de développement et cela fonctionne également lorsque je le déploie sur mon instance Azure App Service, les fichiers statiques jquery, bootstrap et font-awesome sont bien servis, mais je ne suis pas sûr de cette implémentation.
Quelle est la bonne approche pour y parvenir?
Cette solution est venue après avoir collecté beaucoup d'informations à partir de plusieurs sources et en avoir essayé certaines qui n'ont pas fonctionné, et il semble un peu étrange de devoir servir ces fichiers depuis l'extérieur de wwwroot.
Tout conseil sera grandement apprécié.
la source
Bundler and Minifier
- Spécifiez que la source est Outside wwwroot et lorsque vous construisez, il construit le JS dans wwwroot. C'est la bonne façon. Vous ne devriez pas servir de contenu à partir de node_modulesnode_modules
dossier de manière statique . a) ce n'est pas ainsi que l'éco-système est conçu b) c'est un risque pour la sécurité, l'un de vos packages installés peut fuir des informations sensibles. La bonne façon est de configurer un pipeline de construction (grunt / gulp / node / webpack) qui publie des fichiers dans un dossiersrc
ouwhatever
dédié au service de fichiers frontaux statiquesRéponses:
En publiant votre tout
node_modules
dossier, vous déployez bien plus de fichiers que vous n'en aurez réellement besoin en production.Au lieu de cela, utilisez un exécuteur de tâches dans le cadre de votre processus de génération pour empaqueter les fichiers dont vous avez besoin et les déployer sur votre
wwwroot
dossier. Cela vous permettra également de concaténer et de réduire vos ressources en même temps, plutôt que d'avoir à desservir chaque bibliothèque individuellement.Vous pouvez ensuite supprimer complètement la
FileServer
configuration et vous fier à laUseStaticFiles
place.Actuellement, gulp est le lanceur de tâches VS de choix. Ajoutez un
gulpfile.js
à la racine de votre projet et configurez-le pour traiter vos fichiers statiques lors de la publication.Par exemple, vous pouvez ajouter la
scripts
section suivante à votreproject.json
:Ce qui fonctionnerait avec le gulpfile suivant (par défaut lors de l'échafaudage avec
yo
):la source
node_modules
parce que c'est ce que fait npm. La tâche gulp est nécessaire pour déplacer les choses au bon endroit, c'est-à-dire là où vous en avez réellement besoin. Je pense que le problème est que Microsoft a fourni une si belle intégration avec Bower, mais maintenant Bower est mort (ou du moins mourant) et Microsoft n'a fourni aucun outil alternatif.npm
pour gérer les bibliothèques côté client est un bon choix (par opposition à Bower ou NuGet), vous pensez dans la bonne direction :)FileServer
, ayantStaticFiles
devrait suffire pour servir des fichiers statiques (.js, images, etc.)wwwroot
enpublic
, sinon la structure des dossiers dans Azure Web Apps sera déroutante (D:\Home\site\wwwroot\wwwroot
vsD:\Home\site\wwwroot\public
)node_modules
vers un serveur d'hébergement Web). Voir àtools/deploy.js
titre d'exemple.Visitez ASP.NET Core Starter Kit sur GitHub (avertissement: je suis l'auteur)
la source
Installez le Bundler et le Minifier dans les extensions Visual Studio
Ensuite, vous créez un
bundleconfig.json
et entrez ce qui suit comme:Ainsi, le bundler et le minifier (basés sur gulp) ont accès aux fichiers source (qui doivent être exclus de Visual Studio et également exclus de GIT) et les placent dans wwwroot comme spécifié
seul effet secondaire à chaque fois que vous enregistrez, il l'exécutera (mais vous pouvez le configurer pour l'exécuter manuellement)
la source
Je vous donne deux réponses. npm combiné à d'autres outils est puissant mais nécessite un certain travail de configuration. Si vous souhaitez simplement télécharger certaines bibliothèques, vous souhaiterez peut-être utiliser Library Manager à la place (publié dans Visual Studio 15.8).
NPM (avancé)
Ajoutez d'abord package.json à la racine de votre projet. Ajoutez le contenu suivant:
Cela obligera NPM à télécharger Bootstrap, JQuery et d'autres bibliothèques utilisées dans un nouveau projet principal asp.net dans un dossier nommé node_modules. L'étape suivante consiste à copier les fichiers dans un endroit approprié. Pour ce faire, nous utiliserons gulp, qui a également été téléchargé par NPM. Ajoutez ensuite un nouveau fichier à la racine de votre projet nommé gulpfile.js . Ajoutez le contenu suivant:
Ce fichier contient un code JavaScript qui est exécuté lorsque le projet est généré et nettoyé. Il copiera tous les fichiers nécessaires vers lib2 ( pas lib - vous pouvez facilement changer cela ). J'ai utilisé la même structure que dans un nouveau projet, mais il est facile de changer les fichiers vers un emplacement différent. Si vous déplacez les fichiers, assurez-vous également de mettre à jour _Layout.cshtml . Notez que tous les fichiers du répertoire lib2 seront supprimés lorsque le projet sera nettoyé.
Si vous cliquez avec le bouton droit sur gulpfile.js , vous pouvez sélectionner Task Runner Explorer . De là, vous pouvez exécuter gulp manuellement pour copier ou nettoyer des fichiers.
Gulp pourrait également être utile pour d'autres tâches telles que la réduction des fichiers JavaScript et CSS:
https://docs.microsoft.com/en-us/aspnet/core/client-side/using-gulp?view=aspnetcore-2.1
Gestionnaire de bibliothèque (simple)
Cliquez avec le bouton droit sur votre projet et sélectionnez Gérer les bibliothèques côté client . Le fichier libman.json est maintenant ouvert. Dans ce fichier, vous spécifiez la bibliothèque et les fichiers à utiliser et où ils doivent être stockés localement. Vraiment simple! Le fichier suivant copie les bibliothèques par défaut utilisées lors de la création d'un nouveau projet ASP.NET Core 2.1:
Si vous déplacez les fichiers, assurez-vous également de mettre à jour _Layout.cshtml .
la source
gulpfile.js
àgulp.task('default', function (done) {
puis ajouter une dernière ligne dans cette fonction qui suit:done();
Sinon , je le message d'erreurThe following tasks did not complete: Did you forget to signal async completion?
Au lieu d'essayer de servir le dossier des modules de nœuds, vous pouvez également utiliser Gulp pour copier ce dont vous avez besoin sur wwwroot.
https://docs.asp.net/en/latest/client-side/using-gulp.html
Cela pourrait aussi aider
Visual Studio 2015 ASP.NET 5, tâche Gulp ne copiant pas les fichiers à partir de node_modules
la source
Il existe de nombreuses "bonnes" approches, il vous suffit de décider laquelle correspond le mieux à vos besoins. Il semble que vous ne compreniez pas comment utiliser
node_modules
...Si vous connaissez NuGet, vous devriez penser à npm comme son équivalent côté client. Où le
node_modules
répertoire est comme lebin
répertoire de NuGet . L'idée est que ce répertoire n'est qu'un emplacement commun pour stocker les paquets, à mon avis, il est préférable de prendre undependency
sur les paquets dont vous avez besoin comme vous l'avez fait dans lepackage.json
. Ensuite, utilisez un exécuteur de tâches commeGulp
par exemple pour copier les fichiers dont vous avez besoin dans l'wwwroot
emplacement souhaité .J'ai écrit un article de blog à ce sujet en janvier qui détaille npm , Gulp et tout un tas d'autres détails qui sont toujours pertinents aujourd'hui. De plus, quelqu'un a attiré l'attention sur ma question SO que j'ai posée et m'a finalement répondu ici , ce qui est probablement utile.
J'ai créé un
Gist
qui montre legulpfile.js
comme exemple.Dans votre,
Startup.cs
il est toujours important d'utiliser des fichiers statiques:Cela garantira que votre application peut accéder à ce dont elle a besoin.
la source
Une approche beaucoup plus simple consiste à utiliser le package Nuget OdeToCode.UseNodeModules. Je viens de le tester avec .Net Core 3.0. Tout ce que vous avez à faire est d'ajouter le package à la solution et de le référencer dans la méthode Configure de la classe Startup:
Je l'ai appris grâce à l'excellent cours Construire une application Web avec ASP.NET Core, MVC, Entity Framework Core, Bootstrap et Angular Pluralsight de Shawn Wildermuth.
la source
Shawn Wildermuth a un bon guide ici: https://wildermuth.com/2017/11/19/ASP-NET-Core-2-0-and-the-End-of-Bower
L'article est lié au gulpfile sur GitHub où il a mis en œuvre la stratégie dans l'article. Vous pouvez simplement copier et coller la plupart du contenu de gulpfile dans le vôtre, mais assurez-vous d'ajouter les packages appropriés dans package.json sous devDependencies: gulp gulp-uglify gulp-concat rimraf merge-stream
la source
J'ai trouvé un meilleur moyen de gérer les packages JS dans mon projet avec les exécuteurs de tâches NPM Gulp / Grunt. Je n'aime pas l'idée d'avoir un NPM avec une autre couche de bibliothèque javascript pour gérer l '«automatisation», et mon exigence numéro un est de simplement exécuter la mise à jour de npm sans aucun autre souci si je dois exécuter des trucs gulp, s'il réussit à tout copier et vice versa.
La manière NPM:
La manière python:
la source
Veuillez excuser la longueur de ce message.
Il s'agit d'un exemple de travail utilisant ASP.NET Core version 2.5.
Il est à noter que project.json est obsolète ( voir ici ) au profit de .csproj . Un problème avec .csproj . fichier est la grande quantité de fonctionnalités et le fait qu'il n'y a pas d'emplacement central pour sa documentation ( voir ici ).
Encore une chose, cet exemple exécute ASP.NET core dans un conteneur Docker Linux (Alpine 3.9); donc les chemins refléteront cela. Il utilise également gulp ^ 4.0. Cependant, avec quelques modifications, il devrait fonctionner avec les anciennes versions d'ASP.NET Core, Gulp, NodeJS et également sans Docker.
Mais voici une réponse:
gulpfile.js voir le vrai exemple de travail ici
Ajoutez une cible dans le fichier .csproj . Notez que nous avons également ajouté une montre à surveiller et à exclure si nous profitons de la
dotnet run watch
commande.app.csprod
Maintenant, lorsqu'il
dotnet run build
est exécuté, il installera et construira également des modules de nœuds.la source