I am trying to prerender my react app with react-snap. My project is not using create-react-app.
// react-snap configuration
{
inlineCss: true,
source: "dist",
skipThirdPartyRequests: true
}
Prerendering worked correctly if I built my application with webpack mode: development. But it does not when I use my production build. After spent some time debugging, I discovered, that problem happened only when I use compression-webpack-plugin. When I commented on it out, it finished successfully.
/// webpack.config.prod.babel.js
/* eslint-disable import/default */
import merge from 'webpack-merge';
import CompressionPlugin from 'compression-webpack-plugin';
import common from './webpack.config.common.babel';
module.exports = (env = {}) => {
return merge(common(env), {
mode: 'production',
devtool: 'nosources-source-map',
plugins: [
/* when I uncomment the use of plugin, the prerendering stops to work */
// new CompressionPlugin({
// algorithm: 'gzip',
// compressionOptions: {level: 9},
// test: /\.css$|\.js$|\.map|\.svg|\.woff|\.woff2|\.ttf|\.eot$/,
// threshold: 2 * 1024,
// deleteOriginalAssets: true
// })
]
});
};
The error reported by react-snap:
pageerror at /: SyntaxError: Unexpected token '<'
I figured out, that it tries to get my built main or vendor javascript file with extension .min.js. But in my built, there is only file with extension .min.js.gz, which is successfully handled with a standard request from the browser.
My production build is working correctly without prerendering. So I suppose it is a problem of some react-snap configuration, but I did not find any solution for it.
It is possible to use react-snap and gzipped sources at all?
There is a
deleteOriginalAssets: trueoption, without itCompressionPluginshould preserve the original.min.jsfiles for you to use withreact-snap. While your server will continue serve browsers with the.min.js.gzfiles because they still exist.