Używam npm do zarządzania bibliotekami klienta jQuery, Bootstrap, Font Awesome i podobnymi potrzebnymi dla mojej aplikacji ASP.NET Core.
Podejście, które zadziałało, zaczęło się od dodania do projektu pliku package.json, który wygląda następująco:
{
"version": "1.0.0",
"name": "myapp",
"private": true,
"devDependencies": {
},
"dependencies": {
"bootstrap": "^3.3.6",
"font-awesome": "^4.6.1",
"jquery": "^2.2.3"
}
}
npm przywraca te pakiety do folderu node_modules, który jest na tym samym poziomie co wwwroot w katalogu projektu:
Ponieważ ASP.NET Core obsługuje pliki statyczne z folderu wwwroot, a node_modules tam nie ma, musiałem wprowadzić kilka zmian, aby to zadziałało, pierwsza: dodanie app.UseFileServer tuż przed app.UseStaticFiles w moim Startup. plik cs:
app.UseFileServer(new FileServerOptions()
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), @"node_modules")),
RequestPath = new PathString("/node_modules"),
EnableDirectoryBrowsing = true
});
app.UseStaticFiles();
a drugi, w tym node_modules w moim publicationOptions w pliku project.json:
"publishOptions": {
"include": [
"web.config",
"wwwroot",
"Views",
"node_modules"
]
},
Działa to w moim środowisku programistycznym i działa również po wdrożeniu go w moim wystąpieniu Azure App Service, pliki statyczne jquery, bootstrap i font-awesome są dobrze obsługiwane, ale nie jestem pewien co do tej implementacji.
Jakie jest właściwe podejście do tego?
To rozwiązanie pojawiło się po zebraniu wielu fragmentów informacji z kilku źródeł i wypróbowaniu niektórych, które nie zadziałały, i wydaje się nieco dziwne, że trzeba je obsługiwać spoza wwwroot.
Wszelkie porady będą bardzo mile widziane.
źródło
Bundler and Minifier
- Określ, że źródło jest poza wwwroot i kiedy budujesz, buduje JS w wwwroot. To jest właściwa droga .. Ty nie należy służąc treści z node_modulesnode_modules
folderu. a) nie tak zaprojektowano ekosystem b) jest to zagrożenie bezpieczeństwa, jeden z zainstalowanych pakietów może ujawnić poufne informacje. Właściwym sposobem jest skonfigurowanie potoku budowania (grunt / gulp / node / webpack), który publikuje pliki w folderzesrc
lubwhatever
przeznaczonym do obsługi statycznych plikówOdpowiedzi:
Publikując cały
node_modules
folder, wdrażasz znacznie więcej plików, niż faktycznie będziesz potrzebować w środowisku produkcyjnym.Zamiast tego użyj modułu uruchamiającego zadania jako części procesu kompilacji, aby spakować wymagane pliki i wdrożyć je w swoim
wwwroot
folderze. Pozwoli to również na jednoczesne łączenie i minifikowanie zasobów, zamiast obsługiwać osobno każdą bibliotekę.Możesz wtedy całkowicie usunąć
FileServer
konfigurację i polegać na niejUseStaticFiles
.Obecnie gulp jest preferowanym narzędziem do uruchamiania zadań VS. Dodaj
gulpfile.js
do katalogu głównego projektu i skonfiguruj go do przetwarzania plików statycznych podczas publikowania.Na przykład możesz dodać następującą
scripts
sekcję do swojegoproject.json
:Który działałby z następującym plikiem gulpfile (domyślnym w przypadku tworzenia szkieletów z
yo
):źródło
node_modules
ponieważ tak właśnie robi npm. Wystarczy łyk, aby przenieść rzeczy we właściwe miejsce, czyli tam, gdzie są faktycznie potrzebne. Myślę, że problem polega na tym, że Microsoft zapewnił tak piękną integrację z Bower, ale teraz Bower nie żyje (lub przynajmniej umiera), a Microsoft nie dostarczył żadnych alternatywnych narzędzi.npm
do zarządzania bibliotekami po stronie klienta jest dobrym wyborem (w przeciwieństwie do Bower czy NuGet), myślisz we właściwym kierunku :)FileServer
, posiadanieStaticFiles
powinno wystarczyć do obsługi plików statycznych (.js, obrazy itp.)wwwroot
napublic
, w przeciwnym razie struktura folderów w Azure Web Apps będzie myląca (wD:\Home\site\wwwroot\wwwroot
porównaniu zD:\Home\site\wwwroot\public
)node_modules
na serwer hostingu sieci Web). Zobacztools/deploy.js
jako przykład.Odwiedź ASP.NET Core Starter Kit w serwisie GitHub (zastrzeżenie: jestem autorem)
źródło
Zainstaluj pakiet Bundler i Minifier w rozszerzeniach programu Visual Studio
Następnie tworzysz
bundleconfig.json
i wpisujesz:Tak więc bundler i minifier (oparte na gulp) mają dostęp do plików źródłowych (które powinny być wykluczone z Visual Studio, a także z GIT) i umieszcza je w wwwroot, jak określono
tylko efekt uboczny za każdym razem, gdy zapiszesz, uruchomi to (ale możesz ustawić, aby uruchamiał go ręcznie)
źródło
Dam dwie odpowiedzi. npm w połączeniu z innymi narzędziami jest potężny, ale wymaga trochę pracy przy konfiguracji. Jeśli chcesz tylko pobrać niektóre biblioteki, możesz zamiast tego użyć Menedżera bibliotek (wydanego w programie Visual Studio 15.8).
NPM (zaawansowane)
Najpierw dodaj package.json do katalogu głównego projektu. Dodaj następującą zawartość:
Spowoduje to, że NPM pobierze biblioteki Bootstrap, JQuery i inne biblioteki używane w nowym podstawowym projekcie asp.net do folderu o nazwie node_modules. Kolejnym krokiem jest skopiowanie plików w odpowiednie miejsce. Aby to zrobić, użyjemy gulpa, który również został pobrany przez NPM. Następnie dodaj nowy plik w katalogu głównym projektu o nazwie gulpfile.js . Dodaj następującą zawartość:
Ten plik zawiera kod JavaScript, który jest wykonywany podczas tworzenia i czyszczenia projektu. Skopiuje wszystkie potrzebne pliki do lib2 ( nie lib - możesz to łatwo zmienić ). Użyłem tej samej struktury, co w nowym projekcie, ale łatwo jest zmienić pliki w inne miejsce. Jeśli przeniesiesz pliki, upewnij się, że zaktualizowałeś również plik _Layout.cshtml . Zauważ, że wszystkie pliki w katalogu lib2 zostaną usunięte po wyczyszczeniu projektu.
Jeśli klikniesz prawym przyciskiem myszy plik gulpfile.js , możesz wybrać opcję Task Runner Explorer . Stąd możesz ręcznie uruchomić gulp, aby skopiować lub wyczyścić pliki.
Gulp może być również przydatny do innych zadań, takich jak minifikacja plików JavaScript i CSS:
https://docs.microsoft.com/en-us/aspnet/core/client-side/using-gulp?view=aspnetcore-2.1
Menedżer bibliotek (prosty)
Kliknij prawym przyciskiem myszy projekt i wybierz Zarządzaj bibliotekami po stronie klienta . Plik libman.json jest teraz otwarty. W tym pliku określasz, która biblioteka i pliki mają być używane i gdzie powinny być przechowywane lokalnie. Naprawdę proste! Poniższy plik kopiuje domyślne biblioteki używane podczas tworzenia nowego projektu ASP.NET Core 2.1:
Jeśli przeniesiesz pliki, upewnij się, że zaktualizowałeś również plik _Layout.cshtml .
źródło
gulpfile.js
na,gulp.task('default', function (done) {
a następnie dodać jako ostatnią linię w tej funkcji:done();
W przeciwnym razie otrzymam komunikat o błędzieThe following tasks did not complete: Did you forget to signal async completion?
Zamiast próbować obsługiwać folder modułów węzłów, możesz również użyć Gulp do skopiowania tego, czego potrzebujesz, do wwwroot.
https://docs.asp.net/en/latest/client-side/using-gulp.html
To też może pomóc
Visual Studio 2015 ASP.NET 5, zadanie Gulp nie kopiuje plików z node_modules
źródło
Istnieje wiele „właściwych” podejść, po prostu musisz zdecydować, które z nich najlepiej odpowiada Twoim potrzebom. Wygląda na to, że nie rozumiesz, jak używać
node_modules
...Jeśli znasz NuGet , powinieneś pomyśleć o npm jako jego odpowiedniku po stronie klienta. Gdzie
node_modules
katalog jest podobny dobin
katalogu dla NuGet . Chodzi o to, że ten katalog jest po prostu wspólną lokalizacją do przechowywania pakietów, moim zdaniem lepiej jest wziąćdependency
na pakiety, których potrzebujesz, tak jak zrobiłeś to wpackage.json
. Następnie użyj programu do uruchamiania zadań, takiego jakGulp
na przykład, aby skopiować potrzebne pliki do wybranejwwwroot
lokalizacji.Napisałem o tym post na blogu w styczniu, który zawiera szczegóły npm , Gulp i całą masę innych szczegółów, które są nadal aktualne. Dodatkowo ktoś zwrócił uwagę na moje pytanie SO, które zadałem i ostatecznie sobie tutaj odpowiedziałem , co prawdopodobnie jest pomocne.
Stworzyłem,
Gist
który pokazujegulpfile.js
jako przykład.W twoim
Startup.cs
nadal ważne jest, aby używać plików statycznych:Zapewni to, że aplikacja będzie miała dostęp do tego, czego potrzebuje.
źródło
Dużo prostszym podejściem jest użycie pakietu OdeToCode.UseNodeModules Nuget. Właśnie przetestowałem to z .Net Core 3.0. Wszystko, co musisz zrobić, to dodać pakiet do rozwiązania i odwołać się do niego w metodzie Configure klasy Startup:
Dowiedziałem się o tym z doskonałego kursu Building a Web App with ASP.NET Core, MVC, Entity Framework Core, Bootstrap i Angular Pluralsight autorstwa Shawna Wildermutha.
źródło
Shawn Wildermuth ma tutaj fajny przewodnik: https://wildermuth.com/2017/11/19/ASP-NET-Core-2-0-and-the-End-of-Bower
Artykuł prowadzi do pliku gulpfile na GitHubie, w którym zaimplementował strategię w artykule. Możesz po prostu skopiować i wkleić większość zawartości pliku gulpfile do swojego, ale pamiętaj, aby dodać odpowiednie pakiety w pliku package.json w sekcji devDependencies: gulp gulp-uglify gulp-concat rimraf merge-stream
źródło
Znalazłem lepszy sposób zarządzania pakietami JS w moim projekcie za pomocą programów uruchamiających zadania NPM Gulp / Grunt. Nie podoba mi się pomysł posiadania NPM z kolejną warstwą biblioteki javascript do obsługi "automatyzacji", a moim najważniejszym wymaganiem jest proste uruchomienie aktualizacji npm bez żadnych innych obaw o to, czy będę musiał uruchamiać gulp, jeśli pomyślnie skopiował wszystko i odwrotnie.
Sposób NPM:
Sposób Pythona:
źródło
Proszę wybaczyć długość tego posta.
To jest działający przykład przy użyciu ASP.NET Core w wersji 2.5.
Warto zauważyć, że plik project.json jest przestarzały ( patrz tutaj ) na rzecz .csproj . Problem z .csproj . plik to duża liczba funkcji i fakt, że nie ma centralnej lokalizacji dla jego dokumentacji ( patrz tutaj ).
Jeszcze jedno, ten przykład uruchamia ASP.NET core w kontenerze Docker Linux (alpine 3.9); więc ścieżki będą to odzwierciedlać. Używa również łyka ^ 4.0. Jednak z pewnymi modyfikacjami powinien działać ze starszymi wersjami ASP.NET Core, Gulp, NodeJS, a także bez Dockera.
Ale oto odpowiedź:
gulpfile.js zobacz tutaj prawdziwy przykład roboczy
Dodaj cel w pliku .csproj . Zauważ, że dodaliśmy również zegarek do obejrzenia i wykluczenia, jeśli skorzystamy
dotnet run watch
polecenia.app.csprod
Teraz po
dotnet run build
uruchomieniu zainstaluje i zbuduje moduły węzłów.źródło