[Gatsby] SSR 부분에서 window 객체를 참조하면 빌드할 수 없는 문제(귀멸풍)
SSR 부분에서 window를 참조하면 빌드 실패
Gatsby는 빌드시 페이지를 생성하지만 페이지에서 window.innerwidth를 참조하면 오류가 발생합니다.
"window" is not available during server side rendering.
See our docs page for more info on this error: https://gatsby.dev/debug-html
ReferenceError: window is not defined
node 로 페이지 생성하고 있기 때문에 window 객체가 없는 것은 당연하다.
window 의 참조 어째서 빌드 실패하고 있지 않지! ! 아아💢
화나도 공식 봐도 github 봐도 해결되지 않기 때문에, 이 슈퍼 귀찮은 문제의 대응 방법을 생각해 보았습니다.
한 번 상태에 넣을 수 있도록
class Index extends Component {
constructor(props) {
super(props)
this.state = {
width: 0, // or your default width here
}
}
componentDidMount() {
this.handleWindowSizeChange() // Set width
window.addEventListener('resize', this.handleWindowSizeChange)
}
componentWillMount() {
// Don’t use this as the API is deprecated
}
// make sure to remove the listener
// when the component is not mounted anymore
componentWillUnmount() {
window.removeEventListener('resize', this.handleWindowSizeChange)
}
handleWindowSizeChange = () => {
this.setState({ width: window.innerWidth })
}
// rest of code
}
issue에서 논의되었습니다.
state 에 넣을 수고이고, 아마 되는 것이 아니다-라고 느낌입니다.
SSR이면 해당 구성 요소를 마운트하지 않습니다.
MUI에 NoSSR이 준비되어 있으며, 여기를 사용하면,
SSR 의 경우는 그 컴퍼넌트를 마운트 하지 않는 것으로 할 수 있습니다.
MUI 이외에도 비슷한 구조가 있다고 생각합니다.
import { NoSsr, List, ListItem, Tooltip } from "@material-ui/core";
略
<NoSsr>
<Tooltip
id="instagram-twitter"
title="Follow us on twitter"
placement={window && window.innerWidth > 959 ? "top" : "left"}
classes={{ tooltip: classes.tooltip }}
>
<Button
href="https://twitter.com/CreativeTim?ref=creativetim"
target="_blank"
color="transparent"
className={classes.navLink}
>
<i className={classes.socialIcons + " fab fa-twitter"} />
</Button>
</Tooltip>
</NoSsr>
이것은 window 이외의 문제도 해결할 수 있기 때문에 이것입니다.
원래 코드를 다시 쓰지 않는 Polyfill
window를 해결할 정도로 더 쉽게 할 수 없습니까? ! 확실히 해 ~ 탄 지로 오 ~!
있었습니다. 더 끈적한 접근이.
여기를 import하면 window 참조로 떨어지지 않게 됩니다.
addEventListener도 작동합니다.
import { window } from 'ssr-window';
<ListItem className={classes.listItem}>
<Tooltip
id="instagram-tooltip"
title="Follow us on instagram"
placement={window && window.innerWidth > 959 ? "top" : "left"}
classes={{ tooltip: classes.tooltip }}
>
<Button
color="transparent"
href="https://www.instagram.com/CreativeTimOfficial?ref=creativetim"
target="_blank"
className={classes.navLink}
>
<i className={classes.socialIcons + " fab fa-instagram"} />
</Button>
</Tooltip>
어쨌든 떨어지지 않습니다.
요즘 언제 캐릭터가 너무 흥미 롭습니다.
SSR의 프레임 워크 안에서 해주지 않습니까? ! 안돼! 더 즐겁게 해줘!
라고 생각했습니다.
Reference
이 문제에 관하여([Gatsby] SSR 부분에서 window 객체를 참조하면 빌드할 수 없는 문제(귀멸풍)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/coa00/items/463fefd84a9159d7dceb
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
"window" is not available during server side rendering.
See our docs page for more info on this error: https://gatsby.dev/debug-html
ReferenceError: window is not defined
class Index extends Component {
constructor(props) {
super(props)
this.state = {
width: 0, // or your default width here
}
}
componentDidMount() {
this.handleWindowSizeChange() // Set width
window.addEventListener('resize', this.handleWindowSizeChange)
}
componentWillMount() {
// Don’t use this as the API is deprecated
}
// make sure to remove the listener
// when the component is not mounted anymore
componentWillUnmount() {
window.removeEventListener('resize', this.handleWindowSizeChange)
}
handleWindowSizeChange = () => {
this.setState({ width: window.innerWidth })
}
// rest of code
}
import { NoSsr, List, ListItem, Tooltip } from "@material-ui/core";
略
<NoSsr>
<Tooltip
id="instagram-twitter"
title="Follow us on twitter"
placement={window && window.innerWidth > 959 ? "top" : "left"}
classes={{ tooltip: classes.tooltip }}
>
<Button
href="https://twitter.com/CreativeTim?ref=creativetim"
target="_blank"
color="transparent"
className={classes.navLink}
>
<i className={classes.socialIcons + " fab fa-twitter"} />
</Button>
</Tooltip>
</NoSsr>
import { window } from 'ssr-window';
<ListItem className={classes.listItem}>
<Tooltip
id="instagram-tooltip"
title="Follow us on instagram"
placement={window && window.innerWidth > 959 ? "top" : "left"}
classes={{ tooltip: classes.tooltip }}
>
<Button
color="transparent"
href="https://www.instagram.com/CreativeTimOfficial?ref=creativetim"
target="_blank"
className={classes.navLink}
>
<i className={classes.socialIcons + " fab fa-instagram"} />
</Button>
</Tooltip>
Reference
이 문제에 관하여([Gatsby] SSR 부분에서 window 객체를 참조하면 빌드할 수 없는 문제(귀멸풍)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/coa00/items/463fefd84a9159d7dceb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)