Update docs regarding HMR support
Judahmeek opened this issue · 3 comments
Discussed in #1234
Originally posted by sanex3339 December 11, 2022
Hi. I'm not sure, maybe the README is outdated, but it says that this gem does not support HMR when SSR is enabled.
I was able to make it work both for server and client bundles.
What i did:
- added
process.env.WEBPACK_SERVE && 'react-refresh/babel'plugin to thebabel.config.jsfile - used
bin/webpack-dev-serverfile to build bundles + run dev server - in the
webpackconfig we have the following option for the dev server:
devServer: {
devMiddleware: {
publicPath: '/some_project/assets',
writeToDisk: filename => filename.includes('server_rendering.js')
},
host: 'localhost',
port: appConfig.port,
https: false,
hot: true,
liveReload: false,
client: { overlay: false },
allowedHosts: ['localhost'],
headers: { 'Access-Control-Allow-Origin': '*' }
}
The important thing is to use writeToDisk and in my case i only save server_rendering.js file to the disk, so the server is able to always read the updated file.
- added the
ReactRefreshWebpackPluginto thewebpackconfig as well
if (Env.isDevelopment) {
config.plugins.push(
new ReactRefreshWebpackPlugin({
overlay: {
sockPort: DEV_SERVER_PORT
}
})
)
}
- as
output.publicPathvalue for dev environment we usehttp://localhost:${DEV_SERVER_PORT}/some_project/assets, so all client assets are served by the dev server as well - we don't use
shakepakerconfig in the babel or webpack configs at all - in
webpacker.ymlfor dev environment we have:
# we don't use shakapacker to control webpack-dev-server
# but react-rails needs this to find server_rendering.js for dev-server build
dev_server:
https: false
host: localhost
port: SET YOUR DEV SERVER PORT HERE
hmr: true,
allowed_hosts: [ 'localhost' ]
headers:
'Access-Control-Allow-Origin': '*'
static:
watch:
ignored: '**/node_modules/**'
And this is all, the HMR works, the server renders updated HTML every time when react code is changed.
@Judahmeek
I think we should wait for #1252 to get finalized before applying these changes. Right?
@ahangarha now that #1274 (which superseded #1252) has been merged, we should confirm that HMR works correctly.
I just tested HMR on a typical installation of React-Rails 3.1.1 + Shakapacker 7.0.3.
HMR works perfectly as expected. No further modification is required.