Saya punya pertanyaan tentang praktik terbaik untuk node_modules
dimasukkan ke situs web HTML.
Bayangkan saya memiliki Bootstrap di dalam node_modules
folder saya . Sekarang untuk versi produksi situs web, bagaimana saya akan memasukkan skrip Bootstrap dan file CSS yang terletak di dalam node_modules
folder? Apakah masuk akal untuk meninggalkan Bootstrap di dalam folder itu dan melakukan sesuatu seperti yang berikut ini?
<script src="./node_modules/bootstrap/dist/bootstrap.min.js"></script>
Atau apakah saya harus menambahkan aturan ke file teguk saya yang kemudian menyalin file-file itu ke folder dist saya? Atau apakah lebih baik membiarkan tegukan entah bagaimana menghapus sepenuhnya bootstrap lokal dari file HTML saya dan menggantinya dengan versi CDN?
Jawaban:
Biasanya, Anda tidak ingin mengekspos salah satu jalur internal Anda untuk bagaimana server Anda disusun ke dunia luar. Apa yang Anda dapat adalah membuat
/scripts
rute statis di server Anda yang mengambil file dari direktori apa pun yang mereka kebetulan tinggal di. Jadi, jika file Anda di"./node_modules/bootstrap/dist/"
. Kemudian, tag skrip di halaman Anda terlihat seperti ini:Jika Anda menggunakan express dengan nodejs, rute statis semudah ini:
Kemudian, permintaan browser apa pun dari
/scripts/xxx.js
secara otomatis akan diambil daridist
direktori Anda di__dirname + /node_modules/bootstrap/dist/xxx.js
.Catatan: Versi NPM yang lebih baru menempatkan lebih banyak hal di level atas, tidak bersarang terlalu dalam sehingga jika Anda menggunakan versi NPM yang lebih baru, maka nama jalur akan berbeda dari yang ditunjukkan dalam pertanyaan OP dan dalam jawaban saat ini. Tapi, konsepnya masih sama. Anda mencari tahu di mana file-file secara fisik terletak di drive server Anda dan Anda membuat
app.use()
denganexpress.static()
untuk membuat pseudo-path ke file-file itu sehingga Anda tidak mengekspos organisasi sistem file server yang sebenarnya kepada klien.Jika Anda tidak ingin membuat rute statis seperti ini, maka Anda mungkin lebih baik hanya menyalin skrip publik ke jalur yang diperlakukan oleh server web Anda sebagai
/scripts
atau sebutan tingkat atas apa pun yang ingin Anda gunakan. Biasanya, Anda dapat menjadikan salinan ini sebagai bagian dari proses build / deployment Anda.Jika Anda ingin membuat hanya satu file tertentu publik dalam direktori dan tidak semua yang ditemukan dalam direktori itu, maka Anda dapat secara manual membuat rute individual untuk setiap file daripada menggunakan
express.static()
seperti:Dan kode untuk membuat rute untuk itu
Atau, jika Anda masih ingin menggambarkan rute untuk skrip
/scripts
, Anda dapat melakukan ini:Dan kode untuk membuat rute untuk itu
sumber
/scripts
karena dengan cara itu setiap dependensi di dalam modul akan dipertahankan.express.static()
mengirimkan kecocokan pertama yang ditemukannya. Karena setiapexpress.static()
pernyataan hanya membuat satu jalur pencocokan yang mungkin, tidak boleh ada duplikat dari satuexpress.static()
pernyataan. Jika Anda memiliki beberapaexpress.static()
pernyataan yang masing-masing dapat memiliki kecocokan, maka yang pertama dalam kode Anda adalah yang kecocokannya akan digunakan. Juga, Anda seharusnya tidak memiliki banyak file dengan nama dan jalur relatif yang sama yang dapat dijangkau olehexpress.static()
pernyataan. Praktik terbaik adalah tidak melakukan itu.express.static()
pada direktori yang HANYA berisi file publik (termasuk sub-direktori). Jadi, saya tidak bisa membayangkan proyek di mana ada banyakdist
direktori yang diterbitkan. Bagi saya itu sangat tidak biasa. Mungkin Anda ingin membuat rute spesifik ke file tertentu atau ke 2-3 file. Dalam hal ini, Anda bertanggung jawab untuk melambangkan file-file itu. Lagipula tidak ada gunanya bagimu untuk memiliki empatscript.js
file./script.js
diminta oleh browser. Jadi, jawaban abstraknya adalah Anda tidak boleh membiarkan situasi duplikat nama file ada karena itu bukan masalah yang dapat dipecahkan kecuali Anda memerlukan awalan unik untuk setiap direktori file. Kemudian, duplikat nama akar tidak menjadi masalah. Untuk jawaban yang lebih spesifik dengan rekomendasi terperinci, Anda perlu memposting pertanyaan Anda sendiri dengan detail yang tepat.Saya akan menggunakan modul path npm dan kemudian melakukan sesuatu seperti ini:
PENTING: kami menggunakan path.join untuk membuat lintasan bergabung menggunakan cara agnostik sistem, yaitu pada windows dan unix kami memiliki pemisah jalur yang berbeda (/ dan)
sumber
Seperti yang disebutkan oleh jfriend00 Anda tidak boleh mengekspos struktur server Anda. Anda dapat menyalin file ketergantungan proyek Anda ke sesuatu seperti
public/scripts
. Anda dapat melakukan ini dengan sangat mudah dengan dep-linker seperti ini:sumber
src
kemudian akan menjadi seperti/scripts/[package-name]/dist/file.min.js
.Jika Anda menginginkan solusi yang cepat dan mudah (dan Anda telah menelannya).
Dalam saya,
gulpfile.js
saya menjalankan tugas copy paste sederhana yang menempatkan file apa pun yang saya butuhkan ke./public/modules/
direktori.Kelemahan dari ini adalah tidak otomatis. Namun, jika yang Anda butuhkan hanyalah beberapa skrip dan gaya yang disalin (dan disimpan dalam daftar), ini harusnya berhasil.
sumber
'scripts': {'install':'yarn gulp copy-modules'}
, dengan asumsi benang adalah manajer paket dan tegukan diinstal dalam paket.Direktori 'node_modules' mungkin tidak ada di direktori saat ini, jadi Anda harus menyelesaikan jalur secara dinamis.
sumber
Saya ingin memperbarui pertanyaan ini dengan solusi yang lebih mudah. Buat tautan simbolis ke node_modules.
Cara termudah untuk memberikan akses publik ke node_modules adalah dengan membuat tautan simbolis yang menunjuk ke node_modules Anda dari dalam direktori publik Anda. Symlink akan membuatnya seolah-olah file ada di mana pun tautan dibuat.
Misalnya, jika server simpul memiliki kode untuk menyajikan file statis
dan __dirname merujuk ke / path / ke / app sehingga file statis Anda dilayani dari / path / ke / app / dist
dan node_modules ada di / path / ke / app / node_modules, lalu buat symlink seperti ini di mac / linux:
atau seperti ini di windows:
Sekarang dapatkan permintaan untuk:
akan menerima respons dengan file di
yang benar-benar file di
Jika direktori Anda di / path / ke / app / dist bukanlah lokasi yang aman, mungkin karena gangguan dari proses build dengan tegukan atau gerutuan, maka Anda bisa menambahkan direktori terpisah untuk tautan dan menambahkan panggilan serveStatic baru seperti:
dan di simpul tambahkan:
sumber
Saya tidak menemukan solusi bersih (saya tidak ingin mengekspos sumber semua node_modules saya) jadi saya hanya menulis skrip Powershell untuk menyalinnya:
sumber
Saya melakukan perubahan di bawah untuk AUTO-INCLUDE file dalam indeks html. Sehingga ketika Anda menambahkan file dalam folder itu akan secara otomatis diambil dari folder, tanpa Anda harus memasukkan file dalam index.html
sumber
Ini yang saya siapkan di
express
server saya :Semoga berhasil...
sumber