Saya menggunakan npm untuk mengelola jQuery, Bootstrap, Font Awesome dan pustaka klien serupa yang saya perlukan untuk aplikasi ASP.NET Core saya.
Pendekatan yang berhasil untuk saya dimulai dengan menambahkan file package.json ke proyek, yang terlihat seperti ini:
{
"version": "1.0.0",
"name": "myapp",
"private": true,
"devDependencies": {
},
"dependencies": {
"bootstrap": "^3.3.6",
"font-awesome": "^4.6.1",
"jquery": "^2.2.3"
}
}
npm mengembalikan paket-paket ini ke folder node_modules yang berada di level yang sama dengan wwwroot di direktori proyek:
Karena ASP.NET Core melayani file statis dari folder wwwroot, dan node_modules tidak ada di sana, saya harus membuat beberapa perubahan untuk membuat ini berfungsi, yang pertama: menambahkan app.UseFileServer tepat sebelum app.UseStaticFiles di Startup saya. file cs:
app.UseFileServer(new FileServerOptions()
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), @"node_modules")),
RequestPath = new PathString("/node_modules"),
EnableDirectoryBrowsing = true
});
app.UseStaticFiles();
dan yang kedua, termasuk node_modules di publishOptions saya di file project.json:
"publishOptions": {
"include": [
"web.config",
"wwwroot",
"Views",
"node_modules"
]
},
Ini berfungsi di lingkungan pengembangan saya dan juga berfungsi saat saya menerapkannya ke instance Azure App Service saya, file statis jquery, bootstrap, dan font-awesome dilayani dengan baik, tetapi saya tidak yakin tentang penerapan ini.
Apa pendekatan yang tepat untuk melakukan ini?
Solusi ini datang setelah mengumpulkan banyak bit info dari beberapa sumber dan mencoba beberapa yang tidak berhasil, dan tampaknya agak aneh harus menyajikan file-file ini dari luar wwwroot.
Setiap saran akan sangat dihargai.
sumber
Bundler and Minifier
- Tentukan sumbernya di luar wwwroot dan ketika Anda membangunnya membangun JS ke wwwroot. Itu adalah cara yang tepat .. Anda tidak boleh menyajikan konten dari node_modulesnode_modules
folder secara statis . a) itu bukan cara ekosistem dirancang b) ini adalah risiko keamanan, salah satu paket yang Anda instal mungkin membocorkan informasi sensitif. Cara yang tepat adalah menyiapkan pipeline bangunan (grunt / gulp / node / webpack) yang menerbitkan file ke foldersrc
atau yangwhatever
didedikasikan untuk melayani file front-end statisJawaban:
Dengan menerbitkan seluruh
node_modules
folder, Anda menyebarkan lebih banyak file daripada yang sebenarnya Anda perlukan dalam produksi.Sebagai gantinya, gunakan runner tugas sebagai bagian dari proses build Anda untuk mengemas file yang Anda perlukan, dan menerapkannya ke
wwwroot
folder Anda . Ini juga akan memungkinkan Anda untuk menggabungkan dan mengecilkan aset Anda pada saat yang sama, daripada harus menyajikan setiap perpustakaan secara terpisah.Kemudian Anda juga dapat menghapus
FileServer
konfigurasi sepenuhnya dan mengandalkannyaUseStaticFiles
.Saat ini, gulp adalah pelari tugas VS pilihan. Tambahkan a
gulpfile.js
ke root proyek Anda, dan konfigurasikan untuk memproses file statis Anda saat dipublikasikan.Misalnya, Anda dapat menambahkan bagian berikut
scripts
keproject.json
:Yang akan bekerja dengan gulpfile berikut (default saat scaffolding dengan
yo
):sumber
node_modules
karena itulah yang dilakukan npm. Tugas menelan diperlukan untuk memindahkan barang ke tempat yang tepat, yaitu di tempat Anda benar-benar membutuhkannya. Saya pikir masalahnya adalah Microsoft menyediakan integrasi yang begitu indah dengan Bower, tetapi sekarang Bower sudah mati (atau setidaknya sekarat) dan Microsoft belum menyediakan perkakas alternatif.npm
untuk mengelola pustaka sisi klien adalah pilihan yang baik (dibandingkan dengan Bower atau NuGet), Anda berpikir ke arah yang benar :)FileServer
, memilikiStaticFiles
sudah cukup untuk menyajikan file statis (.js, gambar, dll.)wwwroot
menjadipublic
, jika tidak, struktur folder di Aplikasi Web Azure akan membingungkan (D:\Home\site\wwwroot\wwwroot
vsD:\Home\site\wwwroot\public
)node_modules
ke server hosting web). Lihattools/deploy.js
sebagai contoh.Kunjungi ASP.NET Core Starter Kit di GitHub (penafian: Saya penulisnya)
sumber
Instal Bundler dan Minifier ke dalam ekstensi Visual Studio
Kemudian Anda membuat
bundleconfig.json
dan memasukkan seperti berikut:Jadi bundler dan minifier (berbasis gulp) memiliki akses ke file sumber (yang harus dikeluarkan dari Visual Studio dan juga dikecualikan dari GIT) dan menempatkannya ke dalam wwwroot seperti yang ditentukan
hanya efek samping setiap kali Anda menyimpannya yang akan menjalankan ini (tetapi Anda dapat mengaturnya untuk menjalankannya secara manual)
sumber
Saya memberi Anda dua jawaban. npm yang dikombinasikan dengan alat lain sangat berguna tetapi membutuhkan beberapa pekerjaan untuk menyiapkannya. Jika Anda hanya ingin mengunduh beberapa perpustakaan, Anda mungkin ingin menggunakan Manajer Perpustakaan sebagai gantinya (dirilis dalam Visual Studio 15.8).
NPM (Lanjutan)
Pertama tambahkan package.json di root proyek Anda. Tambahkan konten berikut:
Ini akan membuat NPM mengunduh Bootstrap, JQuery, dan pustaka lain yang digunakan dalam proyek inti asp.net baru ke folder bernama node_modules. Langkah selanjutnya adalah menyalin file ke tempat yang sesuai. Untuk melakukan ini kita akan menggunakan gulp, yang juga diunduh oleh NPM. Kemudian tambahkan file baru di root proyek Anda bernama gulpfile.js . Tambahkan konten berikut:
File ini berisi kode JavaScript yang dijalankan saat proyek dibangun dan dibersihkan. Ini akan menyalin semua file yang diperlukan ke lib2 ( bukan lib - Anda dapat dengan mudah mengubahnya ). Saya telah menggunakan struktur yang sama seperti di proyek baru, tetapi mudah untuk mengubah file ke lokasi yang berbeda. Jika Anda memindahkan file, pastikan Anda juga memperbarui _Layout.cshtml . Perhatikan bahwa semua file dalam direktori lib2 akan dihapus saat proyek dibersihkan.
Jika Anda mengklik kanan gulpfile.js , Anda dapat memilih Task Runner Explorer . Dari sini Anda dapat menjalankan gulp secara manual untuk menyalin atau membersihkan file.
Gulp juga bisa berguna untuk tugas lain seperti mengecilkan JavaScript dan file CSS:
https://docs.microsoft.com/en-us/aspnet/core/client-side/using-gulp?view=aspnetcore-2.1
Manajer Perpustakaan (Sederhana)
Klik kanan pada proyek Anda dan pilih Kelola perpustakaan sisi klien . File libman.json sekarang terbuka. Dalam file ini Anda menentukan pustaka dan file mana yang akan digunakan dan di mana mereka harus disimpan secara lokal. Sangat sederhana! Berkas berikut ini menyalin pustaka default yang digunakan saat membuat proyek ASP.NET Core 2.1 baru:
Jika Anda memindahkan file, pastikan Anda juga memperbarui _Layout.cshtml .
sumber
gulpfile.js
menjadigulp.task('default', function (done) {
dan kemudian menambahkan sebagai baris terakhir dalam fungsi itu sebagai berikut:done();
Jika tidak, saya akan mendapatkan pesan kesalahanThe following tasks did not complete: Did you forget to signal async completion?
Alih-alih mencoba melayani folder modul node, Anda juga dapat menggunakan Gulp untuk menyalin apa yang Anda butuhkan ke wwwroot.
https://docs.asp.net/en/latest/client-side/using-gulp.html
Ini mungkin membantu juga
Visual Studio 2015 ASP.NET 5, Gulp tugas tidak menyalin file dari node_modules
sumber
Ada banyak pendekatan yang "benar", Anda tinggal memutuskan mana yang paling sesuai dengan kebutuhan Anda. Tampaknya Anda salah paham tentang cara menggunakan
node_modules
...Jika Anda terbiasa dengan NuGet, Anda harus memikirkan npm sebagai mitra sisi kliennya. Dimana
node_modules
direktorinya sepertibin
direktori NuGet . Idenya adalah bahwa direktori ini hanyalah lokasi umum untuk menyimpan paket, menurut pendapat saya lebih baik menggunakandependency
paket yang Anda butuhkan seperti yang telah Anda lakukan dipackage.json
. Kemudian gunakan pelari tugas sepertiGulp
misalnya untuk menyalin file yang Anda butuhkan kewwwroot
lokasi yang Anda inginkan .Saya menulis posting blog tentang ini kembali pada bulan Januari yang merinci npm , Gulp dan sejumlah detail lainnya yang masih relevan hingga saat ini. Selain itu, seseorang meminta perhatian pada pertanyaan SO saya yang saya tanyakan dan akhirnya menjawab sendiri di sini , yang mungkin berguna.
Saya membuat
Gist
yang menunjukkangulpfile.js
sebagai contoh.Di Anda
Startup.cs
, masih penting untuk menggunakan file statis:Ini akan memastikan bahwa aplikasi Anda dapat mengakses apa yang dibutuhkannya.
sumber
Pendekatan yang jauh lebih sederhana adalah dengan menggunakan paket OdeToCode.UseNodeModules Nuget. Saya baru saja mengujinya dengan .Net Core 3.0. Yang perlu Anda lakukan adalah menambahkan paket ke solusi dan mereferensikannya di metode Konfigurasi kelas Startup:
Saya mempelajarinya dari kursus Membangun Aplikasi Web dengan ASP.NET Core, MVC, Entity Framework Core, Bootstrap, dan kursus Angular Pluralsight yang luar biasa oleh Shawn Wildermuth.
sumber
Shawn Wildermuth memiliki panduan yang bagus di sini: https://wildermuth.com/2017/11/19/ASP-NET-Core-2-0-and-the-End-of-Bower
Artikel tersebut tertaut ke gulpfile di GitHub tempat dia menerapkan strategi dalam artikel tersebut. Anda bisa menyalin dan menempelkan sebagian besar konten gulpfile ke milik Anda, tetapi pastikan untuk menambahkan paket yang sesuai di package.json di bawah devDependencies: gulp gulp-uglify gulp-concat rimraf merge-stream
sumber
Saya telah menemukan cara yang lebih baik untuk mengelola paket JS dalam proyek saya dengan pelari tugas NPM Gulp / Grunt. Saya tidak suka ide untuk memiliki NPM dengan lapisan lain dari pustaka javascript untuk menangani "otomatisasi", dan persyaratan nomor satu saya adalah menjalankan pembaruan npm secara sederhana tanpa ada kekhawatiran lain tentang apakah saya perlu menjalankan hal-hal gulp, jika berhasil menyalin semuanya dan sebaliknya.
Cara NPM:
Cara python:
sumber
Mohon maafkan panjang posting ini.
Ini adalah contoh kerja menggunakan ASP.NET Core versi 2.5.
Sesuatu yang perlu diperhatikan adalah bahwa project.json sudah usang ( lihat di sini ) dan mendukung .csproj . Masalah dengan .csproj . file adalah sejumlah besar fitur dan faktanya tidak ada lokasi pusat untuk dokumentasinya ( lihat di sini ).
Satu hal lagi, contoh ini menjalankan inti ASP.NET di wadah Docker Linux (alpine 3.9); jadi jalannya akan mencerminkan itu. Ini juga menggunakan gulp ^ 4.0. Namun, dengan beberapa modifikasi, itu akan bekerja dengan versi lama dari ASP.NET Core, Gulp, NodeJS, dan juga tanpa Docker.
Tapi inilah jawabannya:
gulpfile.js lihat contoh kerja sebenarnya di sini
Tambahkan Target di file .csproj . Perhatikan kami juga menambahkan Watch untuk menonton dan mengecualikan jika kami memanfaatkan
dotnet run watch
perintah.app.csprod
Sekarang ketika
dotnet run build
dijalankan itu juga akan menginstal dan membangun modul node.sumber