I have <MobileLayout />
, <DesktopLayout />
. I'm using Next.js
for Server Side Rendering.
And I noticed there are many famous ui library has mobile detection components like <Respnosive />
component in Semantic-UI-React. But all of this is client side method, not working properly on SSR
I read some documents the conclusion is I should check user-agent
of server side req.headers
. In Next.js, What is proper way to detect device and conditonally render one of MobileLayout
/ DesktopLayout
?
What I tried
in _app.js
import isMobile from 'ismobilejs'
...
function Homepage({ Component, pageProps, mobile }){
return (
mobile ?
<MobileLayout><Component {...pageProps} /></MobileLayout> :
<DesktopLayout><Component {...pageProps} /></DesktopLayout>
)
}
HomePage.getInitialProps = async (appContext) => {
const userAgent = appContext.ctx.req.headers['user-agent']
const mobile = isMobile(userAgent).any
const appProps = await App.getInitialProps(appContext)
return { ...appProps, mobile }
}
But the problem is getIntialProps on _app.js
executed every page load. with moving page with client, the appContext.ctx
is undefined
so it will omit error. and I think this method might block some nextjs builtin optimizations.
Error in error page
getInitialProps
: TypeError: Cannot read property 'headers' of undefined
So what is propery way to check device in Next.js?