(未解決)styled-componentsをSSGで使うとstyleが崩れることがある
#WIP
styled-components
v5.3.3
nextjs
12.0.9
Chrome DevToolsでJavaScriptを無効にすると、初期表示では正しい
つまり、SSRした時点では正しい
clientでhydrationしたタイミングでズレている
リロードしたら崩れる
ページ遷移でそのページに来た時は崩れない
何故かclassNameがずれることがある
code:html
<div class="hoge1"> ←ok
<div class="hoge1"> ←ng 本来はhoge2
<div class="hoge2"> ←ng 本来はhoge3
<div class="hoge3"> ←ng 本来はhoge4
同じ場所では再現する
「たまに起こる」とかではなく毎回起こる
原因がわからないので再現するモノを複製できないmrsekut.icon
https://gyazo.com/11b3d17b915c8bb751fbfefaac9f011a
関連issue
Wrong styles applied during SSR hydration · Issue #351 · styled-components/babel-plugin-styled-components
Same classname applied in SSR · Issue #3125 · styled-components/styled-components
対処法?
https://github.com/styled-components/styled-components/issues/3125#issuecomment-810593421
classNameが複製されているComponentにwithConfigを付ける
なおらんmrsekut.icon
そこだけCSRする
https://github.com/styled-components/styled-components/issues/3125#issuecomment-843022258
code:ts
{typeof window !== 'undefined' && <Hoge />}
こういうComponentを用意しておく
<ClientOnlyRendering>
code:ts
export const ClientOnlyRendering: React.FC<Props> = ({ children }) => {
if (isClient) {
return children;
}
return null;
};
しかしこれはError: Hydration failed because the initial UI does not match what was rendered on the server.を起こしてしまう
↑このエラーに従ってDOM構造をちゃんとしたら直った(?)
わかるけどできればやりたくないmrsekut.icon
応急処置感がありすぎる
Component名が重複しているから起きるの?
https://github.com/styled-components/babel-plugin-styled-components/issues/277
違う気がする
適当に名前を変えても再現し続ける
もしそうならモジュールにしている意味ねえmrsekut.icon
babel-plugin-styled-componentsのssr: trueもしている
#??
原因
対処法
対処法
divが連続になっているのが原因っぽかったので
とりあえず、span & display:block を使ったら回避できた
本質的な修正方法ではないのであまりやりたくないが仕方ない
なぜssr trueにするとスタイルが崩れたのか
https://nextjs.org/docs/advanced-features/dynamic-import#with-no-ssr
これどうやって判断するんだ?
ページ遷移では崩れないが、reloadすると崩れる理由など
https://zenn.dev/takepepe/articles/css-order-should-matter
dynamic import
locaalhostでは再現しない理由
再現する