Saya membuat aplikasi yang menggunakan webpack-dev-server dalam pengembangan bersama react-router.
Tampaknya webpack-dev-server dibangun dengan asumsi bahwa Anda akan memiliki titik masuk publik di satu tempat (yaitu "/"), sedangkan react-router memungkinkan jumlah titik masuk yang tidak terbatas.
Saya ingin manfaat dari webpack-dev-server, terutama fitur hot reload yang bagus untuk produktivitas, tetapi saya masih ingin memuat rute yang disetel di react-router.
Bagaimana seseorang bisa menerapkannya sedemikian rupa sehingga mereka bekerja sama? Bisakah Anda menjalankan server ekspres di depan webpack-dev-server sedemikian rupa untuk mengizinkan ini?
javascript
reactjs
webpack
react-router
Nathan Wienert
sumber
sumber
Jawaban:
Saya menyiapkan proxy untuk mencapai ini:
Anda memiliki server web ekspres reguler yang melayani index.html di rute mana pun, kecuali jika itu adalah rute aset. jika itu adalah aset, permintaan akan di-proxy-kan ke web-dev-server
Titik entri react hot Anda masih akan mengarah langsung ke server dev webpack, jadi hot reload masih berfungsi.
Anggaplah Anda menjalankan webpack-dev-server pada 8081 dan proxy Anda pada 8080. File server.js Anda akan terlihat seperti ini:
sekarang buat entrypoint Anda di konfigurasi webpack seperti ini:
perhatikan panggilan langsung ke 8081 untuk hotreload
juga pastikan Anda meneruskan url absolut ke
output.publicPath
opsi:sumber
output.publicPath
opsi, yang seharusnya menjadi url absolut juga.historyApiFallback
.Anda harus menetapkan
historyApiFallback
dariWebpackDevServer
sebagai benar untuk ini bekerja. Berikut adalah contoh kecil (sesuaikan agar sesuai dengan tujuan Anda):sumber
true
.webpack-dev-server --history-api-fallback
Untuk orang lain yang mungkin masih mencari jawaban ini. Saya mengumpulkan bypass proxy sederhana yang mencapai ini tanpa banyak kerumitan dan konfigurasinya masuk ke webpack.config.js
Saya yakin ada banyak cara yang lebih elegan untuk menguji konten lokal menggunakan regex, tetapi ini sesuai dengan kebutuhan saya.
sumber
Jika Anda menjalankan webpack-dev-server menggunakan CLI, Anda dapat mengkonfigurasinya melalui webpack.config.js dengan meneruskan objek devServer:
Ini akan mengalihkan ke index.html setiap kali 404 ditemukan.
CATATAN: Jika Anda menggunakan publicPath, Anda juga harus meneruskannya ke devServer:
Anda dapat memverifikasi bahwa semuanya telah diatur dengan benar dengan melihat beberapa baris pertama dari output (bagian dengan "404s akan kembali ke: path ").
sumber
Untuk jawaban yang lebih baru, versi webpack saat ini (4.1.1) Anda bisa mengaturnya di webpack.config.js Anda seperti:
Bagian yang penting adalah
historyApiFallback: true
. Tidak perlu menjalankan server khusus, cukup gunakan cli:sumber
Saya ingin menambahkan jawaban untuk kasus ketika Anda menjalankan aplikasi isomorfik (yaitu rendering sisi server komponen React.)
Dalam hal ini Anda mungkin juga ingin memuat ulang server secara otomatis ketika Anda mengubah salah satu komponen React Anda. Anda melakukan ini dengan
piping
paket. Yang harus Anda lakukan adalah menginstalnya dan menambahkanrequire("piping")({hook: true})
di suatu tempat di awal server.js Anda . Itu dia. Server akan restart setelah Anda mengubah komponen apa pun yang digunakan olehnya.Ini menimbulkan masalah lain - jika Anda menjalankan server webpack dari proses yang sama dengan server ekspres Anda (seperti dalam jawaban yang diterima di atas), server webpack juga akan memulai ulang dan akan mengkompilasi ulang bundel Anda setiap saat. Untuk menghindari hal ini, Anda harus menjalankan server utama dan server webpack dalam proses yang berbeda sehingga pemipaan hanya akan memulai ulang server ekspres Anda dan tidak akan menyentuh webpack. Anda dapat melakukan ini dengan
concurrently
paket. Anda dapat menemukan contohnya di react-isomorphic-starterkit . Di package.json dia memiliki:yang menjalankan kedua server secara bersamaan tetapi dalam proses terpisah.
sumber
historyApiFallback
juga bisa menjadi objek, bukan Boolean, yang berisi rute.sumber
Mungkin tidak di semua kasus, tetapi tampaknya
publicPath: '/'
opsi di devServer adalah solusi termudah untuk memperbaiki masalah rute dalam, lihat: https://github.com/ReactTraining/react-router/issues/676sumber
Ini berhasil untuk saya: cukup tambahkan middlewares webpack terlebih dahulu dan
app.get('*'...
resolver index.html nanti,jadi express akan terlebih dahulu memeriksa apakah permintaan tersebut cocok dengan salah satu rute yang disediakan oleh webpack (seperti:
/dist/bundle.js
atau/__webpack_hmr_
) dan jika tidak, maka itu akan pindah keindex.html
dengan*
resolver.yaitu:
sumber