Я использую npm для управления jQuery, Bootstrap, Font Awesome и аналогичными клиентскими библиотеками, которые мне нужны для моего приложения ASP.NET Core.
Подход, который сработал для меня, начался с добавления в проект файла package.json, который выглядит так:
{
"version": "1.0.0",
"name": "myapp",
"private": true,
"devDependencies": {
},
"dependencies": {
"bootstrap": "^3.3.6",
"font-awesome": "^4.6.1",
"jquery": "^2.2.3"
}
}
npm восстанавливает эти пакеты в папку node_modules, которая находится на том же уровне, что и wwwroot в каталоге проекта:
Поскольку ASP.NET Core обслуживает статические файлы из папки wwwroot, а node_modules там нет, мне пришлось внести пару изменений, чтобы заставить эту работу, первое: добавление app.UseFileServer прямо перед app.UseStaticFiles в моем Startup. cs файл:
app.UseFileServer(new FileServerOptions()
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), @"node_modules")),
RequestPath = new PathString("/node_modules"),
EnableDirectoryBrowsing = true
});
app.UseStaticFiles();
и второй, включая node_modules в моих publishOptions в файле project.json:
"publishOptions": {
"include": [
"web.config",
"wwwroot",
"Views",
"node_modules"
]
},
Это работает в моей среде разработки, и это также работает, когда я развертываю его в своем экземпляре службы приложений Azure, статические файлы jquery, bootstrap и font-awesome обрабатываются хорошо, но я не уверен в этой реализации.
Как правильно это сделать?
Это решение появилось после сбора большого количества информации из нескольких источников и проверки некоторых из них, которые не работали, и кажется немного странным обслуживать эти файлы извне wwwroot.
Мы будем благодарны за любые советы.
источник
Bundler and Minifier
- Укажите, что источник находится вне wwwroot, и когда вы создаете, он встраивает JS в wwwroot. Это правильный путь .. Вы не должны обслуживать контент из node_modulesnode_modules
папку. а) экосистема спроектирована не так. б) это угроза безопасности, один из установленных пакетов может привести к утечке конфиденциальной информации. Правильный способ - настроить конвейер сборки (grunt / gulp / node / webpack), который публикует файлы в папкуsrc
или,whatever
предназначенную для обслуживания статических файловОтветы:
Публикуя всю свою
node_modules
папку, вы развертываете гораздо больше файлов, чем вам действительно нужно в производственной среде.Вместо этого используйте средство выполнения задач как часть процесса сборки, чтобы упаковать нужные файлы и развернуть их в своей
wwwroot
папке. Это также позволит вам объединять и минимизировать ваши активы одновременно, вместо того, чтобы обслуживать каждую отдельную библиотеку отдельно.Затем вы также можете полностью удалить
FileServer
конфигурацию и полагаться наUseStaticFiles
нее.В настоящее время предпочтительным средством выполнения задач VS является gulp. Добавьте
gulpfile.js
в корень вашего проекта и настройте его для обработки ваших статических файлов при публикации.Например, вы можете добавить следующий
scripts
раздел в свойproject.json
:Что будет работать со следующим gulpfile (по умолчанию при построении с помощью
yo
):источник
node_modules
потому что это то, что делает npm. Задача gulp необходима для перемещения вещей в нужное место, то есть там, где они вам действительно нужны. Я думаю, проблема в том, что Microsoft предоставила такую прекрасную интеграцию с Bower, но теперь Bower мертв (или, по крайней мере, умирает), а Microsoft не предоставила никаких альтернативных инструментов.npm
для управления клиентскими библиотеками - хороший выбор (в отличие от Bower или NuGet), вы думаете в правильном направлении :)FileServer
, егоStaticFiles
должно быть достаточно для обслуживания статических файлов (.js, изображений и т. Д.)wwwroot
вpublic
, иначе структура папок в веб-приложениях Azure будет запутанной (D:\Home\site\wwwroot\wwwroot
vsD:\Home\site\wwwroot\public
)node_modules
на сервер веб-хостинга). См.tools/deploy.js
Пример.Посетите стартовый комплект ASP.NET Core на GitHub (отказ от ответственности: я автор)
источник
Установите Bundler и Minifier в расширения Visual Studio
Затем вы создаете
bundleconfig.json
и вводите следующее, например:Таким образом, сборщик и минификатор (на основе gulp) имеют доступ к исходным файлам (которые должны быть исключены из Visual Studio, а также из GIT) и помещают их в wwwroot, как указано
только побочный эффект каждый раз, когда вы сохраняете, он запускает это (но вы можете настроить его для запуска вручную)
источник
Даю вам два ответа. npm в сочетании с другими инструментами является мощным средством, но требует некоторой работы для настройки. Если вы просто хотите загрузить некоторые библиотеки, вы можете вместо этого использовать диспетчер библиотек (выпущенный в Visual Studio 15.8).
NPM (продвинутый)
Сначала добавьте package.json в корень вашего проекта. Добавьте следующий контент:
Это заставит NPM загрузить Bootstrap, JQuery и другие библиотеки, которые используются в новом основном проекте asp.net, в папку с именем node_modules. Следующим шагом является копирование файлов в подходящее место. Для этого мы будем использовать gulp, который также был загружен NPM. Затем добавьте новый файл в корень вашего проекта с именем gulpfile.js . Добавьте следующий контент:
Этот файл содержит код JavaScript, который выполняется при сборке и очистке проекта. Он скопирует все необходимые файлы в lib2 ( не в lib - вы можете легко это изменить ). Я использовал ту же структуру, что и в новом проекте, но легко изменить файлы в другое место. Если вы перемещаете файлы, убедитесь, что вы также обновили _Layout.cshtml . Обратите внимание, что все файлы в каталоге lib2 будут удалены при очистке проекта.
Если вы щелкнете правой кнопкой мыши на gulpfile.js , вы можете выбрать Task Runner Explorer . Отсюда вы можете запустить gulp вручную, чтобы скопировать или очистить файлы.
Gulp также может быть полезен для других задач, таких как минимизация файлов JavaScript и CSS:
https://docs.microsoft.com/en-us/aspnet/core/client-side/using-gulp?view=aspnetcore-2.1
Менеджер библиотеки (простой)
Щелкните правой кнопкой мыши проект и выберите « Управление клиентскими библиотеками» . Теперь открыт файл libman.json . В этом файле вы указываете, какую библиотеку и файлы использовать и где они должны храниться локально. Действительно просто! Следующий файл копирует библиотеки по умолчанию, которые используются при создании нового проекта ASP.NET Core 2.1:
Если вы перемещаете файлы, убедитесь, что вы также обновили _Layout.cshtml .
источник
gulpfile.js
на,gulp.task('default', function (done) {
а затем добавить в качестве последней строки в этой функции следующее:done();
В противном случае я бы получил сообщение об ошибкеThe following tasks did not complete: Did you forget to signal async completion?
Вместо того, чтобы пытаться обслуживать папку модулей узлов, вы также можете использовать Gulp для копирования того, что вам нужно, в wwwroot.
https://docs.asp.net/en/latest/client-side/using-gulp.html
Это тоже может помочь
Visual Studio 2015 ASP.NET 5, задача Gulp не копирует файлы из node_modules
источник
Существует множество «правильных» подходов, вам просто нужно решить, какой из них лучше всего соответствует вашим потребностям. Похоже, вы не понимаете, как использовать
node_modules
...Если вы знакомы с NuGet, вам следует рассматривать npm как его клиентскую копию. Где
node_modules
каталог похож наbin
каталог для NuGet . Идея состоит в том, что этот каталог - просто обычное место для хранения пакетов, на мой взгляд, лучше взятьdependency
нужные вам пакеты, как вы это сделали в каталогеpackage.json
. Затем используйте средство запуска задач,Gulp
например, чтобы скопировать нужные файлы в желаемоеwwwroot
место.Еще в январе я написал в блоге об этом сообщение, в котором подробно описаны npm , Gulp и множество других деталей, которые актуальны и сегодня. Вдобавок кто-то обратил внимание на мой вопрос SO, который я задал, и в конечном итоге ответил себе здесь , что, вероятно, полезно.
Я создал файл,
Gist
который показывает вgulpfile.js
качестве примера.В вашем
Startup.cs
по-прежнему важно использовать статические файлы:Это гарантирует, что ваше приложение сможет получить доступ к тому, что ему нужно.
источник
Намного более простой подход - использовать пакет Nuget OdeToCode.UseNodeModules. Я только что тестировал его с .Net Core 3.0. Все, что вам нужно сделать, это добавить пакет в решение и указать его в методе Configure класса Startup:
Я узнал об этом из отличного курса « Создание веб-приложения с ASP.NET Core, MVC, Entity Framework Core, Bootstrap и Angular Pluralsight» Шона Вильдермута.
источник
У Шона Вильдермута есть хорошее руководство: https://wildermuth.com/2017/11/19/ASP-NET-Core-2-0-and-the-End-of-Bower
В статье есть ссылка на gulpfile на GitHub, где он реализовал стратегию, описанную в статье. Вы можете просто скопировать и вставить большую часть содержимого gulpfile в свой, но обязательно добавьте соответствующие пакеты в package.json в devDependencies: gulp gulp-uglify gulp-concat rimraf merge-stream
источник
Я нашел лучший способ управления пакетами JS в моем проекте с помощью средств запуска задач NPM Gulp / Grunt. Мне не нравится идея иметь NPM с другим уровнем библиотеки javascript для обработки «автоматизации», и мое требование номер один - просто запустить обновление npm без каких-либо других забот, если мне нужно запустить gulp. если он успешно все скопировал и наоборот.
Способ NPM:
Путь питона:
источник
Прошу прощения за объем этой публикации.
Это рабочий пример с использованием ASP.NET Core версии 2.5.
Следует отметить, что project.json устарел ( см. Здесь ) в пользу .csproj . Проблема с .csproj . file - это большое количество функций и тот факт, что для его документации нет централизованного расположения ( см. здесь ).
Еще одна вещь: в этом примере выполняется ядро ASP.NET в контейнере Docker Linux (alpine 3.9); так что пути будут отражать это. Он также использует gulp ^ 4.0. Однако с некоторыми изменениями он должен работать со старыми версиями ASP.NET Core, Gulp, NodeJS, а также без Docker.
Но вот ответ:
gulpfile.js см. реальный рабочий пример здесь
Добавьте цель в файл .csproj . Обратите внимание, что мы также добавили Watch, чтобы отслеживать и исключать, если мы воспользуемся
dotnet run watch
командой.app.csprod
Теперь, когда
dotnet run build
он запущен, он также установит и построит модули узлов.источник