saeeed
September 17, 2020, 7:27pm
1
Hello friends .
As usual, I have a question about ssr.
I implemented ssr, but it only works on the Home Route ( / ) .
This means that, in the Home Route , all elements are rendered correctly from the server side.
But when we go to another address like register ( /register ) , and its components are loaded from the client, I still see that the server has rendered the Home Route components in the div.
In other words, by looking at the view page source at both home ( / ) and register ( /register ) , I see a result in my main div (Home Components ).
Does SSR only work on Home Route and does this make sense?
Shouldn’t the server render the same components by changing the components and routes?
saeeed
September 17, 2020, 7:29pm
2
This is my Routes code :
<Router>
<Switch>
<Route path='/admin-panel/:path?' exact>
<PanelAdminLayout>
<Switch>
<Route path='/admin-panel' exact component={PanelAdminIndex} />
<Route path='/admin-panel/setting' component={PanelAdminSetting} />
</Switch>
</PanelAdminLayout>
</Route>
<Route path='/user-panel/:path?' exact>
<PanelUserLayout>
<Switch>
<Route path='/user-panel' exact component={PanelUserIndex} />
</Switch>
</PanelUserLayout>
</Route>
<Route>
<PagesLayout>
<Switch>
<Route path='/' exact component={PagesIndex} />
<Route path='/login' exact component={Login} />
<Route path='/register' exact component={Register} />
</Switch>
</PagesLayout>
</Route>
</Switch>
</Router>
saeeed
September 17, 2020, 7:30pm
3
And this My SSR Code in the Server :
onPageLoad(sink => {
const helmetContext = {};
const sheet = new ServerStyleSheet();
const html = renderToString(sheet.collectStyles(
<HelmetProvider context={helmetContext}>
<Routes location={sink.request.url} />
</HelmetProvider>
));
const { helmet } = helmetContext;
sink.renderIntoElementById("App", html);
sink.appendToHead(helmet.meta.toString());
sink.appendToHead(helmet.link.toString());
sink.appendToHead(helmet.title.toString());
});
saeeed
September 18, 2020, 6:36am
4
i’m Really struggling with this guys .
I Really need Help
Are you also using the community package?
opened 08:40AM - 11 Sep 20 UTC
closed 04:19AM - 23 Mar 21 UTC
While running this package with Meteor METEOR@1.11 and "react": "^16.13.0" I fi… nd that loading the homepage (/) works great. The package loads the pre-rendered page and it's quick.
When I click on a button to go to a page this also goes perfect.
When I am at a specific url (say /accounts/sign-up) and I hit refresh things go wrong: Errors appear that the server side content does not match the client state:
```
Warning: Expected server HTML to contain a matching <div> in <div>.
in div (created by Row)
in Row (created by Register)
in div (created by Container)
in Container (created by Register)
in Register (created by AccountRoutes)
in Route (created by AccountRoutes)
in Switch (created by AccountRoutes)
in AccountRoutes
in div (created by WebContainer)
in div (created by WebContainer)
in WebContainer
in Route
in Switch
in Router
in Switch (created by ReactRouterSSR)
in Router (created by ReactRouterSSR)
in ReactRouterSSR
```
I see that the package is trying to match the homepage instead of the specific page at this url.
I expect this might be related with this part from the readme:
> The component that encompasses your application. Can be any React element. Routers and Switches are handled by the package so those aren't necessary inside your app.
The main entry point of this application is a <Router> tag from React Router. Is this a Router in Router problem?
Versions:
```
"react-helmet": "^6.1.0",
"react-router": "^5.2.0",
"react-router-bootstrap": "^0.25.0",
"react-router-dom": "^5.2.0",
```
Or did you implement it totally by yourself? I wrote an issue about such behavior a few days ago in the community package repo. Not sure if that package is still the default solution for SSR.
1 Like
saeeed
September 18, 2020, 7:43am
6
@lucfranken
well i have the same issue But i didn’t use this Package (react-router-ssr) .
i just used the guiding of the meteor , in this link :
https://docs.meteor.com/packages/server-render.html
saeeed
September 18, 2020, 7:48am
7
this is my Server Side :
import React from "react";
import { onPageLoad } from "meteor/server-render";
import { renderToString } from "react-dom/server";
import { ServerStyleSheet } from "styled-components"
import { HelmetProvider } from 'react-helmet-async';
import Routes from "../../Routes/Server-Routes";
onPageLoad(sink => {
const helmetContext = {};
const sheet = new ServerStyleSheet();
const html = renderToString(sheet.collectStyles(
<HelmetProvider context={helmetContext}>
<Routes location={sink.request.url} />
</HelmetProvider>
));
const { helmet } = helmetContext;
sink.renderIntoElementById("App", html);
sink.appendToHead(helmet.meta.toString());
sink.appendToHead(helmet.link.toString());
sink.appendToHead(helmet.title.toString());
});
and this Client Side:
import React from 'react';
import ReactDOM from 'react-dom';
import { onPageLoad } from 'meteor/server-render';
import { HelmetProvider } from 'react-helmet-async';
onPageLoad(async sink => {
const Routes = (await import('../../Routes/Client-Routes')).default;
ReactDOM.hydrate(
<HelmetProvider>
<Routes />
</HelmetProvider>
,
document.getElementById('App')
);
});
and this my Routes :
// Layouts
import PagesLayout from '../Ui/Pages/Layout/PagesLayout';
import PanelAdminLayout from '../Ui/PanelAdmin/Layout/PanelAdminLayout';
import PanelUserLayout from '../Ui/PanelUser/Layout/PanelUserLayout';
// Pages Components
import PagesIndex from '../Ui/Pages/Index/PagesIndex';
import Login from '../Ui/Pages/Login/Login'
import Register from '../Ui/Pages/Register/Register';
// Panel Admin Components
import PanelAdminIndex from '../Ui/PanelAdmin/Index/PanelAdminIndex';
import PanelAdminSetting from '../Ui/PanelAdmin/Setting/PanelAdminSetting'
// Panel User Components
import PanelUserIndex from '../Ui/PanelUser/Index/PanelUserIndex';
export default class ServerRoutes extends React.Component {
render() {
return (
<Router>
<Switch>
<Route path='/admin-panel/:path?' exact>
<PanelAdminLayout>
<Switch>
<Route path='/admin-panel' exact component={PanelAdminIndex} />
<Route path='/admin-panel/setting' component={PanelAdminSetting} />
</Switch>
</PanelAdminLayout>
</Route>
<Route path='/user-panel/:path?' exact>
<PanelUserLayout>
<Switch>
<Route path='/user-panel' exact component={PanelUserIndex} />
</Switch>
</PanelUserLayout>
</Route>
<Route>
<PagesLayout>
<Switch>
<Route path='/' exact component={PagesIndex} />
<Route path='/login' exact component={Login} />
<Route path='/register' exact component={Register} />
</Switch>
</PagesLayout>
</Route>
</Switch>
</Router>
);
}
}
saeeed
September 18, 2020, 7:53am
8
my point here is i didn’t use (History) in neither of Server and Client.
Can it be the Problem ?