\n```\n\nスタイルオブジェクトはプレーンな JavaScript のため、スタイルの条件分岐することや props から新たにスタイルをオーバーライドする事が容易となる。\n上記の手法に、擬似クラスや擬似要素、メディアクエリがサポートするためコミュニティによって様々なライブラリが作成された。\n\n### styled-components という選択\n\n様々なライブラリが登場した中で、styled-components はある種パイオニア的な存在であった。\n同じ時期に登場したライブラリと比較して、styled-components は以下の特徴を持っていて、開発者にとって魅力的であった。\n\n- 依存 package が少ない\n- template literal の中に今までの CSS とほぼ同じような書き味で記述できる\n\nこれらの特徴は、styled-components は多くの開発者に支持される理由となった。\n\n2020 年の頃の記事を参照してしまい大変恐縮ではあるが、[@takepepe](https://twitter.com/takepepe) さんが書いている、「経年劣化に耐える React Component の書き方[^4]」という記事は、とても筋が良いなと個人的に思う。\nDOM 層として実装した Component を styled-components でスタイリングするという技法は、今でも有効であると感じる。\n\n[^4]: [https://qiita.com/Takepepe/items/41e3e7a2f612d7eb094a](https://qiita.com/Takepepe/items/41e3e7a2f612d7eb094a)\n\nstyled-components の大胆にスタイルできる利点が少々失われてしまうが、今までの BEM 記法や CSS Modules へのフォールバックが容易であり、それでいてスタイルのコロケーションが可能である。\nこういった選択に自由度がありつつ、プロダクトごとに規約を持たせることで開発体験を上げることができるのは、styled-components の魅力である。\n\n## styled-components の現在\n\n### React Server Components の登場\n\n2023 年の 5 月、Vercel は Next.js 13.4 を発表し、React Server Components の上で動作する最初のフレームワークとなった。[^5]\nまた同じ月に React Core team は React Labs からの発表として React Server Components をよりプリミティブな形で提供することを目指していると発表した。[^6]\n\n[^5]: [https://nextjs.org/blog/next-13-4](https://nextjs.org/blog/next-13-4)\n\n[^6]: [https://react.dev/blog/2023/03/22/react-labs-what-we-have-been-working-on-march-2023#react-server-components](https://react.dev/blog/2023/03/22/react-labs-what-we-have-been-working-on-march-2023#react-server-components)\n\nReact Server Components の RFC[^7] では、React がよりサーバーを活用することでパフォーマンスやバンドルサイズを改善することを目指している。\n\nまだまだ発展途上な概念ではあるが、React を使って開発をする人や、React を使って作られたアプリケーションのユーザーにとって、画期的な機能であることは間違いない。\nだが、この概念の登場によって頭を抱え、存続の危機に陥るライブラリもある。\nstyled-components もその 1 つである。\n\n[^7]: [https://github.com/reactjs/rfcs/blob/7f8492f6a177fc33fe807d242319f2f96353bf68/text/0188-server-components.md](https://github.com/reactjs/rfcs/blob/7f8492f6a177fc33fe807d242319f2f96353bf68/text/0188-server-components.md)\n\n#### styled-components の動作原理\n\nランタイム CSS in JS という集合に分けられる、 styled-components や emotion などのライブラリは、JavaScript の実行時にスタイルを生成する。\n生成されたスタイルは DOM API を介して、style タグとして挿入される。\n\n```ts:dom.ts\n/** Create a style element inside `target` or \x3Chead> after the last */\nexport const makeStyleTag = (target?: InsertionTarget | undefined): HTMLStyleElement => {\n const head = document.head;\n const parent = target || head;\n const style = document.createElement('style');\n const prevStyle = findLastStyleTag(parent);\n const nextSibling = prevStyle !== undefined ? prevStyle.nextSibling : null;\n\n style.setAttribute(SC_ATTR, SC_ATTR_ACTIVE);\n style.setAttribute(SC_ATTR_VERSION, SC_VERSION);\n\n const nonce = getNonce();\n\n if (nonce) style.setAttribute('nonce', nonce);\n\n parent.insertBefore(style, nextSibling);\n\n return style;\n};\n```\n\nhttps://github.com/styled-components/styled-components/blob/ef548a2fd1d8b7766a273084edb33caf7d8a37df/packages/styled-components/src/sheet/dom.ts#L13-L31\n\nしかし、React Server Components では DOM API を使用できないため、styled-components のようなランタイム CSS in JS ライブラリは、React Server Components 上で動作しない。\n\n### React Server Components への対応\n\nこれに対し、React は v19 では `\x3Cbody>` の中にある `\x3Cstyle>` を自動で `\x3Chead>` に巻き上げる機能を追加した[^8]。\n詳しい挙動のイメージはブログを参照してほしいが、この機能を使った新しい世代の CSS in JS ライブラリがある[^9]。\nstyle tag hoisting は DOM API を使用せず、React のレンダリングの流れに乗って、`\x3Cstyle>` タグを `\x3Chead>` に挿入できる。\nこの機能は、React Server Components の上で動作する CSS in JS ライブラリにとって、非常に重要な機能である。\n\n[^8]: [https://react.dev/blog/2024/12/05/react-19#support-for-stylesheets](https://react.dev/blog/2024/12/05/react-19#support-for-stylesheets)\n\n[^9]: [souporserious/restyle - The simplest way to add CSS styles to your React components.](https://github.com/souporserious/restyle)\n\n### styled-components の選択\n\nReact v19 の styled hoisting を使えば、styled-components も React Server Components 上で動作できる。\nしかし、長く続いているライブラリにおいて、React の API 変更へ大胆に対応するのは既存のユーザーへ求める負荷が高まってしまう。\nそのため、styled-components はメンテナンスモードに移行することを選択したと話している。\n\n私達は、この選択を決して責めることはできないし、責めるべきではない。\nstyled-components は長い間、CSS in JS のパイオニアとして多くの開発者に支持されてきた。\nそして、新機能を追加しないと判断した今もなお、UX を損なわない程度にバグ修正などはしばらく行うとも発表している。\n私達は、styled-components の選択を尊重し、感謝の意を表するべきである。\n\nただ、発表文の中にあった、「The React core team has decided to defacto-deprecate certain APIs like the Context API」という文言は、少々気になる。\n少なくとも、React core team は Context API を事実上の非推奨とするような変更や発言はどこでもしていない。\n上述の文言が styled-components の開発者の誤解であることを願うが、React Server Components の登場によって、styled-components の選択肢が狭まったことは間違いない。\nまた、styled-components のメンテナンスモードへの移行は、CSS in JS ライブラリの選択肢を狭めることにもつながる。\n\n## styled-components とこれから\n\n### 移行先?\n\nstyled-components のメンテナンスモードに対して、私達はどのように対応すれば良いのだろうか。\n対応を検討するときに、次の観点が重要である。\n\n- CSS in JS ライブラリを使用するのか\n - runtime CSS in JS を使用するのか zero-runtime CSS in JS を使用するのか\n - 使用するなら template literal を使用するのか\n - object literal を使用する場合、stylelint などの資産が使えなくなることへの考慮\n - 使用しないなら、CSS Modules や BEM 記法を使用するのか\n- 移行する場合に、必ずプロダクトに複数の styling library が混在することになる\n - その場合、どのように移行するのか\n - AST 走査による機械的な移行\n - Cursor や Cline などの AI を使用した移行\n - 手動での移行\n - どのように運用していくのか\n- そもそも移行するのか?\n - 現状 React Server Components を使用していない場合\n - styled-components 起因で React などのバージョンアップができない場合\n - styled-components のバグに悩まされている場合\n\nこれらの観点を考慮しながら、移行先を検討する必要がある。\n私の個人的な感想としては、React Server Components や Streaming SSR を使用する場合、あとは React の major version を上げる際に、styled-components の存在が障壁になったタイミングで移行するのが良いのではないかと思う。\n\n## おわりに\n\nstyled-components のメンテナンスモードへの移行は、CSS in JS ライブラリの歴史において、1つの節目となる出来事である。\n私達は、styled-components の選択を尊重し、感謝の意を表するべきである。\nまた、React Server Components の登場によって、CSS in JS ライブラリの選択肢が狭まることは間違いない。\n私達は、移行先を検討し、プロダクトに最適な選択をする必要がある。",description:"styled-components のメンテナンスモードを受けて考えた記録。",published:!0,publishedAt:"2025-03-24T23:31:13.108+09:00[Asia/Tokyo]",tags:$R[4]=["styled-components","CSS in JS","React"],title:"styled-components の歴史、現在、これから",updatedAt:"2025-04-02T00:04:33.74+09:00[Asia/Tokyo]",_meta:$R[5]={filePath:"01JQ4914YGQZ02Q5PW5CNRJTJT/slug.md",fileName:"slug.md",directory:"01JQ4914YGQZ02Q5PW5CNRJTJT",extension:"md",path:"01JQ4914YGQZ02Q5PW5CNRJTJT/slug"},abstract:"styled-components の歴史、現在、これからはじめに先日、1つの時代が終わりを迎えた。https://opencollective.com/styled-components/updates/thank-youstyled-components のメンテナンスモードへの移行が発表された。\nこれは、CSS in JS 並びに styling library の歴史において、1つの節目となる出来事である。社内のプロダクトでは styled-components が使用されており、年末に私が v6 へのアップデートを行ったばかりだった。\nそのため、この発表は私にとっても大きな影響を与えるものであった。そこで、今回は styled-components の歴史を振り返り、現在の状況を整理し、これからの展望を考える。styled-components とはstyled-componen",mdast:$R[6]={children:$R[7]=[$R[8]={children:$R[9]=[$R[10]={children:$R[11]=[$R[12]={position:$R[13]={start:$R[14]={line:3,column:4,offset:36},end:$R[15]={line:3,column:8,offset:40}},type:"text",value:"はじめに"}],id:"はじめに",level:2,plain:"はじめに",position:$R[16]={start:$R[17]={line:3,column:1,offset:33},end:$R[18]={line:3,column:8,offset:40}},type:"heading"},$R[19]={children:$R[20]=[$R[21]={position:$R[22]={start:$R[23]={line:5,column:1,offset:42},end:$R[24]={line:5,column:18,offset:59}},type:"text",value:"先日、1つの時代が終わりを迎えた。"}],position:$R[25]={start:$R[26]={line:5,column:1,offset:42},end:$R[27]={line:5,column:18,offset:59}},type:"paragraph"},$R[28]={meta:$R[29]={title:"Thank you - Open Collective",twitter_card:$R[30]={site:"@opencollect",creator:void 0,card:"summary_large_image",title:"Thank you - styled-components",description:"First and foremost, thank you to everyone who has contributed to styled-components over the years. Open Source is hard work, and many of the larger feature and/or refactoring drives probably would never have shipped without your support! As...",images:$R[31]=[$R[32]={url:"https://images.opencollective.com/styled-components/dedfe2f/logo.png"}]},open_graph:$R[33]={images:$R[34]=[$R[35]={url:"https://images.opencollective.com/styled-components/dedfe2f/logo.png"}],title:"Thank you - styled-components"},description:"First and foremost, thank you to everyone who has contributed to styled-components over the years. Open Source is hard work, and many of the larger feature and/or refactoring drives probably would never have shipped without your support! As...",favicon:"https://opencollective.com/static/images/favicon.ico.png",canonical_url:"https://opencollective.com/styled-components/updates/thank-you"},oembed:void 0,position:$R[36]={start:$R[37]={line:7,column:1,offset:61},end:$R[38]={line:7,column:63,offset:123}},src:"https://opencollective.com/styled-components/updates/thank-you",type:"embed"},$R[39]={children:$R[40]=[$R[41]={position:$R[42]={start:$R[43]={line:9,column:1,offset:125},end:$R[44]={line:10,column:58,offset:222}},type:"text",value:"styled-components のメンテナンスモードへの移行が発表された。\nこれは、CSS in JS 並びに styling library の歴史において、1つの節目となる出来事である。"}],position:$R[45]={start:$R[46]={line:9,column:1,offset:125},end:$R[47]={line:10,column:58,offset:222}},type:"paragraph"},$R[48]={children:$R[49]=[$R[50]={position:$R[51]={start:$R[52]={line:12,column:1,offset:224},end:$R[53]={line:13,column:33,offset:323}},type:"text",value:"社内のプロダクトでは styled-components が使用されており、年末に私が v6 へのアップデートを行ったばかりだった。\nそのため、この発表は私にとっても大きな影響を与えるものであった。"}],position:$R[54]={start:$R[55]={line:12,column:1,offset:224},end:$R[56]={line:13,column:33,offset:323}},type:"paragraph"},$R[57]={children:$R[58]=[$R[59]={position:$R[60]={start:$R[61]={line:15,column:1,offset:325},end:$R[62]={line:15,column:58,offset:382}},type:"text",value:"そこで、今回は styled-components の歴史を振り返り、現在の状況を整理し、これからの展望を考える。"}],position:$R[63]={start:$R[64]={line:15,column:1,offset:325},end:$R[65]={line:15,column:58,offset:382}},type:"paragraph"}],position:$R[66]={end:$R[67]={line:15,column:58,offset:382},start:$R[68]={line:3,column:1,offset:33}},type:"section"},$R[69]={children:$R[70]=[$R[71]={children:$R[72]=[$R[73]={position:$R[74]={start:$R[75]={line:17,column:4,offset:387},end:$R[76]={line:17,column:24,offset:407}},type:"text",value:"styled-components とは"}],id:"styled-components-とは",level:2,plain:"styled-components とは",position:$R[77]={start:$R[78]={line:17,column:1,offset:384},end:$R[79]={line:17,column:24,offset:407}},type:"heading"},$R[80]={children:$R[81]=[$R[82]={position:$R[83]={start:$R[84]={line:19,column:1,offset:409},end:$R[85]={line:19,column:52,offset:460}},type:"text",value:"styled-components は 2016 年に Glen Maddern 氏によって作成された"},$R[86]={footnoteIndex:0,position:$R[87]={start:$R[88]={line:19,column:52,offset:460},end:$R[89]={line:19,column:56,offset:464}},referenceIndex:1,type:"footnoteReference"},$R[90]={position:$R[91]={start:$R[92]={line:19,column:56,offset:464},end:$R[93]={line:21,column:58,offset:622}},type:"text",value:"、CSS in JS ライブラリである。\nReact コンポーネントシステムのスタイリングをどのように強化できるかという疑問から生まれたものであり、その後、多くの開発者によって利用されるようになった。\nstyled-components は開発者にとってより良い開発体験を提供することに加えて、以下の利点を提供する。"}],position:$R[94]={start:$R[95]={line:19,column:1,offset:409},end:$R[96]={line:21,column:58,offset:622}},type:"paragraph"},$R[97]={children:$R[98]=[$R[99]={children:$R[100]=[$R[101]={children:$R[102]=[$R[103]={position:$R[104]={start:$R[105]={line:25,column:3,offset:736},end:$R[106]={line:25,column:25,offset:758}},type:"text",value:"Critical CSS を自動的に生成する"}],position:$R[107]={start:$R[108]={line:25,column:3,offset:736},end:$R[109]={line:25,column:25,offset:758}},type:"paragraph"},$R[110]={children:$R[111]=[$R[112]={children:$R[113]=[$R[114]={children:$R[115]=[$R[116]={position:$R[117]={start:$R[118]={line:26,column:5,offset:763},end:$R[119]={line:26,column:88,offset:846}},type:"text",value:"これはほんまか?って気持ちがあったが、レンダリングされたコンポーネントのスタイルのみを注入するのだから、Critical CSS と言っても過言ではないかもしれない。"}],position:$R[120]={start:$R[121]={line:26,column:5,offset:763},end:$R[122]={line:26,column:88,offset:846}},type:"paragraph"}],position:$R[123]={start:$R[124]={line:26,column:3,offset:761},end:$R[125]={line:26,column:88,offset:846}},type:"listItem"}],position:$R[126]={start:$R[127]={line:26,column:3,offset:761},end:$R[128]={line:26,column:88,offset:846}},type:"unorderedList"}],position:$R[129]={start:$R[130]={line:25,column:1,offset:734},end:$R[131]={line:26,column:88,offset:846}},type:"listItem"},$R[132]={children:$R[133]=[$R[134]={children:$R[135]=[$R[136]={position:$R[137]={start:$R[138]={line:27,column:3,offset:849},end:$R[139]={line:27,column:21,offset:867}},type:"text",value:"シンプルに動的なスタイルを適用できる"}],position:$R[140]={start:$R[141]={line:27,column:3,offset:849},end:$R[142]={line:27,column:21,offset:867}},type:"paragraph"}],position:$R[143]={start:$R[144]={line:27,column:1,offset:847},end:$R[145]={line:27,column:21,offset:867}},type:"listItem"},$R[146]={children:$R[147]=[$R[148]={children:$R[149]=[$R[150]={position:$R[151]={start:$R[152]={line:28,column:3,offset:870},end:$R[153]={line:28,column:15,offset:882}},type:"text",value:"スタイルのコロケーション"}],position:$R[154]={start:$R[155]={line:28,column:3,offset:870},end:$R[156]={line:28,column:15,offset:882}},type:"paragraph"}],position:$R[157]={start:$R[158]={line:28,column:1,offset:868},end:$R[159]={line:28,column:15,offset:882}},type:"listItem"}],position:$R[160]={start:$R[161]={line:25,column:1,offset:734},end:$R[162]={line:28,column:15,offset:882}},type:"unorderedList"},$R[163]={children:$R[164]=[$R[165]={position:$R[166]={start:$R[167]={line:30,column:1,offset:884},end:$R[168]={line:30,column:11,offset:894}},type:"text",value:"これらはドキュメント"},$R[169]={footnoteIndex:1,position:$R[170]={start:$R[171]={line:30,column:11,offset:894},end:$R[172]={line:30,column:15,offset:898}},referenceIndex:1,type:"footnoteReference"},$R[173]={position:$R[174]={start:$R[175]={line:30,column:15,offset:898},end:$R[176]={line:30,column:45,offset:928}},type:"text",value:"から引用してきたものであるが、私の認識とほとんど変わらない。"}],position:$R[177]={start:$R[178]={line:30,column:1,offset:884},end:$R[179]={line:30,column:45,offset:928}},type:"paragraph"}],position:$R[180]={end:$R[181]={line:30,column:45,offset:928},start:$R[182]={line:17,column:1,offset:384}},type:"section"},$R[183]={children:$R[184]=[$R[185]={children:$R[186]=[$R[187]={position:$R[188]={start:$R[189]={line:34,column:4,offset:1049},end:$R[190]={line:34,column:25,offset:1070}},type:"text",value:"styled-components の歴史"}],id:"styled-components-の歴史",level:2,plain:"styled-components の歴史",position:$R[191]={start:$R[192]={line:34,column:1,offset:1046},end:$R[193]={line:34,column:25,offset:1070}},type:"heading"},$R[194]={children:$R[195]=[$R[196]={children:$R[197]=[$R[198]={position:$R[199]={start:$R[200]={line:36,column:5,offset:1076},end:$R[201]={line:36,column:18,offset:1089}},type:"text",value:"CSS in JS の登場"}],id:"css-in-js-の登場",level:3,plain:"CSS in JS の登場",position:$R[202]={start:$R[203]={line:36,column:1,offset:1072},end:$R[204]={line:36,column:18,offset:1089}},type:"heading"},$R[205]={children:$R[206]=[$R[207]={position:$R[208]={start:$R[209]={line:38,column:1,offset:1091},end:$R[210]={line:38,column:70,offset:1160}},type:"text",value:"CSS in JS は、2014 年に Facebook の Christopher \"vjeux\" Chedeau 氏によって提唱された"},$R[211]={footnoteIndex:2,position:$R[212]={start:$R[213]={line:38,column:70,offset:1160},end:$R[214]={line:38,column:74,offset:1164}},referenceIndex:1,type:"footnoteReference"},$R[215]={position:$R[216]={start:$R[217]={line:38,column:74,offset:1164},end:$R[218]={line:39,column:57,offset:1222}},type:"text",value:"。\n彼は CSS の問題点として、グローバル変数の汚染や使用されなくなった CSS の削除が困難であることを挙げた。"}],position:$R[219]={start:$R[220]={line:38,column:1,offset:1091},end:$R[221]={line:39,column:57,offset:1222}},type:"paragraph"},$R[222]={children:$R[223]=[$R[224]={position:$R[225]={start:$R[226]={line:43,column:1,offset:1326},end:$R[227]={line:43,column:75,offset:1400}},type:"text",value:"Facebook 社内ではこれらの問題に対処するため、 JavaScript を用いてインラインスタイルをオブジェクト化するという手法が講じられた。"}],position:$R[228]={start:$R[229]={line:43,column:1,offset:1326},end:$R[230]={line:43,column:75,offset:1400}},type:"paragraph"},$R[231]={filename:"sample.jsx jsx",lang:"jsx",position:$R[232]={start:$R[233]={line:45,column:1,offset:1402},end:$R[234]={line:54,column:4,offset:1534}},type:"code",value:"const style = {\n text: {\n backgroundColor: '#000000',\n color: 'white'\n }\n}\n\n\x3Cdiv style={style.text} />",hast:$R[235]={type:"root",children:$R[236]=[$R[237]={type:"element",tagName:"pre",properties:$R[238]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[239]=[$R[240]={type:"element",tagName:"code",properties:$R[241]={},children:$R[242]=[$R[243]={type:"element",tagName:"span",properties:$R[244]={class:"line"},children:$R[245]=[$R[246]={type:"element",tagName:"span",properties:$R[247]={style:"color:#CB7676"},children:$R[248]=[$R[249]={type:"text",value:"const"}]},$R[250]={type:"element",tagName:"span",properties:$R[251]={style:"color:#BD976A"},children:$R[252]=[$R[253]={type:"text",value:" style"}]},$R[254]={type:"element",tagName:"span",properties:$R[255]={style:"color:#666666"},children:$R[256]=[$R[257]={type:"text",value:" ="}]},$R[258]={type:"element",tagName:"span",properties:$R[259]={style:"color:#666666"},children:$R[260]=[$R[261]={type:"text",value:" {"}]}]},$R[262]={type:"text",value:"\n"},$R[263]={type:"element",tagName:"span",properties:$R[264]={class:"line"},children:$R[265]=[$R[266]={type:"element",tagName:"span",properties:$R[267]={style:"color:#B8A965"},children:$R[268]=[$R[269]={type:"text",value:" text"}]},$R[270]={type:"element",tagName:"span",properties:$R[271]={style:"color:#666666"},children:$R[272]=[$R[273]={type:"text",value:":"}]},$R[274]={type:"element",tagName:"span",properties:$R[275]={style:"color:#666666"},children:$R[276]=[$R[277]={type:"text",value:" {"}]}]},$R[278]={type:"text",value:"\n"},$R[279]={type:"element",tagName:"span",properties:$R[280]={class:"line"},children:$R[281]=[$R[282]={type:"element",tagName:"span",properties:$R[283]={style:"color:#B8A965"},children:$R[284]=[$R[285]={type:"text",value:" backgroundColor"}]},$R[286]={type:"element",tagName:"span",properties:$R[287]={style:"color:#666666"},children:$R[288]=[$R[289]={type:"text",value:":"}]},$R[290]={type:"element",tagName:"span",properties:$R[291]={style:"color:#C98A7D77"},children:$R[292]=[$R[293]={type:"text",value:" '"}]},$R[294]={type:"element",tagName:"span",properties:$R[295]={style:"color:#C98A7D"},children:$R[296]=[$R[297]={type:"text",value:"#000000"}]},$R[298]={type:"element",tagName:"span",properties:$R[299]={style:"color:#C98A7D77"},children:$R[300]=[$R[301]={type:"text",value:"'"}]},$R[302]={type:"element",tagName:"span",properties:$R[303]={style:"color:#666666"},children:$R[304]=[$R[305]={type:"text",value:","}]}]},$R[306]={type:"text",value:"\n"},$R[307]={type:"element",tagName:"span",properties:$R[308]={class:"line"},children:$R[309]=[$R[310]={type:"element",tagName:"span",properties:$R[311]={style:"color:#B8A965"},children:$R[312]=[$R[313]={type:"text",value:" color"}]},$R[314]={type:"element",tagName:"span",properties:$R[315]={style:"color:#666666"},children:$R[316]=[$R[317]={type:"text",value:":"}]},$R[318]={type:"element",tagName:"span",properties:$R[319]={style:"color:#C98A7D77"},children:$R[320]=[$R[321]={type:"text",value:" '"}]},$R[322]={type:"element",tagName:"span",properties:$R[323]={style:"color:#C98A7D"},children:$R[324]=[$R[325]={type:"text",value:"white"}]},$R[326]={type:"element",tagName:"span",properties:$R[327]={style:"color:#C98A7D77"},children:$R[328]=[$R[329]={type:"text",value:"'"}]}]},$R[330]={type:"text",value:"\n"},$R[331]={type:"element",tagName:"span",properties:$R[332]={class:"line"},children:$R[333]=[$R[334]={type:"element",tagName:"span",properties:$R[335]={style:"color:#666666"},children:$R[336]=[$R[337]={type:"text",value:" }"}]}]},$R[338]={type:"text",value:"\n"},$R[339]={type:"element",tagName:"span",properties:$R[340]={class:"line"},children:$R[341]=[$R[342]={type:"element",tagName:"span",properties:$R[343]={style:"color:#666666"},children:$R[344]=[$R[345]={type:"text",value:"}"}]}]},$R[346]={type:"text",value:"\n"},$R[347]={type:"element",tagName:"span",properties:$R[348]={class:"line"},children:$R[349]=[]},$R[350]={type:"text",value:"\n"},$R[351]={type:"element",tagName:"span",properties:$R[352]={class:"line"},children:$R[353]=[$R[354]={type:"element",tagName:"span",properties:$R[355]={style:"color:#666666"},children:$R[356]=[$R[357]={type:"text",value:"\x3C"}]},$R[358]={type:"element",tagName:"span",properties:$R[359]={style:"color:#4D9375"},children:$R[360]=[$R[361]={type:"text",value:"div"}]},$R[362]={type:"element",tagName:"span",properties:$R[363]={style:"color:#BD976A"},children:$R[364]=[$R[365]={type:"text",value:" style"}]},$R[366]={type:"element",tagName:"span",properties:$R[367]={style:"color:#666666"},children:$R[368]=[$R[369]={type:"text",value:"={"}]},$R[370]={type:"element",tagName:"span",properties:$R[371]={style:"color:#BD976A"},children:$R[372]=[$R[373]={type:"text",value:"style"}]},$R[374]={type:"element",tagName:"span",properties:$R[375]={style:"color:#666666"},children:$R[376]=[$R[377]={type:"text",value:"."}]},$R[378]={type:"element",tagName:"span",properties:$R[379]={style:"color:#BD976A"},children:$R[380]=[$R[381]={type:"text",value:"text"}]},$R[382]={type:"element",tagName:"span",properties:$R[383]={style:"color:#666666"},children:$R[384]=[$R[385]={type:"text",value:"}"}]},$R[386]={type:"element",tagName:"span",properties:$R[387]={style:"color:#666666"},children:$R[388]=[$R[389]={type:"text",value:" />"}]}]}]}]}]}},$R[390]={children:$R[391]=[$R[392]={position:$R[393]={start:$R[394]={line:56,column:1,offset:1536},end:$R[395]={line:57,column:60,offset:1676}},type:"text",value:"スタイルオブジェクトはプレーンな JavaScript のため、スタイルの条件分岐することや props から新たにスタイルをオーバーライドする事が容易となる。\n上記の手法に、擬似クラスや擬似要素、メディアクエリがサポートするためコミュニティによって様々なライブラリが作成された。"}],position:$R[396]={start:$R[397]={line:56,column:1,offset:1536},end:$R[398]={line:57,column:60,offset:1676}},type:"paragraph"}],position:$R[399]={end:$R[400]={line:57,column:60,offset:1676},start:$R[401]={line:36,column:1,offset:1072}},type:"section"},$R[402]={children:$R[403]=[$R[404]={children:$R[405]=[$R[406]={position:$R[407]={start:$R[408]={line:59,column:5,offset:1682},end:$R[409]={line:59,column:28,offset:1705}},type:"text",value:"styled-components という選択"}],id:"styled-components-という選択",level:3,plain:"styled-components という選択",position:$R[410]={start:$R[411]={line:59,column:1,offset:1678},end:$R[412]={line:59,column:28,offset:1705}},type:"heading"},$R[413]={children:$R[414]=[$R[415]={position:$R[416]={start:$R[417]={line:61,column:1,offset:1707},end:$R[418]={line:62,column:67,offset:1826}},type:"text",value:"様々なライブラリが登場した中で、styled-components はある種パイオニア的な存在であった。\n同じ時期に登場したライブラリと比較して、styled-components は以下の特徴を持っていて、開発者にとって魅力的であった。"}],position:$R[419]={start:$R[420]={line:61,column:1,offset:1707},end:$R[421]={line:62,column:67,offset:1826}},type:"paragraph"},$R[422]={children:$R[423]=[$R[424]={children:$R[425]=[$R[426]={children:$R[427]=[$R[428]={position:$R[429]={start:$R[430]={line:64,column:3,offset:1830},end:$R[431]={line:64,column:18,offset:1845}},type:"text",value:"依存 package が少ない"}],position:$R[432]={start:$R[433]={line:64,column:3,offset:1830},end:$R[434]={line:64,column:18,offset:1845}},type:"paragraph"}],position:$R[435]={start:$R[436]={line:64,column:1,offset:1828},end:$R[437]={line:64,column:18,offset:1845}},type:"listItem"},$R[438]={children:$R[439]=[$R[440]={children:$R[441]=[$R[442]={position:$R[443]={start:$R[444]={line:65,column:3,offset:1848},end:$R[445]={line:65,column:49,offset:1894}},type:"text",value:"template literal の中に今までの CSS とほぼ同じような書き味で記述できる"}],position:$R[446]={start:$R[447]={line:65,column:3,offset:1848},end:$R[448]={line:65,column:49,offset:1894}},type:"paragraph"}],position:$R[449]={start:$R[450]={line:65,column:1,offset:1846},end:$R[451]={line:65,column:49,offset:1894}},type:"listItem"}],position:$R[452]={start:$R[453]={line:64,column:1,offset:1828},end:$R[454]={line:65,column:49,offset:1894}},type:"unorderedList"},$R[455]={children:$R[456]=[$R[457]={position:$R[458]={start:$R[459]={line:67,column:1,offset:1896},end:$R[460]={line:67,column:47,offset:1942}},type:"text",value:"これらの特徴は、styled-components は多くの開発者に支持される理由となった。"}],position:$R[461]={start:$R[462]={line:67,column:1,offset:1896},end:$R[463]={line:67,column:47,offset:1942}},type:"paragraph"},$R[464]={children:$R[465]=[$R[466]={position:$R[467]={start:$R[468]={line:69,column:1,offset:1944},end:$R[469]={line:69,column:30,offset:1973}},type:"text",value:"2020 年の頃の記事を参照してしまい大変恐縮ではあるが、"},$R[470]={children:$R[471]=[$R[472]={position:$R[473]={start:$R[474]={line:69,column:31,offset:1974},end:$R[475]={line:69,column:40,offset:1983}},type:"text",value:"@takepepe"}],position:$R[476]={start:$R[477]={line:69,column:30,offset:1973},end:$R[478]={line:69,column:71,offset:2014}},title:void 0,type:"link",url:"https://twitter.com/takepepe"},$R[479]={position:$R[480]={start:$R[481]={line:69,column:71,offset:2014},end:$R[482]={line:69,column:111,offset:2054}},type:"text",value:" さんが書いている、「経年劣化に耐える React Component の書き方"},$R[483]={footnoteIndex:3,position:$R[484]={start:$R[485]={line:69,column:111,offset:2054},end:$R[486]={line:69,column:115,offset:2058}},referenceIndex:1,type:"footnoteReference"},$R[487]={position:$R[488]={start:$R[489]={line:69,column:115,offset:2058},end:$R[490]={line:70,column:73,offset:2155}},type:"text",value:"」という記事は、とても筋が良いなと個人的に思う。\nDOM 層として実装した Component を styled-components でスタイリングするという技法は、今でも有効であると感じる。"}],position:$R[491]={start:$R[492]={line:69,column:1,offset:1944},end:$R[493]={line:70,column:73,offset:2155}},type:"paragraph"},$R[494]={children:$R[495]=[$R[496]={position:$R[497]={start:$R[498]={line:74,column:1,offset:2275},end:$R[499]={line:75,column:78,offset:2461}},type:"text",value:"styled-components の大胆にスタイルできる利点が少々失われてしまうが、今までの BEM 記法や CSS Modules へのフォールバックが容易であり、それでいてスタイルのコロケーションが可能である。\nこういった選択に自由度がありつつ、プロダクトごとに規約を持たせることで開発体験を上げることができるのは、styled-components の魅力である。"}],position:$R[500]={start:$R[501]={line:74,column:1,offset:2275},end:$R[502]={line:75,column:78,offset:2461}},type:"paragraph"}],position:$R[503]={end:$R[504]={line:75,column:78,offset:2461},start:$R[505]={line:59,column:1,offset:1678}},type:"section"}],position:$R[506]={end:$R[507]={line:75,column:78,offset:2461},start:$R[508]={line:34,column:1,offset:1046}},type:"section"},$R[509]={children:$R[510]=[$R[511]={children:$R[512]=[$R[513]={position:$R[514]={start:$R[515]={line:77,column:4,offset:2466},end:$R[516]={line:77,column:25,offset:2487}},type:"text",value:"styled-components の現在"}],id:"styled-components-の現在",level:2,plain:"styled-components の現在",position:$R[517]={start:$R[518]={line:77,column:1,offset:2463},end:$R[519]={line:77,column:25,offset:2487}},type:"heading"},$R[520]={children:$R[521]=[$R[522]={children:$R[523]=[$R[524]={position:$R[525]={start:$R[526]={line:79,column:5,offset:2493},end:$R[527]={line:79,column:32,offset:2520}},type:"text",value:"React Server Components の登場"}],id:"react-server-components-の登場",level:3,plain:"React Server Components の登場",position:$R[528]={start:$R[529]={line:79,column:1,offset:2489},end:$R[530]={line:79,column:32,offset:2520}},type:"heading"},$R[531]={children:$R[532]=[$R[533]={position:$R[534]={start:$R[535]={line:81,column:1,offset:2522},end:$R[536]={line:81,column:86,offset:2607}},type:"text",value:"2023 年の 5 月、Vercel は Next.js 13.4 を発表し、React Server Components の上で動作する最初のフレームワークとなった。"},$R[537]={footnoteIndex:4,position:$R[538]={start:$R[539]={line:81,column:86,offset:2607},end:$R[540]={line:81,column:90,offset:2611}},referenceIndex:1,type:"footnoteReference"},$R[541]={position:$R[542]={start:$R[543]={line:81,column:90,offset:2611},end:$R[544]={line:82,column:101,offset:2712}},type:"text",value:"\nまた同じ月に React Core team は React Labs からの発表として React Server Components をよりプリミティブな形で提供することを目指していると発表した。"},$R[545]={footnoteIndex:5,position:$R[546]={start:$R[547]={line:82,column:101,offset:2712},end:$R[548]={line:82,column:105,offset:2716}},referenceIndex:1,type:"footnoteReference"}],position:$R[549]={start:$R[550]={line:81,column:1,offset:2522},end:$R[551]={line:82,column:105,offset:2716}},type:"paragraph"},$R[552]={children:$R[553]=[$R[554]={position:$R[555]={start:$R[556]={line:88,column:1,offset:3024},end:$R[557]={line:88,column:30,offset:3053}},type:"text",value:"React Server Components の RFC"},$R[558]={footnoteIndex:6,position:$R[559]={start:$R[560]={line:88,column:30,offset:3053},end:$R[561]={line:88,column:34,offset:3057}},referenceIndex:1,type:"footnoteReference"},$R[562]={position:$R[563]={start:$R[564]={line:88,column:34,offset:3057},end:$R[565]={line:88,column:89,offset:3112}},type:"text",value:" では、React がよりサーバーを活用することでパフォーマンスやバンドルサイズを改善することを目指している。"}],position:$R[566]={start:$R[567]={line:88,column:1,offset:3024},end:$R[568]={line:88,column:89,offset:3112}},type:"paragraph"},$R[569]={children:$R[570]=[$R[571]={position:$R[572]={start:$R[573]={line:90,column:1,offset:3114},end:$R[574]={line:92,column:30,offset:3266}},type:"text",value:"まだまだ発展途上な概念ではあるが、React を使って開発をする人や、React を使って作られたアプリケーションのユーザーにとって、画期的な機能であることは間違いない。\nだが、この概念の登場によって頭を抱え、存続の危機に陥るライブラリもある。\nstyled-components もその 1 つである。"}],position:$R[575]={start:$R[576]={line:90,column:1,offset:3114},end:$R[577]={line:92,column:30,offset:3266}},type:"paragraph"},$R[578]={children:$R[579]=[$R[580]={children:$R[581]=[$R[582]={position:$R[583]={start:$R[584]={line:96,column:6,offset:3501},end:$R[585]={line:96,column:29,offset:3524}},type:"text",value:"styled-components の動作原理"}],id:"styled-components-の動作原理",level:4,plain:"styled-components の動作原理",position:$R[586]={start:$R[587]={line:96,column:1,offset:3496},end:$R[588]={line:96,column:29,offset:3524}},type:"heading"},$R[589]={children:$R[590]=[$R[591]={position:$R[592]={start:$R[593]={line:98,column:1,offset:3526},end:$R[594]={line:99,column:42,offset:3661}},type:"text",value:"ランタイム CSS in JS という集合に分けられる、 styled-components や emotion などのライブラリは、JavaScript の実行時にスタイルを生成する。\n生成されたスタイルは DOM API を介して、style タグとして挿入される。"}],position:$R[595]={start:$R[596]={line:98,column:1,offset:3526},end:$R[597]={line:99,column:42,offset:3661}},type:"paragraph"},$R[598]={filename:"dom.ts ts",lang:"ts",position:$R[599]={start:$R[600]={line:101,column:1,offset:3663},end:$R[601]={line:121,column:4,offset:4318}},type:"code",value:"/** Create a style element inside `target` or \x3Chead> after the last */\nexport const makeStyleTag = (target?: InsertionTarget | undefined): HTMLStyleElement => {\n const head = document.head;\n const parent = target || head;\n const style = document.createElement('style');\n const prevStyle = findLastStyleTag(parent);\n const nextSibling = prevStyle !== undefined ? prevStyle.nextSibling : null;\n\n style.setAttribute(SC_ATTR, SC_ATTR_ACTIVE);\n style.setAttribute(SC_ATTR_VERSION, SC_VERSION);\n\n const nonce = getNonce();\n\n if (nonce) style.setAttribute('nonce', nonce);\n\n parent.insertBefore(style, nextSibling);\n\n return style;\n};",hast:$R[602]={type:"root",children:$R[603]=[$R[604]={type:"element",tagName:"pre",properties:$R[605]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[606]=[$R[607]={type:"element",tagName:"code",properties:$R[608]={},children:$R[609]=[$R[610]={type:"element",tagName:"span",properties:$R[611]={class:"line"},children:$R[612]=[$R[613]={type:"element",tagName:"span",properties:$R[614]={style:"color:#758575DD"},children:$R[615]=[$R[616]={type:"text",value:"/** Create a style element inside `target` or \x3Chead> after the last */"}]}]},$R[617]={type:"text",value:"\n"},$R[618]={type:"element",tagName:"span",properties:$R[619]={class:"line"},children:$R[620]=[$R[621]={type:"element",tagName:"span",properties:$R[622]={style:"color:#4D9375"},children:$R[623]=[$R[624]={type:"text",value:"export"}]},$R[625]={type:"element",tagName:"span",properties:$R[626]={style:"color:#CB7676"},children:$R[627]=[$R[628]={type:"text",value:" const "}]},$R[629]={type:"element",tagName:"span",properties:$R[630]={style:"color:#80A665"},children:$R[631]=[$R[632]={type:"text",value:"makeStyleTag"}]},$R[633]={type:"element",tagName:"span",properties:$R[634]={style:"color:#666666"},children:$R[635]=[$R[636]={type:"text",value:" ="}]},$R[637]={type:"element",tagName:"span",properties:$R[638]={style:"color:#666666"},children:$R[639]=[$R[640]={type:"text",value:" ("}]},$R[641]={type:"element",tagName:"span",properties:$R[642]={style:"color:#BD976A"},children:$R[643]=[$R[644]={type:"text",value:"target"}]},$R[645]={type:"element",tagName:"span",properties:$R[646]={style:"color:#CB7676"},children:$R[647]=[$R[648]={type:"text",value:"?"}]},$R[649]={type:"element",tagName:"span",properties:$R[650]={style:"color:#666666"},children:$R[651]=[$R[652]={type:"text",value:": "}]},$R[653]={type:"element",tagName:"span",properties:$R[654]={style:"color:#5DA994"},children:$R[655]=[$R[656]={type:"text",value:"InsertionTarget"}]},$R[657]={type:"element",tagName:"span",properties:$R[658]={style:"color:#666666"},children:$R[659]=[$R[660]={type:"text",value:" | "}]},$R[661]={type:"element",tagName:"span",properties:$R[662]={style:"color:#CB7676"},children:$R[663]=[$R[664]={type:"text",value:"undefined"}]},$R[665]={type:"element",tagName:"span",properties:$R[666]={style:"color:#666666"},children:$R[667]=[$R[668]={type:"text",value:"):"}]},$R[669]={type:"element",tagName:"span",properties:$R[670]={style:"color:#5DA994"},children:$R[671]=[$R[672]={type:"text",value:" HTMLStyleElement"}]},$R[673]={type:"element",tagName:"span",properties:$R[674]={style:"color:#666666"},children:$R[675]=[$R[676]={type:"text",value:" =>"}]},$R[677]={type:"element",tagName:"span",properties:$R[678]={style:"color:#666666"},children:$R[679]=[$R[680]={type:"text",value:" {"}]}]},$R[681]={type:"text",value:"\n"},$R[682]={type:"element",tagName:"span",properties:$R[683]={class:"line"},children:$R[684]=[$R[685]={type:"element",tagName:"span",properties:$R[686]={style:"color:#CB7676"},children:$R[687]=[$R[688]={type:"text",value:" const "}]},$R[689]={type:"element",tagName:"span",properties:$R[690]={style:"color:#BD976A"},children:$R[691]=[$R[692]={type:"text",value:"head"}]},$R[693]={type:"element",tagName:"span",properties:$R[694]={style:"color:#666666"},children:$R[695]=[$R[696]={type:"text",value:" ="}]},$R[697]={type:"element",tagName:"span",properties:$R[698]={style:"color:#BD976A"},children:$R[699]=[$R[700]={type:"text",value:" document"}]},$R[701]={type:"element",tagName:"span",properties:$R[702]={style:"color:#666666"},children:$R[703]=[$R[704]={type:"text",value:"."}]},$R[705]={type:"element",tagName:"span",properties:$R[706]={style:"color:#BD976A"},children:$R[707]=[$R[708]={type:"text",value:"head"}]},$R[709]={type:"element",tagName:"span",properties:$R[710]={style:"color:#666666"},children:$R[711]=[$R[712]={type:"text",value:";"}]}]},$R[713]={type:"text",value:"\n"},$R[714]={type:"element",tagName:"span",properties:$R[715]={class:"line"},children:$R[716]=[$R[717]={type:"element",tagName:"span",properties:$R[718]={style:"color:#CB7676"},children:$R[719]=[$R[720]={type:"text",value:" const "}]},$R[721]={type:"element",tagName:"span",properties:$R[722]={style:"color:#BD976A"},children:$R[723]=[$R[724]={type:"text",value:"parent"}]},$R[725]={type:"element",tagName:"span",properties:$R[726]={style:"color:#666666"},children:$R[727]=[$R[728]={type:"text",value:" ="}]},$R[729]={type:"element",tagName:"span",properties:$R[730]={style:"color:#BD976A"},children:$R[731]=[$R[732]={type:"text",value:" target"}]},$R[733]={type:"element",tagName:"span",properties:$R[734]={style:"color:#CB7676"},children:$R[735]=[$R[736]={type:"text",value:" || "}]},$R[737]={type:"element",tagName:"span",properties:$R[738]={style:"color:#BD976A"},children:$R[739]=[$R[740]={type:"text",value:"head"}]},$R[741]={type:"element",tagName:"span",properties:$R[742]={style:"color:#666666"},children:$R[743]=[$R[744]={type:"text",value:";"}]}]},$R[745]={type:"text",value:"\n"},$R[746]={type:"element",tagName:"span",properties:$R[747]={class:"line"},children:$R[748]=[$R[749]={type:"element",tagName:"span",properties:$R[750]={style:"color:#CB7676"},children:$R[751]=[$R[752]={type:"text",value:" const "}]},$R[753]={type:"element",tagName:"span",properties:$R[754]={style:"color:#BD976A"},children:$R[755]=[$R[756]={type:"text",value:"style"}]},$R[757]={type:"element",tagName:"span",properties:$R[758]={style:"color:#666666"},children:$R[759]=[$R[760]={type:"text",value:" ="}]},$R[761]={type:"element",tagName:"span",properties:$R[762]={style:"color:#BD976A"},children:$R[763]=[$R[764]={type:"text",value:" document"}]},$R[765]={type:"element",tagName:"span",properties:$R[766]={style:"color:#666666"},children:$R[767]=[$R[768]={type:"text",value:"."}]},$R[769]={type:"element",tagName:"span",properties:$R[770]={style:"color:#80A665"},children:$R[771]=[$R[772]={type:"text",value:"createElement"}]},$R[773]={type:"element",tagName:"span",properties:$R[774]={style:"color:#666666"},children:$R[775]=[$R[776]={type:"text",value:"("}]},$R[777]={type:"element",tagName:"span",properties:$R[778]={style:"color:#C98A7D77"},children:$R[779]=[$R[780]={type:"text",value:"'"}]},$R[781]={type:"element",tagName:"span",properties:$R[782]={style:"color:#C98A7D"},children:$R[783]=[$R[784]={type:"text",value:"style"}]},$R[785]={type:"element",tagName:"span",properties:$R[786]={style:"color:#C98A7D77"},children:$R[787]=[$R[788]={type:"text",value:"'"}]},$R[789]={type:"element",tagName:"span",properties:$R[790]={style:"color:#666666"},children:$R[791]=[$R[792]={type:"text",value:");"}]}]},$R[793]={type:"text",value:"\n"},$R[794]={type:"element",tagName:"span",properties:$R[795]={class:"line"},children:$R[796]=[$R[797]={type:"element",tagName:"span",properties:$R[798]={style:"color:#CB7676"},children:$R[799]=[$R[800]={type:"text",value:" const "}]},$R[801]={type:"element",tagName:"span",properties:$R[802]={style:"color:#BD976A"},children:$R[803]=[$R[804]={type:"text",value:"prevStyle"}]},$R[805]={type:"element",tagName:"span",properties:$R[806]={style:"color:#666666"},children:$R[807]=[$R[808]={type:"text",value:" ="}]},$R[809]={type:"element",tagName:"span",properties:$R[810]={style:"color:#80A665"},children:$R[811]=[$R[812]={type:"text",value:" findLastStyleTag"}]},$R[813]={type:"element",tagName:"span",properties:$R[814]={style:"color:#666666"},children:$R[815]=[$R[816]={type:"text",value:"("}]},$R[817]={type:"element",tagName:"span",properties:$R[818]={style:"color:#BD976A"},children:$R[819]=[$R[820]={type:"text",value:"parent"}]},$R[821]={type:"element",tagName:"span",properties:$R[822]={style:"color:#666666"},children:$R[823]=[$R[824]={type:"text",value:");"}]}]},$R[825]={type:"text",value:"\n"},$R[826]={type:"element",tagName:"span",properties:$R[827]={class:"line"},children:$R[828]=[$R[829]={type:"element",tagName:"span",properties:$R[830]={style:"color:#CB7676"},children:$R[831]=[$R[832]={type:"text",value:" const "}]},$R[833]={type:"element",tagName:"span",properties:$R[834]={style:"color:#BD976A"},children:$R[835]=[$R[836]={type:"text",value:"nextSibling"}]},$R[837]={type:"element",tagName:"span",properties:$R[838]={style:"color:#666666"},children:$R[839]=[$R[840]={type:"text",value:" ="}]},$R[841]={type:"element",tagName:"span",properties:$R[842]={style:"color:#BD976A"},children:$R[843]=[$R[844]={type:"text",value:" prevStyle"}]},$R[845]={type:"element",tagName:"span",properties:$R[846]={style:"color:#CB7676"},children:$R[847]=[$R[848]={type:"text",value:" !== undefined ? "}]},$R[849]={type:"element",tagName:"span",properties:$R[850]={style:"color:#BD976A"},children:$R[851]=[$R[852]={type:"text",value:"prevStyle"}]},$R[853]={type:"element",tagName:"span",properties:$R[854]={style:"color:#666666"},children:$R[855]=[$R[856]={type:"text",value:"."}]},$R[857]={type:"element",tagName:"span",properties:$R[858]={style:"color:#BD976A"},children:$R[859]=[$R[860]={type:"text",value:"nextSibling"}]},$R[861]={type:"element",tagName:"span",properties:$R[862]={style:"color:#CB7676"},children:$R[863]=[$R[864]={type:"text",value:" : null"}]},$R[865]={type:"element",tagName:"span",properties:$R[866]={style:"color:#666666"},children:$R[867]=[$R[868]={type:"text",value:";"}]}]},$R[869]={type:"text",value:"\n"},$R[870]={type:"element",tagName:"span",properties:$R[871]={class:"line"},children:$R[872]=[]},$R[873]={type:"text",value:"\n"},$R[874]={type:"element",tagName:"span",properties:$R[875]={class:"line"},children:$R[876]=[$R[877]={type:"element",tagName:"span",properties:$R[878]={style:"color:#BD976A"},children:$R[879]=[$R[880]={type:"text",value:" style"}]},$R[881]={type:"element",tagName:"span",properties:$R[882]={style:"color:#666666"},children:$R[883]=[$R[884]={type:"text",value:"."}]},$R[885]={type:"element",tagName:"span",properties:$R[886]={style:"color:#80A665"},children:$R[887]=[$R[888]={type:"text",value:"setAttribute"}]},$R[889]={type:"element",tagName:"span",properties:$R[890]={style:"color:#666666"},children:$R[891]=[$R[892]={type:"text",value:"("}]},$R[893]={type:"element",tagName:"span",properties:$R[894]={style:"color:#BD976A"},children:$R[895]=[$R[896]={type:"text",value:"SC_ATTR"}]},$R[897]={type:"element",tagName:"span",properties:$R[898]={style:"color:#666666"},children:$R[899]=[$R[900]={type:"text",value:","}]},$R[901]={type:"element",tagName:"span",properties:$R[902]={style:"color:#BD976A"},children:$R[903]=[$R[904]={type:"text",value:" SC_ATTR_ACTIVE"}]},$R[905]={type:"element",tagName:"span",properties:$R[906]={style:"color:#666666"},children:$R[907]=[$R[908]={type:"text",value:");"}]}]},$R[909]={type:"text",value:"\n"},$R[910]={type:"element",tagName:"span",properties:$R[911]={class:"line"},children:$R[912]=[$R[913]={type:"element",tagName:"span",properties:$R[914]={style:"color:#BD976A"},children:$R[915]=[$R[916]={type:"text",value:" style"}]},$R[917]={type:"element",tagName:"span",properties:$R[918]={style:"color:#666666"},children:$R[919]=[$R[920]={type:"text",value:"."}]},$R[921]={type:"element",tagName:"span",properties:$R[922]={style:"color:#80A665"},children:$R[923]=[$R[924]={type:"text",value:"setAttribute"}]},$R[925]={type:"element",tagName:"span",properties:$R[926]={style:"color:#666666"},children:$R[927]=[$R[928]={type:"text",value:"("}]},$R[929]={type:"element",tagName:"span",properties:$R[930]={style:"color:#BD976A"},children:$R[931]=[$R[932]={type:"text",value:"SC_ATTR_VERSION"}]},$R[933]={type:"element",tagName:"span",properties:$R[934]={style:"color:#666666"},children:$R[935]=[$R[936]={type:"text",value:","}]},$R[937]={type:"element",tagName:"span",properties:$R[938]={style:"color:#BD976A"},children:$R[939]=[$R[940]={type:"text",value:" SC_VERSION"}]},$R[941]={type:"element",tagName:"span",properties:$R[942]={style:"color:#666666"},children:$R[943]=[$R[944]={type:"text",value:");"}]}]},$R[945]={type:"text",value:"\n"},$R[946]={type:"element",tagName:"span",properties:$R[947]={class:"line"},children:$R[948]=[]},$R[949]={type:"text",value:"\n"},$R[950]={type:"element",tagName:"span",properties:$R[951]={class:"line"},children:$R[952]=[$R[953]={type:"element",tagName:"span",properties:$R[954]={style:"color:#CB7676"},children:$R[955]=[$R[956]={type:"text",value:" const "}]},$R[957]={type:"element",tagName:"span",properties:$R[958]={style:"color:#BD976A"},children:$R[959]=[$R[960]={type:"text",value:"nonce"}]},$R[961]={type:"element",tagName:"span",properties:$R[962]={style:"color:#666666"},children:$R[963]=[$R[964]={type:"text",value:" ="}]},$R[965]={type:"element",tagName:"span",properties:$R[966]={style:"color:#80A665"},children:$R[967]=[$R[968]={type:"text",value:" getNonce"}]},$R[969]={type:"element",tagName:"span",properties:$R[970]={style:"color:#666666"},children:$R[971]=[$R[972]={type:"text",value:"();"}]}]},$R[973]={type:"text",value:"\n"},$R[974]={type:"element",tagName:"span",properties:$R[975]={class:"line"},children:$R[976]=[]},$R[977]={type:"text",value:"\n"},$R[978]={type:"element",tagName:"span",properties:$R[979]={class:"line"},children:$R[980]=[$R[981]={type:"element",tagName:"span",properties:$R[982]={style:"color:#4D9375"},children:$R[983]=[$R[984]={type:"text",value:" if"}]},$R[985]={type:"element",tagName:"span",properties:$R[986]={style:"color:#666666"},children:$R[987]=[$R[988]={type:"text",value:" ("}]},$R[989]={type:"element",tagName:"span",properties:$R[990]={style:"color:#BD976A"},children:$R[991]=[$R[992]={type:"text",value:"nonce"}]},$R[993]={type:"element",tagName:"span",properties:$R[994]={style:"color:#666666"},children:$R[995]=[$R[996]={type:"text",value:")"}]},$R[997]={type:"element",tagName:"span",properties:$R[998]={style:"color:#BD976A"},children:$R[999]=[$R[1000]={type:"text",value:" style"}]},$R[1001]={type:"element",tagName:"span",properties:$R[1002]={style:"color:#666666"},children:$R[1003]=[$R[1004]={type:"text",value:"."}]},$R[1005]={type:"element",tagName:"span",properties:$R[1006]={style:"color:#80A665"},children:$R[1007]=[$R[1008]={type:"text",value:"setAttribute"}]},$R[1009]={type:"element",tagName:"span",properties:$R[1010]={style:"color:#666666"},children:$R[1011]=[$R[1012]={type:"text",value:"("}]},$R[1013]={type:"element",tagName:"span",properties:$R[1014]={style:"color:#C98A7D77"},children:$R[1015]=[$R[1016]={type:"text",value:"'"}]},$R[1017]={type:"element",tagName:"span",properties:$R[1018]={style:"color:#C98A7D"},children:$R[1019]=[$R[1020]={type:"text",value:"nonce"}]},$R[1021]={type:"element",tagName:"span",properties:$R[1022]={style:"color:#C98A7D77"},children:$R[1023]=[$R[1024]={type:"text",value:"'"}]},$R[1025]={type:"element",tagName:"span",properties:$R[1026]={style:"color:#666666"},children:$R[1027]=[$R[1028]={type:"text",value:","}]},$R[1029]={type:"element",tagName:"span",properties:$R[1030]={style:"color:#BD976A"},children:$R[1031]=[$R[1032]={type:"text",value:" nonce"}]},$R[1033]={type:"element",tagName:"span",properties:$R[1034]={style:"color:#666666"},children:$R[1035]=[$R[1036]={type:"text",value:");"}]}]},$R[1037]={type:"text",value:"\n"},$R[1038]={type:"element",tagName:"span",properties:$R[1039]={class:"line"},children:$R[1040]=[]},$R[1041]={type:"text",value:"\n"},$R[1042]={type:"element",tagName:"span",properties:$R[1043]={class:"line"},children:$R[1044]=[$R[1045]={type:"element",tagName:"span",properties:$R[1046]={style:"color:#BD976A"},children:$R[1047]=[$R[1048]={type:"text",value:" parent"}]},$R[1049]={type:"element",tagName:"span",properties:$R[1050]={style:"color:#666666"},children:$R[1051]=[$R[1052]={type:"text",value:"."}]},$R[1053]={type:"element",tagName:"span",properties:$R[1054]={style:"color:#80A665"},children:$R[1055]=[$R[1056]={type:"text",value:"insertBefore"}]},$R[1057]={type:"element",tagName:"span",properties:$R[1058]={style:"color:#666666"},children:$R[1059]=[$R[1060]={type:"text",value:"("}]},$R[1061]={type:"element",tagName:"span",properties:$R[1062]={style:"color:#BD976A"},children:$R[1063]=[$R[1064]={type:"text",value:"style"}]},$R[1065]={type:"element",tagName:"span",properties:$R[1066]={style:"color:#666666"},children:$R[1067]=[$R[1068]={type:"text",value:","}]},$R[1069]={type:"element",tagName:"span",properties:$R[1070]={style:"color:#BD976A"},children:$R[1071]=[$R[1072]={type:"text",value:" nextSibling"}]},$R[1073]={type:"element",tagName:"span",properties:$R[1074]={style:"color:#666666"},children:$R[1075]=[$R[1076]={type:"text",value:");"}]}]},$R[1077]={type:"text",value:"\n"},$R[1078]={type:"element",tagName:"span",properties:$R[1079]={class:"line"},children:$R[1080]=[]},$R[1081]={type:"text",value:"\n"},$R[1082]={type:"element",tagName:"span",properties:$R[1083]={class:"line"},children:$R[1084]=[$R[1085]={type:"element",tagName:"span",properties:$R[1086]={style:"color:#4D9375"},children:$R[1087]=[$R[1088]={type:"text",value:" return"}]},$R[1089]={type:"element",tagName:"span",properties:$R[1090]={style:"color:#BD976A"},children:$R[1091]=[$R[1092]={type:"text",value:" style"}]},$R[1093]={type:"element",tagName:"span",properties:$R[1094]={style:"color:#666666"},children:$R[1095]=[$R[1096]={type:"text",value:";"}]}]},$R[1097]={type:"text",value:"\n"},$R[1098]={type:"element",tagName:"span",properties:$R[1099]={class:"line"},children:$R[1100]=[$R[1101]={type:"element",tagName:"span",properties:$R[1102]={style:"color:#666666"},children:$R[1103]=[$R[1104]={type:"text",value:"};"}]}]}]}]}]}},$R[1105]={meta:$R[1106]={title:"styled-components/packages/styled-components/src/sheet/dom.ts at ef548a2fd1d8b7766a273084edb33caf7d8a37df · styled-components/styled-components · GitHub",description:"Visual primitives for the component age. Use the best bits of ES6 and CSS to style your apps without stress 💅 - styled-components/packages/styled-components/src/sheet/dom.ts at ef548a2fd1d8b7766a273084edb33caf7d8a37df · styled-components/styled-components",twitter_card:$R[1107]={images:$R[1108]=[$R[1109]={url:"https://repository-images.githubusercontent.com/65794292/bdacfa80-6132-11e9-90b9-33e6eee04d1f"}],site:"@github",card:"summary_large_image",title:"styled-components/packages/styled-components/src/sheet/dom.ts at ef548a2fd1d8b7766a273084edb33caf7d8a37df · styled-components/styled-components",description:"Visual primitives for the component age. Use the best bits of ES6 and CSS to style your apps without stress 💅 - styled-components/styled-components"},open_graph:$R[1110]={images:$R[1111]=[$R[1112]={url:"https://repository-images.githubusercontent.com/65794292/bdacfa80-6132-11e9-90b9-33e6eee04d1f",alt:"Visual primitives for the component age. Use the best bits of ES6 and CSS to style your apps without stress 💅 - styled-components/styled-components"}],site_name:"GitHub",type:"object",title:"styled-components/packages/styled-components/src/sheet/dom.ts at ef548a2fd1d8b7766a273084edb33caf7d8a37df · styled-components/styled-components",url:"https://github.com/styled-components/styled-components/blob/ef548a2fd1d8b7766a273084edb33caf7d8a37df/packages/styled-components/src/sheet/dom.ts",description:"Visual primitives for the component age. Use the best bits of ES6 and CSS to style your apps without stress 💅 - styled-components/styled-components"},theme_color:"#1e2327",favicon:"https://github.githubassets.com/favicons/favicon.svg"},oembed:void 0,position:$R[1113]={start:$R[1114]={line:123,column:1,offset:4320},end:$R[1115]={line:123,column:153,offset:4472}},src:"https://github.com/styled-components/styled-components/blob/ef548a2fd1d8b7766a273084edb33caf7d8a37df/packages/styled-components/src/sheet/dom.ts#L13-L31",type:"embed"},$R[1116]={children:$R[1117]=[$R[1118]={position:$R[1119]={start:$R[1120]={line:125,column:1,offset:4474},end:$R[1121]={line:125,column:127,offset:4600}},type:"text",value:"しかし、React Server Components では DOM API を使用できないため、styled-components のようなランタイム CSS in JS ライブラリは、React Server Components 上で動作しない。"}],position:$R[1122]={start:$R[1123]={line:125,column:1,offset:4474},end:$R[1124]={line:125,column:127,offset:4600}},type:"paragraph"}],position:$R[1125]={end:$R[1126]={line:125,column:127,offset:4600},start:$R[1127]={line:96,column:1,offset:3496}},type:"section"}],position:$R[1128]={end:$R[1129]={line:125,column:127,offset:4600},start:$R[1130]={line:79,column:1,offset:2489}},type:"section"},$R[1131]={children:$R[1132]=[$R[1133]={children:$R[1134]=[$R[1135]={position:$R[1136]={start:$R[1137]={line:127,column:5,offset:4606},end:$R[1138]={line:127,column:33,offset:4634}},type:"text",value:"React Server Components への対応"}],id:"react-server-components-への対応",level:3,plain:"React Server Components への対応",position:$R[1139]={start:$R[1140]={line:127,column:1,offset:4602},end:$R[1141]={line:127,column:33,offset:4634}},type:"heading"},$R[1142]={children:$R[1143]=[$R[1144]={position:$R[1145]={start:$R[1146]={line:129,column:1,offset:4636},end:$R[1147]={line:129,column:22,offset:4657}},type:"text",value:"これに対し、React は v19 では "},$R[1148]={position:$R[1149]={start:$R[1150]={line:129,column:22,offset:4657},end:$R[1151]={line:129,column:30,offset:4665}},type:"inlineCode",value:"\x3Cbody>"},$R[1152]={position:$R[1153]={start:$R[1154]={line:129,column:30,offset:4665},end:$R[1155]={line:129,column:37,offset:4672}},type:"text",value:" の中にある "},$R[1156]={position:$R[1157]={start:$R[1158]={line:129,column:37,offset:4672},end:$R[1159]={line:129,column:46,offset:4681}},type:"inlineCode",value:"\x3Cstyle>"},$R[1160]={position:$R[1161]={start:$R[1162]={line:129,column:46,offset:4681},end:$R[1163]={line:129,column:52,offset:4687}},type:"text",value:" を自動で "},$R[1164]={position:$R[1165]={start:$R[1166]={line:129,column:52,offset:4687},end:$R[1167]={line:129,column:60,offset:4695}},type:"inlineCode",value:"\x3Chead>"},$R[1168]={position:$R[1169]={start:$R[1170]={line:129,column:60,offset:4695},end:$R[1171]={line:129,column:74,offset:4709}},type:"text",value:" に巻き上げる機能を追加した"},$R[1172]={footnoteIndex:7,position:$R[1173]={start:$R[1174]={line:129,column:74,offset:4709},end:$R[1175]={line:129,column:78,offset:4713}},referenceIndex:1,type:"footnoteReference"},$R[1176]={position:$R[1177]={start:$R[1178]={line:129,column:78,offset:4713},end:$R[1179]={line:130,column:58,offset:4772}},type:"text",value:"。\n詳しい挙動のイメージはブログを参照してほしいが、この機能を使った新しい世代の CSS in JS ライブラリがある"},$R[1180]={footnoteIndex:8,position:$R[1181]={start:$R[1182]={line:130,column:58,offset:4772},end:$R[1183]={line:130,column:62,offset:4776}},referenceIndex:1,type:"footnoteReference"},$R[1184]={position:$R[1185]={start:$R[1186]={line:130,column:62,offset:4776},end:$R[1187]={line:131,column:57,offset:4834}},type:"text",value:"。\nstyle tag hoisting は DOM API を使用せず、React のレンダリングの流れに乗って、"},$R[1188]={position:$R[1189]={start:$R[1190]={line:131,column:57,offset:4834},end:$R[1191]={line:131,column:66,offset:4843}},type:"inlineCode",value:"\x3Cstyle>"},$R[1192]={position:$R[1193]={start:$R[1194]={line:131,column:66,offset:4843},end:$R[1195]={line:131,column:71,offset:4848}},type:"text",value:" タグを "},$R[1196]={position:$R[1197]={start:$R[1198]={line:131,column:71,offset:4848},end:$R[1199]={line:131,column:79,offset:4856}},type:"inlineCode",value:"\x3Chead>"},$R[1200]={position:$R[1201]={start:$R[1202]={line:131,column:79,offset:4856},end:$R[1203]={line:132,column:71,offset:4935}},type:"text",value:" に挿入できる。\nこの機能は、React Server Components の上で動作する CSS in JS ライブラリにとって、非常に重要な機能である。"}],position:$R[1204]={start:$R[1205]={line:129,column:1,offset:4636},end:$R[1206]={line:132,column:71,offset:4935}},type:"paragraph"}],position:$R[1207]={end:$R[1208]={line:132,column:71,offset:4935},start:$R[1209]={line:127,column:1,offset:4602}},type:"section"},$R[1210]={children:$R[1211]=[$R[1212]={children:$R[1213]=[$R[1214]={position:$R[1215]={start:$R[1216]={line:138,column:5,offset:5221},end:$R[1217]={line:138,column:26,offset:5242}},type:"text",value:"styled-components の選択"}],id:"styled-components-の選択",level:3,plain:"styled-components の選択",position:$R[1218]={start:$R[1219]={line:138,column:1,offset:5217},end:$R[1220]={line:138,column:26,offset:5242}},type:"heading"},$R[1221]={children:$R[1222]=[$R[1223]={position:$R[1224]={start:$R[1225]={line:140,column:1,offset:5244},end:$R[1226]={line:142,column:53,offset:5450}},type:"text",value:"React v19 の styled hoisting を使えば、styled-components も React Server Components 上で動作できる。\nしかし、長く続いているライブラリにおいて、React の API 変更へ大胆に対応するのは既存のユーザーへ求める負荷が高まってしまう。\nそのため、styled-components はメンテナンスモードに移行することを選択したと話している。"}],position:$R[1227]={start:$R[1228]={line:140,column:1,offset:5244},end:$R[1229]={line:142,column:53,offset:5450}},type:"paragraph"},$R[1230]={children:$R[1231]=[$R[1232]={position:$R[1233]={start:$R[1234]={line:144,column:1,offset:5452},end:$R[1235]={line:147,column:45,offset:5647}},type:"text",value:"私達は、この選択を決して責めることはできないし、責めるべきではない。\nstyled-components は長い間、CSS in JS のパイオニアとして多くの開発者に支持されてきた。\nそして、新機能を追加しないと判断した今もなお、UX を損なわない程度にバグ修正などはしばらく行うとも発表している。\n私達は、styled-components の選択を尊重し、感謝の意を表するべきである。"}],position:$R[1236]={start:$R[1237]={line:144,column:1,offset:5452},end:$R[1238]={line:147,column:45,offset:5647}},type:"paragraph"},$R[1239]={children:$R[1240]=[$R[1241]={position:$R[1242]={start:$R[1243]={line:149,column:1,offset:5649},end:$R[1244]={line:152,column:70,offset:6012}},type:"text",value:"ただ、発表文の中にあった、「The React core team has decided to defacto-deprecate certain APIs like the Context API」という文言は、少々気になる。\n少なくとも、React core team は Context API を事実上の非推奨とするような変更や発言はどこでもしていない。\n上述の文言が styled-components の開発者の誤解であることを願うが、React Server Components の登場によって、styled-components の選択肢が狭まったことは間違いない。\nまた、styled-components のメンテナンスモードへの移行は、CSS in JS ライブラリの選択肢を狭めることにもつながる。"}],position:$R[1245]={start:$R[1246]={line:149,column:1,offset:5649},end:$R[1247]={line:152,column:70,offset:6012}},type:"paragraph"}],position:$R[1248]={end:$R[1249]={line:152,column:70,offset:6012},start:$R[1250]={line:138,column:1,offset:5217}},type:"section"}],position:$R[1251]={end:$R[1252]={line:152,column:70,offset:6012},start:$R[1253]={line:77,column:1,offset:2463}},type:"section"},$R[1254]={children:$R[1255]=[$R[1256]={children:$R[1257]=[$R[1258]={position:$R[1259]={start:$R[1260]={line:154,column:4,offset:6017},end:$R[1261]={line:154,column:27,offset:6040}},type:"text",value:"styled-components とこれから"}],id:"styled-components-とこれから",level:2,plain:"styled-components とこれから",position:$R[1262]={start:$R[1263]={line:154,column:1,offset:6014},end:$R[1264]={line:154,column:27,offset:6040}},type:"heading"},$R[1265]={children:$R[1266]=[$R[1267]={children:$R[1268]=[$R[1269]={position:$R[1270]={start:$R[1271]={line:156,column:5,offset:6046},end:$R[1272]={line:156,column:9,offset:6050}},type:"text",value:"移行先?"}],id:"移行先",level:3,plain:"移行先?",position:$R[1273]={start:$R[1274]={line:156,column:1,offset:6042},end:$R[1275]={line:156,column:9,offset:6050}},type:"heading"},$R[1276]={children:$R[1277]=[$R[1278]={position:$R[1279]={start:$R[1280]={line:158,column:1,offset:6052},end:$R[1281]={line:159,column:23,offset:6129}},type:"text",value:"styled-components のメンテナンスモードに対して、私達はどのように対応すれば良いのだろうか。\n対応を検討するときに、次の観点が重要である。"}],position:$R[1282]={start:$R[1283]={line:158,column:1,offset:6052},end:$R[1284]={line:159,column:23,offset:6129}},type:"paragraph"},$R[1285]={children:$R[1286]=[$R[1287]={children:$R[1288]=[$R[1289]={children:$R[1290]=[$R[1291]={position:$R[1292]={start:$R[1293]={line:161,column:3,offset:6133},end:$R[1294]={line:161,column:25,offset:6155}},type:"text",value:"CSS in JS ライブラリを使用するのか"}],position:$R[1295]={start:$R[1296]={line:161,column:3,offset:6133},end:$R[1297]={line:161,column:25,offset:6155}},type:"paragraph"},$R[1298]={children:$R[1299]=[$R[1300]={children:$R[1301]=[$R[1302]={children:$R[1303]=[$R[1304]={position:$R[1305]={start:$R[1306]={line:162,column:5,offset:6160},end:$R[1307]={line:162,column:61,offset:6216}},type:"text",value:"runtime CSS in JS を使用するのか zero-runtime CSS in JS を使用するのか"}],position:$R[1308]={start:$R[1309]={line:162,column:5,offset:6160},end:$R[1310]={line:162,column:61,offset:6216}},type:"paragraph"}],position:$R[1311]={start:$R[1312]={line:162,column:3,offset:6158},end:$R[1313]={line:162,column:61,offset:6216}},type:"listItem"},$R[1314]={children:$R[1315]=[$R[1316]={children:$R[1317]=[$R[1318]={position:$R[1319]={start:$R[1320]={line:163,column:5,offset:6221},end:$R[1321]={line:163,column:36,offset:6252}},type:"text",value:"使用するなら template literal を使用するのか"}],position:$R[1322]={start:$R[1323]={line:163,column:5,offset:6221},end:$R[1324]={line:163,column:36,offset:6252}},type:"paragraph"},$R[1325]={children:$R[1326]=[$R[1327]={children:$R[1328]=[$R[1329]={children:$R[1330]=[$R[1331]={position:$R[1332]={start:$R[1333]={line:164,column:7,offset:6259},end:$R[1334]={line:164,column:58,offset:6310}},type:"text",value:"object literal を使用する場合、stylelint などの資産が使えなくなることへの考慮"}],position:$R[1335]={start:$R[1336]={line:164,column:7,offset:6259},end:$R[1337]={line:164,column:58,offset:6310}},type:"paragraph"}],position:$R[1338]={start:$R[1339]={line:164,column:5,offset:6257},end:$R[1340]={line:164,column:58,offset:6310}},type:"listItem"}],position:$R[1341]={start:$R[1342]={line:164,column:5,offset:6257},end:$R[1343]={line:164,column:58,offset:6310}},type:"unorderedList"}],position:$R[1344]={start:$R[1345]={line:163,column:3,offset:6219},end:$R[1346]={line:164,column:58,offset:6310}},type:"listItem"},$R[1347]={children:$R[1348]=[$R[1349]={children:$R[1350]=[$R[1351]={position:$R[1352]={start:$R[1353]={line:165,column:5,offset:6315},end:$R[1354]={line:165,column:40,offset:6350}},type:"text",value:"使用しないなら、CSS Modules や BEM 記法を使用するのか"}],position:$R[1355]={start:$R[1356]={line:165,column:5,offset:6315},end:$R[1357]={line:165,column:40,offset:6350}},type:"paragraph"}],position:$R[1358]={start:$R[1359]={line:165,column:3,offset:6313},end:$R[1360]={line:165,column:40,offset:6350}},type:"listItem"}],position:$R[1361]={start:$R[1362]={line:162,column:3,offset:6158},end:$R[1363]={line:165,column:40,offset:6350}},type:"unorderedList"}],position:$R[1364]={start:$R[1365]={line:161,column:1,offset:6131},end:$R[1366]={line:165,column:40,offset:6350}},type:"listItem"},$R[1367]={children:$R[1368]=[$R[1369]={children:$R[1370]=[$R[1371]={position:$R[1372]={start:$R[1373]={line:166,column:3,offset:6353},end:$R[1374]={line:166,column:49,offset:6399}},type:"text",value:"移行する場合に、必ずプロダクトに複数の styling library が混在することになる"}],position:$R[1375]={start:$R[1376]={line:166,column:3,offset:6353},end:$R[1377]={line:166,column:49,offset:6399}},type:"paragraph"},$R[1378]={children:$R[1379]=[$R[1380]={children:$R[1381]=[$R[1382]={children:$R[1383]=[$R[1384]={position:$R[1385]={start:$R[1386]={line:167,column:5,offset:6404},end:$R[1387]={line:167,column:21,offset:6420}},type:"text",value:"その場合、どのように移行するのか"}],position:$R[1388]={start:$R[1389]={line:167,column:5,offset:6404},end:$R[1390]={line:167,column:21,offset:6420}},type:"paragraph"},$R[1391]={children:$R[1392]=[$R[1393]={children:$R[1394]=[$R[1395]={children:$R[1396]=[$R[1397]={position:$R[1398]={start:$R[1399]={line:168,column:7,offset:6427},end:$R[1400]={line:168,column:22,offset:6442}},type:"text",value:"AST 走査による機械的な移行"}],position:$R[1401]={start:$R[1402]={line:168,column:7,offset:6427},end:$R[1403]={line:168,column:22,offset:6442}},type:"paragraph"}],position:$R[1404]={start:$R[1405]={line:168,column:5,offset:6425},end:$R[1406]={line:168,column:22,offset:6442}},type:"listItem"},$R[1407]={children:$R[1408]=[$R[1409]={children:$R[1410]=[$R[1411]={position:$R[1412]={start:$R[1413]={line:169,column:7,offset:6449},end:$R[1414]={line:169,column:36,offset:6478}},type:"text",value:"Cursor や Cline などの AI を使用した移行"}],position:$R[1415]={start:$R[1416]={line:169,column:7,offset:6449},end:$R[1417]={line:169,column:36,offset:6478}},type:"paragraph"}],position:$R[1418]={start:$R[1419]={line:169,column:5,offset:6447},end:$R[1420]={line:169,column:36,offset:6478}},type:"listItem"},$R[1421]={children:$R[1422]=[$R[1423]={children:$R[1424]=[$R[1425]={position:$R[1426]={start:$R[1427]={line:170,column:7,offset:6485},end:$R[1428]={line:170,column:13,offset:6491}},type:"text",value:"手動での移行"}],position:$R[1429]={start:$R[1430]={line:170,column:7,offset:6485},end:$R[1431]={line:170,column:13,offset:6491}},type:"paragraph"}],position:$R[1432]={start:$R[1433]={line:170,column:5,offset:6483},end:$R[1434]={line:170,column:13,offset:6491}},type:"listItem"}],position:$R[1435]={start:$R[1436]={line:168,column:5,offset:6425},end:$R[1437]={line:170,column:13,offset:6491}},type:"unorderedList"}],position:$R[1438]={start:$R[1439]={line:167,column:3,offset:6402},end:$R[1440]={line:170,column:13,offset:6491}},type:"listItem"},$R[1441]={children:$R[1442]=[$R[1443]={children:$R[1444]=[$R[1445]={position:$R[1446]={start:$R[1447]={line:171,column:5,offset:6496},end:$R[1448]={line:171,column:18,offset:6509}},type:"text",value:"どのように運用していくのか"}],position:$R[1449]={start:$R[1450]={line:171,column:5,offset:6496},end:$R[1451]={line:171,column:18,offset:6509}},type:"paragraph"}],position:$R[1452]={start:$R[1453]={line:171,column:3,offset:6494},end:$R[1454]={line:171,column:18,offset:6509}},type:"listItem"}],position:$R[1455]={start:$R[1456]={line:167,column:3,offset:6402},end:$R[1457]={line:171,column:18,offset:6509}},type:"unorderedList"}],position:$R[1458]={start:$R[1459]={line:166,column:1,offset:6351},end:$R[1460]={line:171,column:18,offset:6509}},type:"listItem"},$R[1461]={children:$R[1462]=[$R[1463]={children:$R[1464]=[$R[1465]={position:$R[1466]={start:$R[1467]={line:172,column:3,offset:6512},end:$R[1468]={line:172,column:14,offset:6523}},type:"text",value:"そもそも移行するのか?"}],position:$R[1469]={start:$R[1470]={line:172,column:3,offset:6512},end:$R[1471]={line:172,column:14,offset:6523}},type:"paragraph"},$R[1472]={children:$R[1473]=[$R[1474]={children:$R[1475]=[$R[1476]={children:$R[1477]=[$R[1478]={position:$R[1479]={start:$R[1480]={line:173,column:5,offset:6528},end:$R[1481]={line:173,column:42,offset:6565}},type:"text",value:"現状 React Server Components を使用していない場合"}],position:$R[1482]={start:$R[1483]={line:173,column:5,offset:6528},end:$R[1484]={line:173,column:42,offset:6565}},type:"paragraph"}],position:$R[1485]={start:$R[1486]={line:173,column:3,offset:6526},end:$R[1487]={line:173,column:42,offset:6565}},type:"listItem"},$R[1488]={children:$R[1489]=[$R[1490]={children:$R[1491]=[$R[1492]={position:$R[1493]={start:$R[1494]={line:174,column:5,offset:6570},end:$R[1495]={line:174,column:51,offset:6616}},type:"text",value:"styled-components 起因で React などのバージョンアップができない場合"}],position:$R[1496]={start:$R[1497]={line:174,column:5,offset:6570},end:$R[1498]={line:174,column:51,offset:6616}},type:"paragraph"}],position:$R[1499]={start:$R[1500]={line:174,column:3,offset:6568},end:$R[1501]={line:174,column:51,offset:6616}},type:"listItem"},$R[1502]={children:$R[1503]=[$R[1504]={children:$R[1505]=[$R[1506]={position:$R[1507]={start:$R[1508]={line:175,column:5,offset:6621},end:$R[1509]={line:175,column:36,offset:6652}},type:"text",value:"styled-components のバグに悩まされている場合"}],position:$R[1510]={start:$R[1511]={line:175,column:5,offset:6621},end:$R[1512]={line:175,column:36,offset:6652}},type:"paragraph"}],position:$R[1513]={start:$R[1514]={line:175,column:3,offset:6619},end:$R[1515]={line:175,column:36,offset:6652}},type:"listItem"}],position:$R[1516]={start:$R[1517]={line:173,column:3,offset:6526},end:$R[1518]={line:175,column:36,offset:6652}},type:"unorderedList"}],position:$R[1519]={start:$R[1520]={line:172,column:1,offset:6510},end:$R[1521]={line:175,column:36,offset:6652}},type:"listItem"}],position:$R[1522]={start:$R[1523]={line:161,column:1,offset:6131},end:$R[1524]={line:175,column:36,offset:6652}},type:"unorderedList"},$R[1525]={children:$R[1526]=[$R[1527]={position:$R[1528]={start:$R[1529]={line:177,column:1,offset:6654},end:$R[1530]={line:178,column:147,offset:6829}},type:"text",value:"これらの観点を考慮しながら、移行先を検討する必要がある。\n私の個人的な感想としては、React Server Components や Streaming SSR を使用する場合、あとは React の major version を上げる際に、styled-components の存在が障壁になったタイミングで移行するのが良いのではないかと思う。"}],position:$R[1531]={start:$R[1532]={line:177,column:1,offset:6654},end:$R[1533]={line:178,column:147,offset:6829}},type:"paragraph"}],position:$R[1534]={end:$R[1535]={line:178,column:147,offset:6829},start:$R[1536]={line:156,column:1,offset:6042}},type:"section"}],position:$R[1537]={end:$R[1538]={line:178,column:147,offset:6829},start:$R[1539]={line:154,column:1,offset:6014}},type:"section"},$R[1540]={children:$R[1541]=[$R[1542]={children:$R[1543]=[$R[1544]={position:$R[1545]={start:$R[1546]={line:180,column:4,offset:6834},end:$R[1547]={line:180,column:8,offset:6838}},type:"text",value:"おわりに"}],id:"おわりに",level:2,plain:"おわりに",position:$R[1548]={start:$R[1549]={line:180,column:1,offset:6831},end:$R[1550]={line:180,column:8,offset:6838}},type:"heading"},$R[1551]={children:$R[1552]=[$R[1553]={position:$R[1554]={start:$R[1555]={line:182,column:1,offset:6840},end:$R[1556]={line:185,column:33,offset:7058}},type:"text",value:"styled-components のメンテナンスモードへの移行は、CSS in JS ライブラリの歴史において、1つの節目となる出来事である。\n私達は、styled-components の選択を尊重し、感謝の意を表するべきである。\nまた、React Server Components の登場によって、CSS in JS ライブラリの選択肢が狭まることは間違いない。\n私達は、移行先を検討し、プロダクトに最適な選択をする必要がある。"}],position:$R[1557]={start:$R[1558]={line:182,column:1,offset:6840},end:$R[1559]={line:185,column:33,offset:7058}},type:"paragraph"}],position:$R[1560]={end:$R[1561]={line:185,column:33,offset:7058},start:$R[1562]={line:180,column:1,offset:6831}},type:"section"}],footnotes:$R[1563]=[$R[1564]={children:$R[1565]=[$R[1566]={children:$R[1567]=[$R[1568]={children:$R[1569]=[$R[1570]={position:$R[1571]={start:$R[1572]={line:23,column:7,offset:630},end:$R[1573]={line:23,column:109,offset:732}},type:"text",value:"https://github.com/styled-components/styled-components/commit/d2561d4928ff252eb79e5e3a3749c13930b6f062"}],position:$R[1574]={start:$R[1575]={line:23,column:7,offset:630},end:$R[1576]={line:23,column:109,offset:732}},title:void 0,type:"link",url:"https://github.com/styled-components/styled-components/commit/d2561d4928ff252eb79e5e3a3749c13930b6f062"}],position:$R[1577]={start:$R[1578]={line:23,column:7,offset:630},end:$R[1579]={line:23,column:109,offset:732}},type:"paragraph"}],count:1,index:0,position:$R[1580]={start:$R[1581]={line:23,column:1,offset:624},end:$R[1582]={line:23,column:109,offset:732}},type:"footnoteDefinition"},$R[1583]={children:$R[1584]=[$R[1585]={children:$R[1586]=[$R[1587]={children:$R[1588]=[$R[1589]={position:$R[1590]={start:$R[1591]={line:32,column:8,offset:937},end:$R[1592]={line:32,column:60,offset:989}},type:"text",value:"https://styled-components.com/docs/basics#motivation"}],position:$R[1593]={start:$R[1594]={line:32,column:7,offset:936},end:$R[1595]={line:32,column:115,offset:1044}},title:void 0,type:"link",url:"https://styled-components.com/docs/basics#motivation"}],position:$R[1596]={start:$R[1597]={line:32,column:7,offset:936},end:$R[1598]={line:32,column:115,offset:1044}},type:"paragraph"}],count:1,index:1,position:$R[1599]={start:$R[1600]={line:32,column:1,offset:930},end:$R[1601]={line:32,column:115,offset:1044}},type:"footnoteDefinition"},$R[1602]={children:$R[1603]=[$R[1604]={children:$R[1605]=[$R[1606]={children:$R[1607]=[$R[1608]={position:$R[1609]={start:$R[1610]={line:41,column:8,offset:1231},end:$R[1611]={line:41,column:53,offset:1276}},type:"text",value:"https://speakerdeck.com/vjeux/react-css-in-js"}],position:$R[1612]={start:$R[1613]={line:41,column:7,offset:1230},end:$R[1614]={line:41,column:101,offset:1324}},title:void 0,type:"link",url:"https://speakerdeck.com/vjeux/react-css-in-js"}],position:$R[1615]={start:$R[1616]={line:41,column:7,offset:1230},end:$R[1617]={line:41,column:101,offset:1324}},type:"paragraph"}],count:1,index:2,position:$R[1618]={start:$R[1619]={line:41,column:1,offset:1224},end:$R[1620]={line:41,column:101,offset:1324}},type:"footnoteDefinition"},$R[1621]={children:$R[1622]=[$R[1623]={children:$R[1624]=[$R[1625]={children:$R[1626]=[$R[1627]={position:$R[1628]={start:$R[1629]={line:72,column:8,offset:2164},end:$R[1630]={line:72,column:61,offset:2217}},type:"text",value:"https://qiita.com/Takepepe/items/41e3e7a2f612d7eb094a"}],position:$R[1631]={start:$R[1632]={line:72,column:7,offset:2163},end:$R[1633]={line:72,column:117,offset:2273}},title:void 0,type:"link",url:"https://qiita.com/Takepepe/items/41e3e7a2f612d7eb094a"}],position:$R[1634]={start:$R[1635]={line:72,column:7,offset:2163},end:$R[1636]={line:72,column:117,offset:2273}},type:"paragraph"}],count:1,index:3,position:$R[1637]={start:$R[1638]={line:72,column:1,offset:2157},end:$R[1639]={line:72,column:117,offset:2273}},type:"footnoteDefinition"},$R[1640]={children:$R[1641]=[$R[1642]={children:$R[1643]=[$R[1644]={children:$R[1645]=[$R[1646]={position:$R[1647]={start:$R[1648]={line:84,column:8,offset:2725},end:$R[1649]={line:84,column:41,offset:2758}},type:"text",value:"https://nextjs.org/blog/next-13-4"}],position:$R[1650]={start:$R[1651]={line:84,column:7,offset:2724},end:$R[1652]={line:84,column:77,offset:2794}},title:void 0,type:"link",url:"https://nextjs.org/blog/next-13-4"}],position:$R[1653]={start:$R[1654]={line:84,column:7,offset:2724},end:$R[1655]={line:84,column:77,offset:2794}},type:"paragraph"}],count:1,index:4,position:$R[1656]={start:$R[1657]={line:84,column:1,offset:2718},end:$R[1658]={line:84,column:77,offset:2794}},type:"footnoteDefinition"},$R[1659]={children:$R[1660]=[$R[1661]={children:$R[1662]=[$R[1663]={children:$R[1664]=[$R[1665]={position:$R[1666]={start:$R[1667]={line:86,column:8,offset:2803},end:$R[1668]={line:86,column:116,offset:2911}},type:"text",value:"https://react.dev/blog/2023/03/22/react-labs-what-we-have-been-working-on-march-2023#react-server-components"}],position:$R[1669]={start:$R[1670]={line:86,column:7,offset:2802},end:$R[1671]={line:86,column:227,offset:3022}},title:void 0,type:"link",url:"https://react.dev/blog/2023/03/22/react-labs-what-we-have-been-working-on-march-2023#react-server-components"}],position:$R[1672]={start:$R[1673]={line:86,column:7,offset:2802},end:$R[1674]={line:86,column:227,offset:3022}},type:"paragraph"}],count:1,index:5,position:$R[1675]={start:$R[1676]={line:86,column:1,offset:2796},end:$R[1677]={line:86,column:227,offset:3022}},type:"footnoteDefinition"},$R[1678]={children:$R[1679]=[$R[1680]={children:$R[1681]=[$R[1682]={children:$R[1683]=[$R[1684]={position:$R[1685]={start:$R[1686]={line:94,column:8,offset:3275},end:$R[1687]={line:94,column:116,offset:3383}},type:"text",value:"https://github.com/reactjs/rfcs/blob/7f8492f6a177fc33fe807d242319f2f96353bf68/text/0188-server-components.md"}],position:$R[1688]={start:$R[1689]={line:94,column:7,offset:3274},end:$R[1690]={line:94,column:227,offset:3494}},title:void 0,type:"link",url:"https://github.com/reactjs/rfcs/blob/7f8492f6a177fc33fe807d242319f2f96353bf68/text/0188-server-components.md"}],position:$R[1691]={start:$R[1692]={line:94,column:7,offset:3274},end:$R[1693]={line:94,column:227,offset:3494}},type:"paragraph"}],count:1,index:6,position:$R[1694]={start:$R[1695]={line:94,column:1,offset:3268},end:$R[1696]={line:94,column:227,offset:3494}},type:"footnoteDefinition"},$R[1697]={children:$R[1698]=[$R[1699]={children:$R[1700]=[$R[1701]={children:$R[1702]=[$R[1703]={position:$R[1704]={start:$R[1705]={line:134,column:8,offset:4944},end:$R[1706]={line:134,column:74,offset:5010}},type:"text",value:"https://react.dev/blog/2024/12/05/react-19#support-for-stylesheets"}],position:$R[1707]={start:$R[1708]={line:134,column:7,offset:4943},end:$R[1709]={line:134,column:143,offset:5079}},title:void 0,type:"link",url:"https://react.dev/blog/2024/12/05/react-19#support-for-stylesheets"}],position:$R[1710]={start:$R[1711]={line:134,column:7,offset:4943},end:$R[1712]={line:134,column:143,offset:5079}},type:"paragraph"}],count:1,index:7,position:$R[1713]={start:$R[1714]={line:134,column:1,offset:4937},end:$R[1715]={line:134,column:143,offset:5079}},type:"footnoteDefinition"},$R[1716]={children:$R[1717]=[$R[1718]={children:$R[1719]=[$R[1720]={children:$R[1721]=[$R[1722]={position:$R[1723]={start:$R[1724]={line:136,column:8,offset:5088},end:$R[1725]={line:136,column:92,offset:5172}},type:"text",value:"souporserious/restyle - The simplest way to add CSS styles to your React components."}],position:$R[1726]={start:$R[1727]={line:136,column:7,offset:5087},end:$R[1728]={line:136,column:135,offset:5215}},title:void 0,type:"link",url:"https://github.com/souporserious/restyle"}],position:$R[1729]={start:$R[1730]={line:136,column:7,offset:5087},end:$R[1731]={line:136,column:135,offset:5215}},type:"paragraph"}],count:1,index:8,position:$R[1732]={start:$R[1733]={line:136,column:1,offset:5081},end:$R[1734]={line:136,column:135,offset:5215}},type:"footnoteDefinition"}],title:$R[1735]={children:$R[1736]=[$R[1737]={position:$R[1738]={start:$R[1739]={line:1,column:3,offset:2},end:$R[1740]={line:1,column:32,offset:31}},type:"text",value:"styled-components の歴史、現在、これから"}],id:"styled-components-の歴史現在これから",level:1,plain:"styled-components の歴史、現在、これから",position:$R[1741]={start:$R[1742]={line:1,column:1,offset:0},end:$R[1743]={line:1,column:32,offset:31}},type:"heading"},toc:$R[1744]=[$R[1745]={children:$R[1746]=[],id:"はじめに",plain:"はじめに",type:"toc"},$R[1747]={children:$R[1748]=[],id:"styled-components-とは",plain:"styled-components とは",type:"toc"},$R[1749]={children:$R[1750]=[$R[1751]={children:$R[1752]=[],id:"css-in-js-の登場",plain:"CSS in JS の登場",type:"toc"},$R[1753]={children:$R[1754]=[],id:"styled-components-という選択",plain:"styled-components という選択",type:"toc"}],id:"styled-components-の歴史",plain:"styled-components の歴史",type:"toc"},$R[1755]={children:$R[1756]=[$R[1757]={children:$R[1758]=[$R[1759]={children:$R[1760]=[],id:"styled-components-の動作原理",plain:"styled-components の動作原理",type:"toc"}],id:"react-server-components-の登場",plain:"React Server Components の登場",type:"toc"},$R[1761]={children:$R[1762]=[],id:"react-server-components-への対応",plain:"React Server Components への対応",type:"toc"},$R[1763]={children:$R[1764]=[],id:"styled-components-の選択",plain:"styled-components の選択",type:"toc"}],id:"styled-components-の現在",plain:"styled-components の現在",type:"toc"},$R[1765]={children:$R[1766]=[$R[1767]={children:$R[1768]=[],id:"移行先",plain:"移行先?",type:"toc"}],id:"styled-components-とこれから",plain:"styled-components とこれから",type:"toc"},$R[1769]={children:$R[1770]=[],id:"おわりに",plain:"おわりに",type:"toc"}],type:"article"}});_$HY.r["0000000100010020000000000"]=$R[1772]=$R[1]();_$HY.r["00000001000100200000000"]=$R[1773]=$R[1]();$R[1771]($R[2],!0);$R[1771]($R[1772],$R[3]);$R[1771]($R[1773],!0);
React v19 の styled hoisting を使えば、styled-components も React Server Components 上で動作できる。
しかし、長く続いているライブラリにおいて、React の API 変更へ大胆に対応するのは既存のユーザーへ求める負荷が高まってしまう。
そのため、styled-components はメンテナンスモードに移行することを選択したと話している。
私達は、この選択を決して責めることはできないし、責めるべきではない。
styled-components は長い間、CSS in JS のパイオニアとして多くの開発者に支持されてきた。
そして、新機能を追加しないと判断した今もなお、UX を損なわない程度にバグ修正などはしばらく行うとも発表している。
私達は、styled-components の選択を尊重し、感謝の意を表するべきである。
ただ、発表文の中にあった、「The React core team has decided to defacto-deprecate certain APIs like the Context API」という文言は、少々気になる。
少なくとも、React core team は Context API を事実上の非推奨とするような変更や発言はどこでもしていない。
上述の文言が styled-components の開発者の誤解であることを願うが、React Server Components の登場によって、styled-components の選択肢が狭まったことは間違いない。
また、styled-components のメンテナンスモードへの移行は、CSS in JS ライブラリの選択肢を狭めることにもつながる。
これらの観点を考慮しながら、移行先を検討する必要がある。
私の個人的な感想としては、React Server Components や Streaming SSR を使用する場合、あとは React の major version を上げる際に、styled-components の存在が障壁になったタイミングで移行するのが良いのではないかと思う。
styled-components のメンテナンスモードへの移行は、CSS in JS ライブラリの歴史において、1つの節目となる出来事である。
私達は、styled-components の選択を尊重し、感謝の意を表するべきである。
また、React Server Components の登場によって、CSS in JS ライブラリの選択肢が狭まることは間違いない。
私達は、移行先を検討し、プロダクトに最適な選択をする必要がある。