\n\t\t\t\x3CCounter />\n\t\t\t\x3CCountAtomScopeProvider userId=\"tom@example.com\">\n\t\t\t\t\x3CCounter />\n\t\t\t\t\x3CCounter />\n\t\t\t\x3C/CountAtomScopeProvider>\n\t\t\x3C/CountAtomScopeProvider>\n\t);\n}\n```\n\n上記の例は `jotai` を使っているが、`bunshi` も使うと以下のように書くことができる。\n\n```tsx:sample.tsx\nimport { atom, useAtom } from \"jotai\";\nimport {\n\tScopeProvider,\n\tcreateScope,\n\tmolecule,\n\tuseMolecule,\n} from \"bunshi/react\";\n\nconst UserScope = createScope(undefined);\nconst countMolecule = molecule((mol, scope) => {\n\tconst userId = scope(UserScope);\n\tconsole.log(\"Creating a new atom for\", userId);\n\treturn atom(0);\n});\n\n// ... Counter unchanged\n\nexport function App() {\n\treturn (\n\t\t\x3CScopeProvider scope={UserScope} value=\"bob@example.com\">\n\t\t\t\x3CCounter />\n\t\t\x3C/ScopeProvider>\n\t);\n}\n```\n\n## まとめ\n\n今回は `bunshi` というライブラリの基本概念からその魅力までを調べた。途中で実装の方を参照することが多々あったが、ほとんどテストされていてドキュメントも充実しているため、理解するのは難しくなかった。\n\n`bunshi` を使って状態管理のベストプラクティスを追求したいと思った。",description:"自分の理解を深めるために調べ尽くす",published:!0,publishedAt:"2024-05-29T22:23:29.51+09:00[Asia/Tokyo]",tags:$R[7316]=["state","jotai","bunshi"],title:"bunshiを理解する",_meta:$R[7317]={filePath:"01HYDY4ANBK11SCFE0K2K3DV5A/slug.md",fileName:"slug.md",directory:"01HYDY4ANBK11SCFE0K2K3DV5A",extension:"md",path:"01HYDY4ANBK11SCFE0K2K3DV5A/slug"},abstract:"bunshiを理解するはじめにbunshi というライブラリがある。状態管理ライブラリの DI を行うものだ。jotai を使う機会があり、調べを進める中で当時名前を聞いた jotai-molecule が bunshi という名前で良い感じに開発されていて気になったので調べてみる。注意: この記事が書かれた当時の情報であり、最新の情報とは異なる可能性がある。bunshi のバージョンは 2.1.5 である。bunshiの特徴bunshi は次のような特徴を持つ。バンドルサイズが小さいgzip 圧縮されたサイズで 1.18KB しかない。また他のライブラリに依存いていないのも大きな特徴だ。framework agnosticであるbunshi は jotai や zustand、nanostores などの状態管理ライブラリを molecule という概念でラップすることで、状態のスコープ",mdast:$R[7318]={children:$R[7319]=[$R[7320]={children:$R[7321]=[$R[7322]={children:$R[7323]=[$R[7324]={position:$R[7325]={start:$R[7326]={line:3,column:4,offset:18},end:$R[7327]={line:3,column:8,offset:22}},type:"text",value:"はじめに"}],id:"はじめに",level:2,plain:"はじめに",position:$R[7328]={start:$R[7329]={line:3,column:1,offset:15},end:$R[7330]={line:3,column:8,offset:22}},type:"heading"},$R[7331]={children:$R[7332]=[$R[7333]={children:$R[7334]=[$R[7335]={position:$R[7336]={start:$R[7337]={line:5,column:2,offset:25},end:$R[7338]={line:5,column:8,offset:31}},type:"text",value:"bunshi"}],position:$R[7339]={start:$R[7340]={line:5,column:1,offset:24},end:$R[7341]={line:5,column:47,offset:70}},title:void 0,type:"link",url:"https://github.com/saasquatch/bunshi"},$R[7342]={position:$R[7343]={start:$R[7344]={line:5,column:47,offset:70},end:$R[7345]={line:5,column:81,offset:104}},type:"text",value:" というライブラリがある。状態管理ライブラリの DI を行うものだ。"}],position:$R[7346]={start:$R[7347]={line:5,column:1,offset:24},end:$R[7348]={line:5,column:81,offset:104}},type:"paragraph"},$R[7349]={children:$R[7350]=[$R[7351]={position:$R[7352]={start:$R[7353]={line:7,column:1,offset:106},end:$R[7354]={line:7,column:8,offset:113}},type:"inlineCode",value:"jotai"},$R[7355]={position:$R[7356]={start:$R[7357]={line:7,column:8,offset:113},end:$R[7358]={line:7,column:35,offset:140}},type:"text",value:" を使う機会があり、調べを進める中で当時名前を聞いた "},$R[7359]={position:$R[7360]={start:$R[7361]={line:7,column:35,offset:140},end:$R[7362]={line:7,column:51,offset:156}},type:"inlineCode",value:"jotai-molecule"},$R[7363]={position:$R[7364]={start:$R[7365]={line:7,column:51,offset:156},end:$R[7366]={line:7,column:54,offset:159}},type:"text",value:" が "},$R[7367]={position:$R[7368]={start:$R[7369]={line:7,column:54,offset:159},end:$R[7370]={line:7,column:62,offset:167}},type:"inlineCode",value:"bunshi"},$R[7371]={position:$R[7372]={start:$R[7373]={line:7,column:62,offset:167},end:$R[7374]={line:7,column:94,offset:199}},type:"text",value:" という名前で良い感じに開発されていて気になったので調べてみる。"}],position:$R[7375]={start:$R[7376]={line:7,column:1,offset:106},end:$R[7377]={line:7,column:94,offset:199}},type:"paragraph"},$R[7378]={children:$R[7379]=[$R[7380]={position:$R[7381]={start:$R[7382]={line:9,column:1,offset:201},end:$R[7383]={line:9,column:40,offset:240}},type:"text",value:"注意: この記事が書かれた当時の情報であり、最新の情報とは異なる可能性がある。"},$R[7384]={position:$R[7385]={start:$R[7386]={line:9,column:40,offset:240},end:$R[7387]={line:9,column:48,offset:248}},type:"inlineCode",value:"bunshi"},$R[7388]={position:$R[7389]={start:$R[7390]={line:9,column:48,offset:248},end:$R[7391]={line:9,column:57,offset:257}},type:"text",value:" のバージョンは "},$R[7392]={position:$R[7393]={start:$R[7394]={line:9,column:57,offset:257},end:$R[7395]={line:9,column:64,offset:264}},type:"inlineCode",value:"2.1.5"},$R[7396]={position:$R[7397]={start:$R[7398]={line:9,column:64,offset:264},end:$R[7399]={line:9,column:69,offset:269}},type:"text",value:" である。"}],position:$R[7400]={start:$R[7401]={line:9,column:1,offset:201},end:$R[7402]={line:9,column:69,offset:269}},type:"paragraph"}],position:$R[7403]={end:$R[7404]={line:9,column:69,offset:269},start:$R[7405]={line:3,column:1,offset:15}},type:"section"},$R[7406]={children:$R[7407]=[$R[7408]={children:$R[7409]=[$R[7410]={position:$R[7411]={start:$R[7412]={line:11,column:4,offset:274},end:$R[7413]={line:11,column:13,offset:283}},type:"text",value:"bunshiの特徴"}],id:"bunshiの特徴",level:2,plain:"bunshiの特徴",position:$R[7414]={start:$R[7415]={line:11,column:1,offset:271},end:$R[7416]={line:11,column:13,offset:283}},type:"heading"},$R[7417]={children:$R[7418]=[$R[7419]={position:$R[7420]={start:$R[7421]={line:13,column:1,offset:285},end:$R[7422]={line:13,column:9,offset:293}},type:"inlineCode",value:"bunshi"},$R[7423]={position:$R[7424]={start:$R[7425]={line:13,column:9,offset:293},end:$R[7426]={line:13,column:22,offset:306}},type:"text",value:" は次のような特徴を持つ。"}],position:$R[7427]={start:$R[7428]={line:13,column:1,offset:285},end:$R[7429]={line:13,column:22,offset:306}},type:"paragraph"},$R[7430]={children:$R[7431]=[$R[7432]={children:$R[7433]=[$R[7434]={position:$R[7435]={start:$R[7436]={line:15,column:5,offset:312},end:$R[7437]={line:15,column:16,offset:323}},type:"text",value:"バンドルサイズが小さい"}],id:"バンドルサイズが小さい",level:3,plain:"バンドルサイズが小さい",position:$R[7438]={start:$R[7439]={line:15,column:1,offset:308},end:$R[7440]={line:15,column:16,offset:323}},type:"heading"},$R[7441]={children:$R[7442]=[$R[7443]={position:$R[7444]={start:$R[7445]={line:17,column:1,offset:325},end:$R[7446]={line:17,column:54,offset:378}},type:"text",value:"gzip 圧縮されたサイズで 1.18KB しかない。また他のライブラリに依存いていないのも大きな特徴だ。"}],position:$R[7447]={start:$R[7448]={line:17,column:1,offset:325},end:$R[7449]={line:17,column:54,offset:378}},type:"paragraph"}],position:$R[7450]={end:$R[7451]={line:17,column:54,offset:378},start:$R[7452]={line:15,column:1,offset:308}},type:"section"},$R[7453]={children:$R[7454]=[$R[7455]={children:$R[7456]=[$R[7457]={position:$R[7458]={start:$R[7459]={line:19,column:5,offset:384},end:$R[7460]={line:19,column:26,offset:405}},type:"text",value:"framework agnosticである"}],id:"framework-agnosticである",level:3,plain:"framework agnosticである",position:$R[7461]={start:$R[7462]={line:19,column:1,offset:380},end:$R[7463]={line:19,column:26,offset:405}},type:"heading"},$R[7464]={children:$R[7465]=[$R[7466]={position:$R[7467]={start:$R[7468]={line:21,column:1,offset:407},end:$R[7469]={line:21,column:9,offset:415}},type:"inlineCode",value:"bunshi"},$R[7470]={position:$R[7471]={start:$R[7472]={line:21,column:9,offset:415},end:$R[7473]={line:21,column:12,offset:418}},type:"text",value:" は "},$R[7474]={position:$R[7475]={start:$R[7476]={line:21,column:12,offset:418},end:$R[7477]={line:21,column:19,offset:425}},type:"inlineCode",value:"jotai"},$R[7478]={position:$R[7479]={start:$R[7480]={line:21,column:19,offset:425},end:$R[7481]={line:21,column:22,offset:428}},type:"text",value:" や "},$R[7482]={position:$R[7483]={start:$R[7484]={line:21,column:22,offset:428},end:$R[7485]={line:21,column:31,offset:437}},type:"inlineCode",value:"zustand"},$R[7486]={position:$R[7487]={start:$R[7488]={line:21,column:31,offset:437},end:$R[7489]={line:21,column:32,offset:438}},type:"text",value:"、"},$R[7490]={position:$R[7491]={start:$R[7492]={line:21,column:32,offset:438},end:$R[7493]={line:21,column:44,offset:450}},type:"inlineCode",value:"nanostores"},$R[7494]={position:$R[7495]={start:$R[7496]={line:21,column:44,offset:450},end:$R[7497]={line:21,column:59,offset:465}},type:"text",value:" などの状態管理ライブラリを "},$R[7498]={position:$R[7499]={start:$R[7500]={line:21,column:59,offset:465},end:$R[7501]={line:21,column:69,offset:475}},type:"inlineCode",value:"molecule"},$R[7502]={position:$R[7503]={start:$R[7504]={line:21,column:69,offset:475},end:$R[7505]={line:21,column:109,offset:515}},type:"text",value:" という概念でラップすることで、状態のスコープ管理や依存注入を行うことができる。"}],position:$R[7506]={start:$R[7507]={line:21,column:1,offset:407},end:$R[7508]={line:21,column:109,offset:515}},type:"paragraph"},$R[7509]={children:$R[7510]=[$R[7511]={position:$R[7512]={start:$R[7513]={line:23,column:1,offset:517},end:$R[7514]={line:23,column:11,offset:527}},type:"inlineCode",value:"molecule"},$R[7515]={position:$R[7516]={start:$R[7517]={line:23,column:11,offset:527},end:$R[7518]={line:23,column:68,offset:584}},type:"text",value:" の宣言は framework agnostic であるため、ロジックをフレームワークに依存させず書くことができる"},$R[7519]={footnoteIndex:0,position:$R[7520]={start:$R[7521]={line:23,column:68,offset:584},end:$R[7522]={line:23,column:72,offset:588}},referenceIndex:1,type:"footnoteReference"},$R[7523]={position:$R[7524]={start:$R[7525]={line:23,column:72,offset:588},end:$R[7526]={line:23,column:73,offset:589}},type:"text",value:"。"}],position:$R[7527]={start:$R[7528]={line:23,column:1,offset:517},end:$R[7529]={line:23,column:73,offset:589}},type:"paragraph"}],position:$R[7530]={end:$R[7531]={line:23,column:73,offset:589},start:$R[7532]={line:19,column:1,offset:380}},type:"section"},$R[7533]={children:$R[7534]=[$R[7535]={children:$R[7536]=[$R[7537]={position:$R[7538]={start:$R[7539]={line:27,column:5,offset:747},end:$R[7540]={line:27,column:20,offset:762}},type:"text",value:"パフォーマンスに配慮されている"}],id:"パフォーマンスに配慮されている",level:3,plain:"パフォーマンスに配慮されている",position:$R[7541]={start:$R[7542]={line:27,column:1,offset:743},end:$R[7543]={line:27,column:20,offset:762}},type:"heading"},$R[7544]={children:$R[7545]=[$R[7546]={position:$R[7547]={start:$R[7548]={line:29,column:1,offset:764},end:$R[7549]={line:29,column:10,offset:773}},type:"inlineCode",value:"WeakMap"},$R[7550]={position:$R[7551]={start:$R[7552]={line:29,column:10,offset:773},end:$R[7553]={line:29,column:24,offset:787}},type:"text",value:" を用いたメモリリークの防止"},$R[7554]={footnoteIndex:1,position:$R[7555]={start:$R[7556]={line:29,column:24,offset:787},end:$R[7557]={line:29,column:28,offset:791}},referenceIndex:1,type:"footnoteReference"},$R[7558]={position:$R[7559]={start:$R[7560]={line:29,column:28,offset:791},end:$R[7561]={line:29,column:66,offset:829}},type:"text",value:"や、不要な再レンダリングを防止するためにフレームワークのインテグレーション("},$R[7562]={position:$R[7563]={start:$R[7564]={line:29,column:66,offset:829},end:$R[7565]={line:29,column:73,offset:836}},type:"inlineCode",value:"React"},$R[7566]={position:$R[7567]={start:$R[7568]={line:29,column:73,offset:836},end:$R[7569]={line:29,column:75,offset:838}},type:"text",value:", "},$R[7570]={position:$R[7571]={start:$R[7572]={line:29,column:75,offset:838},end:$R[7573]={line:29,column:80,offset:843}},type:"inlineCode",value:"Vue"},$R[7574]={position:$R[7575]={start:$R[7576]={line:29,column:80,offset:843},end:$R[7577]={line:29,column:93,offset:856}},type:"text",value:")ではメモ化を行っている。"}],position:$R[7578]={start:$R[7579]={line:29,column:1,offset:764},end:$R[7580]={line:29,column:93,offset:856}},type:"paragraph"}],position:$R[7581]={end:$R[7582]={line:29,column:93,offset:856},start:$R[7583]={line:27,column:1,offset:743}},type:"section"}],position:$R[7584]={end:$R[7585]={line:29,column:93,offset:856},start:$R[7586]={line:11,column:1,offset:271}},type:"section"},$R[7587]={children:$R[7588]=[$R[7589]={children:$R[7590]=[$R[7591]={position:$R[7592]={start:$R[7593]={line:33,column:4,offset:985},end:$R[7594]={line:33,column:15,offset:996}},type:"text",value:"bunshiの基本概念"}],id:"bunshiの基本概念",level:2,plain:"bunshiの基本概念",position:$R[7595]={start:$R[7596]={line:33,column:1,offset:982},end:$R[7597]={line:33,column:15,offset:996}},type:"heading"},$R[7598]={children:$R[7599]=[$R[7600]={position:$R[7601]={start:$R[7602]={line:35,column:1,offset:998},end:$R[7603]={line:35,column:25,offset:1022}},type:"text",value:"bunshi は次の 3 つの概念で構成される。"}],position:$R[7604]={start:$R[7605]={line:35,column:1,offset:998},end:$R[7606]={line:35,column:25,offset:1022}},type:"paragraph"},$R[7607]={children:$R[7608]=[$R[7609]={children:$R[7610]=[$R[7611]={position:$R[7612]={start:$R[7613]={line:37,column:5,offset:1028},end:$R[7614]={line:37,column:13,offset:1036}},type:"text",value:"molecule"}],id:"molecule",level:3,plain:"molecule",position:$R[7615]={start:$R[7616]={line:37,column:1,offset:1024},end:$R[7617]={line:37,column:13,offset:1036}},type:"heading"},$R[7618]={children:$R[7619]=[$R[7620]={position:$R[7621]={start:$R[7622]={line:39,column:1,offset:1038},end:$R[7623]={line:39,column:11,offset:1048}},type:"inlineCode",value:"molecule"},$R[7624]={position:$R[7625]={start:$R[7626]={line:39,column:11,offset:1048},end:$R[7627]={line:39,column:14,offset:1051}},type:"text",value:" は "},$R[7628]={position:$R[7629]={start:$R[7630]={line:39,column:14,offset:1051},end:$R[7631]={line:39,column:22,offset:1059}},type:"inlineCode",value:"bunshi"},$R[7632]={position:$R[7633]={start:$R[7634]={line:39,column:22,offset:1059},end:$R[7635]={line:39,column:57,offset:1094}},type:"text",value:" の core 的な概念であり、実態は値を返す関数の HoF である。"}],position:$R[7636]={start:$R[7637]={line:39,column:1,offset:1038},end:$R[7638]={line:39,column:57,offset:1094}},type:"paragraph"},$R[7639]={children:$R[7640]=[$R[7641]={position:$R[7642]={start:$R[7643]={line:41,column:1,offset:1096},end:$R[7644]={line:41,column:45,offset:1140}},type:"text",value:"最大の特徴は、関数の実行結果がキャッシュされることである。以下の例は常に同じ乱数を返す。"}],position:$R[7645]={start:$R[7646]={line:41,column:1,offset:1096},end:$R[7647]={line:41,column:45,offset:1140}},type:"paragraph"},$R[7648]={filename:"sample.ts ts",lang:"ts",position:$R[7649]={start:$R[7650]={line:43,column:1,offset:1142},end:$R[7651]={line:47,column:4,offset:1258}},type:"code",value:"import { molecule } from \"bunshi\";\n\nexport const RandomMolecule = molecule(() => Math.random());",hast:$R[7652]={type:"root",children:$R[7653]=[$R[7654]={type:"element",tagName:"pre",properties:$R[7655]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[7656]=[$R[7657]={type:"element",tagName:"code",properties:$R[7658]={},children:$R[7659]=[$R[7660]={type:"element",tagName:"span",properties:$R[7661]={class:"line"},children:$R[7662]=[$R[7663]={type:"element",tagName:"span",properties:$R[7664]={style:"color:#4D9375"},children:$R[7665]=[$R[7666]={type:"text",value:"import"}]},$R[7667]={type:"element",tagName:"span",properties:$R[7668]={style:"color:#666666"},children:$R[7669]=[$R[7670]={type:"text",value:" {"}]},$R[7671]={type:"element",tagName:"span",properties:$R[7672]={style:"color:#BD976A"},children:$R[7673]=[$R[7674]={type:"text",value:" molecule"}]},$R[7675]={type:"element",tagName:"span",properties:$R[7676]={style:"color:#666666"},children:$R[7677]=[$R[7678]={type:"text",value:" }"}]},$R[7679]={type:"element",tagName:"span",properties:$R[7680]={style:"color:#4D9375"},children:$R[7681]=[$R[7682]={type:"text",value:" from"}]},$R[7683]={type:"element",tagName:"span",properties:$R[7684]={style:"color:#C98A7D77"},children:$R[7685]=[$R[7686]={type:"text",value:" \""}]},$R[7687]={type:"element",tagName:"span",properties:$R[7688]={style:"color:#C98A7D"},children:$R[7689]=[$R[7690]={type:"text",value:"bunshi"}]},$R[7691]={type:"element",tagName:"span",properties:$R[7692]={style:"color:#C98A7D77"},children:$R[7693]=[$R[7694]={type:"text",value:"\""}]},$R[7695]={type:"element",tagName:"span",properties:$R[7696]={style:"color:#666666"},children:$R[7697]=[$R[7698]={type:"text",value:";"}]}]},$R[7699]={type:"text",value:"\n"},$R[7700]={type:"element",tagName:"span",properties:$R[7701]={class:"line"},children:$R[7702]=[]},$R[7703]={type:"text",value:"\n"},$R[7704]={type:"element",tagName:"span",properties:$R[7705]={class:"line"},children:$R[7706]=[$R[7707]={type:"element",tagName:"span",properties:$R[7708]={style:"color:#4D9375"},children:$R[7709]=[$R[7710]={type:"text",value:"export"}]},$R[7711]={type:"element",tagName:"span",properties:$R[7712]={style:"color:#CB7676"},children:$R[7713]=[$R[7714]={type:"text",value:" const "}]},$R[7715]={type:"element",tagName:"span",properties:$R[7716]={style:"color:#BD976A"},children:$R[7717]=[$R[7718]={type:"text",value:"RandomMolecule"}]},$R[7719]={type:"element",tagName:"span",properties:$R[7720]={style:"color:#666666"},children:$R[7721]=[$R[7722]={type:"text",value:" ="}]},$R[7723]={type:"element",tagName:"span",properties:$R[7724]={style:"color:#80A665"},children:$R[7725]=[$R[7726]={type:"text",value:" molecule"}]},$R[7727]={type:"element",tagName:"span",properties:$R[7728]={style:"color:#666666"},children:$R[7729]=[$R[7730]={type:"text",value:"(()"}]},$R[7731]={type:"element",tagName:"span",properties:$R[7732]={style:"color:#666666"},children:$R[7733]=[$R[7734]={type:"text",value:" =>"}]},$R[7735]={type:"element",tagName:"span",properties:$R[7736]={style:"color:#BD976A"},children:$R[7737]=[$R[7738]={type:"text",value:" Math"}]},$R[7739]={type:"element",tagName:"span",properties:$R[7740]={style:"color:#666666"},children:$R[7741]=[$R[7742]={type:"text",value:"."}]},$R[7743]={type:"element",tagName:"span",properties:$R[7744]={style:"color:#80A665"},children:$R[7745]=[$R[7746]={type:"text",value:"random"}]},$R[7747]={type:"element",tagName:"span",properties:$R[7748]={style:"color:#666666"},children:$R[7749]=[$R[7750]={type:"text",value:"());"}]}]}]}]}]}},$R[7751]={children:$R[7752]=[$R[7753]={position:$R[7754]={start:$R[7755]={line:49,column:1,offset:1260},end:$R[7756]={line:49,column:4,offset:1263}},type:"text",value:"また "},$R[7757]={position:$R[7758]={start:$R[7759]={line:49,column:4,offset:1263},end:$R[7760]={line:49,column:14,offset:1273}},type:"inlineCode",value:"molecule"},$R[7761]={position:$R[7762]={start:$R[7763]={line:49,column:14,offset:1273},end:$R[7764]={line:49,column:19,offset:1278}},type:"text",value:" は他の "},$R[7765]={position:$R[7766]={start:$R[7767]={line:49,column:19,offset:1278},end:$R[7768]={line:49,column:29,offset:1288}},type:"inlineCode",value:"molecule"},$R[7769]={position:$R[7770]={start:$R[7771]={line:49,column:29,offset:1288},end:$R[7772]={line:49,column:37,offset:1296}},type:"text",value:" に依存できる。"}],position:$R[7773]={start:$R[7774]={line:49,column:1,offset:1260},end:$R[7775]={line:49,column:37,offset:1296}},type:"paragraph"},$R[7776]={filename:"sample.ts ts",lang:"ts",position:$R[7777]={start:$R[7778]={line:51,column:1,offset:1298},end:$R[7779]={line:59,column:4,offset:1579}},type:"code",value:"import { molecule } from \"bunshi\";\n\nexport const RandomMolecule = molecule(() => Math.random());\nexport const UsernameMolecule = molecule(\n\tmol => `You are user ${mol(RandomMolecule)}`,\n);\nexport const IDMolecule = molecule(mol => `ID: ${mol(RandomMolecule)}`);",hast:$R[7780]={type:"root",children:$R[7781]=[$R[7782]={type:"element",tagName:"pre",properties:$R[7783]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[7784]=[$R[7785]={type:"element",tagName:"code",properties:$R[7786]={},children:$R[7787]=[$R[7788]={type:"element",tagName:"span",properties:$R[7789]={class:"line"},children:$R[7790]=[$R[7791]={type:"element",tagName:"span",properties:$R[7792]={style:"color:#4D9375"},children:$R[7793]=[$R[7794]={type:"text",value:"import"}]},$R[7795]={type:"element",tagName:"span",properties:$R[7796]={style:"color:#666666"},children:$R[7797]=[$R[7798]={type:"text",value:" {"}]},$R[7799]={type:"element",tagName:"span",properties:$R[7800]={style:"color:#BD976A"},children:$R[7801]=[$R[7802]={type:"text",value:" molecule"}]},$R[7803]={type:"element",tagName:"span",properties:$R[7804]={style:"color:#666666"},children:$R[7805]=[$R[7806]={type:"text",value:" }"}]},$R[7807]={type:"element",tagName:"span",properties:$R[7808]={style:"color:#4D9375"},children:$R[7809]=[$R[7810]={type:"text",value:" from"}]},$R[7811]={type:"element",tagName:"span",properties:$R[7812]={style:"color:#C98A7D77"},children:$R[7813]=[$R[7814]={type:"text",value:" \""}]},$R[7815]={type:"element",tagName:"span",properties:$R[7816]={style:"color:#C98A7D"},children:$R[7817]=[$R[7818]={type:"text",value:"bunshi"}]},$R[7819]={type:"element",tagName:"span",properties:$R[7820]={style:"color:#C98A7D77"},children:$R[7821]=[$R[7822]={type:"text",value:"\""}]},$R[7823]={type:"element",tagName:"span",properties:$R[7824]={style:"color:#666666"},children:$R[7825]=[$R[7826]={type:"text",value:";"}]}]},$R[7827]={type:"text",value:"\n"},$R[7828]={type:"element",tagName:"span",properties:$R[7829]={class:"line"},children:$R[7830]=[]},$R[7831]={type:"text",value:"\n"},$R[7832]={type:"element",tagName:"span",properties:$R[7833]={class:"line"},children:$R[7834]=[$R[7835]={type:"element",tagName:"span",properties:$R[7836]={style:"color:#4D9375"},children:$R[7837]=[$R[7838]={type:"text",value:"export"}]},$R[7839]={type:"element",tagName:"span",properties:$R[7840]={style:"color:#CB7676"},children:$R[7841]=[$R[7842]={type:"text",value:" const "}]},$R[7843]={type:"element",tagName:"span",properties:$R[7844]={style:"color:#BD976A"},children:$R[7845]=[$R[7846]={type:"text",value:"RandomMolecule"}]},$R[7847]={type:"element",tagName:"span",properties:$R[7848]={style:"color:#666666"},children:$R[7849]=[$R[7850]={type:"text",value:" ="}]},$R[7851]={type:"element",tagName:"span",properties:$R[7852]={style:"color:#80A665"},children:$R[7853]=[$R[7854]={type:"text",value:" molecule"}]},$R[7855]={type:"element",tagName:"span",properties:$R[7856]={style:"color:#666666"},children:$R[7857]=[$R[7858]={type:"text",value:"(()"}]},$R[7859]={type:"element",tagName:"span",properties:$R[7860]={style:"color:#666666"},children:$R[7861]=[$R[7862]={type:"text",value:" =>"}]},$R[7863]={type:"element",tagName:"span",properties:$R[7864]={style:"color:#BD976A"},children:$R[7865]=[$R[7866]={type:"text",value:" Math"}]},$R[7867]={type:"element",tagName:"span",properties:$R[7868]={style:"color:#666666"},children:$R[7869]=[$R[7870]={type:"text",value:"."}]},$R[7871]={type:"element",tagName:"span",properties:$R[7872]={style:"color:#80A665"},children:$R[7873]=[$R[7874]={type:"text",value:"random"}]},$R[7875]={type:"element",tagName:"span",properties:$R[7876]={style:"color:#666666"},children:$R[7877]=[$R[7878]={type:"text",value:"());"}]}]},$R[7879]={type:"text",value:"\n"},$R[7880]={type:"element",tagName:"span",properties:$R[7881]={class:"line"},children:$R[7882]=[$R[7883]={type:"element",tagName:"span",properties:$R[7884]={style:"color:#4D9375"},children:$R[7885]=[$R[7886]={type:"text",value:"export"}]},$R[7887]={type:"element",tagName:"span",properties:$R[7888]={style:"color:#CB7676"},children:$R[7889]=[$R[7890]={type:"text",value:" const "}]},$R[7891]={type:"element",tagName:"span",properties:$R[7892]={style:"color:#BD976A"},children:$R[7893]=[$R[7894]={type:"text",value:"UsernameMolecule"}]},$R[7895]={type:"element",tagName:"span",properties:$R[7896]={style:"color:#666666"},children:$R[7897]=[$R[7898]={type:"text",value:" ="}]},$R[7899]={type:"element",tagName:"span",properties:$R[7900]={style:"color:#80A665"},children:$R[7901]=[$R[7902]={type:"text",value:" molecule"}]},$R[7903]={type:"element",tagName:"span",properties:$R[7904]={style:"color:#666666"},children:$R[7905]=[$R[7906]={type:"text",value:"("}]}]},$R[7907]={type:"text",value:"\n"},$R[7908]={type:"element",tagName:"span",properties:$R[7909]={class:"line"},children:$R[7910]=[$R[7911]={type:"element",tagName:"span",properties:$R[7912]={style:"color:#BD976A"},children:$R[7913]=[$R[7914]={type:"text",value:"\tmol"}]},$R[7915]={type:"element",tagName:"span",properties:$R[7916]={style:"color:#666666"},children:$R[7917]=[$R[7918]={type:"text",value:" =>"}]},$R[7919]={type:"element",tagName:"span",properties:$R[7920]={style:"color:#C98A7D77"},children:$R[7921]=[$R[7922]={type:"text",value:" `"}]},$R[7923]={type:"element",tagName:"span",properties:$R[7924]={style:"color:#C98A7D"},children:$R[7925]=[$R[7926]={type:"text",value:"You are user "}]},$R[7927]={type:"element",tagName:"span",properties:$R[7928]={style:"color:#4D9375"},children:$R[7929]=[$R[7930]={type:"text",value:"${"}]},$R[7931]={type:"element",tagName:"span",properties:$R[7932]={style:"color:#80A665"},children:$R[7933]=[$R[7934]={type:"text",value:"mol"}]},$R[7935]={type:"element",tagName:"span",properties:$R[7936]={style:"color:#666666"},children:$R[7937]=[$R[7938]={type:"text",value:"("}]},$R[7939]={type:"element",tagName:"span",properties:$R[7940]={style:"color:#C98A7D"},children:$R[7941]=[$R[7942]={type:"text",value:"RandomMolecule"}]},$R[7943]={type:"element",tagName:"span",properties:$R[7944]={style:"color:#666666"},children:$R[7945]=[$R[7946]={type:"text",value:")"}]},$R[7947]={type:"element",tagName:"span",properties:$R[7948]={style:"color:#4D9375"},children:$R[7949]=[$R[7950]={type:"text",value:"}"}]},$R[7951]={type:"element",tagName:"span",properties:$R[7952]={style:"color:#C98A7D77"},children:$R[7953]=[$R[7954]={type:"text",value:"`"}]},$R[7955]={type:"element",tagName:"span",properties:$R[7956]={style:"color:#666666"},children:$R[7957]=[$R[7958]={type:"text",value:","}]}]},$R[7959]={type:"text",value:"\n"},$R[7960]={type:"element",tagName:"span",properties:$R[7961]={class:"line"},children:$R[7962]=[$R[7963]={type:"element",tagName:"span",properties:$R[7964]={style:"color:#666666"},children:$R[7965]=[$R[7966]={type:"text",value:");"}]}]},$R[7967]={type:"text",value:"\n"},$R[7968]={type:"element",tagName:"span",properties:$R[7969]={class:"line"},children:$R[7970]=[$R[7971]={type:"element",tagName:"span",properties:$R[7972]={style:"color:#4D9375"},children:$R[7973]=[$R[7974]={type:"text",value:"export"}]},$R[7975]={type:"element",tagName:"span",properties:$R[7976]={style:"color:#CB7676"},children:$R[7977]=[$R[7978]={type:"text",value:" const "}]},$R[7979]={type:"element",tagName:"span",properties:$R[7980]={style:"color:#BD976A"},children:$R[7981]=[$R[7982]={type:"text",value:"IDMolecule"}]},$R[7983]={type:"element",tagName:"span",properties:$R[7984]={style:"color:#666666"},children:$R[7985]=[$R[7986]={type:"text",value:" ="}]},$R[7987]={type:"element",tagName:"span",properties:$R[7988]={style:"color:#80A665"},children:$R[7989]=[$R[7990]={type:"text",value:" molecule"}]},$R[7991]={type:"element",tagName:"span",properties:$R[7992]={style:"color:#666666"},children:$R[7993]=[$R[7994]={type:"text",value:"("}]},$R[7995]={type:"element",tagName:"span",properties:$R[7996]={style:"color:#BD976A"},children:$R[7997]=[$R[7998]={type:"text",value:"mol"}]},$R[7999]={type:"element",tagName:"span",properties:$R[8000]={style:"color:#666666"},children:$R[8001]=[$R[8002]={type:"text",value:" =>"}]},$R[8003]={type:"element",tagName:"span",properties:$R[8004]={style:"color:#C98A7D77"},children:$R[8005]=[$R[8006]={type:"text",value:" `"}]},$R[8007]={type:"element",tagName:"span",properties:$R[8008]={style:"color:#C98A7D"},children:$R[8009]=[$R[8010]={type:"text",value:"ID: "}]},$R[8011]={type:"element",tagName:"span",properties:$R[8012]={style:"color:#4D9375"},children:$R[8013]=[$R[8014]={type:"text",value:"${"}]},$R[8015]={type:"element",tagName:"span",properties:$R[8016]={style:"color:#80A665"},children:$R[8017]=[$R[8018]={type:"text",value:"mol"}]},$R[8019]={type:"element",tagName:"span",properties:$R[8020]={style:"color:#666666"},children:$R[8021]=[$R[8022]={type:"text",value:"("}]},$R[8023]={type:"element",tagName:"span",properties:$R[8024]={style:"color:#C98A7D"},children:$R[8025]=[$R[8026]={type:"text",value:"RandomMolecule"}]},$R[8027]={type:"element",tagName:"span",properties:$R[8028]={style:"color:#666666"},children:$R[8029]=[$R[8030]={type:"text",value:")"}]},$R[8031]={type:"element",tagName:"span",properties:$R[8032]={style:"color:#4D9375"},children:$R[8033]=[$R[8034]={type:"text",value:"}"}]},$R[8035]={type:"element",tagName:"span",properties:$R[8036]={style:"color:#C98A7D77"},children:$R[8037]=[$R[8038]={type:"text",value:"`"}]},$R[8039]={type:"element",tagName:"span",properties:$R[8040]={style:"color:#666666"},children:$R[8041]=[$R[8042]={type:"text",value:");"}]}]}]}]}]}},$R[8043]={children:$R[8044]=[$R[8045]={position:$R[8046]={start:$R[8047]={line:61,column:1,offset:1581},end:$R[8048]={line:61,column:31,offset:1611}},type:"text",value:"依存は自動で解決されるため、コード保守やテストが容易になる。"}],position:$R[8049]={start:$R[8050]={line:61,column:1,offset:1581},end:$R[8051]={line:61,column:31,offset:1611}},type:"paragraph"},$R[8052]={children:$R[8053]=[$R[8054]={position:$R[8055]={start:$R[8056]={line:63,column:1,offset:1613},end:$R[8057]={line:63,column:9,offset:1621}},type:"text",value:"ロジックなどを "},$R[8058]={position:$R[8059]={start:$R[8060]={line:63,column:9,offset:1621},end:$R[8061]={line:63,column:19,offset:1631}},type:"inlineCode",value:"molecule"},$R[8062]={position:$R[8063]={start:$R[8064]={line:63,column:19,offset:1631},end:$R[8065]={line:63,column:44,offset:1656}},type:"text",value:" に閉じ込めることでコードは非結合で遅延的となる。"}],position:$R[8066]={start:$R[8067]={line:63,column:1,offset:1613},end:$R[8068]={line:63,column:44,offset:1656}},type:"paragraph"},$R[8069]={children:$R[8070]=[$R[8071]={children:$R[8072]=[$R[8073]={children:$R[8074]=[$R[8075]={position:$R[8076]={start:$R[8077]={line:65,column:3,offset:1660},end:$R[8078]={line:65,column:6,offset:1663}},type:"text",value:"非結合"}],position:$R[8079]={start:$R[8080]={line:65,column:3,offset:1660},end:$R[8081]={line:65,column:6,offset:1663}},type:"paragraph"},$R[8082]={children:$R[8083]=[$R[8084]={children:$R[8085]=[$R[8086]={children:$R[8087]=[$R[8088]={position:$R[8089]={start:$R[8090]={line:67,column:5,offset:1669},end:$R[8091]={line:67,column:8,offset:1672}},type:"text",value:"ある "},$R[8092]={position:$R[8093]={start:$R[8094]={line:67,column:8,offset:1672},end:$R[8095]={line:67,column:18,offset:1682}},type:"inlineCode",value:"molecule"},$R[8096]={position:$R[8097]={start:$R[8098]={line:67,column:18,offset:1682},end:$R[8099]={line:67,column:35,offset:1699}},type:"text",value:" をリファクタリングする時、その "},$R[8100]={position:$R[8101]={start:$R[8102]={line:67,column:35,offset:1699},end:$R[8103]={line:67,column:45,offset:1709}},type:"inlineCode",value:"molecule"},$R[8104]={position:$R[8105]={start:$R[8106]={line:67,column:45,offset:1709},end:$R[8107]={line:67,column:54,offset:1718}},type:"text",value:" に依存する他の "},$R[8108]={position:$R[8109]={start:$R[8110]={line:67,column:54,offset:1718},end:$R[8111]={line:67,column:64,offset:1728}},type:"inlineCode",value:"molecule"},$R[8112]={position:$R[8113]={start:$R[8114]={line:67,column:64,offset:1728},end:$R[8115]={line:67,column:73,offset:1737}},type:"text",value:" に影響を与えない"}],position:$R[8116]={start:$R[8117]={line:67,column:5,offset:1669},end:$R[8118]={line:67,column:73,offset:1737}},type:"paragraph"}],position:$R[8119]={start:$R[8120]={line:67,column:3,offset:1667},end:$R[8121]={line:67,column:73,offset:1737}},type:"listItem"}],position:$R[8122]={start:$R[8123]={line:67,column:3,offset:1667},end:$R[8124]={line:67,column:73,offset:1737}},type:"unorderedList"}],position:$R[8125]={start:$R[8126]={line:65,column:1,offset:1658},end:$R[8127]={line:67,column:73,offset:1737}},type:"listItem"},$R[8128]={children:$R[8129]=[$R[8130]={children:$R[8131]=[$R[8132]={position:$R[8133]={start:$R[8134]={line:69,column:3,offset:1741},end:$R[8135]={line:69,column:6,offset:1744}},type:"text",value:"遅延的"}],position:$R[8136]={start:$R[8137]={line:69,column:3,offset:1741},end:$R[8138]={line:69,column:6,offset:1744}},type:"paragraph"},$R[8139]={children:$R[8140]=[$R[8141]={children:$R[8142]=[$R[8143]={children:$R[8144]=[$R[8145]={position:$R[8146]={start:$R[8147]={line:71,column:5,offset:1750},end:$R[8148]={line:71,column:15,offset:1760}},type:"inlineCode",value:"molecule"},$R[8149]={position:$R[8150]={start:$R[8151]={line:71,column:15,offset:1760},end:$R[8152]={line:71,column:30,offset:1775}},type:"text",value:" は必要になるまで実行されない"}],position:$R[8153]={start:$R[8154]={line:71,column:5,offset:1750},end:$R[8155]={line:71,column:30,offset:1775}},type:"paragraph"}],position:$R[8156]={start:$R[8157]={line:71,column:3,offset:1748},end:$R[8158]={line:71,column:30,offset:1775}},type:"listItem"}],position:$R[8159]={start:$R[8160]={line:71,column:3,offset:1748},end:$R[8161]={line:71,column:30,offset:1775}},type:"unorderedList"}],position:$R[8162]={start:$R[8163]={line:69,column:1,offset:1739},end:$R[8164]={line:71,column:30,offset:1775}},type:"listItem"}],position:$R[8165]={start:$R[8166]={line:65,column:1,offset:1658},end:$R[8167]={line:71,column:30,offset:1775}},type:"unorderedList"}],position:$R[8168]={end:$R[8169]={line:71,column:30,offset:1775},start:$R[8170]={line:37,column:1,offset:1024}},type:"section"},$R[8171]={children:$R[8172]=[$R[8173]={children:$R[8174]=[$R[8175]={position:$R[8176]={start:$R[8177]={line:73,column:5,offset:1781},end:$R[8178]={line:73,column:10,offset:1786}},type:"text",value:"scope"}],id:"scope",level:3,plain:"scope",position:$R[8179]={start:$R[8180]={line:73,column:1,offset:1777},end:$R[8181]={line:73,column:10,offset:1786}},type:"heading"},$R[8182]={children:$R[8183]=[$R[8184]={position:$R[8185]={start:$R[8186]={line:75,column:1,offset:1788},end:$R[8187]={line:75,column:8,offset:1795}},type:"inlineCode",value:"scope"},$R[8188]={position:$R[8189]={start:$R[8190]={line:75,column:8,offset:1795},end:$R[8191]={line:75,column:11,offset:1798}},type:"text",value:" は "},$R[8192]={position:$R[8193]={start:$R[8194]={line:75,column:11,offset:1798},end:$R[8195]={line:75,column:21,offset:1808}},type:"inlineCode",value:"molecule"},$R[8196]={position:$R[8197]={start:$R[8198]={line:75,column:21,offset:1808},end:$R[8199]={line:75,column:71,offset:1858}},type:"text",value:" を異なるコンポーネントで共通の環境を共有して使うための依存関係のグラフを構築するための概念である。"}],position:$R[8200]={start:$R[8201]={line:75,column:1,offset:1788},end:$R[8202]={line:75,column:71,offset:1858}},type:"paragraph"},$R[8203]={children:$R[8204]=[$R[8205]={position:$R[8206]={start:$R[8207]={line:77,column:1,offset:1860},end:$R[8208]={line:77,column:14,offset:1873}},type:"inlineCode",value:"createScope"},$R[8209]={position:$R[8210]={start:$R[8211]={line:77,column:14,offset:1873},end:$R[8212]={line:77,column:22,offset:1881}},type:"text",value:" 関数を使って "},$R[8213]={position:$R[8214]={start:$R[8215]={line:77,column:22,offset:1881},end:$R[8216]={line:77,column:29,offset:1888}},type:"inlineCode",value:"scope"},$R[8217]={position:$R[8218]={start:$R[8219]={line:77,column:29,offset:1888},end:$R[8220]={line:77,column:36,offset:1895}},type:"text",value:" を作成する。"}],position:$R[8221]={start:$R[8222]={line:77,column:1,offset:1860},end:$R[8223]={line:77,column:36,offset:1895}},type:"paragraph"},$R[8224]={filename:"sample.ts ts",lang:"ts",position:$R[8225]={start:$R[8226]={line:79,column:1,offset:1897},end:$R[8227]={line:86,column:4,offset:2054}},type:"code",value:"import { createScope } from \"bunshi\";\n\n/**\n * Scope for a user id\n */\nexport const UserScope = createScope\x3Cstring>(\"alice@example.com\");",hast:$R[8228]={type:"root",children:$R[8229]=[$R[8230]={type:"element",tagName:"pre",properties:$R[8231]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[8232]=[$R[8233]={type:"element",tagName:"code",properties:$R[8234]={},children:$R[8235]=[$R[8236]={type:"element",tagName:"span",properties:$R[8237]={class:"line"},children:$R[8238]=[$R[8239]={type:"element",tagName:"span",properties:$R[8240]={style:"color:#4D9375"},children:$R[8241]=[$R[8242]={type:"text",value:"import"}]},$R[8243]={type:"element",tagName:"span",properties:$R[8244]={style:"color:#666666"},children:$R[8245]=[$R[8246]={type:"text",value:" {"}]},$R[8247]={type:"element",tagName:"span",properties:$R[8248]={style:"color:#BD976A"},children:$R[8249]=[$R[8250]={type:"text",value:" createScope"}]},$R[8251]={type:"element",tagName:"span",properties:$R[8252]={style:"color:#666666"},children:$R[8253]=[$R[8254]={type:"text",value:" }"}]},$R[8255]={type:"element",tagName:"span",properties:$R[8256]={style:"color:#4D9375"},children:$R[8257]=[$R[8258]={type:"text",value:" from"}]},$R[8259]={type:"element",tagName:"span",properties:$R[8260]={style:"color:#C98A7D77"},children:$R[8261]=[$R[8262]={type:"text",value:" \""}]},$R[8263]={type:"element",tagName:"span",properties:$R[8264]={style:"color:#C98A7D"},children:$R[8265]=[$R[8266]={type:"text",value:"bunshi"}]},$R[8267]={type:"element",tagName:"span",properties:$R[8268]={style:"color:#C98A7D77"},children:$R[8269]=[$R[8270]={type:"text",value:"\""}]},$R[8271]={type:"element",tagName:"span",properties:$R[8272]={style:"color:#666666"},children:$R[8273]=[$R[8274]={type:"text",value:";"}]}]},$R[8275]={type:"text",value:"\n"},$R[8276]={type:"element",tagName:"span",properties:$R[8277]={class:"line"},children:$R[8278]=[]},$R[8279]={type:"text",value:"\n"},$R[8280]={type:"element",tagName:"span",properties:$R[8281]={class:"line"},children:$R[8282]=[$R[8283]={type:"element",tagName:"span",properties:$R[8284]={style:"color:#758575DD"},children:$R[8285]=[$R[8286]={type:"text",value:"/**"}]}]},$R[8287]={type:"text",value:"\n"},$R[8288]={type:"element",tagName:"span",properties:$R[8289]={class:"line"},children:$R[8290]=[$R[8291]={type:"element",tagName:"span",properties:$R[8292]={style:"color:#758575DD"},children:$R[8293]=[$R[8294]={type:"text",value:" * Scope for a user id"}]}]},$R[8295]={type:"text",value:"\n"},$R[8296]={type:"element",tagName:"span",properties:$R[8297]={class:"line"},children:$R[8298]=[$R[8299]={type:"element",tagName:"span",properties:$R[8300]={style:"color:#758575DD"},children:$R[8301]=[$R[8302]={type:"text",value:" */"}]}]},$R[8303]={type:"text",value:"\n"},$R[8304]={type:"element",tagName:"span",properties:$R[8305]={class:"line"},children:$R[8306]=[$R[8307]={type:"element",tagName:"span",properties:$R[8308]={style:"color:#4D9375"},children:$R[8309]=[$R[8310]={type:"text",value:"export"}]},$R[8311]={type:"element",tagName:"span",properties:$R[8312]={style:"color:#CB7676"},children:$R[8313]=[$R[8314]={type:"text",value:" const "}]},$R[8315]={type:"element",tagName:"span",properties:$R[8316]={style:"color:#BD976A"},children:$R[8317]=[$R[8318]={type:"text",value:"UserScope"}]},$R[8319]={type:"element",tagName:"span",properties:$R[8320]={style:"color:#666666"},children:$R[8321]=[$R[8322]={type:"text",value:" ="}]},$R[8323]={type:"element",tagName:"span",properties:$R[8324]={style:"color:#80A665"},children:$R[8325]=[$R[8326]={type:"text",value:" createScope"}]},$R[8327]={type:"element",tagName:"span",properties:$R[8328]={style:"color:#666666"},children:$R[8329]=[$R[8330]={type:"text",value:"\x3C"}]},$R[8331]={type:"element",tagName:"span",properties:$R[8332]={style:"color:#5DA994"},children:$R[8333]=[$R[8334]={type:"text",value:"string"}]},$R[8335]={type:"element",tagName:"span",properties:$R[8336]={style:"color:#666666"},children:$R[8337]=[$R[8338]={type:"text",value:">("}]},$R[8339]={type:"element",tagName:"span",properties:$R[8340]={style:"color:#C98A7D77"},children:$R[8341]=[$R[8342]={type:"text",value:"\""}]},$R[8343]={type:"element",tagName:"span",properties:$R[8344]={style:"color:#C98A7D"},children:$R[8345]=[$R[8346]={type:"text",value:"alice@example.com"}]},$R[8347]={type:"element",tagName:"span",properties:$R[8348]={style:"color:#C98A7D77"},children:$R[8349]=[$R[8350]={type:"text",value:"\""}]},$R[8351]={type:"element",tagName:"span",properties:$R[8352]={style:"color:#666666"},children:$R[8353]=[$R[8354]={type:"text",value:");"}]}]}]}]}]}},$R[8355]={children:$R[8356]=[$R[8357]={position:$R[8358]={start:$R[8359]={line:88,column:1,offset:2056},end:$R[8360]={line:88,column:6,offset:2061}},type:"text",value:"宣言した "},$R[8361]={position:$R[8362]={start:$R[8363]={line:88,column:6,offset:2061},end:$R[8364]={line:88,column:13,offset:2068}},type:"inlineCode",value:"scope"},$R[8365]={position:$R[8366]={start:$R[8367]={line:88,column:13,offset:2068},end:$R[8368]={line:88,column:47,offset:2102}},type:"text",value:" はフレームワークによって異なる方法でプロバイダーを提供する。私は "},$R[8369]={position:$R[8370]={start:$R[8371]={line:88,column:47,offset:2102},end:$R[8372]={line:88,column:54,offset:2109}},type:"inlineCode",value:"React"},$R[8373]={position:$R[8374]={start:$R[8375]={line:88,column:54,offset:2109},end:$R[8376]={line:88,column:64,offset:2119}},type:"text",value:" を使っているので、"},$R[8377]={position:$R[8378]={start:$R[8379]={line:88,column:64,offset:2119},end:$R[8380]={line:88,column:71,offset:2126}},type:"inlineCode",value:"React"},$R[8381]={position:$R[8382]={start:$R[8383]={line:88,column:71,offset:2126},end:$R[8384]={line:88,column:89,offset:2144}},type:"text",value:" でのプロバイダーの提供方法を示す。"}],position:$R[8385]={start:$R[8386]={line:88,column:1,offset:2056},end:$R[8387]={line:88,column:89,offset:2144}},type:"paragraph"},$R[8388]={filename:"sample.tsx tsx",lang:"tsx",position:$R[8389]={start:$R[8390]={line:90,column:1,offset:2146},end:$R[8391]={line:103,column:4,offset:2438}},type:"code",value:"import { ScopeProvider } from \"bunshi/react\";\nimport type { ReactElement } from \"react\";\n\nimport { UserScope } from \"./scopes\";\n\nexport function App({ children }: Props): ReactElement {\n\treturn (\n\t\t\x3CScopeProvider scope={UserScope}>\n\t\t\t{children}\n\t\t\x3C/ScopeProvider>\n\t);\n}",hast:$R[8392]={type:"root",children:$R[8393]=[$R[8394]={type:"element",tagName:"pre",properties:$R[8395]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[8396]=[$R[8397]={type:"element",tagName:"code",properties:$R[8398]={},children:$R[8399]=[$R[8400]={type:"element",tagName:"span",properties:$R[8401]={class:"line"},children:$R[8402]=[$R[8403]={type:"element",tagName:"span",properties:$R[8404]={style:"color:#4D9375"},children:$R[8405]=[$R[8406]={type:"text",value:"import"}]},$R[8407]={type:"element",tagName:"span",properties:$R[8408]={style:"color:#666666"},children:$R[8409]=[$R[8410]={type:"text",value:" {"}]},$R[8411]={type:"element",tagName:"span",properties:$R[8412]={style:"color:#BD976A"},children:$R[8413]=[$R[8414]={type:"text",value:" ScopeProvider"}]},$R[8415]={type:"element",tagName:"span",properties:$R[8416]={style:"color:#666666"},children:$R[8417]=[$R[8418]={type:"text",value:" }"}]},$R[8419]={type:"element",tagName:"span",properties:$R[8420]={style:"color:#4D9375"},children:$R[8421]=[$R[8422]={type:"text",value:" from"}]},$R[8423]={type:"element",tagName:"span",properties:$R[8424]={style:"color:#C98A7D77"},children:$R[8425]=[$R[8426]={type:"text",value:" \""}]},$R[8427]={type:"element",tagName:"span",properties:$R[8428]={style:"color:#C98A7D"},children:$R[8429]=[$R[8430]={type:"text",value:"bunshi/react"}]},$R[8431]={type:"element",tagName:"span",properties:$R[8432]={style:"color:#C98A7D77"},children:$R[8433]=[$R[8434]={type:"text",value:"\""}]},$R[8435]={type:"element",tagName:"span",properties:$R[8436]={style:"color:#666666"},children:$R[8437]=[$R[8438]={type:"text",value:";"}]}]},$R[8439]={type:"text",value:"\n"},$R[8440]={type:"element",tagName:"span",properties:$R[8441]={class:"line"},children:$R[8442]=[$R[8443]={type:"element",tagName:"span",properties:$R[8444]={style:"color:#4D9375"},children:$R[8445]=[$R[8446]={type:"text",value:"import"}]},$R[8447]={type:"element",tagName:"span",properties:$R[8448]={style:"color:#4D9375"},children:$R[8449]=[$R[8450]={type:"text",value:" type"}]},$R[8451]={type:"element",tagName:"span",properties:$R[8452]={style:"color:#666666"},children:$R[8453]=[$R[8454]={type:"text",value:" {"}]},$R[8455]={type:"element",tagName:"span",properties:$R[8456]={style:"color:#BD976A"},children:$R[8457]=[$R[8458]={type:"text",value:" ReactElement"}]},$R[8459]={type:"element",tagName:"span",properties:$R[8460]={style:"color:#666666"},children:$R[8461]=[$R[8462]={type:"text",value:" }"}]},$R[8463]={type:"element",tagName:"span",properties:$R[8464]={style:"color:#4D9375"},children:$R[8465]=[$R[8466]={type:"text",value:" from"}]},$R[8467]={type:"element",tagName:"span",properties:$R[8468]={style:"color:#C98A7D77"},children:$R[8469]=[$R[8470]={type:"text",value:" \""}]},$R[8471]={type:"element",tagName:"span",properties:$R[8472]={style:"color:#C98A7D"},children:$R[8473]=[$R[8474]={type:"text",value:"react"}]},$R[8475]={type:"element",tagName:"span",properties:$R[8476]={style:"color:#C98A7D77"},children:$R[8477]=[$R[8478]={type:"text",value:"\""}]},$R[8479]={type:"element",tagName:"span",properties:$R[8480]={style:"color:#666666"},children:$R[8481]=[$R[8482]={type:"text",value:";"}]}]},$R[8483]={type:"text",value:"\n"},$R[8484]={type:"element",tagName:"span",properties:$R[8485]={class:"line"},children:$R[8486]=[]},$R[8487]={type:"text",value:"\n"},$R[8488]={type:"element",tagName:"span",properties:$R[8489]={class:"line"},children:$R[8490]=[$R[8491]={type:"element",tagName:"span",properties:$R[8492]={style:"color:#4D9375"},children:$R[8493]=[$R[8494]={type:"text",value:"import"}]},$R[8495]={type:"element",tagName:"span",properties:$R[8496]={style:"color:#666666"},children:$R[8497]=[$R[8498]={type:"text",value:" {"}]},$R[8499]={type:"element",tagName:"span",properties:$R[8500]={style:"color:#BD976A"},children:$R[8501]=[$R[8502]={type:"text",value:" UserScope"}]},$R[8503]={type:"element",tagName:"span",properties:$R[8504]={style:"color:#666666"},children:$R[8505]=[$R[8506]={type:"text",value:" }"}]},$R[8507]={type:"element",tagName:"span",properties:$R[8508]={style:"color:#4D9375"},children:$R[8509]=[$R[8510]={type:"text",value:" from"}]},$R[8511]={type:"element",tagName:"span",properties:$R[8512]={style:"color:#C98A7D77"},children:$R[8513]=[$R[8514]={type:"text",value:" \""}]},$R[8515]={type:"element",tagName:"span",properties:$R[8516]={style:"color:#C98A7D"},children:$R[8517]=[$R[8518]={type:"text",value:"./scopes"}]},$R[8519]={type:"element",tagName:"span",properties:$R[8520]={style:"color:#C98A7D77"},children:$R[8521]=[$R[8522]={type:"text",value:"\""}]},$R[8523]={type:"element",tagName:"span",properties:$R[8524]={style:"color:#666666"},children:$R[8525]=[$R[8526]={type:"text",value:";"}]}]},$R[8527]={type:"text",value:"\n"},$R[8528]={type:"element",tagName:"span",properties:$R[8529]={class:"line"},children:$R[8530]=[]},$R[8531]={type:"text",value:"\n"},$R[8532]={type:"element",tagName:"span",properties:$R[8533]={class:"line"},children:$R[8534]=[$R[8535]={type:"element",tagName:"span",properties:$R[8536]={style:"color:#4D9375"},children:$R[8537]=[$R[8538]={type:"text",value:"export"}]},$R[8539]={type:"element",tagName:"span",properties:$R[8540]={style:"color:#CB7676"},children:$R[8541]=[$R[8542]={type:"text",value:" function"}]},$R[8543]={type:"element",tagName:"span",properties:$R[8544]={style:"color:#80A665"},children:$R[8545]=[$R[8546]={type:"text",value:" App"}]},$R[8547]={type:"element",tagName:"span",properties:$R[8548]={style:"color:#666666"},children:$R[8549]=[$R[8550]={type:"text",value:"({"}]},$R[8551]={type:"element",tagName:"span",properties:$R[8552]={style:"color:#BD976A"},children:$R[8553]=[$R[8554]={type:"text",value:" children"}]},$R[8555]={type:"element",tagName:"span",properties:$R[8556]={style:"color:#666666"},children:$R[8557]=[$R[8558]={type:"text",value:" }: "}]},$R[8559]={type:"element",tagName:"span",properties:$R[8560]={style:"color:#5DA994"},children:$R[8561]=[$R[8562]={type:"text",value:"Props"}]},$R[8563]={type:"element",tagName:"span",properties:$R[8564]={style:"color:#666666"},children:$R[8565]=[$R[8566]={type:"text",value:"):"}]},$R[8567]={type:"element",tagName:"span",properties:$R[8568]={style:"color:#5DA994"},children:$R[8569]=[$R[8570]={type:"text",value:" ReactElement"}]},$R[8571]={type:"element",tagName:"span",properties:$R[8572]={style:"color:#666666"},children:$R[8573]=[$R[8574]={type:"text",value:" {"}]}]},$R[8575]={type:"text",value:"\n"},$R[8576]={type:"element",tagName:"span",properties:$R[8577]={class:"line"},children:$R[8578]=[$R[8579]={type:"element",tagName:"span",properties:$R[8580]={style:"color:#4D9375"},children:$R[8581]=[$R[8582]={type:"text",value:"\treturn"}]},$R[8583]={type:"element",tagName:"span",properties:$R[8584]={style:"color:#666666"},children:$R[8585]=[$R[8586]={type:"text",value:" ("}]}]},$R[8587]={type:"text",value:"\n"},$R[8588]={type:"element",tagName:"span",properties:$R[8589]={class:"line"},children:$R[8590]=[$R[8591]={type:"element",tagName:"span",properties:$R[8592]={style:"color:#666666"},children:$R[8593]=[$R[8594]={type:"text",value:"\t\t\x3C"}]},$R[8595]={type:"element",tagName:"span",properties:$R[8596]={style:"color:#B8A965"},children:$R[8597]=[$R[8598]={type:"text",value:"ScopeProvider"}]},$R[8599]={type:"element",tagName:"span",properties:$R[8600]={style:"color:#BD976A"},children:$R[8601]=[$R[8602]={type:"text",value:" scope"}]},$R[8603]={type:"element",tagName:"span",properties:$R[8604]={style:"color:#666666"},children:$R[8605]=[$R[8606]={type:"text",value:"={"}]},$R[8607]={type:"element",tagName:"span",properties:$R[8608]={style:"color:#BD976A"},children:$R[8609]=[$R[8610]={type:"text",value:"UserScope"}]},$R[8611]={type:"element",tagName:"span",properties:$R[8612]={style:"color:#666666"},children:$R[8613]=[$R[8614]={type:"text",value:"}>"}]}]},$R[8615]={type:"text",value:"\n"},$R[8616]={type:"element",tagName:"span",properties:$R[8617]={class:"line"},children:$R[8618]=[$R[8619]={type:"element",tagName:"span",properties:$R[8620]={style:"color:#666666"},children:$R[8621]=[$R[8622]={type:"text",value:"\t\t\t{"}]},$R[8623]={type:"element",tagName:"span",properties:$R[8624]={style:"color:#BD976A"},children:$R[8625]=[$R[8626]={type:"text",value:"children"}]},$R[8627]={type:"element",tagName:"span",properties:$R[8628]={style:"color:#666666"},children:$R[8629]=[$R[8630]={type:"text",value:"}"}]}]},$R[8631]={type:"text",value:"\n"},$R[8632]={type:"element",tagName:"span",properties:$R[8633]={class:"line"},children:$R[8634]=[$R[8635]={type:"element",tagName:"span",properties:$R[8636]={style:"color:#666666"},children:$R[8637]=[$R[8638]={type:"text",value:"\t\t\x3C/"}]},$R[8639]={type:"element",tagName:"span",properties:$R[8640]={style:"color:#B8A965"},children:$R[8641]=[$R[8642]={type:"text",value:"ScopeProvider"}]},$R[8643]={type:"element",tagName:"span",properties:$R[8644]={style:"color:#666666"},children:$R[8645]=[$R[8646]={type:"text",value:">"}]}]},$R[8647]={type:"text",value:"\n"},$R[8648]={type:"element",tagName:"span",properties:$R[8649]={class:"line"},children:$R[8650]=[$R[8651]={type:"element",tagName:"span",properties:$R[8652]={style:"color:#666666"},children:$R[8653]=[$R[8654]={type:"text",value:"\t);"}]}]},$R[8655]={type:"text",value:"\n"},$R[8656]={type:"element",tagName:"span",properties:$R[8657]={class:"line"},children:$R[8658]=[$R[8659]={type:"element",tagName:"span",properties:$R[8660]={style:"color:#666666"},children:$R[8661]=[$R[8662]={type:"text",value:"}"}]}]}]}]}]}},$R[8663]={children:$R[8664]=[$R[8665]={position:$R[8666]={start:$R[8667]={line:105,column:1,offset:2440},end:$R[8668]={line:105,column:8,offset:2447}},type:"inlineCode",value:"scope"},$R[8669]={position:$R[8670]={start:$R[8671]={line:105,column:8,offset:2447},end:$R[8672]={line:105,column:14,offset:2453}},type:"text",value:" の真価は、"},$R[8673]={position:$R[8674]={start:$R[8675]={line:105,column:14,offset:2453},end:$R[8676]={line:105,column:24,offset:2463}},type:"inlineCode",value:"molecule"},$R[8677]={position:$R[8678]={start:$R[8679]={line:105,column:24,offset:2463},end:$R[8680]={line:105,column:27,offset:2466}},type:"text",value:" を "},$R[8681]={position:$R[8682]={start:$R[8683]={line:105,column:27,offset:2466},end:$R[8684]={line:105,column:34,offset:2473}},type:"inlineCode",value:"scope"},$R[8685]={position:$R[8686]={start:$R[8687]={line:105,column:34,offset:2473},end:$R[8688]={line:105,column:49,offset:2488}},type:"text",value:" に依存させることで発揮する。"}],position:$R[8689]={start:$R[8690]={line:105,column:1,offset:2440},end:$R[8691]={line:105,column:49,offset:2488}},type:"paragraph"},$R[8692]={filename:"sample.ts ts",lang:"ts",position:$R[8693]={start:$R[8694]={line:107,column:1,offset:2490},end:$R[8695]={line:114,column:4,offset:2682}},type:"code",value:"import { molecule } from \"bunshi\";\nimport { UserScope } from \"./scopes\";\n\nexport const UsernameMolecule = molecule(\n\t(_mol, scope) => `You are user ${scope(UserScope)}`,\n);",hast:$R[8696]={type:"root",children:$R[8697]=[$R[8698]={type:"element",tagName:"pre",properties:$R[8699]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[8700]=[$R[8701]={type:"element",tagName:"code",properties:$R[8702]={},children:$R[8703]=[$R[8704]={type:"element",tagName:"span",properties:$R[8705]={class:"line"},children:$R[8706]=[$R[8707]={type:"element",tagName:"span",properties:$R[8708]={style:"color:#4D9375"},children:$R[8709]=[$R[8710]={type:"text",value:"import"}]},$R[8711]={type:"element",tagName:"span",properties:$R[8712]={style:"color:#666666"},children:$R[8713]=[$R[8714]={type:"text",value:" {"}]},$R[8715]={type:"element",tagName:"span",properties:$R[8716]={style:"color:#BD976A"},children:$R[8717]=[$R[8718]={type:"text",value:" molecule"}]},$R[8719]={type:"element",tagName:"span",properties:$R[8720]={style:"color:#666666"},children:$R[8721]=[$R[8722]={type:"text",value:" }"}]},$R[8723]={type:"element",tagName:"span",properties:$R[8724]={style:"color:#4D9375"},children:$R[8725]=[$R[8726]={type:"text",value:" from"}]},$R[8727]={type:"element",tagName:"span",properties:$R[8728]={style:"color:#C98A7D77"},children:$R[8729]=[$R[8730]={type:"text",value:" \""}]},$R[8731]={type:"element",tagName:"span",properties:$R[8732]={style:"color:#C98A7D"},children:$R[8733]=[$R[8734]={type:"text",value:"bunshi"}]},$R[8735]={type:"element",tagName:"span",properties:$R[8736]={style:"color:#C98A7D77"},children:$R[8737]=[$R[8738]={type:"text",value:"\""}]},$R[8739]={type:"element",tagName:"span",properties:$R[8740]={style:"color:#666666"},children:$R[8741]=[$R[8742]={type:"text",value:";"}]}]},$R[8743]={type:"text",value:"\n"},$R[8744]={type:"element",tagName:"span",properties:$R[8745]={class:"line"},children:$R[8746]=[$R[8747]={type:"element",tagName:"span",properties:$R[8748]={style:"color:#4D9375"},children:$R[8749]=[$R[8750]={type:"text",value:"import"}]},$R[8751]={type:"element",tagName:"span",properties:$R[8752]={style:"color:#666666"},children:$R[8753]=[$R[8754]={type:"text",value:" {"}]},$R[8755]={type:"element",tagName:"span",properties:$R[8756]={style:"color:#BD976A"},children:$R[8757]=[$R[8758]={type:"text",value:" UserScope"}]},$R[8759]={type:"element",tagName:"span",properties:$R[8760]={style:"color:#666666"},children:$R[8761]=[$R[8762]={type:"text",value:" }"}]},$R[8763]={type:"element",tagName:"span",properties:$R[8764]={style:"color:#4D9375"},children:$R[8765]=[$R[8766]={type:"text",value:" from"}]},$R[8767]={type:"element",tagName:"span",properties:$R[8768]={style:"color:#C98A7D77"},children:$R[8769]=[$R[8770]={type:"text",value:" \""}]},$R[8771]={type:"element",tagName:"span",properties:$R[8772]={style:"color:#C98A7D"},children:$R[8773]=[$R[8774]={type:"text",value:"./scopes"}]},$R[8775]={type:"element",tagName:"span",properties:$R[8776]={style:"color:#C98A7D77"},children:$R[8777]=[$R[8778]={type:"text",value:"\""}]},$R[8779]={type:"element",tagName:"span",properties:$R[8780]={style:"color:#666666"},children:$R[8781]=[$R[8782]={type:"text",value:";"}]}]},$R[8783]={type:"text",value:"\n"},$R[8784]={type:"element",tagName:"span",properties:$R[8785]={class:"line"},children:$R[8786]=[]},$R[8787]={type:"text",value:"\n"},$R[8788]={type:"element",tagName:"span",properties:$R[8789]={class:"line"},children:$R[8790]=[$R[8791]={type:"element",tagName:"span",properties:$R[8792]={style:"color:#4D9375"},children:$R[8793]=[$R[8794]={type:"text",value:"export"}]},$R[8795]={type:"element",tagName:"span",properties:$R[8796]={style:"color:#CB7676"},children:$R[8797]=[$R[8798]={type:"text",value:" const "}]},$R[8799]={type:"element",tagName:"span",properties:$R[8800]={style:"color:#BD976A"},children:$R[8801]=[$R[8802]={type:"text",value:"UsernameMolecule"}]},$R[8803]={type:"element",tagName:"span",properties:$R[8804]={style:"color:#666666"},children:$R[8805]=[$R[8806]={type:"text",value:" ="}]},$R[8807]={type:"element",tagName:"span",properties:$R[8808]={style:"color:#80A665"},children:$R[8809]=[$R[8810]={type:"text",value:" molecule"}]},$R[8811]={type:"element",tagName:"span",properties:$R[8812]={style:"color:#666666"},children:$R[8813]=[$R[8814]={type:"text",value:"("}]}]},$R[8815]={type:"text",value:"\n"},$R[8816]={type:"element",tagName:"span",properties:$R[8817]={class:"line"},children:$R[8818]=[$R[8819]={type:"element",tagName:"span",properties:$R[8820]={style:"color:#666666"},children:$R[8821]=[$R[8822]={type:"text",value:"\t("}]},$R[8823]={type:"element",tagName:"span",properties:$R[8824]={style:"color:#BD976A"},children:$R[8825]=[$R[8826]={type:"text",value:"_mol"}]},$R[8827]={type:"element",tagName:"span",properties:$R[8828]={style:"color:#666666"},children:$R[8829]=[$R[8830]={type:"text",value:","}]},$R[8831]={type:"element",tagName:"span",properties:$R[8832]={style:"color:#BD976A"},children:$R[8833]=[$R[8834]={type:"text",value:" scope"}]},$R[8835]={type:"element",tagName:"span",properties:$R[8836]={style:"color:#666666"},children:$R[8837]=[$R[8838]={type:"text",value:")"}]},$R[8839]={type:"element",tagName:"span",properties:$R[8840]={style:"color:#666666"},children:$R[8841]=[$R[8842]={type:"text",value:" =>"}]},$R[8843]={type:"element",tagName:"span",properties:$R[8844]={style:"color:#C98A7D77"},children:$R[8845]=[$R[8846]={type:"text",value:" `"}]},$R[8847]={type:"element",tagName:"span",properties:$R[8848]={style:"color:#C98A7D"},children:$R[8849]=[$R[8850]={type:"text",value:"You are user "}]},$R[8851]={type:"element",tagName:"span",properties:$R[8852]={style:"color:#4D9375"},children:$R[8853]=[$R[8854]={type:"text",value:"${"}]},$R[8855]={type:"element",tagName:"span",properties:$R[8856]={style:"color:#80A665"},children:$R[8857]=[$R[8858]={type:"text",value:"scope"}]},$R[8859]={type:"element",tagName:"span",properties:$R[8860]={style:"color:#666666"},children:$R[8861]=[$R[8862]={type:"text",value:"("}]},$R[8863]={type:"element",tagName:"span",properties:$R[8864]={style:"color:#C98A7D"},children:$R[8865]=[$R[8866]={type:"text",value:"UserScope"}]},$R[8867]={type:"element",tagName:"span",properties:$R[8868]={style:"color:#666666"},children:$R[8869]=[$R[8870]={type:"text",value:")"}]},$R[8871]={type:"element",tagName:"span",properties:$R[8872]={style:"color:#4D9375"},children:$R[8873]=[$R[8874]={type:"text",value:"}"}]},$R[8875]={type:"element",tagName:"span",properties:$R[8876]={style:"color:#C98A7D77"},children:$R[8877]=[$R[8878]={type:"text",value:"`"}]},$R[8879]={type:"element",tagName:"span",properties:$R[8880]={style:"color:#666666"},children:$R[8881]=[$R[8882]={type:"text",value:","}]}]},$R[8883]={type:"text",value:"\n"},$R[8884]={type:"element",tagName:"span",properties:$R[8885]={class:"line"},children:$R[8886]=[$R[8887]={type:"element",tagName:"span",properties:$R[8888]={style:"color:#666666"},children:$R[8889]=[$R[8890]={type:"text",value:");"}]}]}]}]}]}},$R[8891]={children:$R[8892]=[$R[8893]={position:$R[8894]={start:$R[8895]={line:116,column:1,offset:2684},end:$R[8896]={line:116,column:8,offset:2691}},type:"inlineCode",value:"scope"},$R[8897]={position:$R[8898]={start:$R[8899]={line:116,column:8,offset:2691},end:$R[8900]={line:116,column:11,offset:2694}},type:"text",value:" を "},$R[8901]={position:$R[8902]={start:$R[8903]={line:116,column:11,offset:2694},end:$R[8904]={line:116,column:21,offset:2704}},type:"inlineCode",value:"molecule"},$R[8905]={position:$R[8906]={start:$R[8907]={line:116,column:21,offset:2704},end:$R[8908]={line:116,column:32,offset:2715}},type:"text",value:" に依存させることで "},$R[8909]={position:$R[8910]={start:$R[8911]={line:116,column:32,offset:2715},end:$R[8912]={line:116,column:42,offset:2725}},type:"inlineCode",value:"molecule"},$R[8913]={position:$R[8914]={start:$R[8915]={line:116,column:42,offset:2725},end:$R[8916]={line:116,column:70,offset:2753}},type:"text",value:" はアプリケーション全体で 1 回実行されるのではなく、"},$R[8917]={position:$R[8918]={start:$R[8919]={line:116,column:70,offset:2753},end:$R[8920]={line:116,column:77,offset:2760}},type:"inlineCode",value:"scope"},$R[8921]={position:$R[8922]={start:$R[8923]={line:116,column:77,offset:2760},end:$R[8924]={line:116,column:98,offset:2781}},type:"text",value:" をマウントするごとに再実行される。また、"},$R[8925]={position:$R[8926]={start:$R[8927]={line:116,column:98,offset:2781},end:$R[8928]={line:116,column:105,offset:2788}},type:"inlineCode",value:"scope"},$R[8929]={position:$R[8930]={start:$R[8931]={line:116,column:105,offset:2788},end:$R[8932]={line:116,column:113,offset:2796}},type:"text",value:" に渡した値は "},$R[8933]={position:$R[8934]={start:$R[8935]={line:116,column:113,offset:2796},end:$R[8936]={line:116,column:120,offset:2803}},type:"inlineCode",value:"scope"},$R[8937]={position:$R[8938]={start:$R[8939]={line:116,column:120,offset:2803},end:$R[8940]={line:116,column:131,offset:2814}},type:"text",value:" プロバイダー内部の "},$R[8941]={position:$R[8942]={start:$R[8943]={line:116,column:131,offset:2814},end:$R[8944]={line:116,column:141,offset:2824}},type:"inlineCode",value:"molecule"},$R[8945]={position:$R[8946]={start:$R[8947]={line:116,column:141,offset:2824},end:$R[8948]={line:116,column:145,offset:2828}},type:"text",value:" から "},$R[8949]={position:$R[8950]={start:$R[8951]={line:116,column:145,offset:2828},end:$R[8952]={line:116,column:154,offset:2837}},type:"inlineCode",value:"scope()"},$R[8953]={position:$R[8954]={start:$R[8955]={line:116,column:154,offset:2837},end:$R[8956]={line:116,column:167,offset:2850}},type:"text",value:" 関数を通じて取得できる。"}],position:$R[8957]={start:$R[8958]={line:116,column:1,offset:2684},end:$R[8959]={line:116,column:167,offset:2850}},type:"paragraph"}],position:$R[8960]={end:$R[8961]={line:116,column:167,offset:2850},start:$R[8962]={line:73,column:1,offset:1777}},type:"section"},$R[8963]={children:$R[8964]=[$R[8965]={children:$R[8966]=[$R[8967]={position:$R[8968]={start:$R[8969]={line:118,column:5,offset:2856},end:$R[8970]={line:118,column:14,offset:2865}},type:"text",value:"lifecycle"}],id:"lifecycle",level:3,plain:"lifecycle",position:$R[8971]={start:$R[8972]={line:118,column:1,offset:2852},end:$R[8973]={line:118,column:14,offset:2865}},type:"heading"},$R[8974]={children:$R[8975]=[$R[8976]={position:$R[8977]={start:$R[8978]={line:120,column:1,offset:2867},end:$R[8979]={line:120,column:11,offset:2877}},type:"inlineCode",value:"molecule"},$R[8980]={position:$R[8981]={start:$R[8982]={line:120,column:11,offset:2877},end:$R[8983]={line:120,column:85,offset:2951}},type:"text",value:" はアプリケーションやスコープに応じて必要なときに実行され使用中であることを示すためマウントされ、必要でなくなったらアンマウントされ GC される。"}],position:$R[8984]={start:$R[8985]={line:120,column:1,offset:2867},end:$R[8986]={line:120,column:85,offset:2951}},type:"paragraph"},$R[8987]={children:$R[8988]=[$R[8989]={position:$R[8990]={start:$R[8991]={line:122,column:1,offset:2953},end:$R[8992]={line:122,column:7,offset:2959}},type:"text",value:"以下の図は "},$R[8993]={children:$R[8994]=[$R[8995]={position:$R[8996]={start:$R[8997]={line:122,column:8,offset:2960},end:$R[8998]={line:122,column:17,offset:2969}},type:"text",value:"公式のドキュメント"}],position:$R[8999]={start:$R[9000]={line:122,column:7,offset:2959},end:$R[9001]={line:122,column:62,offset:3014}},title:void 0,type:"link",url:"https://www.bunshi.org/concepts/lifecycle/"},$R[9002]={position:$R[9003]={start:$R[9004]={line:122,column:62,offset:3014},end:$R[9005]={line:122,column:85,offset:3037}},type:"text",value:" から引用したものである。とてもわかりやすい。"}],position:$R[9006]={start:$R[9007]={line:122,column:1,offset:2953},end:$R[9008]={line:122,column:85,offset:3037}},type:"paragraph"},$R[9009]={children:$R[9010]=[$R[9011]={alt:"bunshiのライフサイクル",position:$R[9012]={start:$R[9013]={line:124,column:1,offset:3039},end:$R[9014]={line:124,column:35,offset:3073}},title:void 0,type:"image",url:"./lifecycle.png",transformed:$R[9015]=[$R[9016]={dim:$R[9017]={h:1800,w:1390},path:"/img/lifecycle-YaSDHDzK-1390x1800.webp"},$R[9018]={dim:$R[9019]={h:1260,w:973},path:"/img/lifecycle-YaSDHDzK-973x1260.webp"},$R[9020]={dim:$R[9021]={h:882,w:681},path:"/img/lifecycle-YaSDHDzK-681x882.webp"},$R[9022]={dim:$R[9023]={h:617,w:477},path:"/img/lifecycle-YaSDHDzK-477x617.webp"},$R[9024]={dim:$R[9025]={h:432,w:334},path:"/img/lifecycle-YaSDHDzK-334x432.webp"}]}],position:$R[9026]={start:$R[9027]={line:124,column:1,offset:3039},end:$R[9028]={line:124,column:35,offset:3073}},type:"paragraph"},$R[9029]={children:$R[9030]=[$R[9031]={position:$R[9032]={start:$R[9033]={line:126,column:1,offset:3075},end:$R[9034]={line:126,column:9,offset:3083}},type:"text",value:"次の例のように "},$R[9035]={position:$R[9036]={start:$R[9037]={line:126,column:9,offset:3083},end:$R[9038]={line:126,column:18,offset:3092}},type:"inlineCode",value:"onMount"},$R[9039]={position:$R[9040]={start:$R[9041]={line:126,column:18,offset:3092},end:$R[9042]={line:126,column:40,offset:3114}},type:"text",value:" 関数とその cleanup 関数を使って "},$R[9043]={position:$R[9044]={start:$R[9045]={line:126,column:40,offset:3114},end:$R[9046]={line:126,column:50,offset:3124}},type:"inlineCode",value:"molecule"},$R[9047]={position:$R[9048]={start:$R[9049]={line:126,column:50,offset:3124},end:$R[9050]={line:126,column:77,offset:3151}},type:"text",value:" のマウントとアンマウント時の処理を行うことができる。"}],position:$R[9051]={start:$R[9052]={line:126,column:1,offset:3075},end:$R[9053]={line:126,column:77,offset:3151}},type:"paragraph"},$R[9054]={filename:"sample.ts ts",lang:"ts",position:$R[9055]={start:$R[9056]={line:128,column:1,offset:3153},end:$R[9057]={line:140,column:4,offset:3436}},type:"code",value:"import { molecule, onMount } from \"bunshi\";\nimport { atom } from \"jotai/vanilla\";\n\nexport const CountMolecule = molecule(() => {\n\tconsole.log(\"Created\");\n\tonMount(() => {\n\t\tconsole.log(\"Mounted\");\n\t\treturn () => console.log(\"Unmounted\");\n\t});\n\treturn atom(0);\n});",hast:$R[9058]={type:"root",children:$R[9059]=[$R[9060]={type:"element",tagName:"pre",properties:$R[9061]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[9062]=[$R[9063]={type:"element",tagName:"code",properties:$R[9064]={},children:$R[9065]=[$R[9066]={type:"element",tagName:"span",properties:$R[9067]={class:"line"},children:$R[9068]=[$R[9069]={type:"element",tagName:"span",properties:$R[9070]={style:"color:#4D9375"},children:$R[9071]=[$R[9072]={type:"text",value:"import"}]},$R[9073]={type:"element",tagName:"span",properties:$R[9074]={style:"color:#666666"},children:$R[9075]=[$R[9076]={type:"text",value:" {"}]},$R[9077]={type:"element",tagName:"span",properties:$R[9078]={style:"color:#BD976A"},children:$R[9079]=[$R[9080]={type:"text",value:" molecule"}]},$R[9081]={type:"element",tagName:"span",properties:$R[9082]={style:"color:#666666"},children:$R[9083]=[$R[9084]={type:"text",value:","}]},$R[9085]={type:"element",tagName:"span",properties:$R[9086]={style:"color:#BD976A"},children:$R[9087]=[$R[9088]={type:"text",value:" onMount"}]},$R[9089]={type:"element",tagName:"span",properties:$R[9090]={style:"color:#666666"},children:$R[9091]=[$R[9092]={type:"text",value:" }"}]},$R[9093]={type:"element",tagName:"span",properties:$R[9094]={style:"color:#4D9375"},children:$R[9095]=[$R[9096]={type:"text",value:" from"}]},$R[9097]={type:"element",tagName:"span",properties:$R[9098]={style:"color:#C98A7D77"},children:$R[9099]=[$R[9100]={type:"text",value:" \""}]},$R[9101]={type:"element",tagName:"span",properties:$R[9102]={style:"color:#C98A7D"},children:$R[9103]=[$R[9104]={type:"text",value:"bunshi"}]},$R[9105]={type:"element",tagName:"span",properties:$R[9106]={style:"color:#C98A7D77"},children:$R[9107]=[$R[9108]={type:"text",value:"\""}]},$R[9109]={type:"element",tagName:"span",properties:$R[9110]={style:"color:#666666"},children:$R[9111]=[$R[9112]={type:"text",value:";"}]}]},$R[9113]={type:"text",value:"\n"},$R[9114]={type:"element",tagName:"span",properties:$R[9115]={class:"line"},children:$R[9116]=[$R[9117]={type:"element",tagName:"span",properties:$R[9118]={style:"color:#4D9375"},children:$R[9119]=[$R[9120]={type:"text",value:"import"}]},$R[9121]={type:"element",tagName:"span",properties:$R[9122]={style:"color:#666666"},children:$R[9123]=[$R[9124]={type:"text",value:" {"}]},$R[9125]={type:"element",tagName:"span",properties:$R[9126]={style:"color:#BD976A"},children:$R[9127]=[$R[9128]={type:"text",value:" atom"}]},$R[9129]={type:"element",tagName:"span",properties:$R[9130]={style:"color:#666666"},children:$R[9131]=[$R[9132]={type:"text",value:" }"}]},$R[9133]={type:"element",tagName:"span",properties:$R[9134]={style:"color:#4D9375"},children:$R[9135]=[$R[9136]={type:"text",value:" from"}]},$R[9137]={type:"element",tagName:"span",properties:$R[9138]={style:"color:#C98A7D77"},children:$R[9139]=[$R[9140]={type:"text",value:" \""}]},$R[9141]={type:"element",tagName:"span",properties:$R[9142]={style:"color:#C98A7D"},children:$R[9143]=[$R[9144]={type:"text",value:"jotai/vanilla"}]},$R[9145]={type:"element",tagName:"span",properties:$R[9146]={style:"color:#C98A7D77"},children:$R[9147]=[$R[9148]={type:"text",value:"\""}]},$R[9149]={type:"element",tagName:"span",properties:$R[9150]={style:"color:#666666"},children:$R[9151]=[$R[9152]={type:"text",value:";"}]}]},$R[9153]={type:"text",value:"\n"},$R[9154]={type:"element",tagName:"span",properties:$R[9155]={class:"line"},children:$R[9156]=[]},$R[9157]={type:"text",value:"\n"},$R[9158]={type:"element",tagName:"span",properties:$R[9159]={class:"line"},children:$R[9160]=[$R[9161]={type:"element",tagName:"span",properties:$R[9162]={style:"color:#4D9375"},children:$R[9163]=[$R[9164]={type:"text",value:"export"}]},$R[9165]={type:"element",tagName:"span",properties:$R[9166]={style:"color:#CB7676"},children:$R[9167]=[$R[9168]={type:"text",value:" const "}]},$R[9169]={type:"element",tagName:"span",properties:$R[9170]={style:"color:#BD976A"},children:$R[9171]=[$R[9172]={type:"text",value:"CountMolecule"}]},$R[9173]={type:"element",tagName:"span",properties:$R[9174]={style:"color:#666666"},children:$R[9175]=[$R[9176]={type:"text",value:" ="}]},$R[9177]={type:"element",tagName:"span",properties:$R[9178]={style:"color:#80A665"},children:$R[9179]=[$R[9180]={type:"text",value:" molecule"}]},$R[9181]={type:"element",tagName:"span",properties:$R[9182]={style:"color:#666666"},children:$R[9183]=[$R[9184]={type:"text",value:"(()"}]},$R[9185]={type:"element",tagName:"span",properties:$R[9186]={style:"color:#666666"},children:$R[9187]=[$R[9188]={type:"text",value:" =>"}]},$R[9189]={type:"element",tagName:"span",properties:$R[9190]={style:"color:#666666"},children:$R[9191]=[$R[9192]={type:"text",value:" {"}]}]},$R[9193]={type:"text",value:"\n"},$R[9194]={type:"element",tagName:"span",properties:$R[9195]={class:"line"},children:$R[9196]=[$R[9197]={type:"element",tagName:"span",properties:$R[9198]={style:"color:#BD976A"},children:$R[9199]=[$R[9200]={type:"text",value:"\tconsole"}]},$R[9201]={type:"element",tagName:"span",properties:$R[9202]={style:"color:#666666"},children:$R[9203]=[$R[9204]={type:"text",value:"."}]},$R[9205]={type:"element",tagName:"span",properties:$R[9206]={style:"color:#80A665"},children:$R[9207]=[$R[9208]={type:"text",value:"log"}]},$R[9209]={type:"element",tagName:"span",properties:$R[9210]={style:"color:#666666"},children:$R[9211]=[$R[9212]={type:"text",value:"("}]},$R[9213]={type:"element",tagName:"span",properties:$R[9214]={style:"color:#C98A7D77"},children:$R[9215]=[$R[9216]={type:"text",value:"\""}]},$R[9217]={type:"element",tagName:"span",properties:$R[9218]={style:"color:#C98A7D"},children:$R[9219]=[$R[9220]={type:"text",value:"Created"}]},$R[9221]={type:"element",tagName:"span",properties:$R[9222]={style:"color:#C98A7D77"},children:$R[9223]=[$R[9224]={type:"text",value:"\""}]},$R[9225]={type:"element",tagName:"span",properties:$R[9226]={style:"color:#666666"},children:$R[9227]=[$R[9228]={type:"text",value:");"}]}]},$R[9229]={type:"text",value:"\n"},$R[9230]={type:"element",tagName:"span",properties:$R[9231]={class:"line"},children:$R[9232]=[$R[9233]={type:"element",tagName:"span",properties:$R[9234]={style:"color:#80A665"},children:$R[9235]=[$R[9236]={type:"text",value:"\tonMount"}]},$R[9237]={type:"element",tagName:"span",properties:$R[9238]={style:"color:#666666"},children:$R[9239]=[$R[9240]={type:"text",value:"(()"}]},$R[9241]={type:"element",tagName:"span",properties:$R[9242]={style:"color:#666666"},children:$R[9243]=[$R[9244]={type:"text",value:" =>"}]},$R[9245]={type:"element",tagName:"span",properties:$R[9246]={style:"color:#666666"},children:$R[9247]=[$R[9248]={type:"text",value:" {"}]}]},$R[9249]={type:"text",value:"\n"},$R[9250]={type:"element",tagName:"span",properties:$R[9251]={class:"line"},children:$R[9252]=[$R[9253]={type:"element",tagName:"span",properties:$R[9254]={style:"color:#BD976A"},children:$R[9255]=[$R[9256]={type:"text",value:"\t\tconsole"}]},$R[9257]={type:"element",tagName:"span",properties:$R[9258]={style:"color:#666666"},children:$R[9259]=[$R[9260]={type:"text",value:"."}]},$R[9261]={type:"element",tagName:"span",properties:$R[9262]={style:"color:#80A665"},children:$R[9263]=[$R[9264]={type:"text",value:"log"}]},$R[9265]={type:"element",tagName:"span",properties:$R[9266]={style:"color:#666666"},children:$R[9267]=[$R[9268]={type:"text",value:"("}]},$R[9269]={type:"element",tagName:"span",properties:$R[9270]={style:"color:#C98A7D77"},children:$R[9271]=[$R[9272]={type:"text",value:"\""}]},$R[9273]={type:"element",tagName:"span",properties:$R[9274]={style:"color:#C98A7D"},children:$R[9275]=[$R[9276]={type:"text",value:"Mounted"}]},$R[9277]={type:"element",tagName:"span",properties:$R[9278]={style:"color:#C98A7D77"},children:$R[9279]=[$R[9280]={type:"text",value:"\""}]},$R[9281]={type:"element",tagName:"span",properties:$R[9282]={style:"color:#666666"},children:$R[9283]=[$R[9284]={type:"text",value:");"}]}]},$R[9285]={type:"text",value:"\n"},$R[9286]={type:"element",tagName:"span",properties:$R[9287]={class:"line"},children:$R[9288]=[$R[9289]={type:"element",tagName:"span",properties:$R[9290]={style:"color:#4D9375"},children:$R[9291]=[$R[9292]={type:"text",value:"\t\treturn"}]},$R[9293]={type:"element",tagName:"span",properties:$R[9294]={style:"color:#666666"},children:$R[9295]=[$R[9296]={type:"text",value:" ()"}]},$R[9297]={type:"element",tagName:"span",properties:$R[9298]={style:"color:#666666"},children:$R[9299]=[$R[9300]={type:"text",value:" =>"}]},$R[9301]={type:"element",tagName:"span",properties:$R[9302]={style:"color:#BD976A"},children:$R[9303]=[$R[9304]={type:"text",value:" console"}]},$R[9305]={type:"element",tagName:"span",properties:$R[9306]={style:"color:#666666"},children:$R[9307]=[$R[9308]={type:"text",value:"."}]},$R[9309]={type:"element",tagName:"span",properties:$R[9310]={style:"color:#80A665"},children:$R[9311]=[$R[9312]={type:"text",value:"log"}]},$R[9313]={type:"element",tagName:"span",properties:$R[9314]={style:"color:#666666"},children:$R[9315]=[$R[9316]={type:"text",value:"("}]},$R[9317]={type:"element",tagName:"span",properties:$R[9318]={style:"color:#C98A7D77"},children:$R[9319]=[$R[9320]={type:"text",value:"\""}]},$R[9321]={type:"element",tagName:"span",properties:$R[9322]={style:"color:#C98A7D"},children:$R[9323]=[$R[9324]={type:"text",value:"Unmounted"}]},$R[9325]={type:"element",tagName:"span",properties:$R[9326]={style:"color:#C98A7D77"},children:$R[9327]=[$R[9328]={type:"text",value:"\""}]},$R[9329]={type:"element",tagName:"span",properties:$R[9330]={style:"color:#666666"},children:$R[9331]=[$R[9332]={type:"text",value:");"}]}]},$R[9333]={type:"text",value:"\n"},$R[9334]={type:"element",tagName:"span",properties:$R[9335]={class:"line"},children:$R[9336]=[$R[9337]={type:"element",tagName:"span",properties:$R[9338]={style:"color:#666666"},children:$R[9339]=[$R[9340]={type:"text",value:"\t});"}]}]},$R[9341]={type:"text",value:"\n"},$R[9342]={type:"element",tagName:"span",properties:$R[9343]={class:"line"},children:$R[9344]=[$R[9345]={type:"element",tagName:"span",properties:$R[9346]={style:"color:#4D9375"},children:$R[9347]=[$R[9348]={type:"text",value:"\treturn"}]},$R[9349]={type:"element",tagName:"span",properties:$R[9350]={style:"color:#80A665"},children:$R[9351]=[$R[9352]={type:"text",value:" atom"}]},$R[9353]={type:"element",tagName:"span",properties:$R[9354]={style:"color:#666666"},children:$R[9355]=[$R[9356]={type:"text",value:"("}]},$R[9357]={type:"element",tagName:"span",properties:$R[9358]={style:"color:#4C9A91"},children:$R[9359]=[$R[9360]={type:"text",value:"0"}]},$R[9361]={type:"element",tagName:"span",properties:$R[9362]={style:"color:#666666"},children:$R[9363]=[$R[9364]={type:"text",value:");"}]}]},$R[9365]={type:"text",value:"\n"},$R[9366]={type:"element",tagName:"span",properties:$R[9367]={class:"line"},children:$R[9368]=[$R[9369]={type:"element",tagName:"span",properties:$R[9370]={style:"color:#666666"},children:$R[9371]=[$R[9372]={type:"text",value:"});"}]}]}]}]}]}},$R[9373]={children:$R[9374]=[$R[9375]={position:$R[9376]={start:$R[9377]={line:142,column:1,offset:3438},end:$R[9378]={line:142,column:25,offset:3462}},type:"text",value:"次にライフサイクルの各ステップについて説明する。"}],position:$R[9379]={start:$R[9380]={line:142,column:1,offset:3438},end:$R[9381]={line:142,column:25,offset:3462}},type:"paragraph"},$R[9382]={children:$R[9383]=[$R[9384]={children:$R[9385]=[$R[9386]={position:$R[9387]={start:$R[9388]={line:144,column:6,offset:3469},end:$R[9389]={line:144,column:13,offset:3476}},type:"text",value:"Created"}],id:"created",level:4,plain:"Created",position:$R[9390]={start:$R[9391]={line:144,column:1,offset:3464},end:$R[9392]={line:144,column:13,offset:3476}},type:"heading"},$R[9393]={children:$R[9394]=[$R[9395]={position:$R[9396]={start:$R[9397]={line:146,column:1,offset:3478},end:$R[9398]={line:146,column:18,offset:3495}},type:"text",value:"アプリケーションが初期化された時、"},$R[9399]={position:$R[9400]={start:$R[9401]={line:146,column:18,offset:3495},end:$R[9402]={line:146,column:25,offset:3502}},type:"inlineCode",value:"scope"},$R[9403]={position:$R[9404]={start:$R[9405]={line:146,column:25,offset:3502},end:$R[9406]={line:146,column:50,offset:3527}},type:"text",value:" を登録したプロバイダーがマウントされた時などに "},$R[9407]={position:$R[9408]={start:$R[9409]={line:146,column:50,offset:3527},end:$R[9410]={line:146,column:60,offset:3537}},type:"inlineCode",value:"molecule"},$R[9411]={position:$R[9412]={start:$R[9413]={line:146,column:60,offset:3537},end:$R[9414]={line:146,column:85,offset:3562}},type:"text",value:" の値は作成され、すべての値は GC 可能になる。"}],position:$R[9415]={start:$R[9416]={line:146,column:1,offset:3478},end:$R[9417]={line:146,column:85,offset:3562}},type:"paragraph"}],position:$R[9418]={end:$R[9419]={line:146,column:85,offset:3562},start:$R[9420]={line:144,column:1,offset:3464}},type:"section"},$R[9421]={children:$R[9422]=[$R[9423]={children:$R[9424]=[$R[9425]={position:$R[9426]={start:$R[9427]={line:148,column:6,offset:3569},end:$R[9428]={line:148,column:13,offset:3576}},type:"text",value:"Mounted"}],id:"mounted",level:4,plain:"Mounted",position:$R[9429]={start:$R[9430]={line:148,column:1,offset:3564},end:$R[9431]={line:148,column:13,offset:3576}},type:"heading"},$R[9432]={children:$R[9433]=[$R[9434]={position:$R[9435]={start:$R[9436]={line:150,column:1,offset:3578},end:$R[9437]={line:150,column:11,offset:3588}},type:"inlineCode",value:"molecule"},$R[9438]={position:$R[9439]={start:$R[9440]={line:150,column:11,offset:3588},end:$R[9441]={line:150,column:34,offset:3611}},type:"text",value:" の値は実行されただけではキャッシュされない。"},$R[9442]={position:$R[9443]={start:$R[9444]={line:150,column:34,offset:3611},end:$R[9445]={line:150,column:41,offset:3618}},type:"inlineCode",value:"React"},$R[9446]={position:$R[9447]={start:$R[9448]={line:150,column:41,offset:3618},end:$R[9449]={line:150,column:44,offset:3621}},type:"text",value:" や "},$R[9450]={position:$R[9451]={start:$R[9452]={line:150,column:44,offset:3621},end:$R[9453]={line:150,column:49,offset:3626}},type:"inlineCode",value:"Vue"},$R[9454]={position:$R[9455]={start:$R[9456]={line:150,column:49,offset:3626},end:$R[9457]={line:150,column:53,offset:3630}},type:"text",value:" では "},$R[9458]={position:$R[9459]={start:$R[9460]={line:150,column:53,offset:3630},end:$R[9461]={line:150,column:66,offset:3643}},type:"inlineCode",value:"useMolecule"},$R[9462]={position:$R[9463]={start:$R[9464]={line:150,column:66,offset:3643},end:$R[9465]={line:150,column:76,offset:3653}},type:"text",value:" フックを使用して "},$R[9466]={position:$R[9467]={start:$R[9468]={line:150,column:76,offset:3653},end:$R[9469]={line:150,column:86,offset:3663}},type:"inlineCode",value:"molecule"},$R[9470]={position:$R[9471]={start:$R[9472]={line:150,column:86,offset:3663},end:$R[9473]={line:150,column:106,offset:3683}},type:"text",value:" をマウントすることでキャッシュされる。"}],position:$R[9474]={start:$R[9475]={line:150,column:1,offset:3578},end:$R[9476]={line:150,column:106,offset:3683}},type:"paragraph"}],position:$R[9477]={end:$R[9478]={line:150,column:106,offset:3683},start:$R[9479]={line:148,column:1,offset:3564}},type:"section"},$R[9480]={children:$R[9481]=[$R[9482]={children:$R[9483]=[$R[9484]={position:$R[9485]={start:$R[9486]={line:152,column:6,offset:3690},end:$R[9487]={line:152,column:15,offset:3699}},type:"text",value:"Unmounted"}],id:"unmounted",level:4,plain:"Unmounted",position:$R[9488]={start:$R[9489]={line:152,column:1,offset:3685},end:$R[9490]={line:152,column:15,offset:3699}},type:"heading"},$R[9491]={children:$R[9492]=[$R[9493]={position:$R[9494]={start:$R[9495]={line:154,column:1,offset:3701},end:$R[9496]={line:154,column:11,offset:3711}},type:"inlineCode",value:"molecule"},$R[9497]={position:$R[9498]={start:$R[9499]={line:154,column:11,offset:3711},end:$R[9500]={line:154,column:25,offset:3725}},type:"text",value:" の値が使用されなくなると、"},$R[9501]={position:$R[9502]={start:$R[9503]={line:154,column:25,offset:3725},end:$R[9504]={line:154,column:35,offset:3735}},type:"inlineCode",value:"molecule"},$R[9505]={position:$R[9506]={start:$R[9507]={line:154,column:35,offset:3735},end:$R[9508]={line:154,column:53,offset:3753}},type:"text",value:" はアンマウントされ、GC される。"},$R[9509]={position:$R[9510]={start:$R[9511]={line:154,column:53,offset:3753},end:$R[9512]={line:154,column:60,offset:3760}},type:"inlineCode",value:"React"},$R[9513]={position:$R[9514]={start:$R[9515]={line:154,column:60,offset:3760},end:$R[9516]={line:154,column:63,offset:3763}},type:"text",value:" や "},$R[9517]={position:$R[9518]={start:$R[9519]={line:154,column:63,offset:3763},end:$R[9520]={line:154,column:68,offset:3768}},type:"inlineCode",value:"Vue"},$R[9521]={position:$R[9522]={start:$R[9523]={line:154,column:68,offset:3768},end:$R[9524]={line:154,column:72,offset:3772}},type:"text",value:" では "},$R[9525]={position:$R[9526]={start:$R[9527]={line:154,column:72,offset:3772},end:$R[9528]={line:154,column:85,offset:3785}},type:"inlineCode",value:"useMolecule"},$R[9529]={position:$R[9530]={start:$R[9531]={line:154,column:85,offset:3785},end:$R[9532]={line:154,column:104,offset:3804}},type:"text",value:" フックで自動的にアンマウントされる。"}],position:$R[9533]={start:$R[9534]={line:154,column:1,offset:3701},end:$R[9535]={line:154,column:104,offset:3804}},type:"paragraph"},$R[9536]={children:$R[9537]=[$R[9538]={position:$R[9539]={start:$R[9540]={line:156,column:1,offset:3806},end:$R[9541]={line:156,column:75,offset:3880}},type:"text",value:"React Strict mode を使用している方は unmount された後に再度 mount されることがあるので、この点に注意が必要である。"},$R[9542]={position:$R[9543]={start:$R[9544]={line:156,column:75,offset:3880},end:$R[9545]={line:156,column:86,offset:3891}},type:"inlineCode",value:"useEffect"},$R[9546]={position:$R[9547]={start:$R[9548]={line:156,column:86,offset:3891},end:$R[9549]={line:156,column:122,offset:3927}},type:"text",value:" などのフックの正当性を確認するために 2 回実行されるのと同じように、"},$R[9550]={position:$R[9551]={start:$R[9552]={line:156,column:122,offset:3927},end:$R[9553]={line:156,column:132,offset:3937}},type:"inlineCode",value:"molecule"},$R[9554]={position:$R[9555]={start:$R[9556]={line:156,column:132,offset:3937},end:$R[9557]={line:156,column:153,offset:3958}},type:"text",value:" も 2 回実行されることがある。この時、"},$R[9558]={position:$R[9559]={start:$R[9560]={line:156,column:153,offset:3958},end:$R[9561]={line:156,column:180,offset:3985}},type:"inlineCode",value:"mount -> unmount -> mount"},$R[9562]={position:$R[9563]={start:$R[9564]={line:156,column:180,offset:3985},end:$R[9565]={line:156,column:191,offset:3996}},type:"text",value:" の順番で実行される。"}],position:$R[9566]={start:$R[9567]={line:156,column:1,offset:3806},end:$R[9568]={line:156,column:191,offset:3996}},type:"paragraph"}],position:$R[9569]={end:$R[9570]={line:156,column:191,offset:3996},start:$R[9571]={line:152,column:1,offset:3685}},type:"section"}],position:$R[9572]={end:$R[9573]={line:156,column:191,offset:3996},start:$R[9574]={line:118,column:1,offset:2852}},type:"section"}],position:$R[9575]={end:$R[9576]={line:156,column:191,offset:3996},start:$R[9577]={line:33,column:1,offset:982}},type:"section"},$R[9578]={children:$R[9579]=[$R[9580]={children:$R[9581]=[$R[9582]={position:$R[9583]={start:$R[9584]={line:158,column:4,offset:4001},end:$R[9585]={line:158,column:19,offset:4016}},type:"text",value:"個人的に面白いと思ったポイント"}],id:"個人的に面白いと思ったポイント",level:2,plain:"個人的に面白いと思ったポイント",position:$R[9586]={start:$R[9587]={line:158,column:1,offset:3998},end:$R[9588]={line:158,column:19,offset:4016}},type:"heading"},$R[9589]={children:$R[9590]=[$R[9591]={position:$R[9592]={start:$R[9593]={line:160,column:1,offset:4018},end:$R[9594]={line:160,column:19,offset:4036}},type:"inlineCode",value:"MoleculeInjector"},$R[9595]={position:$R[9596]={start:$R[9597]={line:160,column:19,offset:4036},end:$R[9598]={line:160,column:26,offset:4043}},type:"text",value:"(を生成する "},$R[9599]={position:$R[9600]={start:$R[9601]={line:160,column:26,offset:4043},end:$R[9602]={line:160,column:42,offset:4059}},type:"inlineCode",value:"createInjector"},$R[9603]={position:$R[9604]={start:$R[9605]={line:160,column:42,offset:4059},end:$R[9606]={line:160,column:45,offset:4062}},type:"text",value:")と "},$R[9607]={position:$R[9608]={start:$R[9609]={line:160,column:45,offset:4062},end:$R[9610]={line:160,column:64,offset:4081}},type:"inlineCode",value:"moleculeInterface"},$R[9611]={position:$R[9612]={start:$R[9613]={line:160,column:64,offset:4081},end:$R[9614]={line:160,column:67,offset:4084}},type:"text",value:" だ。"}],position:$R[9615]={start:$R[9616]={line:160,column:1,offset:4018},end:$R[9617]={line:160,column:67,offset:4084}},type:"paragraph"},$R[9618]={meta:$R[9619]={title:"moleculeInterface",open_graph:$R[9620]={title:"moleculeInterface",type:"article",url:void 0,locale:"en",description:void 0,site_name:"Bunshi"},twitter_card:$R[9621]={card:"summary_large_image",title:"moleculeInterface",description:void 0},favicon:"https://www.bunshi.org/public/favicon.ico"},oembed:void 0,position:$R[9622]={start:$R[9623]={line:162,column:1,offset:4086},end:$R[9624]={line:162,column:80,offset:4165}},src:"https://www.bunshi.org/reference/vanilla/functions/functionmoleculeinterface-1/",type:"embed"},$R[9625]={meta:$R[9626]={title:"MoleculeInjector",open_graph:$R[9627]={title:"MoleculeInjector",type:"article",url:void 0,locale:"en",description:void 0,site_name:"Bunshi"},twitter_card:$R[9628]={card:"summary_large_image",title:"MoleculeInjector",description:void 0},favicon:"https://www.bunshi.org/public/favicon.ico"},oembed:void 0,position:$R[9629]={start:$R[9630]={line:164,column:1,offset:4167},end:$R[9631]={line:164,column:82,offset:4248}},src:"https://www.bunshi.org/reference/vanilla/type-aliases/type-aliasmoleculeinjector/",type:"embed"},$R[9632]={children:$R[9633]=[$R[9634]={position:$R[9635]={start:$R[9636]={line:166,column:1,offset:4250},end:$R[9637]={line:166,column:6,offset:4255}},type:"text",value:"それぞれ "},$R[9638]={position:$R[9639]={start:$R[9640]={line:166,column:6,offset:4255},end:$R[9641]={line:166,column:14,offset:4263}},type:"inlineCode",value:"bunshi"},$R[9642]={position:$R[9643]={start:$R[9644]={line:166,column:14,offset:4263},end:$R[9645]={line:166,column:45,offset:4294}},type:"text",value:" の依存関係のグラフを構築するための DI コンテナと、他の "},$R[9646]={position:$R[9647]={start:$R[9648]={line:166,column:45,offset:4294},end:$R[9649]={line:166,column:55,offset:4304}},type:"inlineCode",value:"molecule"},$R[9650]={position:$R[9651]={start:$R[9652]={line:166,column:55,offset:4304},end:$R[9653]={line:166,column:93,offset:4342}},type:"text",value:" が依存できるための参照を提供するものだ。ドキュメントにある通り、どちらも "},$R[9654]={position:$R[9655]={start:$R[9656]={line:166,column:93,offset:4342},end:$R[9657]={line:166,column:103,offset:4352}},type:"inlineCode",value:"molecule"},$R[9658]={position:$R[9659]={start:$R[9660]={line:166,column:103,offset:4352},end:$R[9661]={line:166,column:106,offset:4355}},type:"text",value:" や "},$R[9662]={position:$R[9663]={start:$R[9664]={line:166,column:106,offset:4355},end:$R[9665]={line:166,column:119,offset:4368}},type:"inlineCode",value:"useMolecule"},$R[9666]={position:$R[9667]={start:$R[9668]={line:166,column:119,offset:4368},end:$R[9669]={line:166,column:168,offset:4417}},type:"text",value:" の裏で使用されておりユーザーがこれらを直接使用するのはテストコードを書く場合やライブラリとして "},$R[9670]={position:$R[9671]={start:$R[9672]={line:166,column:168,offset:4417},end:$R[9673]={line:166,column:178,offset:4427}},type:"inlineCode",value:"molecule"},$R[9674]={position:$R[9675]={start:$R[9676]={line:166,column:178,offset:4427},end:$R[9677]={line:166,column:194,offset:4443}},type:"text",value:" を提供する場合などに限られる。"}],position:$R[9678]={start:$R[9679]={line:166,column:1,offset:4250},end:$R[9680]={line:166,column:194,offset:4443}},type:"paragraph"},$R[9681]={children:$R[9682]=[$R[9683]={position:$R[9684]={start:$R[9685]={line:168,column:1,offset:4445},end:$R[9686]={line:168,column:43,offset:4487}},type:"text",value:"私がこれらの機能を面白いと感じたのは、今まで TS の DI コンテナと言われると、"},$R[9687]={children:$R[9688]=[$R[9689]={position:$R[9690]={start:$R[9691]={line:168,column:44,offset:4488},end:$R[9692]={line:168,column:50,offset:4494}},type:"text",value:"NestJS"}],position:$R[9693]={start:$R[9694]={line:168,column:43,offset:4487},end:$R[9695]={line:168,column:72,offset:4516}},title:void 0,type:"link",url:"https://nestjs.com/"},$R[9696]={position:$R[9697]={start:$R[9698]={line:168,column:72,offset:4516},end:$R[9699]={line:168,column:80,offset:4524}},type:"text",value:" に乗っかるか、"},$R[9700]={children:$R[9701]=[$R[9702]={position:$R[9703]={start:$R[9704]={line:168,column:81,offset:4525},end:$R[9705]={line:168,column:89,offset:4533}},type:"text",value:"TSyringe"}],position:$R[9706]={start:$R[9707]={line:168,column:80,offset:4524},end:$R[9708]={line:168,column:129,offset:4573}},title:void 0,type:"link",url:"https://github.com/microsoft/tsyringe"},$R[9709]={position:$R[9710]={start:$R[9711]={line:168,column:129,offset:4573},end:$R[9712]={line:168,column:259,offset:4703}},type:"text",value:" であった。前者はバックエンドを構築するためのフレームワークなので、そもそもフロントエンド文脈で使うことがない。また TSyringe は DI コンテナとしては良くできている。循環依存やインスタンスを使い捨てるなどができるが、デコレータを使用する必要があり "},$R[9713]={position:$R[9714]={start:$R[9715]={line:168,column:259,offset:4703},end:$R[9716]={line:168,column:277,offset:4721}},type:"inlineCode",value:"reflect-metadata"},$R[9717]={position:$R[9718]={start:$R[9719]={line:168,column:277,offset:4721},end:$R[9720]={line:168,column:286,offset:4730}},type:"text",value:" を使う制約がある"},$R[9721]={footnoteIndex:2,position:$R[9722]={start:$R[9723]={line:168,column:286,offset:4730},end:$R[9724]={line:168,column:290,offset:4734}},referenceIndex:1,type:"footnoteReference"},$R[9725]={position:$R[9726]={start:$R[9727]={line:168,column:290,offset:4734},end:$R[9728]={line:168,column:291,offset:4735}},type:"text",value:"。"}],position:$R[9729]={start:$R[9730]={line:168,column:1,offset:4445},end:$R[9731]={line:168,column:291,offset:4735}},type:"paragraph"},$R[9732]={children:$R[9733]=[$R[9734]={position:$R[9735]={start:$R[9736]={line:170,column:1,offset:4737},end:$R[9737]={line:170,column:5,offset:4741}},type:"text",value:"その点 "},$R[9738]={position:$R[9739]={start:$R[9740]={line:170,column:5,offset:4741},end:$R[9741]={line:170,column:13,offset:4749}},type:"inlineCode",value:"bunshi"},$R[9742]={position:$R[9743]={start:$R[9744]={line:170,column:13,offset:4749},end:$R[9745]={line:170,column:55,offset:4791}},type:"text",value:" はスコープで分けられていて、かつ自動で DI される仕組みをとても気に入っている。"}],position:$R[9746]={start:$R[9747]={line:170,column:1,offset:4737},end:$R[9748]={line:170,column:55,offset:4791}},type:"paragraph"}],position:$R[9749]={end:$R[9750]={line:170,column:55,offset:4791},start:$R[9751]={line:158,column:1,offset:3998}},type:"section"},$R[9752]={children:$R[9753]=[$R[9754]={children:$R[9755]=[$R[9756]={position:$R[9757]={start:$R[9758]={line:174,column:4,offset:4858},end:$R[9759]={line:174,column:12,offset:4866}},type:"text",value:"結局何が嬉しい?"}],id:"結局何が嬉しい",level:2,plain:"結局何が嬉しい?",position:$R[9760]={start:$R[9761]={line:174,column:1,offset:4855},end:$R[9762]={line:174,column:12,offset:4866}},type:"heading"},$R[9763]={children:$R[9764]=[$R[9765]={position:$R[9766]={start:$R[9767]={line:176,column:1,offset:4868},end:$R[9768]={line:176,column:9,offset:4876}},type:"inlineCode",value:"bunshi"},$R[9769]={position:$R[9770]={start:$R[9771]={line:176,column:9,offset:4876},end:$R[9772]={line:176,column:71,offset:4938}},type:"text",value:" を使うことで、ステートのリフトアップやプッシュダウンを容易に実現できる。以下の 2 つの例を見れば一目瞭然であると言える。"}],position:$R[9773]={start:$R[9774]={line:176,column:1,offset:4868},end:$R[9775]={line:176,column:71,offset:4938}},type:"paragraph"},$R[9776]={filename:"sample.tsx tsx",lang:"tsx",position:$R[9777]={start:$R[9778]={line:178,column:1,offset:4940},end:$R[9779]={line:223,column:4,offset:5998}},type:"code",value:"import { atom, useAtom } from \"jotai\";\n\nfunction createAtom(userId: string) {\n\treturn atom(userId === \"bob@example.com\" ? 0 : 1);\n}\n\nconst CountAtomContext = React.createContext(createAtom(\"bob@example.com\"));\nconst useCountAtom = () => useContext(CountAtomContext);\nfunction CountAtomScopeProvider({ children, userId }) {\n\t// Create a new atom for every user Id\n\tconst countAtom = useMemo(() => createAtom(userId), [userId]);\n\treturn (\n\t\t\x3CCountAtomContext.Provider value={countAtom}>\n\t\t\t{children}\n\t\t\x3C/CountAtomContext.Provider>\n\t);\n}\n\nfunction Counter() {\n\tconst countAtom = useCountAtom();\n\tconst [count, setCount] = useAtom(countAtom);\n\treturn (\n\t\t\x3Cdiv>\n\t\t\tcount:\n\t\t\t{\" \"}\n\t\t\t{count}\n\t\t\t{\" \"}\n\t\t\t\x3Cbutton onClick={() => setCount(c => c + 1)}>+1\x3C/button>\n\t\t\x3C/div>\n\t);\n}\n\nexport function App() {\n\treturn (\n\t\t\x3CCountAtomScopeProvider userId=\"bob@example.com\">\n\t\t\t\x3CCounter />\n\t\t\t\x3CCounter />\n\t\t\t\x3CCountAtomScopeProvider userId=\"tom@example.com\">\n\t\t\t\t\x3CCounter />\n\t\t\t\t\x3CCounter />\n\t\t\t\x3C/CountAtomScopeProvider>\n\t\t\x3C/CountAtomScopeProvider>\n\t);\n}",hast:$R[9780]={type:"root",children:$R[9781]=[$R[9782]={type:"element",tagName:"pre",properties:$R[9783]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[9784]=[$R[9785]={type:"element",tagName:"code",properties:$R[9786]={},children:$R[9787]=[$R[9788]={type:"element",tagName:"span",properties:$R[9789]={class:"line"},children:$R[9790]=[$R[9791]={type:"element",tagName:"span",properties:$R[9792]={style:"color:#4D9375"},children:$R[9793]=[$R[9794]={type:"text",value:"import"}]},$R[9795]={type:"element",tagName:"span",properties:$R[9796]={style:"color:#666666"},children:$R[9797]=[$R[9798]={type:"text",value:" {"}]},$R[9799]={type:"element",tagName:"span",properties:$R[9800]={style:"color:#BD976A"},children:$R[9801]=[$R[9802]={type:"text",value:" atom"}]},$R[9803]={type:"element",tagName:"span",properties:$R[9804]={style:"color:#666666"},children:$R[9805]=[$R[9806]={type:"text",value:","}]},$R[9807]={type:"element",tagName:"span",properties:$R[9808]={style:"color:#BD976A"},children:$R[9809]=[$R[9810]={type:"text",value:" useAtom"}]},$R[9811]={type:"element",tagName:"span",properties:$R[9812]={style:"color:#666666"},children:$R[9813]=[$R[9814]={type:"text",value:" }"}]},$R[9815]={type:"element",tagName:"span",properties:$R[9816]={style:"color:#4D9375"},children:$R[9817]=[$R[9818]={type:"text",value:" from"}]},$R[9819]={type:"element",tagName:"span",properties:$R[9820]={style:"color:#C98A7D77"},children:$R[9821]=[$R[9822]={type:"text",value:" \""}]},$R[9823]={type:"element",tagName:"span",properties:$R[9824]={style:"color:#C98A7D"},children:$R[9825]=[$R[9826]={type:"text",value:"jotai"}]},$R[9827]={type:"element",tagName:"span",properties:$R[9828]={style:"color:#C98A7D77"},children:$R[9829]=[$R[9830]={type:"text",value:"\""}]},$R[9831]={type:"element",tagName:"span",properties:$R[9832]={style:"color:#666666"},children:$R[9833]=[$R[9834]={type:"text",value:";"}]}]},$R[9835]={type:"text",value:"\n"},$R[9836]={type:"element",tagName:"span",properties:$R[9837]={class:"line"},children:$R[9838]=[]},$R[9839]={type:"text",value:"\n"},$R[9840]={type:"element",tagName:"span",properties:$R[9841]={class:"line"},children:$R[9842]=[$R[9843]={type:"element",tagName:"span",properties:$R[9844]={style:"color:#CB7676"},children:$R[9845]=[$R[9846]={type:"text",value:"function"}]},$R[9847]={type:"element",tagName:"span",properties:$R[9848]={style:"color:#80A665"},children:$R[9849]=[$R[9850]={type:"text",value:" createAtom"}]},$R[9851]={type:"element",tagName:"span",properties:$R[9852]={style:"color:#666666"},children:$R[9853]=[$R[9854]={type:"text",value:"("}]},$R[9855]={type:"element",tagName:"span",properties:$R[9856]={style:"color:#BD976A"},children:$R[9857]=[$R[9858]={type:"text",value:"userId"}]},$R[9859]={type:"element",tagName:"span",properties:$R[9860]={style:"color:#666666"},children:$R[9861]=[$R[9862]={type:"text",value:": "}]},$R[9863]={type:"element",tagName:"span",properties:$R[9864]={style:"color:#5DA994"},children:$R[9865]=[$R[9866]={type:"text",value:"string"}]},$R[9867]={type:"element",tagName:"span",properties:$R[9868]={style:"color:#666666"},children:$R[9869]=[$R[9870]={type:"text",value:")"}]},$R[9871]={type:"element",tagName:"span",properties:$R[9872]={style:"color:#666666"},children:$R[9873]=[$R[9874]={type:"text",value:" {"}]}]},$R[9875]={type:"text",value:"\n"},$R[9876]={type:"element",tagName:"span",properties:$R[9877]={class:"line"},children:$R[9878]=[$R[9879]={type:"element",tagName:"span",properties:$R[9880]={style:"color:#4D9375"},children:$R[9881]=[$R[9882]={type:"text",value:"\treturn"}]},$R[9883]={type:"element",tagName:"span",properties:$R[9884]={style:"color:#80A665"},children:$R[9885]=[$R[9886]={type:"text",value:" atom"}]},$R[9887]={type:"element",tagName:"span",properties:$R[9888]={style:"color:#666666"},children:$R[9889]=[$R[9890]={type:"text",value:"("}]},$R[9891]={type:"element",tagName:"span",properties:$R[9892]={style:"color:#BD976A"},children:$R[9893]=[$R[9894]={type:"text",value:"userId"}]},$R[9895]={type:"element",tagName:"span",properties:$R[9896]={style:"color:#CB7676"},children:$R[9897]=[$R[9898]={type:"text",value:" ==="}]},$R[9899]={type:"element",tagName:"span",properties:$R[9900]={style:"color:#C98A7D77"},children:$R[9901]=[$R[9902]={type:"text",value:" \""}]},$R[9903]={type:"element",tagName:"span",properties:$R[9904]={style:"color:#C98A7D"},children:$R[9905]=[$R[9906]={type:"text",value:"bob@example.com"}]},$R[9907]={type:"element",tagName:"span",properties:$R[9908]={style:"color:#C98A7D77"},children:$R[9909]=[$R[9910]={type:"text",value:"\""}]},$R[9911]={type:"element",tagName:"span",properties:$R[9912]={style:"color:#CB7676"},children:$R[9913]=[$R[9914]={type:"text",value:" ?"}]},$R[9915]={type:"element",tagName:"span",properties:$R[9916]={style:"color:#4C9A91"},children:$R[9917]=[$R[9918]={type:"text",value:" 0"}]},$R[9919]={type:"element",tagName:"span",properties:$R[9920]={style:"color:#CB7676"},children:$R[9921]=[$R[9922]={type:"text",value:" :"}]},$R[9923]={type:"element",tagName:"span",properties:$R[9924]={style:"color:#4C9A91"},children:$R[9925]=[$R[9926]={type:"text",value:" 1"}]},$R[9927]={type:"element",tagName:"span",properties:$R[9928]={style:"color:#666666"},children:$R[9929]=[$R[9930]={type:"text",value:");"}]}]},$R[9931]={type:"text",value:"\n"},$R[9932]={type:"element",tagName:"span",properties:$R[9933]={class:"line"},children:$R[9934]=[$R[9935]={type:"element",tagName:"span",properties:$R[9936]={style:"color:#666666"},children:$R[9937]=[$R[9938]={type:"text",value:"}"}]}]},$R[9939]={type:"text",value:"\n"},$R[9940]={type:"element",tagName:"span",properties:$R[9941]={class:"line"},children:$R[9942]=[]},$R[9943]={type:"text",value:"\n"},$R[9944]={type:"element",tagName:"span",properties:$R[9945]={class:"line"},children:$R[9946]=[$R[9947]={type:"element",tagName:"span",properties:$R[9948]={style:"color:#CB7676"},children:$R[9949]=[$R[9950]={type:"text",value:"const"}]},$R[9951]={type:"element",tagName:"span",properties:$R[9952]={style:"color:#BD976A"},children:$R[9953]=[$R[9954]={type:"text",value:" CountAtomContext"}]},$R[9955]={type:"element",tagName:"span",properties:$R[9956]={style:"color:#666666"},children:$R[9957]=[$R[9958]={type:"text",value:" ="}]},$R[9959]={type:"element",tagName:"span",properties:$R[9960]={style:"color:#BD976A"},children:$R[9961]=[$R[9962]={type:"text",value:" React"}]},$R[9963]={type:"element",tagName:"span",properties:$R[9964]={style:"color:#666666"},children:$R[9965]=[$R[9966]={type:"text",value:"."}]},$R[9967]={type:"element",tagName:"span",properties:$R[9968]={style:"color:#80A665"},children:$R[9969]=[$R[9970]={type:"text",value:"createContext"}]},$R[9971]={type:"element",tagName:"span",properties:$R[9972]={style:"color:#666666"},children:$R[9973]=[$R[9974]={type:"text",value:"("}]},$R[9975]={type:"element",tagName:"span",properties:$R[9976]={style:"color:#80A665"},children:$R[9977]=[$R[9978]={type:"text",value:"createAtom"}]},$R[9979]={type:"element",tagName:"span",properties:$R[9980]={style:"color:#666666"},children:$R[9981]=[$R[9982]={type:"text",value:"("}]},$R[9983]={type:"element",tagName:"span",properties:$R[9984]={style:"color:#C98A7D77"},children:$R[9985]=[$R[9986]={type:"text",value:"\""}]},$R[9987]={type:"element",tagName:"span",properties:$R[9988]={style:"color:#C98A7D"},children:$R[9989]=[$R[9990]={type:"text",value:"bob@example.com"}]},$R[9991]={type:"element",tagName:"span",properties:$R[9992]={style:"color:#C98A7D77"},children:$R[9993]=[$R[9994]={type:"text",value:"\""}]},$R[9995]={type:"element",tagName:"span",properties:$R[9996]={style:"color:#666666"},children:$R[9997]=[$R[9998]={type:"text",value:"));"}]}]},$R[9999]={type:"text",value:"\n"},$R[10000]={type:"element",tagName:"span",properties:$R[10001]={class:"line"},children:$R[10002]=[$R[10003]={type:"element",tagName:"span",properties:$R[10004]={style:"color:#CB7676"},children:$R[10005]=[$R[10006]={type:"text",value:"const"}]},$R[10007]={type:"element",tagName:"span",properties:$R[10008]={style:"color:#80A665"},children:$R[10009]=[$R[10010]={type:"text",value:" useCountAtom"}]},$R[10011]={type:"element",tagName:"span",properties:$R[10012]={style:"color:#666666"},children:$R[10013]=[$R[10014]={type:"text",value:" ="}]},$R[10015]={type:"element",tagName:"span",properties:$R[10016]={style:"color:#666666"},children:$R[10017]=[$R[10018]={type:"text",value:" ()"}]},$R[10019]={type:"element",tagName:"span",properties:$R[10020]={style:"color:#666666"},children:$R[10021]=[$R[10022]={type:"text",value:" =>"}]},$R[10023]={type:"element",tagName:"span",properties:$R[10024]={style:"color:#80A665"},children:$R[10025]=[$R[10026]={type:"text",value:" useContext"}]},$R[10027]={type:"element",tagName:"span",properties:$R[10028]={style:"color:#666666"},children:$R[10029]=[$R[10030]={type:"text",value:"("}]},$R[10031]={type:"element",tagName:"span",properties:$R[10032]={style:"color:#BD976A"},children:$R[10033]=[$R[10034]={type:"text",value:"CountAtomContext"}]},$R[10035]={type:"element",tagName:"span",properties:$R[10036]={style:"color:#666666"},children:$R[10037]=[$R[10038]={type:"text",value:");"}]}]},$R[10039]={type:"text",value:"\n"},$R[10040]={type:"element",tagName:"span",properties:$R[10041]={class:"line"},children:$R[10042]=[$R[10043]={type:"element",tagName:"span",properties:$R[10044]={style:"color:#CB7676"},children:$R[10045]=[$R[10046]={type:"text",value:"function"}]},$R[10047]={type:"element",tagName:"span",properties:$R[10048]={style:"color:#80A665"},children:$R[10049]=[$R[10050]={type:"text",value:" CountAtomScopeProvider"}]},$R[10051]={type:"element",tagName:"span",properties:$R[10052]={style:"color:#666666"},children:$R[10053]=[$R[10054]={type:"text",value:"({"}]},$R[10055]={type:"element",tagName:"span",properties:$R[10056]={style:"color:#BD976A"},children:$R[10057]=[$R[10058]={type:"text",value:" children"}]},$R[10059]={type:"element",tagName:"span",properties:$R[10060]={style:"color:#666666"},children:$R[10061]=[$R[10062]={type:"text",value:","}]},$R[10063]={type:"element",tagName:"span",properties:$R[10064]={style:"color:#BD976A"},children:$R[10065]=[$R[10066]={type:"text",value:" userId"}]},$R[10067]={type:"element",tagName:"span",properties:$R[10068]={style:"color:#666666"},children:$R[10069]=[$R[10070]={type:"text",value:" })"}]},$R[10071]={type:"element",tagName:"span",properties:$R[10072]={style:"color:#666666"},children:$R[10073]=[$R[10074]={type:"text",value:" {"}]}]},$R[10075]={type:"text",value:"\n"},$R[10076]={type:"element",tagName:"span",properties:$R[10077]={class:"line"},children:$R[10078]=[$R[10079]={type:"element",tagName:"span",properties:$R[10080]={style:"color:#758575DD"},children:$R[10081]=[$R[10082]={type:"text",value:"\t// Create a new atom for every user Id"}]}]},$R[10083]={type:"text",value:"\n"},$R[10084]={type:"element",tagName:"span",properties:$R[10085]={class:"line"},children:$R[10086]=[$R[10087]={type:"element",tagName:"span",properties:$R[10088]={style:"color:#CB7676"},children:$R[10089]=[$R[10090]={type:"text",value:"\tconst"}]},$R[10091]={type:"element",tagName:"span",properties:$R[10092]={style:"color:#BD976A"},children:$R[10093]=[$R[10094]={type:"text",value:" countAtom"}]},$R[10095]={type:"element",tagName:"span",properties:$R[10096]={style:"color:#666666"},children:$R[10097]=[$R[10098]={type:"text",value:" ="}]},$R[10099]={type:"element",tagName:"span",properties:$R[10100]={style:"color:#80A665"},children:$R[10101]=[$R[10102]={type:"text",value:" useMemo"}]},$R[10103]={type:"element",tagName:"span",properties:$R[10104]={style:"color:#666666"},children:$R[10105]=[$R[10106]={type:"text",value:"(()"}]},$R[10107]={type:"element",tagName:"span",properties:$R[10108]={style:"color:#666666"},children:$R[10109]=[$R[10110]={type:"text",value:" =>"}]},$R[10111]={type:"element",tagName:"span",properties:$R[10112]={style:"color:#80A665"},children:$R[10113]=[$R[10114]={type:"text",value:" createAtom"}]},$R[10115]={type:"element",tagName:"span",properties:$R[10116]={style:"color:#666666"},children:$R[10117]=[$R[10118]={type:"text",value:"("}]},$R[10119]={type:"element",tagName:"span",properties:$R[10120]={style:"color:#BD976A"},children:$R[10121]=[$R[10122]={type:"text",value:"userId"}]},$R[10123]={type:"element",tagName:"span",properties:$R[10124]={style:"color:#666666"},children:$R[10125]=[$R[10126]={type:"text",value:"),"}]},$R[10127]={type:"element",tagName:"span",properties:$R[10128]={style:"color:#666666"},children:$R[10129]=[$R[10130]={type:"text",value:" ["}]},$R[10131]={type:"element",tagName:"span",properties:$R[10132]={style:"color:#BD976A"},children:$R[10133]=[$R[10134]={type:"text",value:"userId"}]},$R[10135]={type:"element",tagName:"span",properties:$R[10136]={style:"color:#666666"},children:$R[10137]=[$R[10138]={type:"text",value:"]);"}]}]},$R[10139]={type:"text",value:"\n"},$R[10140]={type:"element",tagName:"span",properties:$R[10141]={class:"line"},children:$R[10142]=[$R[10143]={type:"element",tagName:"span",properties:$R[10144]={style:"color:#4D9375"},children:$R[10145]=[$R[10146]={type:"text",value:"\treturn"}]},$R[10147]={type:"element",tagName:"span",properties:$R[10148]={style:"color:#666666"},children:$R[10149]=[$R[10150]={type:"text",value:" ("}]}]},$R[10151]={type:"text",value:"\n"},$R[10152]={type:"element",tagName:"span",properties:$R[10153]={class:"line"},children:$R[10154]=[$R[10155]={type:"element",tagName:"span",properties:$R[10156]={style:"color:#666666"},children:$R[10157]=[$R[10158]={type:"text",value:"\t\t\x3C"}]},$R[10159]={type:"element",tagName:"span",properties:$R[10160]={style:"color:#B8A965"},children:$R[10161]=[$R[10162]={type:"text",value:"CountAtomContext.Provider"}]},$R[10163]={type:"element",tagName:"span",properties:$R[10164]={style:"color:#BD976A"},children:$R[10165]=[$R[10166]={type:"text",value:" value"}]},$R[10167]={type:"element",tagName:"span",properties:$R[10168]={style:"color:#666666"},children:$R[10169]=[$R[10170]={type:"text",value:"={"}]},$R[10171]={type:"element",tagName:"span",properties:$R[10172]={style:"color:#BD976A"},children:$R[10173]=[$R[10174]={type:"text",value:"countAtom"}]},$R[10175]={type:"element",tagName:"span",properties:$R[10176]={style:"color:#666666"},children:$R[10177]=[$R[10178]={type:"text",value:"}>"}]}]},$R[10179]={type:"text",value:"\n"},$R[10180]={type:"element",tagName:"span",properties:$R[10181]={class:"line"},children:$R[10182]=[$R[10183]={type:"element",tagName:"span",properties:$R[10184]={style:"color:#666666"},children:$R[10185]=[$R[10186]={type:"text",value:"\t\t\t{"}]},$R[10187]={type:"element",tagName:"span",properties:$R[10188]={style:"color:#BD976A"},children:$R[10189]=[$R[10190]={type:"text",value:"children"}]},$R[10191]={type:"element",tagName:"span",properties:$R[10192]={style:"color:#666666"},children:$R[10193]=[$R[10194]={type:"text",value:"}"}]}]},$R[10195]={type:"text",value:"\n"},$R[10196]={type:"element",tagName:"span",properties:$R[10197]={class:"line"},children:$R[10198]=[$R[10199]={type:"element",tagName:"span",properties:$R[10200]={style:"color:#666666"},children:$R[10201]=[$R[10202]={type:"text",value:"\t\t\x3C/"}]},$R[10203]={type:"element",tagName:"span",properties:$R[10204]={style:"color:#B8A965"},children:$R[10205]=[$R[10206]={type:"text",value:"CountAtomContext.Provider"}]},$R[10207]={type:"element",tagName:"span",properties:$R[10208]={style:"color:#666666"},children:$R[10209]=[$R[10210]={type:"text",value:">"}]}]},$R[10211]={type:"text",value:"\n"},$R[10212]={type:"element",tagName:"span",properties:$R[10213]={class:"line"},children:$R[10214]=[$R[10215]={type:"element",tagName:"span",properties:$R[10216]={style:"color:#666666"},children:$R[10217]=[$R[10218]={type:"text",value:"\t);"}]}]},$R[10219]={type:"text",value:"\n"},$R[10220]={type:"element",tagName:"span",properties:$R[10221]={class:"line"},children:$R[10222]=[$R[10223]={type:"element",tagName:"span",properties:$R[10224]={style:"color:#666666"},children:$R[10225]=[$R[10226]={type:"text",value:"}"}]}]},$R[10227]={type:"text",value:"\n"},$R[10228]={type:"element",tagName:"span",properties:$R[10229]={class:"line"},children:$R[10230]=[]},$R[10231]={type:"text",value:"\n"},$R[10232]={type:"element",tagName:"span",properties:$R[10233]={class:"line"},children:$R[10234]=[$R[10235]={type:"element",tagName:"span",properties:$R[10236]={style:"color:#CB7676"},children:$R[10237]=[$R[10238]={type:"text",value:"function"}]},$R[10239]={type:"element",tagName:"span",properties:$R[10240]={style:"color:#80A665"},children:$R[10241]=[$R[10242]={type:"text",value:" Counter"}]},$R[10243]={type:"element",tagName:"span",properties:$R[10244]={style:"color:#666666"},children:$R[10245]=[$R[10246]={type:"text",value:"()"}]},$R[10247]={type:"element",tagName:"span",properties:$R[10248]={style:"color:#666666"},children:$R[10249]=[$R[10250]={type:"text",value:" {"}]}]},$R[10251]={type:"text",value:"\n"},$R[10252]={type:"element",tagName:"span",properties:$R[10253]={class:"line"},children:$R[10254]=[$R[10255]={type:"element",tagName:"span",properties:$R[10256]={style:"color:#CB7676"},children:$R[10257]=[$R[10258]={type:"text",value:"\tconst"}]},$R[10259]={type:"element",tagName:"span",properties:$R[10260]={style:"color:#BD976A"},children:$R[10261]=[$R[10262]={type:"text",value:" countAtom"}]},$R[10263]={type:"element",tagName:"span",properties:$R[10264]={style:"color:#666666"},children:$R[10265]=[$R[10266]={type:"text",value:" ="}]},$R[10267]={type:"element",tagName:"span",properties:$R[10268]={style:"color:#80A665"},children:$R[10269]=[$R[10270]={type:"text",value:" useCountAtom"}]},$R[10271]={type:"element",tagName:"span",properties:$R[10272]={style:"color:#666666"},children:$R[10273]=[$R[10274]={type:"text",value:"();"}]}]},$R[10275]={type:"text",value:"\n"},$R[10276]={type:"element",tagName:"span",properties:$R[10277]={class:"line"},children:$R[10278]=[$R[10279]={type:"element",tagName:"span",properties:$R[10280]={style:"color:#CB7676"},children:$R[10281]=[$R[10282]={type:"text",value:"\tconst"}]},$R[10283]={type:"element",tagName:"span",properties:$R[10284]={style:"color:#666666"},children:$R[10285]=[$R[10286]={type:"text",value:" ["}]},$R[10287]={type:"element",tagName:"span",properties:$R[10288]={style:"color:#BD976A"},children:$R[10289]=[$R[10290]={type:"text",value:"count"}]},$R[10291]={type:"element",tagName:"span",properties:$R[10292]={style:"color:#666666"},children:$R[10293]=[$R[10294]={type:"text",value:","}]},$R[10295]={type:"element",tagName:"span",properties:$R[10296]={style:"color:#BD976A"},children:$R[10297]=[$R[10298]={type:"text",value:" setCount"}]},$R[10299]={type:"element",tagName:"span",properties:$R[10300]={style:"color:#666666"},children:$R[10301]=[$R[10302]={type:"text",value:"]"}]},$R[10303]={type:"element",tagName:"span",properties:$R[10304]={style:"color:#666666"},children:$R[10305]=[$R[10306]={type:"text",value:" ="}]},$R[10307]={type:"element",tagName:"span",properties:$R[10308]={style:"color:#80A665"},children:$R[10309]=[$R[10310]={type:"text",value:" useAtom"}]},$R[10311]={type:"element",tagName:"span",properties:$R[10312]={style:"color:#666666"},children:$R[10313]=[$R[10314]={type:"text",value:"("}]},$R[10315]={type:"element",tagName:"span",properties:$R[10316]={style:"color:#BD976A"},children:$R[10317]=[$R[10318]={type:"text",value:"countAtom"}]},$R[10319]={type:"element",tagName:"span",properties:$R[10320]={style:"color:#666666"},children:$R[10321]=[$R[10322]={type:"text",value:");"}]}]},$R[10323]={type:"text",value:"\n"},$R[10324]={type:"element",tagName:"span",properties:$R[10325]={class:"line"},children:$R[10326]=[$R[10327]={type:"element",tagName:"span",properties:$R[10328]={style:"color:#4D9375"},children:$R[10329]=[$R[10330]={type:"text",value:"\treturn"}]},$R[10331]={type:"element",tagName:"span",properties:$R[10332]={style:"color:#666666"},children:$R[10333]=[$R[10334]={type:"text",value:" ("}]}]},$R[10335]={type:"text",value:"\n"},$R[10336]={type:"element",tagName:"span",properties:$R[10337]={class:"line"},children:$R[10338]=[$R[10339]={type:"element",tagName:"span",properties:$R[10340]={style:"color:#666666"},children:$R[10341]=[$R[10342]={type:"text",value:"\t\t\x3C"}]},$R[10343]={type:"element",tagName:"span",properties:$R[10344]={style:"color:#4D9375"},children:$R[10345]=[$R[10346]={type:"text",value:"div"}]},$R[10347]={type:"element",tagName:"span",properties:$R[10348]={style:"color:#666666"},children:$R[10349]=[$R[10350]={type:"text",value:">"}]}]},$R[10351]={type:"text",value:"\n"},$R[10352]={type:"element",tagName:"span",properties:$R[10353]={class:"line"},children:$R[10354]=[$R[10355]={type:"element",tagName:"span",properties:$R[10356]={style:"color:#DBD7CAEE"},children:$R[10357]=[$R[10358]={type:"text",value:"\t\t\tcount:"}]}]},$R[10359]={type:"text",value:"\n"},$R[10360]={type:"element",tagName:"span",properties:$R[10361]={class:"line"},children:$R[10362]=[$R[10363]={type:"element",tagName:"span",properties:$R[10364]={style:"color:#666666"},children:$R[10365]=[$R[10366]={type:"text",value:"\t\t\t{"}]},$R[10367]={type:"element",tagName:"span",properties:$R[10368]={style:"color:#C98A7D77"},children:$R[10369]=[$R[10370]={type:"text",value:"\""}]},$R[10371]={type:"element",tagName:"span",properties:$R[10372]={style:"color:#C98A7D77"},children:$R[10373]=[$R[10374]={type:"text",value:" \""}]},$R[10375]={type:"element",tagName:"span",properties:$R[10376]={style:"color:#666666"},children:$R[10377]=[$R[10378]={type:"text",value:"}"}]}]},$R[10379]={type:"text",value:"\n"},$R[10380]={type:"element",tagName:"span",properties:$R[10381]={class:"line"},children:$R[10382]=[$R[10383]={type:"element",tagName:"span",properties:$R[10384]={style:"color:#666666"},children:$R[10385]=[$R[10386]={type:"text",value:"\t\t\t{"}]},$R[10387]={type:"element",tagName:"span",properties:$R[10388]={style:"color:#BD976A"},children:$R[10389]=[$R[10390]={type:"text",value:"count"}]},$R[10391]={type:"element",tagName:"span",properties:$R[10392]={style:"color:#666666"},children:$R[10393]=[$R[10394]={type:"text",value:"}"}]}]},$R[10395]={type:"text",value:"\n"},$R[10396]={type:"element",tagName:"span",properties:$R[10397]={class:"line"},children:$R[10398]=[$R[10399]={type:"element",tagName:"span",properties:$R[10400]={style:"color:#666666"},children:$R[10401]=[$R[10402]={type:"text",value:"\t\t\t{"}]},$R[10403]={type:"element",tagName:"span",properties:$R[10404]={style:"color:#C98A7D77"},children:$R[10405]=[$R[10406]={type:"text",value:"\""}]},$R[10407]={type:"element",tagName:"span",properties:$R[10408]={style:"color:#C98A7D77"},children:$R[10409]=[$R[10410]={type:"text",value:" \""}]},$R[10411]={type:"element",tagName:"span",properties:$R[10412]={style:"color:#666666"},children:$R[10413]=[$R[10414]={type:"text",value:"}"}]}]},$R[10415]={type:"text",value:"\n"},$R[10416]={type:"element",tagName:"span",properties:$R[10417]={class:"line"},children:$R[10418]=[$R[10419]={type:"element",tagName:"span",properties:$R[10420]={style:"color:#666666"},children:$R[10421]=[$R[10422]={type:"text",value:"\t\t\t\x3C"}]},$R[10423]={type:"element",tagName:"span",properties:$R[10424]={style:"color:#4D9375"},children:$R[10425]=[$R[10426]={type:"text",value:"button"}]},$R[10427]={type:"element",tagName:"span",properties:$R[10428]={style:"color:#BD976A"},children:$R[10429]=[$R[10430]={type:"text",value:" onClick"}]},$R[10431]={type:"element",tagName:"span",properties:$R[10432]={style:"color:#666666"},children:$R[10433]=[$R[10434]={type:"text",value:"={()"}]},$R[10435]={type:"element",tagName:"span",properties:$R[10436]={style:"color:#666666"},children:$R[10437]=[$R[10438]={type:"text",value:" =>"}]},$R[10439]={type:"element",tagName:"span",properties:$R[10440]={style:"color:#80A665"},children:$R[10441]=[$R[10442]={type:"text",value:" setCount"}]},$R[10443]={type:"element",tagName:"span",properties:$R[10444]={style:"color:#666666"},children:$R[10445]=[$R[10446]={type:"text",value:"("}]},$R[10447]={type:"element",tagName:"span",properties:$R[10448]={style:"color:#BD976A"},children:$R[10449]=[$R[10450]={type:"text",value:"c"}]},$R[10451]={type:"element",tagName:"span",properties:$R[10452]={style:"color:#666666"},children:$R[10453]=[$R[10454]={type:"text",value:" =>"}]},$R[10455]={type:"element",tagName:"span",properties:$R[10456]={style:"color:#BD976A"},children:$R[10457]=[$R[10458]={type:"text",value:" c"}]},$R[10459]={type:"element",tagName:"span",properties:$R[10460]={style:"color:#CB7676"},children:$R[10461]=[$R[10462]={type:"text",value:" +"}]},$R[10463]={type:"element",tagName:"span",properties:$R[10464]={style:"color:#4C9A91"},children:$R[10465]=[$R[10466]={type:"text",value:" 1"}]},$R[10467]={type:"element",tagName:"span",properties:$R[10468]={style:"color:#666666"},children:$R[10469]=[$R[10470]={type:"text",value:")}>"}]},$R[10471]={type:"element",tagName:"span",properties:$R[10472]={style:"color:#DBD7CAEE"},children:$R[10473]=[$R[10474]={type:"text",value:"+1"}]},$R[10475]={type:"element",tagName:"span",properties:$R[10476]={style:"color:#666666"},children:$R[10477]=[$R[10478]={type:"text",value:"\x3C/"}]},$R[10479]={type:"element",tagName:"span",properties:$R[10480]={style:"color:#4D9375"},children:$R[10481]=[$R[10482]={type:"text",value:"button"}]},$R[10483]={type:"element",tagName:"span",properties:$R[10484]={style:"color:#666666"},children:$R[10485]=[$R[10486]={type:"text",value:">"}]}]},$R[10487]={type:"text",value:"\n"},$R[10488]={type:"element",tagName:"span",properties:$R[10489]={class:"line"},children:$R[10490]=[$R[10491]={type:"element",tagName:"span",properties:$R[10492]={style:"color:#666666"},children:$R[10493]=[$R[10494]={type:"text",value:"\t\t\x3C/"}]},$R[10495]={type:"element",tagName:"span",properties:$R[10496]={style:"color:#4D9375"},children:$R[10497]=[$R[10498]={type:"text",value:"div"}]},$R[10499]={type:"element",tagName:"span",properties:$R[10500]={style:"color:#666666"},children:$R[10501]=[$R[10502]={type:"text",value:">"}]}]},$R[10503]={type:"text",value:"\n"},$R[10504]={type:"element",tagName:"span",properties:$R[10505]={class:"line"},children:$R[10506]=[$R[10507]={type:"element",tagName:"span",properties:$R[10508]={style:"color:#666666"},children:$R[10509]=[$R[10510]={type:"text",value:"\t);"}]}]},$R[10511]={type:"text",value:"\n"},$R[10512]={type:"element",tagName:"span",properties:$R[10513]={class:"line"},children:$R[10514]=[$R[10515]={type:"element",tagName:"span",properties:$R[10516]={style:"color:#666666"},children:$R[10517]=[$R[10518]={type:"text",value:"}"}]}]},$R[10519]={type:"text",value:"\n"},$R[10520]={type:"element",tagName:"span",properties:$R[10521]={class:"line"},children:$R[10522]=[]},$R[10523]={type:"text",value:"\n"},$R[10524]={type:"element",tagName:"span",properties:$R[10525]={class:"line"},children:$R[10526]=[$R[10527]={type:"element",tagName:"span",properties:$R[10528]={style:"color:#4D9375"},children:$R[10529]=[$R[10530]={type:"text",value:"export"}]},$R[10531]={type:"element",tagName:"span",properties:$R[10532]={style:"color:#CB7676"},children:$R[10533]=[$R[10534]={type:"text",value:" function"}]},$R[10535]={type:"element",tagName:"span",properties:$R[10536]={style:"color:#80A665"},children:$R[10537]=[$R[10538]={type:"text",value:" App"}]},$R[10539]={type:"element",tagName:"span",properties:$R[10540]={style:"color:#666666"},children:$R[10541]=[$R[10542]={type:"text",value:"()"}]},$R[10543]={type:"element",tagName:"span",properties:$R[10544]={style:"color:#666666"},children:$R[10545]=[$R[10546]={type:"text",value:" {"}]}]},$R[10547]={type:"text",value:"\n"},$R[10548]={type:"element",tagName:"span",properties:$R[10549]={class:"line"},children:$R[10550]=[$R[10551]={type:"element",tagName:"span",properties:$R[10552]={style:"color:#4D9375"},children:$R[10553]=[$R[10554]={type:"text",value:"\treturn"}]},$R[10555]={type:"element",tagName:"span",properties:$R[10556]={style:"color:#666666"},children:$R[10557]=[$R[10558]={type:"text",value:" ("}]}]},$R[10559]={type:"text",value:"\n"},$R[10560]={type:"element",tagName:"span",properties:$R[10561]={class:"line"},children:$R[10562]=[$R[10563]={type:"element",tagName:"span",properties:$R[10564]={style:"color:#666666"},children:$R[10565]=[$R[10566]={type:"text",value:"\t\t\x3C"}]},$R[10567]={type:"element",tagName:"span",properties:$R[10568]={style:"color:#B8A965"},children:$R[10569]=[$R[10570]={type:"text",value:"CountAtomScopeProvider"}]},$R[10571]={type:"element",tagName:"span",properties:$R[10572]={style:"color:#BD976A"},children:$R[10573]=[$R[10574]={type:"text",value:" userId"}]},$R[10575]={type:"element",tagName:"span",properties:$R[10576]={style:"color:#666666"},children:$R[10577]=[$R[10578]={type:"text",value:"="}]},$R[10579]={type:"element",tagName:"span",properties:$R[10580]={style:"color:#C98A7D77"},children:$R[10581]=[$R[10582]={type:"text",value:"\""}]},$R[10583]={type:"element",tagName:"span",properties:$R[10584]={style:"color:#C98A7D"},children:$R[10585]=[$R[10586]={type:"text",value:"bob@example.com"}]},$R[10587]={type:"element",tagName:"span",properties:$R[10588]={style:"color:#C98A7D77"},children:$R[10589]=[$R[10590]={type:"text",value:"\""}]},$R[10591]={type:"element",tagName:"span",properties:$R[10592]={style:"color:#666666"},children:$R[10593]=[$R[10594]={type:"text",value:">"}]}]},$R[10595]={type:"text",value:"\n"},$R[10596]={type:"element",tagName:"span",properties:$R[10597]={class:"line"},children:$R[10598]=[$R[10599]={type:"element",tagName:"span",properties:$R[10600]={style:"color:#666666"},children:$R[10601]=[$R[10602]={type:"text",value:"\t\t\t\x3C"}]},$R[10603]={type:"element",tagName:"span",properties:$R[10604]={style:"color:#B8A965"},children:$R[10605]=[$R[10606]={type:"text",value:"Counter"}]},$R[10607]={type:"element",tagName:"span",properties:$R[10608]={style:"color:#666666"},children:$R[10609]=[$R[10610]={type:"text",value:" />"}]}]},$R[10611]={type:"text",value:"\n"},$R[10612]={type:"element",tagName:"span",properties:$R[10613]={class:"line"},children:$R[10614]=[$R[10615]={type:"element",tagName:"span",properties:$R[10616]={style:"color:#666666"},children:$R[10617]=[$R[10618]={type:"text",value:"\t\t\t\x3C"}]},$R[10619]={type:"element",tagName:"span",properties:$R[10620]={style:"color:#B8A965"},children:$R[10621]=[$R[10622]={type:"text",value:"Counter"}]},$R[10623]={type:"element",tagName:"span",properties:$R[10624]={style:"color:#666666"},children:$R[10625]=[$R[10626]={type:"text",value:" />"}]}]},$R[10627]={type:"text",value:"\n"},$R[10628]={type:"element",tagName:"span",properties:$R[10629]={class:"line"},children:$R[10630]=[$R[10631]={type:"element",tagName:"span",properties:$R[10632]={style:"color:#666666"},children:$R[10633]=[$R[10634]={type:"text",value:"\t\t\t\x3C"}]},$R[10635]={type:"element",tagName:"span",properties:$R[10636]={style:"color:#B8A965"},children:$R[10637]=[$R[10638]={type:"text",value:"CountAtomScopeProvider"}]},$R[10639]={type:"element",tagName:"span",properties:$R[10640]={style:"color:#BD976A"},children:$R[10641]=[$R[10642]={type:"text",value:" userId"}]},$R[10643]={type:"element",tagName:"span",properties:$R[10644]={style:"color:#666666"},children:$R[10645]=[$R[10646]={type:"text",value:"="}]},$R[10647]={type:"element",tagName:"span",properties:$R[10648]={style:"color:#C98A7D77"},children:$R[10649]=[$R[10650]={type:"text",value:"\""}]},$R[10651]={type:"element",tagName:"span",properties:$R[10652]={style:"color:#C98A7D"},children:$R[10653]=[$R[10654]={type:"text",value:"tom@example.com"}]},$R[10655]={type:"element",tagName:"span",properties:$R[10656]={style:"color:#C98A7D77"},children:$R[10657]=[$R[10658]={type:"text",value:"\""}]},$R[10659]={type:"element",tagName:"span",properties:$R[10660]={style:"color:#666666"},children:$R[10661]=[$R[10662]={type:"text",value:">"}]}]},$R[10663]={type:"text",value:"\n"},$R[10664]={type:"element",tagName:"span",properties:$R[10665]={class:"line"},children:$R[10666]=[$R[10667]={type:"element",tagName:"span",properties:$R[10668]={style:"color:#666666"},children:$R[10669]=[$R[10670]={type:"text",value:"\t\t\t\t\x3C"}]},$R[10671]={type:"element",tagName:"span",properties:$R[10672]={style:"color:#B8A965"},children:$R[10673]=[$R[10674]={type:"text",value:"Counter"}]},$R[10675]={type:"element",tagName:"span",properties:$R[10676]={style:"color:#666666"},children:$R[10677]=[$R[10678]={type:"text",value:" />"}]}]},$R[10679]={type:"text",value:"\n"},$R[10680]={type:"element",tagName:"span",properties:$R[10681]={class:"line"},children:$R[10682]=[$R[10683]={type:"element",tagName:"span",properties:$R[10684]={style:"color:#666666"},children:$R[10685]=[$R[10686]={type:"text",value:"\t\t\t\t\x3C"}]},$R[10687]={type:"element",tagName:"span",properties:$R[10688]={style:"color:#B8A965"},children:$R[10689]=[$R[10690]={type:"text",value:"Counter"}]},$R[10691]={type:"element",tagName:"span",properties:$R[10692]={style:"color:#666666"},children:$R[10693]=[$R[10694]={type:"text",value:" />"}]}]},$R[10695]={type:"text",value:"\n"},$R[10696]={type:"element",tagName:"span",properties:$R[10697]={class:"line"},children:$R[10698]=[$R[10699]={type:"element",tagName:"span",properties:$R[10700]={style:"color:#666666"},children:$R[10701]=[$R[10702]={type:"text",value:"\t\t\t\x3C/"}]},$R[10703]={type:"element",tagName:"span",properties:$R[10704]={style:"color:#B8A965"},children:$R[10705]=[$R[10706]={type:"text",value:"CountAtomScopeProvider"}]},$R[10707]={type:"element",tagName:"span",properties:$R[10708]={style:"color:#666666"},children:$R[10709]=[$R[10710]={type:"text",value:">"}]}]},$R[10711]={type:"text",value:"\n"},$R[10712]={type:"element",tagName:"span",properties:$R[10713]={class:"line"},children:$R[10714]=[$R[10715]={type:"element",tagName:"span",properties:$R[10716]={style:"color:#666666"},children:$R[10717]=[$R[10718]={type:"text",value:"\t\t\x3C/"}]},$R[10719]={type:"element",tagName:"span",properties:$R[10720]={style:"color:#B8A965"},children:$R[10721]=[$R[10722]={type:"text",value:"CountAtomScopeProvider"}]},$R[10723]={type:"element",tagName:"span",properties:$R[10724]={style:"color:#666666"},children:$R[10725]=[$R[10726]={type:"text",value:">"}]}]},$R[10727]={type:"text",value:"\n"},$R[10728]={type:"element",tagName:"span",properties:$R[10729]={class:"line"},children:$R[10730]=[$R[10731]={type:"element",tagName:"span",properties:$R[10732]={style:"color:#666666"},children:$R[10733]=[$R[10734]={type:"text",value:"\t);"}]}]},$R[10735]={type:"text",value:"\n"},$R[10736]={type:"element",tagName:"span",properties:$R[10737]={class:"line"},children:$R[10738]=[$R[10739]={type:"element",tagName:"span",properties:$R[10740]={style:"color:#666666"},children:$R[10741]=[$R[10742]={type:"text",value:"}"}]}]}]}]}]}},$R[10743]={children:$R[10744]=[$R[10745]={position:$R[10746]={start:$R[10747]={line:225,column:1,offset:6000},end:$R[10748]={line:225,column:7,offset:6006}},type:"text",value:"上記の例は "},$R[10749]={position:$R[10750]={start:$R[10751]={line:225,column:7,offset:6006},end:$R[10752]={line:225,column:14,offset:6013}},type:"inlineCode",value:"jotai"},$R[10753]={position:$R[10754]={start:$R[10755]={line:225,column:14,offset:6013},end:$R[10756]={line:225,column:23,offset:6022}},type:"text",value:" を使っているが、"},$R[10757]={position:$R[10758]={start:$R[10759]={line:225,column:23,offset:6022},end:$R[10760]={line:225,column:31,offset:6030}},type:"inlineCode",value:"bunshi"},$R[10761]={position:$R[10762]={start:$R[10763]={line:225,column:31,offset:6030},end:$R[10764]={line:225,column:51,offset:6050}},type:"text",value:" も使うと以下のように書くことができる。"}],position:$R[10765]={start:$R[10766]={line:225,column:1,offset:6000},end:$R[10767]={line:225,column:51,offset:6050}},type:"paragraph"},$R[10768]={filename:"sample.tsx tsx",lang:"tsx",position:$R[10769]={start:$R[10770]={line:227,column:1,offset:6052},end:$R[10771]={line:252,column:4,offset:6556}},type:"code",value:"import { atom, useAtom } from \"jotai\";\nimport {\n\tScopeProvider,\n\tcreateScope,\n\tmolecule,\n\tuseMolecule,\n} from \"bunshi/react\";\n\nconst UserScope = createScope(undefined);\nconst countMolecule = molecule((mol, scope) => {\n\tconst userId = scope(UserScope);\n\tconsole.log(\"Creating a new atom for\", userId);\n\treturn atom(0);\n});\n\n// ... Counter unchanged\n\nexport function App() {\n\treturn (\n\t\t\x3CScopeProvider scope={UserScope} value=\"bob@example.com\">\n\t\t\t\x3CCounter />\n\t\t\x3C/ScopeProvider>\n\t);\n}",hast:$R[10772]={type:"root",children:$R[10773]=[$R[10774]={type:"element",tagName:"pre",properties:$R[10775]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[10776]=[$R[10777]={type:"element",tagName:"code",properties:$R[10778]={},children:$R[10779]=[$R[10780]={type:"element",tagName:"span",properties:$R[10781]={class:"line"},children:$R[10782]=[$R[10783]={type:"element",tagName:"span",properties:$R[10784]={style:"color:#4D9375"},children:$R[10785]=[$R[10786]={type:"text",value:"import"}]},$R[10787]={type:"element",tagName:"span",properties:$R[10788]={style:"color:#666666"},children:$R[10789]=[$R[10790]={type:"text",value:" {"}]},$R[10791]={type:"element",tagName:"span",properties:$R[10792]={style:"color:#BD976A"},children:$R[10793]=[$R[10794]={type:"text",value:" atom"}]},$R[10795]={type:"element",tagName:"span",properties:$R[10796]={style:"color:#666666"},children:$R[10797]=[$R[10798]={type:"text",value:","}]},$R[10799]={type:"element",tagName:"span",properties:$R[10800]={style:"color:#BD976A"},children:$R[10801]=[$R[10802]={type:"text",value:" useAtom"}]},$R[10803]={type:"element",tagName:"span",properties:$R[10804]={style:"color:#666666"},children:$R[10805]=[$R[10806]={type:"text",value:" }"}]},$R[10807]={type:"element",tagName:"span",properties:$R[10808]={style:"color:#4D9375"},children:$R[10809]=[$R[10810]={type:"text",value:" from"}]},$R[10811]={type:"element",tagName:"span",properties:$R[10812]={style:"color:#C98A7D77"},children:$R[10813]=[$R[10814]={type:"text",value:" \""}]},$R[10815]={type:"element",tagName:"span",properties:$R[10816]={style:"color:#C98A7D"},children:$R[10817]=[$R[10818]={type:"text",value:"jotai"}]},$R[10819]={type:"element",tagName:"span",properties:$R[10820]={style:"color:#C98A7D77"},children:$R[10821]=[$R[10822]={type:"text",value:"\""}]},$R[10823]={type:"element",tagName:"span",properties:$R[10824]={style:"color:#666666"},children:$R[10825]=[$R[10826]={type:"text",value:";"}]}]},$R[10827]={type:"text",value:"\n"},$R[10828]={type:"element",tagName:"span",properties:$R[10829]={class:"line"},children:$R[10830]=[$R[10831]={type:"element",tagName:"span",properties:$R[10832]={style:"color:#4D9375"},children:$R[10833]=[$R[10834]={type:"text",value:"import"}]},$R[10835]={type:"element",tagName:"span",properties:$R[10836]={style:"color:#666666"},children:$R[10837]=[$R[10838]={type:"text",value:" {"}]}]},$R[10839]={type:"text",value:"\n"},$R[10840]={type:"element",tagName:"span",properties:$R[10841]={class:"line"},children:$R[10842]=[$R[10843]={type:"element",tagName:"span",properties:$R[10844]={style:"color:#BD976A"},children:$R[10845]=[$R[10846]={type:"text",value:"\tScopeProvider"}]},$R[10847]={type:"element",tagName:"span",properties:$R[10848]={style:"color:#666666"},children:$R[10849]=[$R[10850]={type:"text",value:","}]}]},$R[10851]={type:"text",value:"\n"},$R[10852]={type:"element",tagName:"span",properties:$R[10853]={class:"line"},children:$R[10854]=[$R[10855]={type:"element",tagName:"span",properties:$R[10856]={style:"color:#BD976A"},children:$R[10857]=[$R[10858]={type:"text",value:"\tcreateScope"}]},$R[10859]={type:"element",tagName:"span",properties:$R[10860]={style:"color:#666666"},children:$R[10861]=[$R[10862]={type:"text",value:","}]}]},$R[10863]={type:"text",value:"\n"},$R[10864]={type:"element",tagName:"span",properties:$R[10865]={class:"line"},children:$R[10866]=[$R[10867]={type:"element",tagName:"span",properties:$R[10868]={style:"color:#BD976A"},children:$R[10869]=[$R[10870]={type:"text",value:"\tmolecule"}]},$R[10871]={type:"element",tagName:"span",properties:$R[10872]={style:"color:#666666"},children:$R[10873]=[$R[10874]={type:"text",value:","}]}]},$R[10875]={type:"text",value:"\n"},$R[10876]={type:"element",tagName:"span",properties:$R[10877]={class:"line"},children:$R[10878]=[$R[10879]={type:"element",tagName:"span",properties:$R[10880]={style:"color:#BD976A"},children:$R[10881]=[$R[10882]={type:"text",value:"\tuseMolecule"}]},$R[10883]={type:"element",tagName:"span",properties:$R[10884]={style:"color:#666666"},children:$R[10885]=[$R[10886]={type:"text",value:","}]}]},$R[10887]={type:"text",value:"\n"},$R[10888]={type:"element",tagName:"span",properties:$R[10889]={class:"line"},children:$R[10890]=[$R[10891]={type:"element",tagName:"span",properties:$R[10892]={style:"color:#666666"},children:$R[10893]=[$R[10894]={type:"text",value:"}"}]},$R[10895]={type:"element",tagName:"span",properties:$R[10896]={style:"color:#4D9375"},children:$R[10897]=[$R[10898]={type:"text",value:" from"}]},$R[10899]={type:"element",tagName:"span",properties:$R[10900]={style:"color:#C98A7D77"},children:$R[10901]=[$R[10902]={type:"text",value:" \""}]},$R[10903]={type:"element",tagName:"span",properties:$R[10904]={style:"color:#C98A7D"},children:$R[10905]=[$R[10906]={type:"text",value:"bunshi/react"}]},$R[10907]={type:"element",tagName:"span",properties:$R[10908]={style:"color:#C98A7D77"},children:$R[10909]=[$R[10910]={type:"text",value:"\""}]},$R[10911]={type:"element",tagName:"span",properties:$R[10912]={style:"color:#666666"},children:$R[10913]=[$R[10914]={type:"text",value:";"}]}]},$R[10915]={type:"text",value:"\n"},$R[10916]={type:"element",tagName:"span",properties:$R[10917]={class:"line"},children:$R[10918]=[]},$R[10919]={type:"text",value:"\n"},$R[10920]={type:"element",tagName:"span",properties:$R[10921]={class:"line"},children:$R[10922]=[$R[10923]={type:"element",tagName:"span",properties:$R[10924]={style:"color:#CB7676"},children:$R[10925]=[$R[10926]={type:"text",value:"const"}]},$R[10927]={type:"element",tagName:"span",properties:$R[10928]={style:"color:#BD976A"},children:$R[10929]=[$R[10930]={type:"text",value:" UserScope"}]},$R[10931]={type:"element",tagName:"span",properties:$R[10932]={style:"color:#666666"},children:$R[10933]=[$R[10934]={type:"text",value:" ="}]},$R[10935]={type:"element",tagName:"span",properties:$R[10936]={style:"color:#80A665"},children:$R[10937]=[$R[10938]={type:"text",value:" createScope"}]},$R[10939]={type:"element",tagName:"span",properties:$R[10940]={style:"color:#666666"},children:$R[10941]=[$R[10942]={type:"text",value:"("}]},$R[10943]={type:"element",tagName:"span",properties:$R[10944]={style:"color:#CB7676"},children:$R[10945]=[$R[10946]={type:"text",value:"undefined"}]},$R[10947]={type:"element",tagName:"span",properties:$R[10948]={style:"color:#666666"},children:$R[10949]=[$R[10950]={type:"text",value:");"}]}]},$R[10951]={type:"text",value:"\n"},$R[10952]={type:"element",tagName:"span",properties:$R[10953]={class:"line"},children:$R[10954]=[$R[10955]={type:"element",tagName:"span",properties:$R[10956]={style:"color:#CB7676"},children:$R[10957]=[$R[10958]={type:"text",value:"const"}]},$R[10959]={type:"element",tagName:"span",properties:$R[10960]={style:"color:#BD976A"},children:$R[10961]=[$R[10962]={type:"text",value:" countMolecule"}]},$R[10963]={type:"element",tagName:"span",properties:$R[10964]={style:"color:#666666"},children:$R[10965]=[$R[10966]={type:"text",value:" ="}]},$R[10967]={type:"element",tagName:"span",properties:$R[10968]={style:"color:#80A665"},children:$R[10969]=[$R[10970]={type:"text",value:" molecule"}]},$R[10971]={type:"element",tagName:"span",properties:$R[10972]={style:"color:#666666"},children:$R[10973]=[$R[10974]={type:"text",value:"(("}]},$R[10975]={type:"element",tagName:"span",properties:$R[10976]={style:"color:#BD976A"},children:$R[10977]=[$R[10978]={type:"text",value:"mol"}]},$R[10979]={type:"element",tagName:"span",properties:$R[10980]={style:"color:#666666"},children:$R[10981]=[$R[10982]={type:"text",value:","}]},$R[10983]={type:"element",tagName:"span",properties:$R[10984]={style:"color:#BD976A"},children:$R[10985]=[$R[10986]={type:"text",value:" scope"}]},$R[10987]={type:"element",tagName:"span",properties:$R[10988]={style:"color:#666666"},children:$R[10989]=[$R[10990]={type:"text",value:")"}]},$R[10991]={type:"element",tagName:"span",properties:$R[10992]={style:"color:#666666"},children:$R[10993]=[$R[10994]={type:"text",value:" =>"}]},$R[10995]={type:"element",tagName:"span",properties:$R[10996]={style:"color:#666666"},children:$R[10997]=[$R[10998]={type:"text",value:" {"}]}]},$R[10999]={type:"text",value:"\n"},$R[11000]={type:"element",tagName:"span",properties:$R[11001]={class:"line"},children:$R[11002]=[$R[11003]={type:"element",tagName:"span",properties:$R[11004]={style:"color:#CB7676"},children:$R[11005]=[$R[11006]={type:"text",value:"\tconst"}]},$R[11007]={type:"element",tagName:"span",properties:$R[11008]={style:"color:#BD976A"},children:$R[11009]=[$R[11010]={type:"text",value:" userId"}]},$R[11011]={type:"element",tagName:"span",properties:$R[11012]={style:"color:#666666"},children:$R[11013]=[$R[11014]={type:"text",value:" ="}]},$R[11015]={type:"element",tagName:"span",properties:$R[11016]={style:"color:#80A665"},children:$R[11017]=[$R[11018]={type:"text",value:" scope"}]},$R[11019]={type:"element",tagName:"span",properties:$R[11020]={style:"color:#666666"},children:$R[11021]=[$R[11022]={type:"text",value:"("}]},$R[11023]={type:"element",tagName:"span",properties:$R[11024]={style:"color:#BD976A"},children:$R[11025]=[$R[11026]={type:"text",value:"UserScope"}]},$R[11027]={type:"element",tagName:"span",properties:$R[11028]={style:"color:#666666"},children:$R[11029]=[$R[11030]={type:"text",value:");"}]}]},$R[11031]={type:"text",value:"\n"},$R[11032]={type:"element",tagName:"span",properties:$R[11033]={class:"line"},children:$R[11034]=[$R[11035]={type:"element",tagName:"span",properties:$R[11036]={style:"color:#BD976A"},children:$R[11037]=[$R[11038]={type:"text",value:"\tconsole"}]},$R[11039]={type:"element",tagName:"span",properties:$R[11040]={style:"color:#666666"},children:$R[11041]=[$R[11042]={type:"text",value:"."}]},$R[11043]={type:"element",tagName:"span",properties:$R[11044]={style:"color:#80A665"},children:$R[11045]=[$R[11046]={type:"text",value:"log"}]},$R[11047]={type:"element",tagName:"span",properties:$R[11048]={style:"color:#666666"},children:$R[11049]=[$R[11050]={type:"text",value:"("}]},$R[11051]={type:"element",tagName:"span",properties:$R[11052]={style:"color:#C98A7D77"},children:$R[11053]=[$R[11054]={type:"text",value:"\""}]},$R[11055]={type:"element",tagName:"span",properties:$R[11056]={style:"color:#C98A7D"},children:$R[11057]=[$R[11058]={type:"text",value:"Creating a new atom for"}]},$R[11059]={type:"element",tagName:"span",properties:$R[11060]={style:"color:#C98A7D77"},children:$R[11061]=[$R[11062]={type:"text",value:"\""}]},$R[11063]={type:"element",tagName:"span",properties:$R[11064]={style:"color:#666666"},children:$R[11065]=[$R[11066]={type:"text",value:","}]},$R[11067]={type:"element",tagName:"span",properties:$R[11068]={style:"color:#BD976A"},children:$R[11069]=[$R[11070]={type:"text",value:" userId"}]},$R[11071]={type:"element",tagName:"span",properties:$R[11072]={style:"color:#666666"},children:$R[11073]=[$R[11074]={type:"text",value:");"}]}]},$R[11075]={type:"text",value:"\n"},$R[11076]={type:"element",tagName:"span",properties:$R[11077]={class:"line"},children:$R[11078]=[$R[11079]={type:"element",tagName:"span",properties:$R[11080]={style:"color:#4D9375"},children:$R[11081]=[$R[11082]={type:"text",value:"\treturn"}]},$R[11083]={type:"element",tagName:"span",properties:$R[11084]={style:"color:#80A665"},children:$R[11085]=[$R[11086]={type:"text",value:" atom"}]},$R[11087]={type:"element",tagName:"span",properties:$R[11088]={style:"color:#666666"},children:$R[11089]=[$R[11090]={type:"text",value:"("}]},$R[11091]={type:"element",tagName:"span",properties:$R[11092]={style:"color:#4C9A91"},children:$R[11093]=[$R[11094]={type:"text",value:"0"}]},$R[11095]={type:"element",tagName:"span",properties:$R[11096]={style:"color:#666666"},children:$R[11097]=[$R[11098]={type:"text",value:");"}]}]},$R[11099]={type:"text",value:"\n"},$R[11100]={type:"element",tagName:"span",properties:$R[11101]={class:"line"},children:$R[11102]=[$R[11103]={type:"element",tagName:"span",properties:$R[11104]={style:"color:#666666"},children:$R[11105]=[$R[11106]={type:"text",value:"});"}]}]},$R[11107]={type:"text",value:"\n"},$R[11108]={type:"element",tagName:"span",properties:$R[11109]={class:"line"},children:$R[11110]=[]},$R[11111]={type:"text",value:"\n"},$R[11112]={type:"element",tagName:"span",properties:$R[11113]={class:"line"},children:$R[11114]=[$R[11115]={type:"element",tagName:"span",properties:$R[11116]={style:"color:#758575DD"},children:$R[11117]=[$R[11118]={type:"text",value:"// ... Counter unchanged"}]}]},$R[11119]={type:"text",value:"\n"},$R[11120]={type:"element",tagName:"span",properties:$R[11121]={class:"line"},children:$R[11122]=[]},$R[11123]={type:"text",value:"\n"},$R[11124]={type:"element",tagName:"span",properties:$R[11125]={class:"line"},children:$R[11126]=[$R[11127]={type:"element",tagName:"span",properties:$R[11128]={style:"color:#4D9375"},children:$R[11129]=[$R[11130]={type:"text",value:"export"}]},$R[11131]={type:"element",tagName:"span",properties:$R[11132]={style:"color:#CB7676"},children:$R[11133]=[$R[11134]={type:"text",value:" function"}]},$R[11135]={type:"element",tagName:"span",properties:$R[11136]={style:"color:#80A665"},children:$R[11137]=[$R[11138]={type:"text",value:" App"}]},$R[11139]={type:"element",tagName:"span",properties:$R[11140]={style:"color:#666666"},children:$R[11141]=[$R[11142]={type:"text",value:"()"}]},$R[11143]={type:"element",tagName:"span",properties:$R[11144]={style:"color:#666666"},children:$R[11145]=[$R[11146]={type:"text",value:" {"}]}]},$R[11147]={type:"text",value:"\n"},$R[11148]={type:"element",tagName:"span",properties:$R[11149]={class:"line"},children:$R[11150]=[$R[11151]={type:"element",tagName:"span",properties:$R[11152]={style:"color:#4D9375"},children:$R[11153]=[$R[11154]={type:"text",value:"\treturn"}]},$R[11155]={type:"element",tagName:"span",properties:$R[11156]={style:"color:#666666"},children:$R[11157]=[$R[11158]={type:"text",value:" ("}]}]},$R[11159]={type:"text",value:"\n"},$R[11160]={type:"element",tagName:"span",properties:$R[11161]={class:"line"},children:$R[11162]=[$R[11163]={type:"element",tagName:"span",properties:$R[11164]={style:"color:#666666"},children:$R[11165]=[$R[11166]={type:"text",value:"\t\t\x3C"}]},$R[11167]={type:"element",tagName:"span",properties:$R[11168]={style:"color:#B8A965"},children:$R[11169]=[$R[11170]={type:"text",value:"ScopeProvider"}]},$R[11171]={type:"element",tagName:"span",properties:$R[11172]={style:"color:#BD976A"},children:$R[11173]=[$R[11174]={type:"text",value:" scope"}]},$R[11175]={type:"element",tagName:"span",properties:$R[11176]={style:"color:#666666"},children:$R[11177]=[$R[11178]={type:"text",value:"={"}]},$R[11179]={type:"element",tagName:"span",properties:$R[11180]={style:"color:#BD976A"},children:$R[11181]=[$R[11182]={type:"text",value:"UserScope"}]},$R[11183]={type:"element",tagName:"span",properties:$R[11184]={style:"color:#666666"},children:$R[11185]=[$R[11186]={type:"text",value:"}"}]},$R[11187]={type:"element",tagName:"span",properties:$R[11188]={style:"color:#BD976A"},children:$R[11189]=[$R[11190]={type:"text",value:" value"}]},$R[11191]={type:"element",tagName:"span",properties:$R[11192]={style:"color:#666666"},children:$R[11193]=[$R[11194]={type:"text",value:"="}]},$R[11195]={type:"element",tagName:"span",properties:$R[11196]={style:"color:#C98A7D77"},children:$R[11197]=[$R[11198]={type:"text",value:"\""}]},$R[11199]={type:"element",tagName:"span",properties:$R[11200]={style:"color:#C98A7D"},children:$R[11201]=[$R[11202]={type:"text",value:"bob@example.com"}]},$R[11203]={type:"element",tagName:"span",properties:$R[11204]={style:"color:#C98A7D77"},children:$R[11205]=[$R[11206]={type:"text",value:"\""}]},$R[11207]={type:"element",tagName:"span",properties:$R[11208]={style:"color:#666666"},children:$R[11209]=[$R[11210]={type:"text",value:">"}]}]},$R[11211]={type:"text",value:"\n"},$R[11212]={type:"element",tagName:"span",properties:$R[11213]={class:"line"},children:$R[11214]=[$R[11215]={type:"element",tagName:"span",properties:$R[11216]={style:"color:#666666"},children:$R[11217]=[$R[11218]={type:"text",value:"\t\t\t\x3C"}]},$R[11219]={type:"element",tagName:"span",properties:$R[11220]={style:"color:#B8A965"},children:$R[11221]=[$R[11222]={type:"text",value:"Counter"}]},$R[11223]={type:"element",tagName:"span",properties:$R[11224]={style:"color:#666666"},children:$R[11225]=[$R[11226]={type:"text",value:" />"}]}]},$R[11227]={type:"text",value:"\n"},$R[11228]={type:"element",tagName:"span",properties:$R[11229]={class:"line"},children:$R[11230]=[$R[11231]={type:"element",tagName:"span",properties:$R[11232]={style:"color:#666666"},children:$R[11233]=[$R[11234]={type:"text",value:"\t\t\x3C/"}]},$R[11235]={type:"element",tagName:"span",properties:$R[11236]={style:"color:#B8A965"},children:$R[11237]=[$R[11238]={type:"text",value:"ScopeProvider"}]},$R[11239]={type:"element",tagName:"span",properties:$R[11240]={style:"color:#666666"},children:$R[11241]=[$R[11242]={type:"text",value:">"}]}]},$R[11243]={type:"text",value:"\n"},$R[11244]={type:"element",tagName:"span",properties:$R[11245]={class:"line"},children:$R[11246]=[$R[11247]={type:"element",tagName:"span",properties:$R[11248]={style:"color:#666666"},children:$R[11249]=[$R[11250]={type:"text",value:"\t);"}]}]},$R[11251]={type:"text",value:"\n"},$R[11252]={type:"element",tagName:"span",properties:$R[11253]={class:"line"},children:$R[11254]=[$R[11255]={type:"element",tagName:"span",properties:$R[11256]={style:"color:#666666"},children:$R[11257]=[$R[11258]={type:"text",value:"}"}]}]}]}]}]}}],position:$R[11259]={end:$R[11260]={line:252,column:4,offset:6556},start:$R[11261]={line:174,column:1,offset:4855}},type:"section"},$R[11262]={children:$R[11263]=[$R[11264]={children:$R[11265]=[$R[11266]={position:$R[11267]={start:$R[11268]={line:254,column:4,offset:6561},end:$R[11269]={line:254,column:7,offset:6564}},type:"text",value:"まとめ"}],id:"まとめ",level:2,plain:"まとめ",position:$R[11270]={start:$R[11271]={line:254,column:1,offset:6558},end:$R[11272]={line:254,column:7,offset:6564}},type:"heading"},$R[11273]={children:$R[11274]=[$R[11275]={position:$R[11276]={start:$R[11277]={line:256,column:1,offset:6566},end:$R[11278]={line:256,column:5,offset:6570}},type:"text",value:"今回は "},$R[11279]={position:$R[11280]={start:$R[11281]={line:256,column:5,offset:6570},end:$R[11282]={line:256,column:13,offset:6578}},type:"inlineCode",value:"bunshi"},$R[11283]={position:$R[11284]={start:$R[11285]={line:256,column:13,offset:6578},end:$R[11286]={line:256,column:104,offset:6669}},type:"text",value:" というライブラリの基本概念からその魅力までを調べた。途中で実装の方を参照することが多々あったが、ほとんどテストされていてドキュメントも充実しているため、理解するのは難しくなかった。"}],position:$R[11287]={start:$R[11288]={line:256,column:1,offset:6566},end:$R[11289]={line:256,column:104,offset:6669}},type:"paragraph"},$R[11290]={children:$R[11291]=[$R[11292]={position:$R[11293]={start:$R[11294]={line:258,column:1,offset:6671},end:$R[11295]={line:258,column:9,offset:6679}},type:"inlineCode",value:"bunshi"},$R[11296]={position:$R[11297]={start:$R[11298]={line:258,column:9,offset:6679},end:$R[11299]={line:258,column:39,offset:6709}},type:"text",value:" を使って状態管理のベストプラクティスを追求したいと思った。"}],position:$R[11300]={start:$R[11301]={line:258,column:1,offset:6671},end:$R[11302]={line:258,column:39,offset:6709}},type:"paragraph"}],position:$R[11303]={end:$R[11304]={line:258,column:39,offset:6709},start:$R[11305]={line:254,column:1,offset:6558}},type:"section"}],footnotes:$R[11306]=[$R[11307]={children:$R[11308]=[$R[11309]={children:$R[11310]=[$R[11311]={position:$R[11312]={start:$R[11313]={line:25,column:7,offset:597},end:$R[11314]={line:25,column:14,offset:604}},type:"inlineCode",value:"React"},$R[11315]={position:$R[11316]={start:$R[11317]={line:25,column:14,offset:604},end:$R[11318]={line:25,column:17,offset:607}},type:"text",value:" と "},$R[11319]={position:$R[11320]={start:$R[11321]={line:25,column:17,offset:607},end:$R[11322]={line:25,column:22,offset:612}},type:"inlineCode",value:"Vue"},$R[11323]={position:$R[11324]={start:$R[11325]={line:25,column:22,offset:612},end:$R[11326]={line:25,column:52,offset:642}},type:"text",value:" は専用の API が用意されている。詳しくはこちらを参照。"},$R[11327]={children:$R[11328]=[$R[11329]={position:$R[11330]={start:$R[11331]={line:25,column:53,offset:643},end:$R[11332]={line:25,column:58,offset:648}},type:"text",value:"React"}],position:$R[11333]={start:$R[11334]={line:25,column:52,offset:642},end:$R[11335]={line:25,column:103,offset:693}},title:void 0,type:"link",url:"https://www.bunshi.org/integrations/react/"},$R[11336]={position:$R[11337]={start:$R[11338]={line:25,column:103,offset:693},end:$R[11339]={line:25,column:104,offset:694}},type:"text",value:"、"},$R[11340]={children:$R[11341]=[$R[11342]={position:$R[11343]={start:$R[11344]={line:25,column:105,offset:695},end:$R[11345]={line:25,column:108,offset:698}},type:"text",value:"Vue"}],position:$R[11346]={start:$R[11347]={line:25,column:104,offset:694},end:$R[11348]={line:25,column:151,offset:741}},title:void 0,type:"link",url:"https://www.bunshi.org/integrations/vue/"}],position:$R[11349]={start:$R[11350]={line:25,column:7,offset:597},end:$R[11351]={line:25,column:151,offset:741}},type:"paragraph"}],count:1,index:0,position:$R[11352]={start:$R[11353]={line:25,column:1,offset:591},end:$R[11354]={line:25,column:151,offset:741}},type:"footnoteDefinition"},$R[11355]={children:$R[11356]=[$R[11357]={children:$R[11358]=[$R[11359]={children:$R[11360]=[$R[11361]={position:$R[11362]={start:$R[11363]={line:31,column:8,offset:865},end:$R[11364]={line:31,column:20,offset:877}},type:"text",value:"Why WeakMap?"}],position:$R[11365]={start:$R[11366]={line:31,column:7,offset:864},end:$R[11367]={line:31,column:123,offset:980}},title:void 0,type:"link",url:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap#why_weakmap"}],position:$R[11368]={start:$R[11369]={line:31,column:7,offset:864},end:$R[11370]={line:31,column:123,offset:980}},type:"paragraph"}],count:1,index:1,position:$R[11371]={start:$R[11372]={line:31,column:1,offset:858},end:$R[11373]={line:31,column:123,offset:980}},type:"footnoteDefinition"},$R[11374]={children:$R[11375]=[$R[11376]={children:$R[11377]=[$R[11378]={position:$R[11379]={start:$R[11380]={line:172,column:7,offset:4799},end:$R[11381]={line:172,column:25,offset:4817}},type:"inlineCode",value:"reflect-metadata"},$R[11382]={position:$R[11383]={start:$R[11384]={line:172,column:25,offset:4817},end:$R[11385]={line:172,column:61,offset:4853}},type:"text",value:" はバンドルに含めるとサイズが大きくなるため、筆者はあまり使いたくない。"}],position:$R[11386]={start:$R[11387]={line:172,column:7,offset:4799},end:$R[11388]={line:172,column:61,offset:4853}},type:"paragraph"}],count:1,index:2,position:$R[11389]={start:$R[11390]={line:172,column:1,offset:4793},end:$R[11391]={line:172,column:61,offset:4853}},type:"footnoteDefinition"}],title:$R[11392]={children:$R[11393]=[$R[11394]={position:$R[11395]={start:$R[11396]={line:1,column:3,offset:2},end:$R[11397]={line:1,column:14,offset:13}},type:"text",value:"bunshiを理解する"}],id:"bunshiを理解する",level:1,plain:"bunshiを理解する",position:$R[11398]={start:$R[11399]={line:1,column:1,offset:0},end:$R[11400]={line:1,column:14,offset:13}},type:"heading"},toc:$R[11401]=[$R[11402]={children:$R[11403]=[],id:"はじめに",plain:"はじめに",type:"toc"},$R[11404]={children:$R[11405]=[$R[11406]={children:$R[11407]=[],id:"バンドルサイズが小さい",plain:"バンドルサイズが小さい",type:"toc"},$R[11408]={children:$R[11409]=[],id:"framework-agnosticである",plain:"framework agnosticである",type:"toc"},$R[11410]={children:$R[11411]=[],id:"パフォーマンスに配慮されている",plain:"パフォーマンスに配慮されている",type:"toc"}],id:"bunshiの特徴",plain:"bunshiの特徴",type:"toc"},$R[11412]={children:$R[11413]=[$R[11414]={children:$R[11415]=[],id:"molecule",plain:"molecule",type:"toc"},$R[11416]={children:$R[11417]=[],id:"scope",plain:"scope",type:"toc"},$R[11418]={children:$R[11419]=[$R[11420]={children:$R[11421]=[],id:"created",plain:"Created",type:"toc"},$R[11422]={children:$R[11423]=[],id:"mounted",plain:"Mounted",type:"toc"},$R[11424]={children:$R[11425]=[],id:"unmounted",plain:"Unmounted",type:"toc"}],id:"lifecycle",plain:"lifecycle",type:"toc"}],id:"bunshiの基本概念",plain:"bunshiの基本概念",type:"toc"},$R[11426]={children:$R[11427]=[],id:"個人的に面白いと思ったポイント",plain:"個人的に面白いと思ったポイント",type:"toc"},$R[11428]={children:$R[11429]=[],id:"結局何が嬉しい",plain:"結局何が嬉しい?",type:"toc"},$R[11430]={children:$R[11431]=[],id:"まとめ",plain:"まとめ",type:"toc"}],type:"article"}},$R[11432]={content:"# eslintSuppressionRules を考察してみる\n\n## はじめに\n\n先日 React Compiler が OSS になった。React のベータ版を使うことで今すぐ使うことができる。\n\n> React Compiler is a new experimental compiler that we’ve open sourced to get early feedback from the community. It still has rough edges and is not yet fully ready for production.\n>\n> React Compiler requires React 19 RC. If you are unable to upgrade to React 19, you may try a userspace implementation of the cache function as described in the Working Group. However, please note that this is not recommended and you should upgrade to React 19 when possible.\n>\n> --- https://react.dev/learn/react-compiler\n\nとある通り、まだ本番環境での使用は推奨されていない。\n\n先日公開された [React Compiler Code reading #1](https://youtu.be/PqPgr_hlVKM?si=OIgDQWxUwbV3se-A) の中で `eslintSuppressionRules` という設定を見つけた。この設定の想定されるであろう使い方について考えてみた。\n\nこの記事で参照するコードの commit は [113c8e7](https://github.com/facebook/react/tree/113c8e7f72bcf5d3bc285546da1508b45da3cf53) である。\n\n## React Compiler とは\n\n詳しくはドキュメント[^1]を読むことをおすすめする。簡潔に説明すると、React Compiler は `React.memo` や `useMemo` を始めとしたメモ化を自動で行い不要な再レンダリングを防ぐコンパイラである。\n\n現在は `babel` のプラグインとして提供されており、eslint のルールと React Compiler の実行時のエラーで React Compiler のルールに従わせている。\n\n[^1]: https://react.dev/learn/react-compiler\n\n## eslintSuppressionRules\n\n結論から言うと `eslintSuppressionRules` は、登録された ESLint ルールが無効化された場合に React Compiler が例外をスローするようにする設定である。\n\n```ts:Options.ts\nexport type PluginOptions = {\n // ...some options\n\n /**\n * By default React Compiler will skip compilation of code that suppresses the default\n * React ESLint rules, since this is a strong indication that the code may be breaking React rules\n * in some way.\n *\n * Use eslintSuppressionRules to pass a custom set of rule names: any code which suppresses the\n * provided rules will skip compilation. To disable this feature (never bailout of compilation\n * even if the default ESLint is suppressed), pass an empty array.\n */\n eslintSuppressionRules?: Array\x3Cstring> | null | undefined;\n};\n```\n\nhttps://github.com/facebook/react/blob/d77dd31a329df55a051800fc76668af8da8332b4/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Options.ts#L96-L105\n\n### 必要性\n\n`eslintSuppressionRules` はデフォルトで次の 2 つのルールが登録されている\n\n```ts:Program.ts\nconst DEFAULT_ESLINT_SUPPRESSIONS = [\n\t\"react-hooks/exhaustive-deps\",\n\t\"react-hooks/rules-of-hooks\",\n];\n```\n\nhttps://github.com/facebook/react/blob/d77dd31a329df55a051800fc76668af8da8332b4/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts#L194-L197\n\nこれらのルールが無効化された場合、React Compiler は例外をスローする。これらのルールは React の基本的なルール[^2]であり、無効化されることは React のルールに違反している可能性が高い。おさらいだが、React Compiler は React のルールに従ったコードのみを解析して最適化する。そのため `eslintSuppressionRules` は React のルールに違反しているコードを見つけ、例外をスローすることで React Compiler が正しく動作することを保証する。\n\n[^2]: https://react.dev/reference/rules/rules-of-hooks にある通り hoosk はコンポーネントのトップレベルもしくはカスタムフック内でのみ呼び出すべきであるなど。\n\n(2024/06/11 追記) ただし、 `\"use no memo\"` ディレクティブを書いた場合は、React Compiler は例外をスローしない。\n\n```ts:Program.ts\n // Top level \"use no forget\", skip this file entirely\n if (\n findDirectiveDisablingMemoization(program.node.directives, options) != null\n ) {\n return;\n }\n```\n\nhttps://github.com/facebook/react/blob/d77dd31a329df55a051800fc76668af8da8332b4/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts#L243-L248\n\n```ts:Program.ts\n const useNoForget = findDirectiveDisablingMemoization(\n fn.node.body.directives,\n pass.opts\n );\n if (useNoForget != null) {\n pass.opts.logger?.logEvent(pass.filename, {\n kind: \"CompileError\",\n fnLoc: fn.node.body.loc ?? null,\n detail: {\n severity: ErrorSeverity.Todo,\n reason: 'Skipped due to \"use no forget\" directive.',\n loc: useNoForget.loc ?? null,\n suggestions: null,\n },\n });\n return null;\n }\n```\n\nhttps://github.com/facebook/react/blob/d77dd31a329df55a051800fc76668af8da8332b4/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts#L478-L493\n\n### ESLint v9との関係と使い方\n\n前項で `eslintSuppressionRules` は React Compiler が正しく動作するための設定であることを述べた。他にも `eslintSuppressionRules` が必要な理由が無いか考えてると、次のような理由があることに気づいた。\n\nそれは、ESLint v9 から stable となった flat config の仕様に関係している。flat config では次のようにプラグインを設定する。\n\n```js:eslint.config.js\n// @ts-check\n\nimport qwikPlugin from \"eslint-plugin-qwik\";\n\nexport default [\n\t{\n\t\tfiles: [\"src/**/*.tsx\"],\n\t\tplugins: {\n\t\t\tqwik: qwikPlugin,\n\t\t},\n\t\tlanguageOptions: {\n\t\t\tparserOptions: {\n\t\t\t\tproject: [\"./tsconfig.json\"],\n\t\t\t},\n\t\t},\n\t\trules: {\n\t\t\t...qwikPlugin.configs.recommended.rules,\n\t\t},\n\t}\n];\n```\n\n注目してほしいのは `plugins` の部分である。ここで各ユーザーがプラグインのプレフィックスを設定している。つまり以下のような設定が可能である。\n\n```js:eslint.config.js\n// @ts-check\n\nimport reactHooks from \"eslint-plugin-react-hooks\";\nimport globals from \"globals\";\n\nexport default [\n\t// ... some settings\n\n\t{\n\t\tfiles: [\"**/*.{js,jsx,mjs,cjs,ts,tsx}\"],\n\t\tplugins: {\n\t\t\tr: reactHooks,\n\t\t},\n\t\tlanguageOptions: {\n\t\t\tparserOptions: {\n\t\t\t\tecmaFeatures: {\n\t\t\t\t\tjsx: true,\n\t\t\t\t},\n\t\t\t},\n\t\t\tglobals: {\n\t\t\t\t...globals.browser,\n\t\t\t},\n\t\t},\n\t\trules: {\n\t\t\t// ... any rules you want\n\t\t\t\"r/exhaustive-deps\": \"error\",\n\t\t\t\"r/rules-of-hooks\": \"error\",\n\t\t},\n\t\t// ... others are omitted for brevity\n\t}\n];\n```\n\n上のような設定をしたプロジェクトで React Copiler を使おうとするとある問題が発生する。前項にて述べたように、`eslintSuppressionRules` はデフォルトで `react-hooks/exhaustive-deps` と `react-hooks/rules-of-hooks` が登録されている。ユーザーは ESLint の設定で `reac-hooks` プラグインのプレフィックスを `r` に設定している。するとユーザーはあるタイミングで eslint を無効化させる時に次のようなコードを書く。\n\n```tsx:sample.tsx\n// eslint-disable-next-line r/exhaustive-deps\nuseEffect(() => {\n\t// some code\n}, []);\n```\n\nこのコードを含んだアプリケーションを React Compiler に食べさせると、本来は例外をスローされるべきコードがコンパイルされてしまい、挙動が変わってしまう恐れがある。プレイグラウンド[^3]で試してみると一目瞭然だが、React Compiler はかなり元のコードを変更して最適化を行う。もちろん React のルールに則ったコードであれば正しく動作するが、そうでないコードは正しく動作する保証がない。\n\n[^3]: https://playground.react.dev/\n\nこの問題を解決するために `eslintSuppressionRules` がある。ユーザーは次のように設定することで、`eslintSuppressionRules` に `r/exhaustive-deps` と `r/rules-of-hooks` を登録することで、上記の問題を解決できる。\n\n```ts:vite.config.ts\nimport { defineConfig } from \"vite\";\n\nexport default defineConfig(() => {\n\treturn {\n\t\tplugins: [\n\t\t\treact({\n\t\t\t\tbabel: {\n\t\t\t\t\tplugins: [\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\"babel-plugin-react-compiler\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\teslintSuppressionRules: [\"r/exhaustive-deps\", \"r/rules-of-hooks\"],\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t],\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t}),\n\t\t],\n\t\t// ...\n\t};\n});\n```\n\nこのように設定することで、`eslintSuppressionRules` に登録されたルールが無効化された場合に例外をスローするようになる。これにより、React Compiler は正しく動作することが保証される。\n\n## まとめ\n\n`eslintSuppressionRules` は React Compiler が正しく動作するための設定である。デフォルトで `react-hooks/exhaustive-deps` と `react-hooks/rules-of-hooks` が登録されており、これらのルールが無効化された場合に例外をスローする。また flat config との相性も良いため、React Compiler を使う際には `eslintSuppressionRules` の設定することをおすすめする。\n\n引き続き React Compiler のコードを読んで、使い方を考えていきたい。\n\nReact Compiler の中身を [@yossydev](https://twitter.com/yossydev)、[@shun_shobon](https://twitter.com/shun_shobon) と読んでいるので、興味がある方はぜひ見てみてほしい。\n\nhttps://www.youtube.com/watch?v=PqPgr_hlVKM",description:"React Compiler における eslintSuppressionRules の使い方について考察してみる",published:!0,publishedAt:"2024-06-02T20:07:36.528+09:00[Asia/Tokyo]",tags:$R[11433]=["React","React Compiler"],title:"React CompilerのeslintSuppressionRules を考察してみる",updatedAt:"2024-06-11T16:21:21.528+09:00[Asia/Tokyo]",_meta:$R[11434]={filePath:"01HZCA49PAZZ1RKK05NV4XZATQ/slug.md",fileName:"slug.md",directory:"01HZCA49PAZZ1RKK05NV4XZATQ",extension:"md",path:"01HZCA49PAZZ1RKK05NV4XZATQ/slug"},abstract:"eslintSuppressionRules を考察してみるはじめに先日 React Compiler が OSS になった。React のベータ版を使うことで今すぐ使うことができる。React Compiler is a new experimental compiler that we’ve open sourced to get early feedback from the community. It still has rough edges and is not yet fully ready for production.React Compiler requires React 19 RC. If you are unable to upgrade to React 19, you may try a userspace implementation of the cach",mdast:$R[11435]={children:$R[11436]=[$R[11437]={children:$R[11438]=[$R[11439]={children:$R[11440]=[$R[11441]={position:$R[11442]={start:$R[11443]={line:3,column:4,offset:37},end:$R[11444]={line:3,column:8,offset:41}},type:"text",value:"はじめに"}],id:"はじめに",level:2,plain:"はじめに",position:$R[11445]={start:$R[11446]={line:3,column:1,offset:34},end:$R[11447]={line:3,column:8,offset:41}},type:"heading"},$R[11448]={children:$R[11449]=[$R[11450]={position:$R[11451]={start:$R[11452]={line:5,column:1,offset:43},end:$R[11453]={line:5,column:59,offset:101}},type:"text",value:"先日 React Compiler が OSS になった。React のベータ版を使うことで今すぐ使うことができる。"}],position:$R[11454]={start:$R[11455]={line:5,column:1,offset:43},end:$R[11456]={line:5,column:59,offset:101}},type:"paragraph"},$R[11457]={children:$R[11458]=[$R[11459]={children:$R[11460]=[$R[11461]={position:$R[11462]={start:$R[11463]={line:7,column:3,offset:105},end:$R[11464]={line:7,column:182,offset:284}},type:"text",value:"React Compiler is a new experimental compiler that we’ve open sourced to get early feedback from the community. It still has rough edges and is not yet fully ready for production."}],position:$R[11465]={start:$R[11466]={line:7,column:3,offset:105},end:$R[11467]={line:7,column:182,offset:284}},type:"paragraph"},$R[11468]={children:$R[11469]=[$R[11470]={position:$R[11471]={start:$R[11472]={line:9,column:3,offset:289},end:$R[11473]={line:9,column:277,offset:563}},type:"text",value:"React Compiler requires React 19 RC. If you are unable to upgrade to React 19, you may try a userspace implementation of the cache function as described in the Working Group. However, please note that this is not recommended and you should upgrade to React 19 when possible."}],position:$R[11474]={start:$R[11475]={line:9,column:3,offset:289},end:$R[11476]={line:9,column:277,offset:563}},type:"paragraph"},$R[11477]={children:$R[11478]=[$R[11479]={position:$R[11480]={start:$R[11481]={line:11,column:3,offset:568},end:$R[11482]={line:11,column:7,offset:572}},type:"text",value:"--- "},$R[11483]={children:$R[11484]=[$R[11485]={position:$R[11486]={start:$R[11487]={line:11,column:7,offset:572},end:$R[11488]={line:11,column:45,offset:610}},type:"text",value:"https://react.dev/learn/react-compiler"}],position:$R[11489]={start:$R[11490]={line:11,column:7,offset:572},end:$R[11491]={line:11,column:45,offset:610}},title:void 0,type:"link",url:"https://react.dev/learn/react-compiler"}],position:$R[11492]={start:$R[11493]={line:11,column:3,offset:568},end:$R[11494]={line:11,column:45,offset:610}},type:"paragraph"}],position:$R[11495]={start:$R[11496]={line:7,column:1,offset:103},end:$R[11497]={line:11,column:45,offset:610}},type:"blockquote"},$R[11498]={children:$R[11499]=[$R[11500]={position:$R[11501]={start:$R[11502]={line:13,column:1,offset:612},end:$R[11503]={line:13,column:27,offset:638}},type:"text",value:"とある通り、まだ本番環境での使用は推奨されていない。"}],position:$R[11504]={start:$R[11505]={line:13,column:1,offset:612},end:$R[11506]={line:13,column:27,offset:638}},type:"paragraph"},$R[11507]={children:$R[11508]=[$R[11509]={position:$R[11510]={start:$R[11511]={line:15,column:1,offset:640},end:$R[11512]={line:15,column:9,offset:648}},type:"text",value:"先日公開された "},$R[11513]={children:$R[11514]=[$R[11515]={position:$R[11516]={start:$R[11517]={line:15,column:10,offset:649},end:$R[11518]={line:15,column:40,offset:679}},type:"text",value:"React Compiler Code reading #1"}],position:$R[11519]={start:$R[11520]={line:15,column:9,offset:648},end:$R[11521]={line:15,column:91,offset:730}},title:void 0,type:"link",url:"https://youtu.be/PqPgr_hlVKM?si=OIgDQWxUwbV3se-A"},$R[11522]={position:$R[11523]={start:$R[11524]={line:15,column:91,offset:730},end:$R[11525]={line:15,column:96,offset:735}},type:"text",value:" の中で "},$R[11526]={position:$R[11527]={start:$R[11528]={line:15,column:96,offset:735},end:$R[11529]={line:15,column:120,offset:759}},type:"inlineCode",value:"eslintSuppressionRules"},$R[11530]={position:$R[11531]={start:$R[11532]={line:15,column:120,offset:759},end:$R[11533]={line:15,column:159,offset:798}},type:"text",value:" という設定を見つけた。この設定の想定されるであろう使い方について考えてみた。"}],position:$R[11534]={start:$R[11535]={line:15,column:1,offset:640},end:$R[11536]={line:15,column:159,offset:798}},type:"paragraph"},$R[11537]={children:$R[11538]=[$R[11539]={position:$R[11540]={start:$R[11541]={line:17,column:1,offset:800},end:$R[11542]={line:17,column:24,offset:823}},type:"text",value:"この記事で参照するコードの commit は "},$R[11543]={children:$R[11544]=[$R[11545]={position:$R[11546]={start:$R[11547]={line:17,column:25,offset:824},end:$R[11548]={line:17,column:32,offset:831}},type:"text",value:"113c8e7"}],position:$R[11549]={start:$R[11550]={line:17,column:24,offset:823},end:$R[11551]={line:17,column:114,offset:913}},title:void 0,type:"link",url:"https://github.com/facebook/react/tree/113c8e7f72bcf5d3bc285546da1508b45da3cf53"},$R[11552]={position:$R[11553]={start:$R[11554]={line:17,column:114,offset:913},end:$R[11555]={line:17,column:119,offset:918}},type:"text",value:" である。"}],position:$R[11556]={start:$R[11557]={line:17,column:1,offset:800},end:$R[11558]={line:17,column:119,offset:918}},type:"paragraph"}],position:$R[11559]={end:$R[11560]={line:17,column:119,offset:918},start:$R[11561]={line:3,column:1,offset:34}},type:"section"},$R[11562]={children:$R[11563]=[$R[11564]={children:$R[11565]=[$R[11566]={position:$R[11567]={start:$R[11568]={line:19,column:4,offset:923},end:$R[11569]={line:19,column:21,offset:940}},type:"text",value:"React Compiler とは"}],id:"react-compiler-とは",level:2,plain:"React Compiler とは",position:$R[11570]={start:$R[11571]={line:19,column:1,offset:920},end:$R[11572]={line:19,column:21,offset:940}},type:"heading"},$R[11573]={children:$R[11574]=[$R[11575]={position:$R[11576]={start:$R[11577]={line:21,column:1,offset:942},end:$R[11578]={line:21,column:11,offset:952}},type:"text",value:"詳しくはドキュメント"},$R[11579]={footnoteIndex:0,position:$R[11580]={start:$R[11581]={line:21,column:11,offset:952},end:$R[11582]={line:21,column:15,offset:956}},referenceIndex:1,type:"footnoteReference"},$R[11583]={position:$R[11584]={start:$R[11585]={line:21,column:15,offset:956},end:$R[11586]={line:21,column:54,offset:995}},type:"text",value:"を読むことをおすすめする。簡潔に説明すると、React Compiler は "},$R[11587]={position:$R[11588]={start:$R[11589]={line:21,column:54,offset:995},end:$R[11590]={line:21,column:66,offset:1007}},type:"inlineCode",value:"React.memo"},$R[11591]={position:$R[11592]={start:$R[11593]={line:21,column:66,offset:1007},end:$R[11594]={line:21,column:69,offset:1010}},type:"text",value:" や "},$R[11595]={position:$R[11596]={start:$R[11597]={line:21,column:69,offset:1010},end:$R[11598]={line:21,column:78,offset:1019}},type:"inlineCode",value:"useMemo"},$R[11599]={position:$R[11600]={start:$R[11601]={line:21,column:78,offset:1019},end:$R[11602]={line:21,column:116,offset:1057}},type:"text",value:" を始めとしたメモ化を自動で行い不要な再レンダリングを防ぐコンパイラである。"}],position:$R[11603]={start:$R[11604]={line:21,column:1,offset:942},end:$R[11605]={line:21,column:116,offset:1057}},type:"paragraph"},$R[11606]={children:$R[11607]=[$R[11608]={position:$R[11609]={start:$R[11610]={line:23,column:1,offset:1059},end:$R[11611]={line:23,column:5,offset:1063}},type:"text",value:"現在は "},$R[11612]={position:$R[11613]={start:$R[11614]={line:23,column:5,offset:1063},end:$R[11615]={line:23,column:12,offset:1070}},type:"inlineCode",value:"babel"},$R[11616]={position:$R[11617]={start:$R[11618]={line:23,column:12,offset:1070},end:$R[11619]={line:23,column:95,offset:1153}},type:"text",value:" のプラグインとして提供されており、eslint のルールと React Compiler の実行時のエラーで React Compiler のルールに従わせている。"}],position:$R[11620]={start:$R[11621]={line:23,column:1,offset:1059},end:$R[11622]={line:23,column:95,offset:1153}},type:"paragraph"}],position:$R[11623]={end:$R[11624]={line:23,column:95,offset:1153},start:$R[11625]={line:19,column:1,offset:920}},type:"section"},$R[11626]={children:$R[11627]=[$R[11628]={children:$R[11629]=[$R[11630]={position:$R[11631]={start:$R[11632]={line:27,column:4,offset:1204},end:$R[11633]={line:27,column:26,offset:1226}},type:"text",value:"eslintSuppressionRules"}],id:"eslintsuppressionrules",level:2,plain:"eslintSuppressionRules",position:$R[11634]={start:$R[11635]={line:27,column:1,offset:1201},end:$R[11636]={line:27,column:26,offset:1226}},type:"heading"},$R[11637]={children:$R[11638]=[$R[11639]={position:$R[11640]={start:$R[11641]={line:29,column:1,offset:1228},end:$R[11642]={line:29,column:9,offset:1236}},type:"text",value:"結論から言うと "},$R[11643]={position:$R[11644]={start:$R[11645]={line:29,column:9,offset:1236},end:$R[11646]={line:29,column:33,offset:1260}},type:"inlineCode",value:"eslintSuppressionRules"},$R[11647]={position:$R[11648]={start:$R[11649]={line:29,column:33,offset:1260},end:$R[11650]={line:29,column:98,offset:1325}},type:"text",value:" は、登録された ESLint ルールが無効化された場合に React Compiler が例外をスローするようにする設定である。"}],position:$R[11651]={start:$R[11652]={line:29,column:1,offset:1228},end:$R[11653]={line:29,column:98,offset:1325}},type:"paragraph"},$R[11654]={filename:"Options.ts ts",lang:"ts",position:$R[11655]={start:$R[11656]={line:31,column:1,offset:1327},end:$R[11657]={line:46,column:4,offset:1952}},type:"code",value:"export type PluginOptions = {\n // ...some options\n\n /**\n * By default React Compiler will skip compilation of code that suppresses the default\n * React ESLint rules, since this is a strong indication that the code may be breaking React rules\n * in some way.\n *\n * Use eslintSuppressionRules to pass a custom set of rule names: any code which suppresses the\n * provided rules will skip compilation. To disable this feature (never bailout of compilation\n * even if the default ESLint is suppressed), pass an empty array.\n */\n eslintSuppressionRules?: Array\x3Cstring> | null | undefined;\n};",hast:$R[11658]={type:"root",children:$R[11659]=[$R[11660]={type:"element",tagName:"pre",properties:$R[11661]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[11662]=[$R[11663]={type:"element",tagName:"code",properties:$R[11664]={},children:$R[11665]=[$R[11666]={type:"element",tagName:"span",properties:$R[11667]={class:"line"},children:$R[11668]=[$R[11669]={type:"element",tagName:"span",properties:$R[11670]={style:"color:#4D9375"},children:$R[11671]=[$R[11672]={type:"text",value:"export"}]},$R[11673]={type:"element",tagName:"span",properties:$R[11674]={style:"color:#CB7676"},children:$R[11675]=[$R[11676]={type:"text",value:" type"}]},$R[11677]={type:"element",tagName:"span",properties:$R[11678]={style:"color:#5DA994"},children:$R[11679]=[$R[11680]={type:"text",value:" PluginOptions"}]},$R[11681]={type:"element",tagName:"span",properties:$R[11682]={style:"color:#666666"},children:$R[11683]=[$R[11684]={type:"text",value:" ="}]},$R[11685]={type:"element",tagName:"span",properties:$R[11686]={style:"color:#666666"},children:$R[11687]=[$R[11688]={type:"text",value:" {"}]}]},$R[11689]={type:"text",value:"\n"},$R[11690]={type:"element",tagName:"span",properties:$R[11691]={class:"line"},children:$R[11692]=[$R[11693]={type:"element",tagName:"span",properties:$R[11694]={style:"color:#758575DD"},children:$R[11695]=[$R[11696]={type:"text",value:" // ...some options"}]}]},$R[11697]={type:"text",value:"\n"},$R[11698]={type:"element",tagName:"span",properties:$R[11699]={class:"line"},children:$R[11700]=[]},$R[11701]={type:"text",value:"\n"},$R[11702]={type:"element",tagName:"span",properties:$R[11703]={class:"line"},children:$R[11704]=[$R[11705]={type:"element",tagName:"span",properties:$R[11706]={style:"color:#758575DD"},children:$R[11707]=[$R[11708]={type:"text",value:" /**"}]}]},$R[11709]={type:"text",value:"\n"},$R[11710]={type:"element",tagName:"span",properties:$R[11711]={class:"line"},children:$R[11712]=[$R[11713]={type:"element",tagName:"span",properties:$R[11714]={style:"color:#758575DD"},children:$R[11715]=[$R[11716]={type:"text",value:" * By default React Compiler will skip compilation of code that suppresses the default"}]}]},$R[11717]={type:"text",value:"\n"},$R[11718]={type:"element",tagName:"span",properties:$R[11719]={class:"line"},children:$R[11720]=[$R[11721]={type:"element",tagName:"span",properties:$R[11722]={style:"color:#758575DD"},children:$R[11723]=[$R[11724]={type:"text",value:" * React ESLint rules, since this is a strong indication that the code may be breaking React rules"}]}]},$R[11725]={type:"text",value:"\n"},$R[11726]={type:"element",tagName:"span",properties:$R[11727]={class:"line"},children:$R[11728]=[$R[11729]={type:"element",tagName:"span",properties:$R[11730]={style:"color:#758575DD"},children:$R[11731]=[$R[11732]={type:"text",value:" * in some way."}]}]},$R[11733]={type:"text",value:"\n"},$R[11734]={type:"element",tagName:"span",properties:$R[11735]={class:"line"},children:$R[11736]=[$R[11737]={type:"element",tagName:"span",properties:$R[11738]={style:"color:#758575DD"},children:$R[11739]=[$R[11740]={type:"text",value:" *"}]}]},$R[11741]={type:"text",value:"\n"},$R[11742]={type:"element",tagName:"span",properties:$R[11743]={class:"line"},children:$R[11744]=[$R[11745]={type:"element",tagName:"span",properties:$R[11746]={style:"color:#758575DD"},children:$R[11747]=[$R[11748]={type:"text",value:" * Use eslintSuppressionRules to pass a custom set of rule names: any code which suppresses the"}]}]},$R[11749]={type:"text",value:"\n"},$R[11750]={type:"element",tagName:"span",properties:$R[11751]={class:"line"},children:$R[11752]=[$R[11753]={type:"element",tagName:"span",properties:$R[11754]={style:"color:#758575DD"},children:$R[11755]=[$R[11756]={type:"text",value:" * provided rules will skip compilation. To disable this feature (never bailout of compilation"}]}]},$R[11757]={type:"text",value:"\n"},$R[11758]={type:"element",tagName:"span",properties:$R[11759]={class:"line"},children:$R[11760]=[$R[11761]={type:"element",tagName:"span",properties:$R[11762]={style:"color:#758575DD"},children:$R[11763]=[$R[11764]={type:"text",value:" * even if the default ESLint is suppressed), pass an empty array."}]}]},$R[11765]={type:"text",value:"\n"},$R[11766]={type:"element",tagName:"span",properties:$R[11767]={class:"line"},children:$R[11768]=[$R[11769]={type:"element",tagName:"span",properties:$R[11770]={style:"color:#758575DD"},children:$R[11771]=[$R[11772]={type:"text",value:" */"}]}]},$R[11773]={type:"text",value:"\n"},$R[11774]={type:"element",tagName:"span",properties:$R[11775]={class:"line"},children:$R[11776]=[$R[11777]={type:"element",tagName:"span",properties:$R[11778]={style:"color:#BD976A"},children:$R[11779]=[$R[11780]={type:"text",value:" eslintSuppressionRules"}]},$R[11781]={type:"element",tagName:"span",properties:$R[11782]={style:"color:#CB7676"},children:$R[11783]=[$R[11784]={type:"text",value:"?"}]},$R[11785]={type:"element",tagName:"span",properties:$R[11786]={style:"color:#666666"},children:$R[11787]=[$R[11788]={type:"text",value:": "}]},$R[11789]={type:"element",tagName:"span",properties:$R[11790]={style:"color:#5DA994"},children:$R[11791]=[$R[11792]={type:"text",value:"Array"}]},$R[11793]={type:"element",tagName:"span",properties:$R[11794]={style:"color:#666666"},children:$R[11795]=[$R[11796]={type:"text",value:"\x3C"}]},$R[11797]={type:"element",tagName:"span",properties:$R[11798]={style:"color:#5DA994"},children:$R[11799]=[$R[11800]={type:"text",value:"string"}]},$R[11801]={type:"element",tagName:"span",properties:$R[11802]={style:"color:#666666"},children:$R[11803]=[$R[11804]={type:"text",value:"> | "}]},$R[11805]={type:"element",tagName:"span",properties:$R[11806]={style:"color:#CB7676"},children:$R[11807]=[$R[11808]={type:"text",value:"null"}]},$R[11809]={type:"element",tagName:"span",properties:$R[11810]={style:"color:#666666"},children:$R[11811]=[$R[11812]={type:"text",value:" | "}]},$R[11813]={type:"element",tagName:"span",properties:$R[11814]={style:"color:#CB7676"},children:$R[11815]=[$R[11816]={type:"text",value:"undefined"}]},$R[11817]={type:"element",tagName:"span",properties:$R[11818]={style:"color:#666666"},children:$R[11819]=[$R[11820]={type:"text",value:";"}]}]},$R[11821]={type:"text",value:"\n"},$R[11822]={type:"element",tagName:"span",properties:$R[11823]={class:"line"},children:$R[11824]=[$R[11825]={type:"element",tagName:"span",properties:$R[11826]={style:"color:#666666"},children:$R[11827]=[$R[11828]={type:"text",value:"};"}]}]}]}]}]}},$R[11829]={meta:$R[11830]={title:"react/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Options.ts at d77dd31a329df55a051800fc76668af8da8332b4 · facebook/react · GitHub",description:"The library for web and native user interfaces. Contribute to facebook/react development by creating an account on GitHub.",twitter_card:$R[11831]={images:$R[11832]=[$R[11833]={url:"https://opengraph.githubassets.com/42acbb3fec132253a9fe0fbe818ffd2fc796f89a9f13a5bad27fb17afe797e47/facebook/react"}],site:"@github",card:"summary_large_image",title:"react/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Options.ts at d77dd31a329df55a051800fc76668af8da8332b4 · facebook/react",description:"The library for web and native user interfaces. Contribute to facebook/react development by creating an account on GitHub."},open_graph:$R[11834]={images:$R[11835]=[$R[11836]={url:"https://opengraph.githubassets.com/42acbb3fec132253a9fe0fbe818ffd2fc796f89a9f13a5bad27fb17afe797e47/facebook/react",alt:"The library for web and native user interfaces. Contribute to facebook/react development by creating an account on GitHub.",width:1200,height:600}],site_name:"GitHub",type:"object",title:"react/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Options.ts at d77dd31a329df55a051800fc76668af8da8332b4 · facebook/react",url:"https://github.com/facebook/react/blob/d77dd31a329df55a051800fc76668af8da8332b4/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Options.ts",description:"The library for web and native user interfaces. Contribute to facebook/react development by creating an account on GitHub."},theme_color:"#1e2327",favicon:"https://github.githubassets.com/favicons/favicon.svg"},oembed:void 0,position:$R[11837]={start:$R[11838]={line:48,column:1,offset:1954},end:$R[11839]={line:48,column:161,offset:2114}},src:"https://github.com/facebook/react/blob/d77dd31a329df55a051800fc76668af8da8332b4/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Options.ts#L96-L105",type:"embed"},$R[11840]={children:$R[11841]=[$R[11842]={children:$R[11843]=[$R[11844]={position:$R[11845]={start:$R[11846]={line:50,column:5,offset:2120},end:$R[11847]={line:50,column:8,offset:2123}},type:"text",value:"必要性"}],id:"必要性",level:3,plain:"必要性",position:$R[11848]={start:$R[11849]={line:50,column:1,offset:2116},end:$R[11850]={line:50,column:8,offset:2123}},type:"heading"},$R[11851]={children:$R[11852]=[$R[11853]={position:$R[11854]={start:$R[11855]={line:52,column:1,offset:2125},end:$R[11856]={line:52,column:25,offset:2149}},type:"inlineCode",value:"eslintSuppressionRules"},$R[11857]={position:$R[11858]={start:$R[11859]={line:52,column:25,offset:2149},end:$R[11860]={line:52,column:51,offset:2175}},type:"text",value:" はデフォルトで次の 2 つのルールが登録されている"}],position:$R[11861]={start:$R[11862]={line:52,column:1,offset:2125},end:$R[11863]={line:52,column:51,offset:2175}},type:"paragraph"},$R[11864]={filename:"Program.ts ts",lang:"ts",position:$R[11865]={start:$R[11866]={line:54,column:1,offset:2177},end:$R[11867]={line:59,column:4,offset:2301}},type:"code",value:"const DEFAULT_ESLINT_SUPPRESSIONS = [\n\t\"react-hooks/exhaustive-deps\",\n\t\"react-hooks/rules-of-hooks\",\n];",hast:$R[11868]={type:"root",children:$R[11869]=[$R[11870]={type:"element",tagName:"pre",properties:$R[11871]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[11872]=[$R[11873]={type:"element",tagName:"code",properties:$R[11874]={},children:$R[11875]=[$R[11876]={type:"element",tagName:"span",properties:$R[11877]={class:"line"},children:$R[11878]=[$R[11879]={type:"element",tagName:"span",properties:$R[11880]={style:"color:#CB7676"},children:$R[11881]=[$R[11882]={type:"text",value:"const "}]},$R[11883]={type:"element",tagName:"span",properties:$R[11884]={style:"color:#BD976A"},children:$R[11885]=[$R[11886]={type:"text",value:"DEFAULT_ESLINT_SUPPRESSIONS"}]},$R[11887]={type:"element",tagName:"span",properties:$R[11888]={style:"color:#666666"},children:$R[11889]=[$R[11890]={type:"text",value:" ="}]},$R[11891]={type:"element",tagName:"span",properties:$R[11892]={style:"color:#666666"},children:$R[11893]=[$R[11894]={type:"text",value:" ["}]}]},$R[11895]={type:"text",value:"\n"},$R[11896]={type:"element",tagName:"span",properties:$R[11897]={class:"line"},children:$R[11898]=[$R[11899]={type:"element",tagName:"span",properties:$R[11900]={style:"color:#C98A7D77"},children:$R[11901]=[$R[11902]={type:"text",value:"\t\""}]},$R[11903]={type:"element",tagName:"span",properties:$R[11904]={style:"color:#C98A7D"},children:$R[11905]=[$R[11906]={type:"text",value:"react-hooks/exhaustive-deps"}]},$R[11907]={type:"element",tagName:"span",properties:$R[11908]={style:"color:#C98A7D77"},children:$R[11909]=[$R[11910]={type:"text",value:"\""}]},$R[11911]={type:"element",tagName:"span",properties:$R[11912]={style:"color:#666666"},children:$R[11913]=[$R[11914]={type:"text",value:","}]}]},$R[11915]={type:"text",value:"\n"},$R[11916]={type:"element",tagName:"span",properties:$R[11917]={class:"line"},children:$R[11918]=[$R[11919]={type:"element",tagName:"span",properties:$R[11920]={style:"color:#C98A7D77"},children:$R[11921]=[$R[11922]={type:"text",value:"\t\""}]},$R[11923]={type:"element",tagName:"span",properties:$R[11924]={style:"color:#C98A7D"},children:$R[11925]=[$R[11926]={type:"text",value:"react-hooks/rules-of-hooks"}]},$R[11927]={type:"element",tagName:"span",properties:$R[11928]={style:"color:#C98A7D77"},children:$R[11929]=[$R[11930]={type:"text",value:"\""}]},$R[11931]={type:"element",tagName:"span",properties:$R[11932]={style:"color:#666666"},children:$R[11933]=[$R[11934]={type:"text",value:","}]}]},$R[11935]={type:"text",value:"\n"},$R[11936]={type:"element",tagName:"span",properties:$R[11937]={class:"line"},children:$R[11938]=[$R[11939]={type:"element",tagName:"span",properties:$R[11940]={style:"color:#666666"},children:$R[11941]=[$R[11942]={type:"text",value:"];"}]}]}]}]}]}},$R[11943]={meta:$R[11944]={title:"react/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts at d77dd31a329df55a051800fc76668af8da8332b4 · facebook/react · GitHub",description:"The library for web and native user interfaces. Contribute to facebook/react development by creating an account on GitHub.",twitter_card:$R[11945]={images:$R[11946]=[$R[11947]={url:"https://opengraph.githubassets.com/42acbb3fec132253a9fe0fbe818ffd2fc796f89a9f13a5bad27fb17afe797e47/facebook/react"}],site:"@github",card:"summary_large_image",title:"react/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts at d77dd31a329df55a051800fc76668af8da8332b4 · facebook/react",description:"The library for web and native user interfaces. Contribute to facebook/react development by creating an account on GitHub."},open_graph:$R[11948]={images:$R[11949]=[$R[11950]={url:"https://opengraph.githubassets.com/42acbb3fec132253a9fe0fbe818ffd2fc796f89a9f13a5bad27fb17afe797e47/facebook/react",alt:"The library for web and native user interfaces. Contribute to facebook/react development by creating an account on GitHub.",width:1200,height:600}],site_name:"GitHub",type:"object",title:"react/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts at d77dd31a329df55a051800fc76668af8da8332b4 · facebook/react",url:"https://github.com/facebook/react/blob/d77dd31a329df55a051800fc76668af8da8332b4/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts",description:"The library for web and native user interfaces. Contribute to facebook/react development by creating an account on GitHub."},theme_color:"#1e2327",favicon:"https://github.githubassets.com/favicons/favicon.svg"},oembed:void 0,position:$R[11951]={start:$R[11952]={line:61,column:1,offset:2303},end:$R[11953]={line:61,column:162,offset:2464}},src:"https://github.com/facebook/react/blob/d77dd31a329df55a051800fc76668af8da8332b4/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts#L194-L197",type:"embed"},$R[11954]={children:$R[11955]=[$R[11956]={position:$R[11957]={start:$R[11958]={line:63,column:1,offset:2466},end:$R[11959]={line:63,column:66,offset:2531}},type:"text",value:"これらのルールが無効化された場合、React Compiler は例外をスローする。これらのルールは React の基本的なルール"},$R[11960]={footnoteIndex:1,position:$R[11961]={start:$R[11962]={line:63,column:66,offset:2531},end:$R[11963]={line:63,column:70,offset:2535}},referenceIndex:1,type:"footnoteReference"},$R[11964]={position:$R[11965]={start:$R[11966]={line:63,column:70,offset:2535},end:$R[11967]={line:63,column:167,offset:2632}},type:"text",value:"であり、無効化されることは React のルールに違反している可能性が高い。おさらいだが、React Compiler は React のルールに従ったコードのみを解析して最適化する。そのため "},$R[11968]={position:$R[11969]={start:$R[11970]={line:63,column:167,offset:2632},end:$R[11971]={line:63,column:191,offset:2656}},type:"inlineCode",value:"eslintSuppressionRules"},$R[11972]={position:$R[11973]={start:$R[11974]={line:63,column:191,offset:2656},end:$R[11975]={line:63,column:262,offset:2727}},type:"text",value:" は React のルールに違反しているコードを見つけ、例外をスローすることで React Compiler が正しく動作することを保証する。"}],position:$R[11976]={start:$R[11977]={line:63,column:1,offset:2466},end:$R[11978]={line:63,column:262,offset:2727}},type:"paragraph"},$R[11979]={children:$R[11980]=[$R[11981]={position:$R[11982]={start:$R[11983]={line:67,column:1,offset:2840},end:$R[11984]={line:67,column:22,offset:2861}},type:"text",value:"(2024/06/11 追記) ただし、 "},$R[11985]={position:$R[11986]={start:$R[11987]={line:67,column:22,offset:2861},end:$R[11988]={line:67,column:37,offset:2876}},type:"inlineCode",value:"\"use no memo\""},$R[11989]={position:$R[11990]={start:$R[11991]={line:67,column:37,offset:2876},end:$R[11992]={line:67,column:79,offset:2918}},type:"text",value:" ディレクティブを書いた場合は、React Compiler は例外をスローしない。"}],position:$R[11993]={start:$R[11994]={line:67,column:1,offset:2840},end:$R[11995]={line:67,column:79,offset:2918}},type:"paragraph"},$R[11996]={filename:"Program.ts ts",lang:"ts",position:$R[11997]={start:$R[11998]={line:69,column:1,offset:2920},end:$R[11999]={line:76,column:4,offset:3105}},type:"code",value:" // Top level \"use no forget\", skip this file entirely\n if (\n findDirectiveDisablingMemoization(program.node.directives, options) != null\n ) {\n return;\n }",hast:$R[12000]={type:"root",children:$R[12001]=[$R[12002]={type:"element",tagName:"pre",properties:$R[12003]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[12004]=[$R[12005]={type:"element",tagName:"code",properties:$R[12006]={},children:$R[12007]=[$R[12008]={type:"element",tagName:"span",properties:$R[12009]={class:"line"},children:$R[12010]=[$R[12011]={type:"element",tagName:"span",properties:$R[12012]={style:"color:#758575DD"},children:$R[12013]=[$R[12014]={type:"text",value:" // Top level \"use no forget\", skip this file entirely"}]}]},$R[12015]={type:"text",value:"\n"},$R[12016]={type:"element",tagName:"span",properties:$R[12017]={class:"line"},children:$R[12018]=[$R[12019]={type:"element",tagName:"span",properties:$R[12020]={style:"color:#4D9375"},children:$R[12021]=[$R[12022]={type:"text",value:" if"}]},$R[12023]={type:"element",tagName:"span",properties:$R[12024]={style:"color:#666666"},children:$R[12025]=[$R[12026]={type:"text",value:" ("}]}]},$R[12027]={type:"text",value:"\n"},$R[12028]={type:"element",tagName:"span",properties:$R[12029]={class:"line"},children:$R[12030]=[$R[12031]={type:"element",tagName:"span",properties:$R[12032]={style:"color:#80A665"},children:$R[12033]=[$R[12034]={type:"text",value:" findDirectiveDisablingMemoization"}]},$R[12035]={type:"element",tagName:"span",properties:$R[12036]={style:"color:#666666"},children:$R[12037]=[$R[12038]={type:"text",value:"("}]},$R[12039]={type:"element",tagName:"span",properties:$R[12040]={style:"color:#BD976A"},children:$R[12041]=[$R[12042]={type:"text",value:"program"}]},$R[12043]={type:"element",tagName:"span",properties:$R[12044]={style:"color:#666666"},children:$R[12045]=[$R[12046]={type:"text",value:"."}]},$R[12047]={type:"element",tagName:"span",properties:$R[12048]={style:"color:#BD976A"},children:$R[12049]=[$R[12050]={type:"text",value:"node"}]},$R[12051]={type:"element",tagName:"span",properties:$R[12052]={style:"color:#666666"},children:$R[12053]=[$R[12054]={type:"text",value:"."}]},$R[12055]={type:"element",tagName:"span",properties:$R[12056]={style:"color:#BD976A"},children:$R[12057]=[$R[12058]={type:"text",value:"directives"}]},$R[12059]={type:"element",tagName:"span",properties:$R[12060]={style:"color:#666666"},children:$R[12061]=[$R[12062]={type:"text",value:","}]},$R[12063]={type:"element",tagName:"span",properties:$R[12064]={style:"color:#BD976A"},children:$R[12065]=[$R[12066]={type:"text",value:" options"}]},$R[12067]={type:"element",tagName:"span",properties:$R[12068]={style:"color:#666666"},children:$R[12069]=[$R[12070]={type:"text",value:")"}]},$R[12071]={type:"element",tagName:"span",properties:$R[12072]={style:"color:#CB7676"},children:$R[12073]=[$R[12074]={type:"text",value:" !="}]},$R[12075]={type:"element",tagName:"span",properties:$R[12076]={style:"color:#CB7676"},children:$R[12077]=[$R[12078]={type:"text",value:" null"}]}]},$R[12079]={type:"text",value:"\n"},$R[12080]={type:"element",tagName:"span",properties:$R[12081]={class:"line"},children:$R[12082]=[$R[12083]={type:"element",tagName:"span",properties:$R[12084]={style:"color:#666666"},children:$R[12085]=[$R[12086]={type:"text",value:" )"}]},$R[12087]={type:"element",tagName:"span",properties:$R[12088]={style:"color:#666666"},children:$R[12089]=[$R[12090]={type:"text",value:" {"}]}]},$R[12091]={type:"text",value:"\n"},$R[12092]={type:"element",tagName:"span",properties:$R[12093]={class:"line"},children:$R[12094]=[$R[12095]={type:"element",tagName:"span",properties:$R[12096]={style:"color:#4D9375"},children:$R[12097]=[$R[12098]={type:"text",value:" return"}]},$R[12099]={type:"element",tagName:"span",properties:$R[12100]={style:"color:#666666"},children:$R[12101]=[$R[12102]={type:"text",value:";"}]}]},$R[12103]={type:"text",value:"\n"},$R[12104]={type:"element",tagName:"span",properties:$R[12105]={class:"line"},children:$R[12106]=[$R[12107]={type:"element",tagName:"span",properties:$R[12108]={style:"color:#666666"},children:$R[12109]=[$R[12110]={type:"text",value:" }"}]}]}]}]}]}},$R[12111]={meta:$R[12112]={title:"react/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts at d77dd31a329df55a051800fc76668af8da8332b4 · facebook/react · GitHub",description:"The library for web and native user interfaces. Contribute to facebook/react development by creating an account on GitHub.",twitter_card:$R[12113]={images:$R[12114]=[$R[12115]={url:"https://opengraph.githubassets.com/42acbb3fec132253a9fe0fbe818ffd2fc796f89a9f13a5bad27fb17afe797e47/facebook/react"}],site:"@github",card:"summary_large_image",title:"react/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts at d77dd31a329df55a051800fc76668af8da8332b4 · facebook/react",description:"The library for web and native user interfaces. Contribute to facebook/react development by creating an account on GitHub."},open_graph:$R[12116]={images:$R[12117]=[$R[12118]={url:"https://opengraph.githubassets.com/42acbb3fec132253a9fe0fbe818ffd2fc796f89a9f13a5bad27fb17afe797e47/facebook/react",alt:"The library for web and native user interfaces. Contribute to facebook/react development by creating an account on GitHub.",width:1200,height:600}],site_name:"GitHub",type:"object",title:"react/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts at d77dd31a329df55a051800fc76668af8da8332b4 · facebook/react",url:"https://github.com/facebook/react/blob/d77dd31a329df55a051800fc76668af8da8332b4/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts",description:"The library for web and native user interfaces. Contribute to facebook/react development by creating an account on GitHub."},theme_color:"#1e2327",favicon:"https://github.githubassets.com/favicons/favicon.svg"},oembed:void 0,position:$R[12119]={start:$R[12120]={line:78,column:1,offset:3107},end:$R[12121]={line:78,column:162,offset:3268}},src:"https://github.com/facebook/react/blob/d77dd31a329df55a051800fc76668af8da8332b4/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts#L243-L248",type:"embed"},$R[12122]={filename:"Program.ts ts",lang:"ts",position:$R[12123]={start:$R[12124]={line:80,column:1,offset:3270},end:$R[12125]={line:98,column:4,offset:3791}},type:"code",value:" const useNoForget = findDirectiveDisablingMemoization(\n fn.node.body.directives,\n pass.opts\n );\n if (useNoForget != null) {\n pass.opts.logger?.logEvent(pass.filename, {\n kind: \"CompileError\",\n fnLoc: fn.node.body.loc ?? null,\n detail: {\n severity: ErrorSeverity.Todo,\n reason: 'Skipped due to \"use no forget\" directive.',\n loc: useNoForget.loc ?? null,\n suggestions: null,\n },\n });\n return null;\n }",hast:$R[12126]={type:"root",children:$R[12127]=[$R[12128]={type:"element",tagName:"pre",properties:$R[12129]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[12130]=[$R[12131]={type:"element",tagName:"code",properties:$R[12132]={},children:$R[12133]=[$R[12134]={type:"element",tagName:"span",properties:$R[12135]={class:"line"},children:$R[12136]=[$R[12137]={type:"element",tagName:"span",properties:$R[12138]={style:"color:#CB7676"},children:$R[12139]=[$R[12140]={type:"text",value:" const "}]},$R[12141]={type:"element",tagName:"span",properties:$R[12142]={style:"color:#BD976A"},children:$R[12143]=[$R[12144]={type:"text",value:"useNoForget"}]},$R[12145]={type:"element",tagName:"span",properties:$R[12146]={style:"color:#666666"},children:$R[12147]=[$R[12148]={type:"text",value:" ="}]},$R[12149]={type:"element",tagName:"span",properties:$R[12150]={style:"color:#80A665"},children:$R[12151]=[$R[12152]={type:"text",value:" findDirectiveDisablingMemoization"}]},$R[12153]={type:"element",tagName:"span",properties:$R[12154]={style:"color:#666666"},children:$R[12155]=[$R[12156]={type:"text",value:"("}]}]},$R[12157]={type:"text",value:"\n"},$R[12158]={type:"element",tagName:"span",properties:$R[12159]={class:"line"},children:$R[12160]=[$R[12161]={type:"element",tagName:"span",properties:$R[12162]={style:"color:#BD976A"},children:$R[12163]=[$R[12164]={type:"text",value:" fn"}]},$R[12165]={type:"element",tagName:"span",properties:$R[12166]={style:"color:#666666"},children:$R[12167]=[$R[12168]={type:"text",value:"."}]},$R[12169]={type:"element",tagName:"span",properties:$R[12170]={style:"color:#BD976A"},children:$R[12171]=[$R[12172]={type:"text",value:"node"}]},$R[12173]={type:"element",tagName:"span",properties:$R[12174]={style:"color:#666666"},children:$R[12175]=[$R[12176]={type:"text",value:"."}]},$R[12177]={type:"element",tagName:"span",properties:$R[12178]={style:"color:#BD976A"},children:$R[12179]=[$R[12180]={type:"text",value:"body"}]},$R[12181]={type:"element",tagName:"span",properties:$R[12182]={style:"color:#666666"},children:$R[12183]=[$R[12184]={type:"text",value:"."}]},$R[12185]={type:"element",tagName:"span",properties:$R[12186]={style:"color:#BD976A"},children:$R[12187]=[$R[12188]={type:"text",value:"directives"}]},$R[12189]={type:"element",tagName:"span",properties:$R[12190]={style:"color:#666666"},children:$R[12191]=[$R[12192]={type:"text",value:","}]}]},$R[12193]={type:"text",value:"\n"},$R[12194]={type:"element",tagName:"span",properties:$R[12195]={class:"line"},children:$R[12196]=[$R[12197]={type:"element",tagName:"span",properties:$R[12198]={style:"color:#BD976A"},children:$R[12199]=[$R[12200]={type:"text",value:" pass"}]},$R[12201]={type:"element",tagName:"span",properties:$R[12202]={style:"color:#666666"},children:$R[12203]=[$R[12204]={type:"text",value:"."}]},$R[12205]={type:"element",tagName:"span",properties:$R[12206]={style:"color:#BD976A"},children:$R[12207]=[$R[12208]={type:"text",value:"opts"}]}]},$R[12209]={type:"text",value:"\n"},$R[12210]={type:"element",tagName:"span",properties:$R[12211]={class:"line"},children:$R[12212]=[$R[12213]={type:"element",tagName:"span",properties:$R[12214]={style:"color:#666666"},children:$R[12215]=[$R[12216]={type:"text",value:" );"}]}]},$R[12217]={type:"text",value:"\n"},$R[12218]={type:"element",tagName:"span",properties:$R[12219]={class:"line"},children:$R[12220]=[$R[12221]={type:"element",tagName:"span",properties:$R[12222]={style:"color:#4D9375"},children:$R[12223]=[$R[12224]={type:"text",value:" if"}]},$R[12225]={type:"element",tagName:"span",properties:$R[12226]={style:"color:#666666"},children:$R[12227]=[$R[12228]={type:"text",value:" ("}]},$R[12229]={type:"element",tagName:"span",properties:$R[12230]={style:"color:#BD976A"},children:$R[12231]=[$R[12232]={type:"text",value:"useNoForget"}]},$R[12233]={type:"element",tagName:"span",properties:$R[12234]={style:"color:#CB7676"},children:$R[12235]=[$R[12236]={type:"text",value:" !="}]},$R[12237]={type:"element",tagName:"span",properties:$R[12238]={style:"color:#CB7676"},children:$R[12239]=[$R[12240]={type:"text",value:" null"}]},$R[12241]={type:"element",tagName:"span",properties:$R[12242]={style:"color:#666666"},children:$R[12243]=[$R[12244]={type:"text",value:")"}]},$R[12245]={type:"element",tagName:"span",properties:$R[12246]={style:"color:#666666"},children:$R[12247]=[$R[12248]={type:"text",value:" {"}]}]},$R[12249]={type:"text",value:"\n"},$R[12250]={type:"element",tagName:"span",properties:$R[12251]={class:"line"},children:$R[12252]=[$R[12253]={type:"element",tagName:"span",properties:$R[12254]={style:"color:#BD976A"},children:$R[12255]=[$R[12256]={type:"text",value:" pass"}]},$R[12257]={type:"element",tagName:"span",properties:$R[12258]={style:"color:#666666"},children:$R[12259]=[$R[12260]={type:"text",value:"."}]},$R[12261]={type:"element",tagName:"span",properties:$R[12262]={style:"color:#BD976A"},children:$R[12263]=[$R[12264]={type:"text",value:"opts"}]},$R[12265]={type:"element",tagName:"span",properties:$R[12266]={style:"color:#666666"},children:$R[12267]=[$R[12268]={type:"text",value:"."}]},$R[12269]={type:"element",tagName:"span",properties:$R[12270]={style:"color:#BD976A"},children:$R[12271]=[$R[12272]={type:"text",value:"logger"}]},$R[12273]={type:"element",tagName:"span",properties:$R[12274]={style:"color:#666666"},children:$R[12275]=[$R[12276]={type:"text",value:"?."}]},$R[12277]={type:"element",tagName:"span",properties:$R[12278]={style:"color:#80A665"},children:$R[12279]=[$R[12280]={type:"text",value:"logEvent"}]},$R[12281]={type:"element",tagName:"span",properties:$R[12282]={style:"color:#666666"},children:$R[12283]=[$R[12284]={type:"text",value:"("}]},$R[12285]={type:"element",tagName:"span",properties:$R[12286]={style:"color:#BD976A"},children:$R[12287]=[$R[12288]={type:"text",value:"pass"}]},$R[12289]={type:"element",tagName:"span",properties:$R[12290]={style:"color:#666666"},children:$R[12291]=[$R[12292]={type:"text",value:"."}]},$R[12293]={type:"element",tagName:"span",properties:$R[12294]={style:"color:#BD976A"},children:$R[12295]=[$R[12296]={type:"text",value:"filename"}]},$R[12297]={type:"element",tagName:"span",properties:$R[12298]={style:"color:#666666"},children:$R[12299]=[$R[12300]={type:"text",value:","}]},$R[12301]={type:"element",tagName:"span",properties:$R[12302]={style:"color:#666666"},children:$R[12303]=[$R[12304]={type:"text",value:" {"}]}]},$R[12305]={type:"text",value:"\n"},$R[12306]={type:"element",tagName:"span",properties:$R[12307]={class:"line"},children:$R[12308]=[$R[12309]={type:"element",tagName:"span",properties:$R[12310]={style:"color:#B8A965"},children:$R[12311]=[$R[12312]={type:"text",value:" kind"}]},$R[12313]={type:"element",tagName:"span",properties:$R[12314]={style:"color:#666666"},children:$R[12315]=[$R[12316]={type:"text",value:": "}]},$R[12317]={type:"element",tagName:"span",properties:$R[12318]={style:"color:#C98A7D77"},children:$R[12319]=[$R[12320]={type:"text",value:"\""}]},$R[12321]={type:"element",tagName:"span",properties:$R[12322]={style:"color:#C98A7D"},children:$R[12323]=[$R[12324]={type:"text",value:"CompileError"}]},$R[12325]={type:"element",tagName:"span",properties:$R[12326]={style:"color:#C98A7D77"},children:$R[12327]=[$R[12328]={type:"text",value:"\""}]},$R[12329]={type:"element",tagName:"span",properties:$R[12330]={style:"color:#666666"},children:$R[12331]=[$R[12332]={type:"text",value:","}]}]},$R[12333]={type:"text",value:"\n"},$R[12334]={type:"element",tagName:"span",properties:$R[12335]={class:"line"},children:$R[12336]=[$R[12337]={type:"element",tagName:"span",properties:$R[12338]={style:"color:#B8A965"},children:$R[12339]=[$R[12340]={type:"text",value:" fnLoc"}]},$R[12341]={type:"element",tagName:"span",properties:$R[12342]={style:"color:#666666"},children:$R[12343]=[$R[12344]={type:"text",value:": "}]},$R[12345]={type:"element",tagName:"span",properties:$R[12346]={style:"color:#BD976A"},children:$R[12347]=[$R[12348]={type:"text",value:"fn"}]},$R[12349]={type:"element",tagName:"span",properties:$R[12350]={style:"color:#666666"},children:$R[12351]=[$R[12352]={type:"text",value:"."}]},$R[12353]={type:"element",tagName:"span",properties:$R[12354]={style:"color:#BD976A"},children:$R[12355]=[$R[12356]={type:"text",value:"node"}]},$R[12357]={type:"element",tagName:"span",properties:$R[12358]={style:"color:#666666"},children:$R[12359]=[$R[12360]={type:"text",value:"."}]},$R[12361]={type:"element",tagName:"span",properties:$R[12362]={style:"color:#BD976A"},children:$R[12363]=[$R[12364]={type:"text",value:"body"}]},$R[12365]={type:"element",tagName:"span",properties:$R[12366]={style:"color:#666666"},children:$R[12367]=[$R[12368]={type:"text",value:"."}]},$R[12369]={type:"element",tagName:"span",properties:$R[12370]={style:"color:#BD976A"},children:$R[12371]=[$R[12372]={type:"text",value:"loc"}]},$R[12373]={type:"element",tagName:"span",properties:$R[12374]={style:"color:#CB7676"},children:$R[12375]=[$R[12376]={type:"text",value:" ??"}]},$R[12377]={type:"element",tagName:"span",properties:$R[12378]={style:"color:#CB7676"},children:$R[12379]=[$R[12380]={type:"text",value:" null"}]},$R[12381]={type:"element",tagName:"span",properties:$R[12382]={style:"color:#666666"},children:$R[12383]=[$R[12384]={type:"text",value:","}]}]},$R[12385]={type:"text",value:"\n"},$R[12386]={type:"element",tagName:"span",properties:$R[12387]={class:"line"},children:$R[12388]=[$R[12389]={type:"element",tagName:"span",properties:$R[12390]={style:"color:#B8A965"},children:$R[12391]=[$R[12392]={type:"text",value:" detail"}]},$R[12393]={type:"element",tagName:"span",properties:$R[12394]={style:"color:#666666"},children:$R[12395]=[$R[12396]={type:"text",value:": {"}]}]},$R[12397]={type:"text",value:"\n"},$R[12398]={type:"element",tagName:"span",properties:$R[12399]={class:"line"},children:$R[12400]=[$R[12401]={type:"element",tagName:"span",properties:$R[12402]={style:"color:#B8A965"},children:$R[12403]=[$R[12404]={type:"text",value:" severity"}]},$R[12405]={type:"element",tagName:"span",properties:$R[12406]={style:"color:#666666"},children:$R[12407]=[$R[12408]={type:"text",value:": "}]},$R[12409]={type:"element",tagName:"span",properties:$R[12410]={style:"color:#BD976A"},children:$R[12411]=[$R[12412]={type:"text",value:"ErrorSeverity"}]},$R[12413]={type:"element",tagName:"span",properties:$R[12414]={style:"color:#666666"},children:$R[12415]=[$R[12416]={type:"text",value:"."}]},$R[12417]={type:"element",tagName:"span",properties:$R[12418]={style:"color:#BD976A"},children:$R[12419]=[$R[12420]={type:"text",value:"Todo"}]},$R[12421]={type:"element",tagName:"span",properties:$R[12422]={style:"color:#666666"},children:$R[12423]=[$R[12424]={type:"text",value:","}]}]},$R[12425]={type:"text",value:"\n"},$R[12426]={type:"element",tagName:"span",properties:$R[12427]={class:"line"},children:$R[12428]=[$R[12429]={type:"element",tagName:"span",properties:$R[12430]={style:"color:#B8A965"},children:$R[12431]=[$R[12432]={type:"text",value:" reason"}]},$R[12433]={type:"element",tagName:"span",properties:$R[12434]={style:"color:#666666"},children:$R[12435]=[$R[12436]={type:"text",value:": "}]},$R[12437]={type:"element",tagName:"span",properties:$R[12438]={style:"color:#C98A7D77"},children:$R[12439]=[$R[12440]={type:"text",value:"'"}]},$R[12441]={type:"element",tagName:"span",properties:$R[12442]={style:"color:#C98A7D"},children:$R[12443]=[$R[12444]={type:"text",value:"Skipped due to \"use no forget\" directive."}]},$R[12445]={type:"element",tagName:"span",properties:$R[12446]={style:"color:#C98A7D77"},children:$R[12447]=[$R[12448]={type:"text",value:"'"}]},$R[12449]={type:"element",tagName:"span",properties:$R[12450]={style:"color:#666666"},children:$R[12451]=[$R[12452]={type:"text",value:","}]}]},$R[12453]={type:"text",value:"\n"},$R[12454]={type:"element",tagName:"span",properties:$R[12455]={class:"line"},children:$R[12456]=[$R[12457]={type:"element",tagName:"span",properties:$R[12458]={style:"color:#B8A965"},children:$R[12459]=[$R[12460]={type:"text",value:" loc"}]},$R[12461]={type:"element",tagName:"span",properties:$R[12462]={style:"color:#666666"},children:$R[12463]=[$R[12464]={type:"text",value:": "}]},$R[12465]={type:"element",tagName:"span",properties:$R[12466]={style:"color:#BD976A"},children:$R[12467]=[$R[12468]={type:"text",value:"useNoForget"}]},$R[12469]={type:"element",tagName:"span",properties:$R[12470]={style:"color:#666666"},children:$R[12471]=[$R[12472]={type:"text",value:"."}]},$R[12473]={type:"element",tagName:"span",properties:$R[12474]={style:"color:#BD976A"},children:$R[12475]=[$R[12476]={type:"text",value:"loc"}]},$R[12477]={type:"element",tagName:"span",properties:$R[12478]={style:"color:#CB7676"},children:$R[12479]=[$R[12480]={type:"text",value:" ??"}]},$R[12481]={type:"element",tagName:"span",properties:$R[12482]={style:"color:#CB7676"},children:$R[12483]=[$R[12484]={type:"text",value:" null"}]},$R[12485]={type:"element",tagName:"span",properties:$R[12486]={style:"color:#666666"},children:$R[12487]=[$R[12488]={type:"text",value:","}]}]},$R[12489]={type:"text",value:"\n"},$R[12490]={type:"element",tagName:"span",properties:$R[12491]={class:"line"},children:$R[12492]=[$R[12493]={type:"element",tagName:"span",properties:$R[12494]={style:"color:#B8A965"},children:$R[12495]=[$R[12496]={type:"text",value:" suggestions"}]},$R[12497]={type:"element",tagName:"span",properties:$R[12498]={style:"color:#666666"},children:$R[12499]=[$R[12500]={type:"text",value:": "}]},$R[12501]={type:"element",tagName:"span",properties:$R[12502]={style:"color:#CB7676"},children:$R[12503]=[$R[12504]={type:"text",value:"null"}]},$R[12505]={type:"element",tagName:"span",properties:$R[12506]={style:"color:#666666"},children:$R[12507]=[$R[12508]={type:"text",value:","}]}]},$R[12509]={type:"text",value:"\n"},$R[12510]={type:"element",tagName:"span",properties:$R[12511]={class:"line"},children:$R[12512]=[$R[12513]={type:"element",tagName:"span",properties:$R[12514]={style:"color:#666666"},children:$R[12515]=[$R[12516]={type:"text",value:" },"}]}]},$R[12517]={type:"text",value:"\n"},$R[12518]={type:"element",tagName:"span",properties:$R[12519]={class:"line"},children:$R[12520]=[$R[12521]={type:"element",tagName:"span",properties:$R[12522]={style:"color:#666666"},children:$R[12523]=[$R[12524]={type:"text",value:" });"}]}]},$R[12525]={type:"text",value:"\n"},$R[12526]={type:"element",tagName:"span",properties:$R[12527]={class:"line"},children:$R[12528]=[$R[12529]={type:"element",tagName:"span",properties:$R[12530]={style:"color:#4D9375"},children:$R[12531]=[$R[12532]={type:"text",value:" return"}]},$R[12533]={type:"element",tagName:"span",properties:$R[12534]={style:"color:#CB7676"},children:$R[12535]=[$R[12536]={type:"text",value:" null"}]},$R[12537]={type:"element",tagName:"span",properties:$R[12538]={style:"color:#666666"},children:$R[12539]=[$R[12540]={type:"text",value:";"}]}]},$R[12541]={type:"text",value:"\n"},$R[12542]={type:"element",tagName:"span",properties:$R[12543]={class:"line"},children:$R[12544]=[$R[12545]={type:"element",tagName:"span",properties:$R[12546]={style:"color:#666666"},children:$R[12547]=[$R[12548]={type:"text",value:" }"}]}]}]}]}]}},$R[12549]={meta:$R[12550]={title:"react/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts at d77dd31a329df55a051800fc76668af8da8332b4 · facebook/react · GitHub",description:"The library for web and native user interfaces. Contribute to facebook/react development by creating an account on GitHub.",twitter_card:$R[12551]={images:$R[12552]=[$R[12553]={url:"https://opengraph.githubassets.com/42acbb3fec132253a9fe0fbe818ffd2fc796f89a9f13a5bad27fb17afe797e47/facebook/react"}],site:"@github",card:"summary_large_image",title:"react/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts at d77dd31a329df55a051800fc76668af8da8332b4 · facebook/react",description:"The library for web and native user interfaces. Contribute to facebook/react development by creating an account on GitHub."},open_graph:$R[12554]={images:$R[12555]=[$R[12556]={url:"https://opengraph.githubassets.com/42acbb3fec132253a9fe0fbe818ffd2fc796f89a9f13a5bad27fb17afe797e47/facebook/react",alt:"The library for web and native user interfaces. Contribute to facebook/react development by creating an account on GitHub.",width:1200,height:600}],site_name:"GitHub",type:"object",title:"react/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts at d77dd31a329df55a051800fc76668af8da8332b4 · facebook/react",url:"https://github.com/facebook/react/blob/d77dd31a329df55a051800fc76668af8da8332b4/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts",description:"The library for web and native user interfaces. Contribute to facebook/react development by creating an account on GitHub."},theme_color:"#1e2327",favicon:"https://github.githubassets.com/favicons/favicon.svg"},oembed:void 0,position:$R[12557]={start:$R[12558]={line:100,column:1,offset:3793},end:$R[12559]={line:100,column:162,offset:3954}},src:"https://github.com/facebook/react/blob/d77dd31a329df55a051800fc76668af8da8332b4/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts#L478-L493",type:"embed"}],position:$R[12560]={end:$R[12561]={line:100,column:162,offset:3954},start:$R[12562]={line:50,column:1,offset:2116}},type:"section"},$R[12563]={children:$R[12564]=[$R[12565]={children:$R[12566]=[$R[12567]={position:$R[12568]={start:$R[12569]={line:102,column:5,offset:3960},end:$R[12570]={line:102,column:22,offset:3977}},type:"text",value:"ESLint v9との関係と使い方"}],id:"eslint-v9との関係と使い方",level:3,plain:"ESLint v9との関係と使い方",position:$R[12571]={start:$R[12572]={line:102,column:1,offset:3956},end:$R[12573]={line:102,column:22,offset:3977}},type:"heading"},$R[12574]={children:$R[12575]=[$R[12576]={position:$R[12577]={start:$R[12578]={line:104,column:1,offset:3979},end:$R[12579]={line:104,column:5,offset:3983}},type:"text",value:"前項で "},$R[12580]={position:$R[12581]={start:$R[12582]={line:104,column:5,offset:3983},end:$R[12583]={line:104,column:29,offset:4007}},type:"inlineCode",value:"eslintSuppressionRules"},$R[12584]={position:$R[12585]={start:$R[12586]={line:104,column:29,offset:4007},end:$R[12587]={line:104,column:74,offset:4052}},type:"text",value:" は React Compiler が正しく動作するための設定であることを述べた。他にも "},$R[12588]={position:$R[12589]={start:$R[12590]={line:104,column:74,offset:4052},end:$R[12591]={line:104,column:98,offset:4076}},type:"inlineCode",value:"eslintSuppressionRules"},$R[12592]={position:$R[12593]={start:$R[12594]={line:104,column:98,offset:4076},end:$R[12595]={line:104,column:133,offset:4111}},type:"text",value:" が必要な理由が無いか考えてると、次のような理由があることに気づいた。"}],position:$R[12596]={start:$R[12597]={line:104,column:1,offset:3979},end:$R[12598]={line:104,column:133,offset:4111}},type:"paragraph"},$R[12599]={children:$R[12600]=[$R[12601]={position:$R[12602]={start:$R[12603]={line:106,column:1,offset:4113},end:$R[12604]={line:106,column:83,offset:4195}},type:"text",value:"それは、ESLint v9 から stable となった flat config の仕様に関係している。flat config では次のようにプラグインを設定する。"}],position:$R[12605]={start:$R[12606]={line:106,column:1,offset:4113},end:$R[12607]={line:106,column:83,offset:4195}},type:"paragraph"},$R[12608]={filename:"eslint.config.js js",lang:"js",position:$R[12609]={start:$R[12610]={line:108,column:1,offset:4197},end:$R[12611]={line:129,column:4,offset:4521}},type:"code",value:"// @ts-check\n\nimport qwikPlugin from \"eslint-plugin-qwik\";\n\nexport default [\n\t{\n\t\tfiles: [\"src/**/*.tsx\"],\n\t\tplugins: {\n\t\t\tqwik: qwikPlugin,\n\t\t},\n\t\tlanguageOptions: {\n\t\t\tparserOptions: {\n\t\t\t\tproject: [\"./tsconfig.json\"],\n\t\t\t},\n\t\t},\n\t\trules: {\n\t\t\t...qwikPlugin.configs.recommended.rules,\n\t\t},\n\t}\n];",hast:$R[12612]={type:"root",children:$R[12613]=[$R[12614]={type:"element",tagName:"pre",properties:$R[12615]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[12616]=[$R[12617]={type:"element",tagName:"code",properties:$R[12618]={},children:$R[12619]=[$R[12620]={type:"element",tagName:"span",properties:$R[12621]={class:"line"},children:$R[12622]=[$R[12623]={type:"element",tagName:"span",properties:$R[12624]={style:"color:#758575DD"},children:$R[12625]=[$R[12626]={type:"text",value:"// @ts-check"}]}]},$R[12627]={type:"text",value:"\n"},$R[12628]={type:"element",tagName:"span",properties:$R[12629]={class:"line"},children:$R[12630]=[]},$R[12631]={type:"text",value:"\n"},$R[12632]={type:"element",tagName:"span",properties:$R[12633]={class:"line"},children:$R[12634]=[$R[12635]={type:"element",tagName:"span",properties:$R[12636]={style:"color:#4D9375"},children:$R[12637]=[$R[12638]={type:"text",value:"import"}]},$R[12639]={type:"element",tagName:"span",properties:$R[12640]={style:"color:#BD976A"},children:$R[12641]=[$R[12642]={type:"text",value:" qwikPlugin"}]},$R[12643]={type:"element",tagName:"span",properties:$R[12644]={style:"color:#4D9375"},children:$R[12645]=[$R[12646]={type:"text",value:" from"}]},$R[12647]={type:"element",tagName:"span",properties:$R[12648]={style:"color:#C98A7D77"},children:$R[12649]=[$R[12650]={type:"text",value:" \""}]},$R[12651]={type:"element",tagName:"span",properties:$R[12652]={style:"color:#C98A7D"},children:$R[12653]=[$R[12654]={type:"text",value:"eslint-plugin-qwik"}]},$R[12655]={type:"element",tagName:"span",properties:$R[12656]={style:"color:#C98A7D77"},children:$R[12657]=[$R[12658]={type:"text",value:"\""}]},$R[12659]={type:"element",tagName:"span",properties:$R[12660]={style:"color:#666666"},children:$R[12661]=[$R[12662]={type:"text",value:";"}]}]},$R[12663]={type:"text",value:"\n"},$R[12664]={type:"element",tagName:"span",properties:$R[12665]={class:"line"},children:$R[12666]=[]},$R[12667]={type:"text",value:"\n"},$R[12668]={type:"element",tagName:"span",properties:$R[12669]={class:"line"},children:$R[12670]=[$R[12671]={type:"element",tagName:"span",properties:$R[12672]={style:"color:#4D9375"},children:$R[12673]=[$R[12674]={type:"text",value:"export"}]},$R[12675]={type:"element",tagName:"span",properties:$R[12676]={style:"color:#4D9375"},children:$R[12677]=[$R[12678]={type:"text",value:" default"}]},$R[12679]={type:"element",tagName:"span",properties:$R[12680]={style:"color:#666666"},children:$R[12681]=[$R[12682]={type:"text",value:" ["}]}]},$R[12683]={type:"text",value:"\n"},$R[12684]={type:"element",tagName:"span",properties:$R[12685]={class:"line"},children:$R[12686]=[$R[12687]={type:"element",tagName:"span",properties:$R[12688]={style:"color:#666666"},children:$R[12689]=[$R[12690]={type:"text",value:"\t{"}]}]},$R[12691]={type:"text",value:"\n"},$R[12692]={type:"element",tagName:"span",properties:$R[12693]={class:"line"},children:$R[12694]=[$R[12695]={type:"element",tagName:"span",properties:$R[12696]={style:"color:#B8A965"},children:$R[12697]=[$R[12698]={type:"text",value:"\t\tfiles"}]},$R[12699]={type:"element",tagName:"span",properties:$R[12700]={style:"color:#666666"},children:$R[12701]=[$R[12702]={type:"text",value:":"}]},$R[12703]={type:"element",tagName:"span",properties:$R[12704]={style:"color:#666666"},children:$R[12705]=[$R[12706]={type:"text",value:" ["}]},$R[12707]={type:"element",tagName:"span",properties:$R[12708]={style:"color:#C98A7D77"},children:$R[12709]=[$R[12710]={type:"text",value:"\""}]},$R[12711]={type:"element",tagName:"span",properties:$R[12712]={style:"color:#C98A7D"},children:$R[12713]=[$R[12714]={type:"text",value:"src/**/*.tsx"}]},$R[12715]={type:"element",tagName:"span",properties:$R[12716]={style:"color:#C98A7D77"},children:$R[12717]=[$R[12718]={type:"text",value:"\""}]},$R[12719]={type:"element",tagName:"span",properties:$R[12720]={style:"color:#666666"},children:$R[12721]=[$R[12722]={type:"text",value:"],"}]}]},$R[12723]={type:"text",value:"\n"},$R[12724]={type:"element",tagName:"span",properties:$R[12725]={class:"line"},children:$R[12726]=[$R[12727]={type:"element",tagName:"span",properties:$R[12728]={style:"color:#B8A965"},children:$R[12729]=[$R[12730]={type:"text",value:"\t\tplugins"}]},$R[12731]={type:"element",tagName:"span",properties:$R[12732]={style:"color:#666666"},children:$R[12733]=[$R[12734]={type:"text",value:":"}]},$R[12735]={type:"element",tagName:"span",properties:$R[12736]={style:"color:#666666"},children:$R[12737]=[$R[12738]={type:"text",value:" {"}]}]},$R[12739]={type:"text",value:"\n"},$R[12740]={type:"element",tagName:"span",properties:$R[12741]={class:"line"},children:$R[12742]=[$R[12743]={type:"element",tagName:"span",properties:$R[12744]={style:"color:#B8A965"},children:$R[12745]=[$R[12746]={type:"text",value:"\t\t\tqwik"}]},$R[12747]={type:"element",tagName:"span",properties:$R[12748]={style:"color:#666666"},children:$R[12749]=[$R[12750]={type:"text",value:":"}]},$R[12751]={type:"element",tagName:"span",properties:$R[12752]={style:"color:#BD976A"},children:$R[12753]=[$R[12754]={type:"text",value:" qwikPlugin"}]},$R[12755]={type:"element",tagName:"span",properties:$R[12756]={style:"color:#666666"},children:$R[12757]=[$R[12758]={type:"text",value:","}]}]},$R[12759]={type:"text",value:"\n"},$R[12760]={type:"element",tagName:"span",properties:$R[12761]={class:"line"},children:$R[12762]=[$R[12763]={type:"element",tagName:"span",properties:$R[12764]={style:"color:#666666"},children:$R[12765]=[$R[12766]={type:"text",value:"\t\t},"}]}]},$R[12767]={type:"text",value:"\n"},$R[12768]={type:"element",tagName:"span",properties:$R[12769]={class:"line"},children:$R[12770]=[$R[12771]={type:"element",tagName:"span",properties:$R[12772]={style:"color:#B8A965"},children:$R[12773]=[$R[12774]={type:"text",value:"\t\tlanguageOptions"}]},$R[12775]={type:"element",tagName:"span",properties:$R[12776]={style:"color:#666666"},children:$R[12777]=[$R[12778]={type:"text",value:":"}]},$R[12779]={type:"element",tagName:"span",properties:$R[12780]={style:"color:#666666"},children:$R[12781]=[$R[12782]={type:"text",value:" {"}]}]},$R[12783]={type:"text",value:"\n"},$R[12784]={type:"element",tagName:"span",properties:$R[12785]={class:"line"},children:$R[12786]=[$R[12787]={type:"element",tagName:"span",properties:$R[12788]={style:"color:#B8A965"},children:$R[12789]=[$R[12790]={type:"text",value:"\t\t\tparserOptions"}]},$R[12791]={type:"element",tagName:"span",properties:$R[12792]={style:"color:#666666"},children:$R[12793]=[$R[12794]={type:"text",value:":"}]},$R[12795]={type:"element",tagName:"span",properties:$R[12796]={style:"color:#666666"},children:$R[12797]=[$R[12798]={type:"text",value:" {"}]}]},$R[12799]={type:"text",value:"\n"},$R[12800]={type:"element",tagName:"span",properties:$R[12801]={class:"line"},children:$R[12802]=[$R[12803]={type:"element",tagName:"span",properties:$R[12804]={style:"color:#B8A965"},children:$R[12805]=[$R[12806]={type:"text",value:"\t\t\t\tproject"}]},$R[12807]={type:"element",tagName:"span",properties:$R[12808]={style:"color:#666666"},children:$R[12809]=[$R[12810]={type:"text",value:":"}]},$R[12811]={type:"element",tagName:"span",properties:$R[12812]={style:"color:#666666"},children:$R[12813]=[$R[12814]={type:"text",value:" ["}]},$R[12815]={type:"element",tagName:"span",properties:$R[12816]={style:"color:#C98A7D77"},children:$R[12817]=[$R[12818]={type:"text",value:"\""}]},$R[12819]={type:"element",tagName:"span",properties:$R[12820]={style:"color:#C98A7D"},children:$R[12821]=[$R[12822]={type:"text",value:"./tsconfig.json"}]},$R[12823]={type:"element",tagName:"span",properties:$R[12824]={style:"color:#C98A7D77"},children:$R[12825]=[$R[12826]={type:"text",value:"\""}]},$R[12827]={type:"element",tagName:"span",properties:$R[12828]={style:"color:#666666"},children:$R[12829]=[$R[12830]={type:"text",value:"],"}]}]},$R[12831]={type:"text",value:"\n"},$R[12832]={type:"element",tagName:"span",properties:$R[12833]={class:"line"},children:$R[12834]=[$R[12835]={type:"element",tagName:"span",properties:$R[12836]={style:"color:#666666"},children:$R[12837]=[$R[12838]={type:"text",value:"\t\t\t},"}]}]},$R[12839]={type:"text",value:"\n"},$R[12840]={type:"element",tagName:"span",properties:$R[12841]={class:"line"},children:$R[12842]=[$R[12843]={type:"element",tagName:"span",properties:$R[12844]={style:"color:#666666"},children:$R[12845]=[$R[12846]={type:"text",value:"\t\t},"}]}]},$R[12847]={type:"text",value:"\n"},$R[12848]={type:"element",tagName:"span",properties:$R[12849]={class:"line"},children:$R[12850]=[$R[12851]={type:"element",tagName:"span",properties:$R[12852]={style:"color:#B8A965"},children:$R[12853]=[$R[12854]={type:"text",value:"\t\trules"}]},$R[12855]={type:"element",tagName:"span",properties:$R[12856]={style:"color:#666666"},children:$R[12857]=[$R[12858]={type:"text",value:":"}]},$R[12859]={type:"element",tagName:"span",properties:$R[12860]={style:"color:#666666"},children:$R[12861]=[$R[12862]={type:"text",value:" {"}]}]},$R[12863]={type:"text",value:"\n"},$R[12864]={type:"element",tagName:"span",properties:$R[12865]={class:"line"},children:$R[12866]=[$R[12867]={type:"element",tagName:"span",properties:$R[12868]={style:"color:#666666"},children:$R[12869]=[$R[12870]={type:"text",value:"\t\t\t..."}]},$R[12871]={type:"element",tagName:"span",properties:$R[12872]={style:"color:#BD976A"},children:$R[12873]=[$R[12874]={type:"text",value:"qwikPlugin"}]},$R[12875]={type:"element",tagName:"span",properties:$R[12876]={style:"color:#666666"},children:$R[12877]=[$R[12878]={type:"text",value:"."}]},$R[12879]={type:"element",tagName:"span",properties:$R[12880]={style:"color:#BD976A"},children:$R[12881]=[$R[12882]={type:"text",value:"configs"}]},$R[12883]={type:"element",tagName:"span",properties:$R[12884]={style:"color:#666666"},children:$R[12885]=[$R[12886]={type:"text",value:"."}]},$R[12887]={type:"element",tagName:"span",properties:$R[12888]={style:"color:#BD976A"},children:$R[12889]=[$R[12890]={type:"text",value:"recommended"}]},$R[12891]={type:"element",tagName:"span",properties:$R[12892]={style:"color:#666666"},children:$R[12893]=[$R[12894]={type:"text",value:"."}]},$R[12895]={type:"element",tagName:"span",properties:$R[12896]={style:"color:#BD976A"},children:$R[12897]=[$R[12898]={type:"text",value:"rules"}]},$R[12899]={type:"element",tagName:"span",properties:$R[12900]={style:"color:#666666"},children:$R[12901]=[$R[12902]={type:"text",value:","}]}]},$R[12903]={type:"text",value:"\n"},$R[12904]={type:"element",tagName:"span",properties:$R[12905]={class:"line"},children:$R[12906]=[$R[12907]={type:"element",tagName:"span",properties:$R[12908]={style:"color:#666666"},children:$R[12909]=[$R[12910]={type:"text",value:"\t\t},"}]}]},$R[12911]={type:"text",value:"\n"},$R[12912]={type:"element",tagName:"span",properties:$R[12913]={class:"line"},children:$R[12914]=[$R[12915]={type:"element",tagName:"span",properties:$R[12916]={style:"color:#666666"},children:$R[12917]=[$R[12918]={type:"text",value:"\t}"}]}]},$R[12919]={type:"text",value:"\n"},$R[12920]={type:"element",tagName:"span",properties:$R[12921]={class:"line"},children:$R[12922]=[$R[12923]={type:"element",tagName:"span",properties:$R[12924]={style:"color:#666666"},children:$R[12925]=[$R[12926]={type:"text",value:"];"}]}]}]}]}]}},$R[12927]={children:$R[12928]=[$R[12929]={position:$R[12930]={start:$R[12931]={line:131,column:1,offset:4523},end:$R[12932]={line:131,column:11,offset:4533}},type:"text",value:"注目してほしいのは "},$R[12933]={position:$R[12934]={start:$R[12935]={line:131,column:11,offset:4533},end:$R[12936]={line:131,column:20,offset:4542}},type:"inlineCode",value:"plugins"},$R[12937]={position:$R[12938]={start:$R[12939]={line:131,column:20,offset:4542},end:$R[12940]={line:131,column:76,offset:4598}},type:"text",value:" の部分である。ここで各ユーザーがプラグインのプレフィックスを設定している。つまり以下のような設定が可能である。"}],position:$R[12941]={start:$R[12942]={line:131,column:1,offset:4523},end:$R[12943]={line:131,column:76,offset:4598}},type:"paragraph"},$R[12944]={filename:"eslint.config.js js",lang:"js",position:$R[12945]={start:$R[12946]={line:133,column:1,offset:4600},end:$R[12947]={line:165,column:4,offset:5141}},type:"code",value:"// @ts-check\n\nimport reactHooks from \"eslint-plugin-react-hooks\";\nimport globals from \"globals\";\n\nexport default [\n\t// ... some settings\n\n\t{\n\t\tfiles: [\"**/*.{js,jsx,mjs,cjs,ts,tsx}\"],\n\t\tplugins: {\n\t\t\tr: reactHooks,\n\t\t},\n\t\tlanguageOptions: {\n\t\t\tparserOptions: {\n\t\t\t\tecmaFeatures: {\n\t\t\t\t\tjsx: true,\n\t\t\t\t},\n\t\t\t},\n\t\t\tglobals: {\n\t\t\t\t...globals.browser,\n\t\t\t},\n\t\t},\n\t\trules: {\n\t\t\t// ... any rules you want\n\t\t\t\"r/exhaustive-deps\": \"error\",\n\t\t\t\"r/rules-of-hooks\": \"error\",\n\t\t},\n\t\t// ... others are omitted for brevity\n\t}\n];",hast:$R[12948]={type:"root",children:$R[12949]=[$R[12950]={type:"element",tagName:"pre",properties:$R[12951]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[12952]=[$R[12953]={type:"element",tagName:"code",properties:$R[12954]={},children:$R[12955]=[$R[12956]={type:"element",tagName:"span",properties:$R[12957]={class:"line"},children:$R[12958]=[$R[12959]={type:"element",tagName:"span",properties:$R[12960]={style:"color:#758575DD"},children:$R[12961]=[$R[12962]={type:"text",value:"// @ts-check"}]}]},$R[12963]={type:"text",value:"\n"},$R[12964]={type:"element",tagName:"span",properties:$R[12965]={class:"line"},children:$R[12966]=[]},$R[12967]={type:"text",value:"\n"},$R[12968]={type:"element",tagName:"span",properties:$R[12969]={class:"line"},children:$R[12970]=[$R[12971]={type:"element",tagName:"span",properties:$R[12972]={style:"color:#4D9375"},children:$R[12973]=[$R[12974]={type:"text",value:"import"}]},$R[12975]={type:"element",tagName:"span",properties:$R[12976]={style:"color:#BD976A"},children:$R[12977]=[$R[12978]={type:"text",value:" reactHooks"}]},$R[12979]={type:"element",tagName:"span",properties:$R[12980]={style:"color:#4D9375"},children:$R[12981]=[$R[12982]={type:"text",value:" from"}]},$R[12983]={type:"element",tagName:"span",properties:$R[12984]={style:"color:#C98A7D77"},children:$R[12985]=[$R[12986]={type:"text",value:" \""}]},$R[12987]={type:"element",tagName:"span",properties:$R[12988]={style:"color:#C98A7D"},children:$R[12989]=[$R[12990]={type:"text",value:"eslint-plugin-react-hooks"}]},$R[12991]={type:"element",tagName:"span",properties:$R[12992]={style:"color:#C98A7D77"},children:$R[12993]=[$R[12994]={type:"text",value:"\""}]},$R[12995]={type:"element",tagName:"span",properties:$R[12996]={style:"color:#666666"},children:$R[12997]=[$R[12998]={type:"text",value:";"}]}]},$R[12999]={type:"text",value:"\n"},$R[13000]={type:"element",tagName:"span",properties:$R[13001]={class:"line"},children:$R[13002]=[$R[13003]={type:"element",tagName:"span",properties:$R[13004]={style:"color:#4D9375"},children:$R[13005]=[$R[13006]={type:"text",value:"import"}]},$R[13007]={type:"element",tagName:"span",properties:$R[13008]={style:"color:#BD976A"},children:$R[13009]=[$R[13010]={type:"text",value:" globals"}]},$R[13011]={type:"element",tagName:"span",properties:$R[13012]={style:"color:#4D9375"},children:$R[13013]=[$R[13014]={type:"text",value:" from"}]},$R[13015]={type:"element",tagName:"span",properties:$R[13016]={style:"color:#C98A7D77"},children:$R[13017]=[$R[13018]={type:"text",value:" \""}]},$R[13019]={type:"element",tagName:"span",properties:$R[13020]={style:"color:#C98A7D"},children:$R[13021]=[$R[13022]={type:"text",value:"globals"}]},$R[13023]={type:"element",tagName:"span",properties:$R[13024]={style:"color:#C98A7D77"},children:$R[13025]=[$R[13026]={type:"text",value:"\""}]},$R[13027]={type:"element",tagName:"span",properties:$R[13028]={style:"color:#666666"},children:$R[13029]=[$R[13030]={type:"text",value:";"}]}]},$R[13031]={type:"text",value:"\n"},$R[13032]={type:"element",tagName:"span",properties:$R[13033]={class:"line"},children:$R[13034]=[]},$R[13035]={type:"text",value:"\n"},$R[13036]={type:"element",tagName:"span",properties:$R[13037]={class:"line"},children:$R[13038]=[$R[13039]={type:"element",tagName:"span",properties:$R[13040]={style:"color:#4D9375"},children:$R[13041]=[$R[13042]={type:"text",value:"export"}]},$R[13043]={type:"element",tagName:"span",properties:$R[13044]={style:"color:#4D9375"},children:$R[13045]=[$R[13046]={type:"text",value:" default"}]},$R[13047]={type:"element",tagName:"span",properties:$R[13048]={style:"color:#666666"},children:$R[13049]=[$R[13050]={type:"text",value:" ["}]}]},$R[13051]={type:"text",value:"\n"},$R[13052]={type:"element",tagName:"span",properties:$R[13053]={class:"line"},children:$R[13054]=[$R[13055]={type:"element",tagName:"span",properties:$R[13056]={style:"color:#758575DD"},children:$R[13057]=[$R[13058]={type:"text",value:"\t// ... some settings"}]}]},$R[13059]={type:"text",value:"\n"},$R[13060]={type:"element",tagName:"span",properties:$R[13061]={class:"line"},children:$R[13062]=[]},$R[13063]={type:"text",value:"\n"},$R[13064]={type:"element",tagName:"span",properties:$R[13065]={class:"line"},children:$R[13066]=[$R[13067]={type:"element",tagName:"span",properties:$R[13068]={style:"color:#666666"},children:$R[13069]=[$R[13070]={type:"text",value:"\t{"}]}]},$R[13071]={type:"text",value:"\n"},$R[13072]={type:"element",tagName:"span",properties:$R[13073]={class:"line"},children:$R[13074]=[$R[13075]={type:"element",tagName:"span",properties:$R[13076]={style:"color:#B8A965"},children:$R[13077]=[$R[13078]={type:"text",value:"\t\tfiles"}]},$R[13079]={type:"element",tagName:"span",properties:$R[13080]={style:"color:#666666"},children:$R[13081]=[$R[13082]={type:"text",value:":"}]},$R[13083]={type:"element",tagName:"span",properties:$R[13084]={style:"color:#666666"},children:$R[13085]=[$R[13086]={type:"text",value:" ["}]},$R[13087]={type:"element",tagName:"span",properties:$R[13088]={style:"color:#C98A7D77"},children:$R[13089]=[$R[13090]={type:"text",value:"\""}]},$R[13091]={type:"element",tagName:"span",properties:$R[13092]={style:"color:#C98A7D"},children:$R[13093]=[$R[13094]={type:"text",value:"**/*.{js,jsx,mjs,cjs,ts,tsx}"}]},$R[13095]={type:"element",tagName:"span",properties:$R[13096]={style:"color:#C98A7D77"},children:$R[13097]=[$R[13098]={type:"text",value:"\""}]},$R[13099]={type:"element",tagName:"span",properties:$R[13100]={style:"color:#666666"},children:$R[13101]=[$R[13102]={type:"text",value:"],"}]}]},$R[13103]={type:"text",value:"\n"},$R[13104]={type:"element",tagName:"span",properties:$R[13105]={class:"line"},children:$R[13106]=[$R[13107]={type:"element",tagName:"span",properties:$R[13108]={style:"color:#B8A965"},children:$R[13109]=[$R[13110]={type:"text",value:"\t\tplugins"}]},$R[13111]={type:"element",tagName:"span",properties:$R[13112]={style:"color:#666666"},children:$R[13113]=[$R[13114]={type:"text",value:":"}]},$R[13115]={type:"element",tagName:"span",properties:$R[13116]={style:"color:#666666"},children:$R[13117]=[$R[13118]={type:"text",value:" {"}]}]},$R[13119]={type:"text",value:"\n"},$R[13120]={type:"element",tagName:"span",properties:$R[13121]={class:"line"},children:$R[13122]=[$R[13123]={type:"element",tagName:"span",properties:$R[13124]={style:"color:#B8A965"},children:$R[13125]=[$R[13126]={type:"text",value:"\t\t\tr"}]},$R[13127]={type:"element",tagName:"span",properties:$R[13128]={style:"color:#666666"},children:$R[13129]=[$R[13130]={type:"text",value:":"}]},$R[13131]={type:"element",tagName:"span",properties:$R[13132]={style:"color:#BD976A"},children:$R[13133]=[$R[13134]={type:"text",value:" reactHooks"}]},$R[13135]={type:"element",tagName:"span",properties:$R[13136]={style:"color:#666666"},children:$R[13137]=[$R[13138]={type:"text",value:","}]}]},$R[13139]={type:"text",value:"\n"},$R[13140]={type:"element",tagName:"span",properties:$R[13141]={class:"line"},children:$R[13142]=[$R[13143]={type:"element",tagName:"span",properties:$R[13144]={style:"color:#666666"},children:$R[13145]=[$R[13146]={type:"text",value:"\t\t},"}]}]},$R[13147]={type:"text",value:"\n"},$R[13148]={type:"element",tagName:"span",properties:$R[13149]={class:"line"},children:$R[13150]=[$R[13151]={type:"element",tagName:"span",properties:$R[13152]={style:"color:#B8A965"},children:$R[13153]=[$R[13154]={type:"text",value:"\t\tlanguageOptions"}]},$R[13155]={type:"element",tagName:"span",properties:$R[13156]={style:"color:#666666"},children:$R[13157]=[$R[13158]={type:"text",value:":"}]},$R[13159]={type:"element",tagName:"span",properties:$R[13160]={style:"color:#666666"},children:$R[13161]=[$R[13162]={type:"text",value:" {"}]}]},$R[13163]={type:"text",value:"\n"},$R[13164]={type:"element",tagName:"span",properties:$R[13165]={class:"line"},children:$R[13166]=[$R[13167]={type:"element",tagName:"span",properties:$R[13168]={style:"color:#B8A965"},children:$R[13169]=[$R[13170]={type:"text",value:"\t\t\tparserOptions"}]},$R[13171]={type:"element",tagName:"span",properties:$R[13172]={style:"color:#666666"},children:$R[13173]=[$R[13174]={type:"text",value:":"}]},$R[13175]={type:"element",tagName:"span",properties:$R[13176]={style:"color:#666666"},children:$R[13177]=[$R[13178]={type:"text",value:" {"}]}]},$R[13179]={type:"text",value:"\n"},$R[13180]={type:"element",tagName:"span",properties:$R[13181]={class:"line"},children:$R[13182]=[$R[13183]={type:"element",tagName:"span",properties:$R[13184]={style:"color:#B8A965"},children:$R[13185]=[$R[13186]={type:"text",value:"\t\t\t\tecmaFeatures"}]},$R[13187]={type:"element",tagName:"span",properties:$R[13188]={style:"color:#666666"},children:$R[13189]=[$R[13190]={type:"text",value:":"}]},$R[13191]={type:"element",tagName:"span",properties:$R[13192]={style:"color:#666666"},children:$R[13193]=[$R[13194]={type:"text",value:" {"}]}]},$R[13195]={type:"text",value:"\n"},$R[13196]={type:"element",tagName:"span",properties:$R[13197]={class:"line"},children:$R[13198]=[$R[13199]={type:"element",tagName:"span",properties:$R[13200]={style:"color:#B8A965"},children:$R[13201]=[$R[13202]={type:"text",value:"\t\t\t\t\tjsx"}]},$R[13203]={type:"element",tagName:"span",properties:$R[13204]={style:"color:#666666"},children:$R[13205]=[$R[13206]={type:"text",value:":"}]},$R[13207]={type:"element",tagName:"span",properties:$R[13208]={style:"color:#4D9375"},children:$R[13209]=[$R[13210]={type:"text",value:" true"}]},$R[13211]={type:"element",tagName:"span",properties:$R[13212]={style:"color:#666666"},children:$R[13213]=[$R[13214]={type:"text",value:","}]}]},$R[13215]={type:"text",value:"\n"},$R[13216]={type:"element",tagName:"span",properties:$R[13217]={class:"line"},children:$R[13218]=[$R[13219]={type:"element",tagName:"span",properties:$R[13220]={style:"color:#666666"},children:$R[13221]=[$R[13222]={type:"text",value:"\t\t\t\t},"}]}]},$R[13223]={type:"text",value:"\n"},$R[13224]={type:"element",tagName:"span",properties:$R[13225]={class:"line"},children:$R[13226]=[$R[13227]={type:"element",tagName:"span",properties:$R[13228]={style:"color:#666666"},children:$R[13229]=[$R[13230]={type:"text",value:"\t\t\t},"}]}]},$R[13231]={type:"text",value:"\n"},$R[13232]={type:"element",tagName:"span",properties:$R[13233]={class:"line"},children:$R[13234]=[$R[13235]={type:"element",tagName:"span",properties:$R[13236]={style:"color:#B8A965"},children:$R[13237]=[$R[13238]={type:"text",value:"\t\t\tglobals"}]},$R[13239]={type:"element",tagName:"span",properties:$R[13240]={style:"color:#666666"},children:$R[13241]=[$R[13242]={type:"text",value:":"}]},$R[13243]={type:"element",tagName:"span",properties:$R[13244]={style:"color:#666666"},children:$R[13245]=[$R[13246]={type:"text",value:" {"}]}]},$R[13247]={type:"text",value:"\n"},$R[13248]={type:"element",tagName:"span",properties:$R[13249]={class:"line"},children:$R[13250]=[$R[13251]={type:"element",tagName:"span",properties:$R[13252]={style:"color:#666666"},children:$R[13253]=[$R[13254]={type:"text",value:"\t\t\t\t..."}]},$R[13255]={type:"element",tagName:"span",properties:$R[13256]={style:"color:#BD976A"},children:$R[13257]=[$R[13258]={type:"text",value:"globals"}]},$R[13259]={type:"element",tagName:"span",properties:$R[13260]={style:"color:#666666"},children:$R[13261]=[$R[13262]={type:"text",value:"."}]},$R[13263]={type:"element",tagName:"span",properties:$R[13264]={style:"color:#BD976A"},children:$R[13265]=[$R[13266]={type:"text",value:"browser"}]},$R[13267]={type:"element",tagName:"span",properties:$R[13268]={style:"color:#666666"},children:$R[13269]=[$R[13270]={type:"text",value:","}]}]},$R[13271]={type:"text",value:"\n"},$R[13272]={type:"element",tagName:"span",properties:$R[13273]={class:"line"},children:$R[13274]=[$R[13275]={type:"element",tagName:"span",properties:$R[13276]={style:"color:#666666"},children:$R[13277]=[$R[13278]={type:"text",value:"\t\t\t},"}]}]},$R[13279]={type:"text",value:"\n"},$R[13280]={type:"element",tagName:"span",properties:$R[13281]={class:"line"},children:$R[13282]=[$R[13283]={type:"element",tagName:"span",properties:$R[13284]={style:"color:#666666"},children:$R[13285]=[$R[13286]={type:"text",value:"\t\t},"}]}]},$R[13287]={type:"text",value:"\n"},$R[13288]={type:"element",tagName:"span",properties:$R[13289]={class:"line"},children:$R[13290]=[$R[13291]={type:"element",tagName:"span",properties:$R[13292]={style:"color:#B8A965"},children:$R[13293]=[$R[13294]={type:"text",value:"\t\trules"}]},$R[13295]={type:"element",tagName:"span",properties:$R[13296]={style:"color:#666666"},children:$R[13297]=[$R[13298]={type:"text",value:":"}]},$R[13299]={type:"element",tagName:"span",properties:$R[13300]={style:"color:#666666"},children:$R[13301]=[$R[13302]={type:"text",value:" {"}]}]},$R[13303]={type:"text",value:"\n"},$R[13304]={type:"element",tagName:"span",properties:$R[13305]={class:"line"},children:$R[13306]=[$R[13307]={type:"element",tagName:"span",properties:$R[13308]={style:"color:#758575DD"},children:$R[13309]=[$R[13310]={type:"text",value:"\t\t\t// ... any rules you want"}]}]},$R[13311]={type:"text",value:"\n"},$R[13312]={type:"element",tagName:"span",properties:$R[13313]={class:"line"},children:$R[13314]=[$R[13315]={type:"element",tagName:"span",properties:$R[13316]={style:"color:#C98A7D77"},children:$R[13317]=[$R[13318]={type:"text",value:"\t\t\t\""}]},$R[13319]={type:"element",tagName:"span",properties:$R[13320]={style:"color:#C98A7D"},children:$R[13321]=[$R[13322]={type:"text",value:"r/exhaustive-deps"}]},$R[13323]={type:"element",tagName:"span",properties:$R[13324]={style:"color:#C98A7D77"},children:$R[13325]=[$R[13326]={type:"text",value:"\""}]},$R[13327]={type:"element",tagName:"span",properties:$R[13328]={style:"color:#666666"},children:$R[13329]=[$R[13330]={type:"text",value:":"}]},$R[13331]={type:"element",tagName:"span",properties:$R[13332]={style:"color:#C98A7D77"},children:$R[13333]=[$R[13334]={type:"text",value:" \""}]},$R[13335]={type:"element",tagName:"span",properties:$R[13336]={style:"color:#C98A7D"},children:$R[13337]=[$R[13338]={type:"text",value:"error"}]},$R[13339]={type:"element",tagName:"span",properties:$R[13340]={style:"color:#C98A7D77"},children:$R[13341]=[$R[13342]={type:"text",value:"\""}]},$R[13343]={type:"element",tagName:"span",properties:$R[13344]={style:"color:#666666"},children:$R[13345]=[$R[13346]={type:"text",value:","}]}]},$R[13347]={type:"text",value:"\n"},$R[13348]={type:"element",tagName:"span",properties:$R[13349]={class:"line"},children:$R[13350]=[$R[13351]={type:"element",tagName:"span",properties:$R[13352]={style:"color:#C98A7D77"},children:$R[13353]=[$R[13354]={type:"text",value:"\t\t\t\""}]},$R[13355]={type:"element",tagName:"span",properties:$R[13356]={style:"color:#C98A7D"},children:$R[13357]=[$R[13358]={type:"text",value:"r/rules-of-hooks"}]},$R[13359]={type:"element",tagName:"span",properties:$R[13360]={style:"color:#C98A7D77"},children:$R[13361]=[$R[13362]={type:"text",value:"\""}]},$R[13363]={type:"element",tagName:"span",properties:$R[13364]={style:"color:#666666"},children:$R[13365]=[$R[13366]={type:"text",value:":"}]},$R[13367]={type:"element",tagName:"span",properties:$R[13368]={style:"color:#C98A7D77"},children:$R[13369]=[$R[13370]={type:"text",value:" \""}]},$R[13371]={type:"element",tagName:"span",properties:$R[13372]={style:"color:#C98A7D"},children:$R[13373]=[$R[13374]={type:"text",value:"error"}]},$R[13375]={type:"element",tagName:"span",properties:$R[13376]={style:"color:#C98A7D77"},children:$R[13377]=[$R[13378]={type:"text",value:"\""}]},$R[13379]={type:"element",tagName:"span",properties:$R[13380]={style:"color:#666666"},children:$R[13381]=[$R[13382]={type:"text",value:","}]}]},$R[13383]={type:"text",value:"\n"},$R[13384]={type:"element",tagName:"span",properties:$R[13385]={class:"line"},children:$R[13386]=[$R[13387]={type:"element",tagName:"span",properties:$R[13388]={style:"color:#666666"},children:$R[13389]=[$R[13390]={type:"text",value:"\t\t},"}]}]},$R[13391]={type:"text",value:"\n"},$R[13392]={type:"element",tagName:"span",properties:$R[13393]={class:"line"},children:$R[13394]=[$R[13395]={type:"element",tagName:"span",properties:$R[13396]={style:"color:#758575DD"},children:$R[13397]=[$R[13398]={type:"text",value:"\t\t// ... others are omitted for brevity"}]}]},$R[13399]={type:"text",value:"\n"},$R[13400]={type:"element",tagName:"span",properties:$R[13401]={class:"line"},children:$R[13402]=[$R[13403]={type:"element",tagName:"span",properties:$R[13404]={style:"color:#666666"},children:$R[13405]=[$R[13406]={type:"text",value:"\t}"}]}]},$R[13407]={type:"text",value:"\n"},$R[13408]={type:"element",tagName:"span",properties:$R[13409]={class:"line"},children:$R[13410]=[$R[13411]={type:"element",tagName:"span",properties:$R[13412]={style:"color:#666666"},children:$R[13413]=[$R[13414]={type:"text",value:"];"}]}]}]}]}]}},$R[13415]={children:$R[13416]=[$R[13417]={position:$R[13418]={start:$R[13419]={line:167,column:1,offset:5143},end:$R[13420]={line:167,column:62,offset:5204}},type:"text",value:"上のような設定をしたプロジェクトで React Copiler を使おうとするとある問題が発生する。前項にて述べたように、"},$R[13421]={position:$R[13422]={start:$R[13423]={line:167,column:62,offset:5204},end:$R[13424]={line:167,column:86,offset:5228}},type:"inlineCode",value:"eslintSuppressionRules"},$R[13425]={position:$R[13426]={start:$R[13427]={line:167,column:86,offset:5228},end:$R[13428]={line:167,column:95,offset:5237}},type:"text",value:" はデフォルトで "},$R[13429]={position:$R[13430]={start:$R[13431]={line:167,column:95,offset:5237},end:$R[13432]={line:167,column:124,offset:5266}},type:"inlineCode",value:"react-hooks/exhaustive-deps"},$R[13433]={position:$R[13434]={start:$R[13435]={line:167,column:124,offset:5266},end:$R[13436]={line:167,column:127,offset:5269}},type:"text",value:" と "},$R[13437]={position:$R[13438]={start:$R[13439]={line:167,column:127,offset:5269},end:$R[13440]={line:167,column:155,offset:5297}},type:"inlineCode",value:"react-hooks/rules-of-hooks"},$R[13441]={position:$R[13442]={start:$R[13443]={line:167,column:155,offset:5297},end:$R[13444]={line:167,column:183,offset:5325}},type:"text",value:" が登録されている。ユーザーは ESLint の設定で "},$R[13445]={position:$R[13446]={start:$R[13447]={line:167,column:183,offset:5325},end:$R[13448]={line:167,column:195,offset:5337}},type:"inlineCode",value:"reac-hooks"},$R[13449]={position:$R[13450]={start:$R[13451]={line:167,column:195,offset:5337},end:$R[13452]={line:167,column:211,offset:5353}},type:"text",value:" プラグインのプレフィックスを "},$R[13453]={position:$R[13454]={start:$R[13455]={line:167,column:211,offset:5353},end:$R[13456]={line:167,column:214,offset:5356}},type:"inlineCode",value:"r"},$R[13457]={position:$R[13458]={start:$R[13459]={line:167,column:214,offset:5356},end:$R[13460]={line:167,column:268,offset:5410}},type:"text",value:" に設定している。するとユーザーはあるタイミングで eslint を無効化させる時に次のようなコードを書く。"}],position:$R[13461]={start:$R[13462]={line:167,column:1,offset:5143},end:$R[13463]={line:167,column:268,offset:5410}},type:"paragraph"},$R[13464]={filename:"sample.tsx tsx",lang:"tsx",position:$R[13465]={start:$R[13466]={line:169,column:1,offset:5412},end:$R[13467]={line:174,column:4,offset:5519}},type:"code",value:"// eslint-disable-next-line r/exhaustive-deps\nuseEffect(() => {\n\t// some code\n}, []);",hast:$R[13468]={type:"root",children:$R[13469]=[$R[13470]={type:"element",tagName:"pre",properties:$R[13471]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[13472]=[$R[13473]={type:"element",tagName:"code",properties:$R[13474]={},children:$R[13475]=[$R[13476]={type:"element",tagName:"span",properties:$R[13477]={class:"line"},children:$R[13478]=[$R[13479]={type:"element",tagName:"span",properties:$R[13480]={style:"color:#758575DD"},children:$R[13481]=[$R[13482]={type:"text",value:"// eslint-disable-next-line r/exhaustive-deps"}]}]},$R[13483]={type:"text",value:"\n"},$R[13484]={type:"element",tagName:"span",properties:$R[13485]={class:"line"},children:$R[13486]=[$R[13487]={type:"element",tagName:"span",properties:$R[13488]={style:"color:#80A665"},children:$R[13489]=[$R[13490]={type:"text",value:"useEffect"}]},$R[13491]={type:"element",tagName:"span",properties:$R[13492]={style:"color:#666666"},children:$R[13493]=[$R[13494]={type:"text",value:"(()"}]},$R[13495]={type:"element",tagName:"span",properties:$R[13496]={style:"color:#666666"},children:$R[13497]=[$R[13498]={type:"text",value:" =>"}]},$R[13499]={type:"element",tagName:"span",properties:$R[13500]={style:"color:#666666"},children:$R[13501]=[$R[13502]={type:"text",value:" {"}]}]},$R[13503]={type:"text",value:"\n"},$R[13504]={type:"element",tagName:"span",properties:$R[13505]={class:"line"},children:$R[13506]=[$R[13507]={type:"element",tagName:"span",properties:$R[13508]={style:"color:#758575DD"},children:$R[13509]=[$R[13510]={type:"text",value:"\t// some code"}]}]},$R[13511]={type:"text",value:"\n"},$R[13512]={type:"element",tagName:"span",properties:$R[13513]={class:"line"},children:$R[13514]=[$R[13515]={type:"element",tagName:"span",properties:$R[13516]={style:"color:#666666"},children:$R[13517]=[$R[13518]={type:"text",value:"},"}]},$R[13519]={type:"element",tagName:"span",properties:$R[13520]={style:"color:#666666"},children:$R[13521]=[$R[13522]={type:"text",value:" []);"}]}]}]}]}]}},$R[13523]={children:$R[13524]=[$R[13525]={position:$R[13526]={start:$R[13527]={line:176,column:1,offset:5521},end:$R[13528]={line:176,column:97,offset:5617}},type:"text",value:"このコードを含んだアプリケーションを React Compiler に食べさせると、本来は例外をスローされるべきコードがコンパイルされてしまい、挙動が変わってしまう恐れがある。プレイグラウンド"},$R[13529]={footnoteIndex:2,position:$R[13530]={start:$R[13531]={line:176,column:97,offset:5617},end:$R[13532]={line:176,column:101,offset:5621}},referenceIndex:1,type:"footnoteReference"},$R[13533]={position:$R[13534]={start:$R[13535]={line:176,column:101,offset:5621},end:$R[13536]={line:176,column:208,offset:5728}},type:"text",value:"で試してみると一目瞭然だが、React Compiler はかなり元のコードを変更して最適化を行う。もちろん React のルールに則ったコードであれば正しく動作するが、そうでないコードは正しく動作する保証がない。"}],position:$R[13537]={start:$R[13538]={line:176,column:1,offset:5521},end:$R[13539]={line:176,column:208,offset:5728}},type:"paragraph"},$R[13540]={children:$R[13541]=[$R[13542]={position:$R[13543]={start:$R[13544]={line:180,column:1,offset:5767},end:$R[13545]={line:180,column:14,offset:5780}},type:"text",value:"この問題を解決するために "},$R[13546]={position:$R[13547]={start:$R[13548]={line:180,column:14,offset:5780},end:$R[13549]={line:180,column:38,offset:5804}},type:"inlineCode",value:"eslintSuppressionRules"},$R[13550]={position:$R[13551]={start:$R[13552]={line:180,column:38,offset:5804},end:$R[13553]={line:180,column:61,offset:5827}},type:"text",value:" がある。ユーザーは次のように設定することで、"},$R[13554]={position:$R[13555]={start:$R[13556]={line:180,column:61,offset:5827},end:$R[13557]={line:180,column:85,offset:5851}},type:"inlineCode",value:"eslintSuppressionRules"},$R[13558]={position:$R[13559]={start:$R[13560]={line:180,column:85,offset:5851},end:$R[13561]={line:180,column:88,offset:5854}},type:"text",value:" に "},$R[13562]={position:$R[13563]={start:$R[13564]={line:180,column:88,offset:5854},end:$R[13565]={line:180,column:107,offset:5873}},type:"inlineCode",value:"r/exhaustive-deps"},$R[13566]={position:$R[13567]={start:$R[13568]={line:180,column:107,offset:5873},end:$R[13569]={line:180,column:110,offset:5876}},type:"text",value:" と "},$R[13570]={position:$R[13571]={start:$R[13572]={line:180,column:110,offset:5876},end:$R[13573]={line:180,column:128,offset:5894}},type:"inlineCode",value:"r/rules-of-hooks"},$R[13574]={position:$R[13575]={start:$R[13576]={line:180,column:128,offset:5894},end:$R[13577]={line:180,column:150,offset:5916}},type:"text",value:" を登録することで、上記の問題を解決できる。"}],position:$R[13578]={start:$R[13579]={line:180,column:1,offset:5767},end:$R[13580]={line:180,column:150,offset:5916}},type:"paragraph"},$R[13581]={filename:"vite.config.ts ts",lang:"ts",position:$R[13582]={start:$R[13583]={line:182,column:1,offset:5918},end:$R[13584]={line:204,column:4,offset:6271}},type:"code",value:"import { defineConfig } from \"vite\";\n\nexport default defineConfig(() => {\n\treturn {\n\t\tplugins: [\n\t\t\treact({\n\t\t\t\tbabel: {\n\t\t\t\t\tplugins: [\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\"babel-plugin-react-compiler\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\teslintSuppressionRules: [\"r/exhaustive-deps\", \"r/rules-of-hooks\"],\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t],\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t}),\n\t\t],\n\t\t// ...\n\t};\n});",hast:$R[13585]={type:"root",children:$R[13586]=[$R[13587]={type:"element",tagName:"pre",properties:$R[13588]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[13589]=[$R[13590]={type:"element",tagName:"code",properties:$R[13591]={},children:$R[13592]=[$R[13593]={type:"element",tagName:"span",properties:$R[13594]={class:"line"},children:$R[13595]=[$R[13596]={type:"element",tagName:"span",properties:$R[13597]={style:"color:#4D9375"},children:$R[13598]=[$R[13599]={type:"text",value:"import"}]},$R[13600]={type:"element",tagName:"span",properties:$R[13601]={style:"color:#666666"},children:$R[13602]=[$R[13603]={type:"text",value:" {"}]},$R[13604]={type:"element",tagName:"span",properties:$R[13605]={style:"color:#BD976A"},children:$R[13606]=[$R[13607]={type:"text",value:" defineConfig"}]},$R[13608]={type:"element",tagName:"span",properties:$R[13609]={style:"color:#666666"},children:$R[13610]=[$R[13611]={type:"text",value:" }"}]},$R[13612]={type:"element",tagName:"span",properties:$R[13613]={style:"color:#4D9375"},children:$R[13614]=[$R[13615]={type:"text",value:" from"}]},$R[13616]={type:"element",tagName:"span",properties:$R[13617]={style:"color:#C98A7D77"},children:$R[13618]=[$R[13619]={type:"text",value:" \""}]},$R[13620]={type:"element",tagName:"span",properties:$R[13621]={style:"color:#C98A7D"},children:$R[13622]=[$R[13623]={type:"text",value:"vite"}]},$R[13624]={type:"element",tagName:"span",properties:$R[13625]={style:"color:#C98A7D77"},children:$R[13626]=[$R[13627]={type:"text",value:"\""}]},$R[13628]={type:"element",tagName:"span",properties:$R[13629]={style:"color:#666666"},children:$R[13630]=[$R[13631]={type:"text",value:";"}]}]},$R[13632]={type:"text",value:"\n"},$R[13633]={type:"element",tagName:"span",properties:$R[13634]={class:"line"},children:$R[13635]=[]},$R[13636]={type:"text",value:"\n"},$R[13637]={type:"element",tagName:"span",properties:$R[13638]={class:"line"},children:$R[13639]=[$R[13640]={type:"element",tagName:"span",properties:$R[13641]={style:"color:#4D9375"},children:$R[13642]=[$R[13643]={type:"text",value:"export"}]},$R[13644]={type:"element",tagName:"span",properties:$R[13645]={style:"color:#4D9375"},children:$R[13646]=[$R[13647]={type:"text",value:" default"}]},$R[13648]={type:"element",tagName:"span",properties:$R[13649]={style:"color:#80A665"},children:$R[13650]=[$R[13651]={type:"text",value:" defineConfig"}]},$R[13652]={type:"element",tagName:"span",properties:$R[13653]={style:"color:#666666"},children:$R[13654]=[$R[13655]={type:"text",value:"(()"}]},$R[13656]={type:"element",tagName:"span",properties:$R[13657]={style:"color:#666666"},children:$R[13658]=[$R[13659]={type:"text",value:" =>"}]},$R[13660]={type:"element",tagName:"span",properties:$R[13661]={style:"color:#666666"},children:$R[13662]=[$R[13663]={type:"text",value:" {"}]}]},$R[13664]={type:"text",value:"\n"},$R[13665]={type:"element",tagName:"span",properties:$R[13666]={class:"line"},children:$R[13667]=[$R[13668]={type:"element",tagName:"span",properties:$R[13669]={style:"color:#4D9375"},children:$R[13670]=[$R[13671]={type:"text",value:"\treturn"}]},$R[13672]={type:"element",tagName:"span",properties:$R[13673]={style:"color:#666666"},children:$R[13674]=[$R[13675]={type:"text",value:" {"}]}]},$R[13676]={type:"text",value:"\n"},$R[13677]={type:"element",tagName:"span",properties:$R[13678]={class:"line"},children:$R[13679]=[$R[13680]={type:"element",tagName:"span",properties:$R[13681]={style:"color:#B8A965"},children:$R[13682]=[$R[13683]={type:"text",value:"\t\tplugins"}]},$R[13684]={type:"element",tagName:"span",properties:$R[13685]={style:"color:#666666"},children:$R[13686]=[$R[13687]={type:"text",value:": ["}]}]},$R[13688]={type:"text",value:"\n"},$R[13689]={type:"element",tagName:"span",properties:$R[13690]={class:"line"},children:$R[13691]=[$R[13692]={type:"element",tagName:"span",properties:$R[13693]={style:"color:#80A665"},children:$R[13694]=[$R[13695]={type:"text",value:"\t\t\treact"}]},$R[13696]={type:"element",tagName:"span",properties:$R[13697]={style:"color:#666666"},children:$R[13698]=[$R[13699]={type:"text",value:"({"}]}]},$R[13700]={type:"text",value:"\n"},$R[13701]={type:"element",tagName:"span",properties:$R[13702]={class:"line"},children:$R[13703]=[$R[13704]={type:"element",tagName:"span",properties:$R[13705]={style:"color:#B8A965"},children:$R[13706]=[$R[13707]={type:"text",value:"\t\t\t\tbabel"}]},$R[13708]={type:"element",tagName:"span",properties:$R[13709]={style:"color:#666666"},children:$R[13710]=[$R[13711]={type:"text",value:": {"}]}]},$R[13712]={type:"text",value:"\n"},$R[13713]={type:"element",tagName:"span",properties:$R[13714]={class:"line"},children:$R[13715]=[$R[13716]={type:"element",tagName:"span",properties:$R[13717]={style:"color:#B8A965"},children:$R[13718]=[$R[13719]={type:"text",value:"\t\t\t\t\tplugins"}]},$R[13720]={type:"element",tagName:"span",properties:$R[13721]={style:"color:#666666"},children:$R[13722]=[$R[13723]={type:"text",value:": ["}]}]},$R[13724]={type:"text",value:"\n"},$R[13725]={type:"element",tagName:"span",properties:$R[13726]={class:"line"},children:$R[13727]=[$R[13728]={type:"element",tagName:"span",properties:$R[13729]={style:"color:#666666"},children:$R[13730]=[$R[13731]={type:"text",value:"\t\t\t\t\t\t["}]}]},$R[13732]={type:"text",value:"\n"},$R[13733]={type:"element",tagName:"span",properties:$R[13734]={class:"line"},children:$R[13735]=[$R[13736]={type:"element",tagName:"span",properties:$R[13737]={style:"color:#C98A7D77"},children:$R[13738]=[$R[13739]={type:"text",value:"\t\t\t\t\t\t\t\""}]},$R[13740]={type:"element",tagName:"span",properties:$R[13741]={style:"color:#C98A7D"},children:$R[13742]=[$R[13743]={type:"text",value:"babel-plugin-react-compiler"}]},$R[13744]={type:"element",tagName:"span",properties:$R[13745]={style:"color:#C98A7D77"},children:$R[13746]=[$R[13747]={type:"text",value:"\""}]},$R[13748]={type:"element",tagName:"span",properties:$R[13749]={style:"color:#666666"},children:$R[13750]=[$R[13751]={type:"text",value:","}]}]},$R[13752]={type:"text",value:"\n"},$R[13753]={type:"element",tagName:"span",properties:$R[13754]={class:"line"},children:$R[13755]=[$R[13756]={type:"element",tagName:"span",properties:$R[13757]={style:"color:#666666"},children:$R[13758]=[$R[13759]={type:"text",value:"\t\t\t\t\t\t\t{"}]}]},$R[13760]={type:"text",value:"\n"},$R[13761]={type:"element",tagName:"span",properties:$R[13762]={class:"line"},children:$R[13763]=[$R[13764]={type:"element",tagName:"span",properties:$R[13765]={style:"color:#B8A965"},children:$R[13766]=[$R[13767]={type:"text",value:"\t\t\t\t\t\t\t\teslintSuppressionRules"}]},$R[13768]={type:"element",tagName:"span",properties:$R[13769]={style:"color:#666666"},children:$R[13770]=[$R[13771]={type:"text",value:": ["}]},$R[13772]={type:"element",tagName:"span",properties:$R[13773]={style:"color:#C98A7D77"},children:$R[13774]=[$R[13775]={type:"text",value:"\""}]},$R[13776]={type:"element",tagName:"span",properties:$R[13777]={style:"color:#C98A7D"},children:$R[13778]=[$R[13779]={type:"text",value:"r/exhaustive-deps"}]},$R[13780]={type:"element",tagName:"span",properties:$R[13781]={style:"color:#C98A7D77"},children:$R[13782]=[$R[13783]={type:"text",value:"\""}]},$R[13784]={type:"element",tagName:"span",properties:$R[13785]={style:"color:#666666"},children:$R[13786]=[$R[13787]={type:"text",value:", "}]},$R[13788]={type:"element",tagName:"span",properties:$R[13789]={style:"color:#C98A7D77"},children:$R[13790]=[$R[13791]={type:"text",value:"\""}]},$R[13792]={type:"element",tagName:"span",properties:$R[13793]={style:"color:#C98A7D"},children:$R[13794]=[$R[13795]={type:"text",value:"r/rules-of-hooks"}]},$R[13796]={type:"element",tagName:"span",properties:$R[13797]={style:"color:#C98A7D77"},children:$R[13798]=[$R[13799]={type:"text",value:"\""}]},$R[13800]={type:"element",tagName:"span",properties:$R[13801]={style:"color:#666666"},children:$R[13802]=[$R[13803]={type:"text",value:"],"}]}]},$R[13804]={type:"text",value:"\n"},$R[13805]={type:"element",tagName:"span",properties:$R[13806]={class:"line"},children:$R[13807]=[$R[13808]={type:"element",tagName:"span",properties:$R[13809]={style:"color:#666666"},children:$R[13810]=[$R[13811]={type:"text",value:"\t\t\t\t\t\t\t}"}]}]},$R[13812]={type:"text",value:"\n"},$R[13813]={type:"element",tagName:"span",properties:$R[13814]={class:"line"},children:$R[13815]=[$R[13816]={type:"element",tagName:"span",properties:$R[13817]={style:"color:#666666"},children:$R[13818]=[$R[13819]={type:"text",value:"\t\t\t\t\t\t],"}]}]},$R[13820]={type:"text",value:"\n"},$R[13821]={type:"element",tagName:"span",properties:$R[13822]={class:"line"},children:$R[13823]=[$R[13824]={type:"element",tagName:"span",properties:$R[13825]={style:"color:#666666"},children:$R[13826]=[$R[13827]={type:"text",value:"\t\t\t\t\t],"}]}]},$R[13828]={type:"text",value:"\n"},$R[13829]={type:"element",tagName:"span",properties:$R[13830]={class:"line"},children:$R[13831]=[$R[13832]={type:"element",tagName:"span",properties:$R[13833]={style:"color:#666666"},children:$R[13834]=[$R[13835]={type:"text",value:"\t\t\t\t},"}]}]},$R[13836]={type:"text",value:"\n"},$R[13837]={type:"element",tagName:"span",properties:$R[13838]={class:"line"},children:$R[13839]=[$R[13840]={type:"element",tagName:"span",properties:$R[13841]={style:"color:#666666"},children:$R[13842]=[$R[13843]={type:"text",value:"\t\t\t}),"}]}]},$R[13844]={type:"text",value:"\n"},$R[13845]={type:"element",tagName:"span",properties:$R[13846]={class:"line"},children:$R[13847]=[$R[13848]={type:"element",tagName:"span",properties:$R[13849]={style:"color:#666666"},children:$R[13850]=[$R[13851]={type:"text",value:"\t\t],"}]}]},$R[13852]={type:"text",value:"\n"},$R[13853]={type:"element",tagName:"span",properties:$R[13854]={class:"line"},children:$R[13855]=[$R[13856]={type:"element",tagName:"span",properties:$R[13857]={style:"color:#758575DD"},children:$R[13858]=[$R[13859]={type:"text",value:"\t\t// ..."}]}]},$R[13860]={type:"text",value:"\n"},$R[13861]={type:"element",tagName:"span",properties:$R[13862]={class:"line"},children:$R[13863]=[$R[13864]={type:"element",tagName:"span",properties:$R[13865]={style:"color:#666666"},children:$R[13866]=[$R[13867]={type:"text",value:"\t};"}]}]},$R[13868]={type:"text",value:"\n"},$R[13869]={type:"element",tagName:"span",properties:$R[13870]={class:"line"},children:$R[13871]=[$R[13872]={type:"element",tagName:"span",properties:$R[13873]={style:"color:#666666"},children:$R[13874]=[$R[13875]={type:"text",value:"});"}]}]}]}]}]}},$R[13876]={children:$R[13877]=[$R[13878]={position:$R[13879]={start:$R[13880]={line:206,column:1,offset:6273},end:$R[13881]={line:206,column:14,offset:6286}},type:"text",value:"このように設定することで、"},$R[13882]={position:$R[13883]={start:$R[13884]={line:206,column:14,offset:6286},end:$R[13885]={line:206,column:38,offset:6310}},type:"inlineCode",value:"eslintSuppressionRules"},$R[13886]={position:$R[13887]={start:$R[13888]={line:206,column:38,offset:6310},end:$R[13889]={line:206,column:110,offset:6382}},type:"text",value:" に登録されたルールが無効化された場合に例外をスローするようになる。これにより、React Compiler は正しく動作することが保証される。"}],position:$R[13890]={start:$R[13891]={line:206,column:1,offset:6273},end:$R[13892]={line:206,column:110,offset:6382}},type:"paragraph"}],position:$R[13893]={end:$R[13894]={line:206,column:110,offset:6382},start:$R[13895]={line:102,column:1,offset:3956}},type:"section"}],position:$R[13896]={end:$R[13897]={line:206,column:110,offset:6382},start:$R[13898]={line:27,column:1,offset:1201}},type:"section"},$R[13899]={children:$R[13900]=[$R[13901]={children:$R[13902]=[$R[13903]={position:$R[13904]={start:$R[13905]={line:208,column:4,offset:6387},end:$R[13906]={line:208,column:7,offset:6390}},type:"text",value:"まとめ"}],id:"まとめ",level:2,plain:"まとめ",position:$R[13907]={start:$R[13908]={line:208,column:1,offset:6384},end:$R[13909]={line:208,column:7,offset:6390}},type:"heading"},$R[13910]={children:$R[13911]=[$R[13912]={position:$R[13913]={start:$R[13914]={line:210,column:1,offset:6392},end:$R[13915]={line:210,column:25,offset:6416}},type:"inlineCode",value:"eslintSuppressionRules"},$R[13916]={position:$R[13917]={start:$R[13918]={line:210,column:25,offset:6416},end:$R[13919]={line:210,column:67,offset:6458}},type:"text",value:" は React Compiler が正しく動作するための設定である。デフォルトで "},$R[13920]={position:$R[13921]={start:$R[13922]={line:210,column:67,offset:6458},end:$R[13923]={line:210,column:96,offset:6487}},type:"inlineCode",value:"react-hooks/exhaustive-deps"},$R[13924]={position:$R[13925]={start:$R[13926]={line:210,column:96,offset:6487},end:$R[13927]={line:210,column:99,offset:6490}},type:"text",value:" と "},$R[13928]={position:$R[13929]={start:$R[13930]={line:210,column:99,offset:6490},end:$R[13931]={line:210,column:127,offset:6518}},type:"inlineCode",value:"react-hooks/rules-of-hooks"},$R[13932]={position:$R[13933]={start:$R[13934]={line:210,column:127,offset:6518},end:$R[13935]={line:210,column:210,offset:6601}},type:"text",value:" が登録されており、これらのルールが無効化された場合に例外をスローする。また flat config との相性も良いため、React Compiler を使う際には "},$R[13936]={position:$R[13937]={start:$R[13938]={line:210,column:210,offset:6601},end:$R[13939]={line:210,column:234,offset:6625}},type:"inlineCode",value:"eslintSuppressionRules"},$R[13940]={position:$R[13941]={start:$R[13942]={line:210,column:234,offset:6625},end:$R[13943]={line:210,column:250,offset:6641}},type:"text",value:" の設定することをおすすめする。"}],position:$R[13944]={start:$R[13945]={line:210,column:1,offset:6392},end:$R[13946]={line:210,column:250,offset:6641}},type:"paragraph"},$R[13947]={children:$R[13948]=[$R[13949]={position:$R[13950]={start:$R[13951]={line:212,column:1,offset:6643},end:$R[13952]={line:212,column:42,offset:6684}},type:"text",value:"引き続き React Compiler のコードを読んで、使い方を考えていきたい。"}],position:$R[13953]={start:$R[13954]={line:212,column:1,offset:6643},end:$R[13955]={line:212,column:42,offset:6684}},type:"paragraph"},$R[13956]={children:$R[13957]=[$R[13958]={position:$R[13959]={start:$R[13960]={line:214,column:1,offset:6686},end:$R[13961]={line:214,column:21,offset:6706}},type:"text",value:"React Compiler の中身を "},$R[13962]={children:$R[13963]=[$R[13964]={position:$R[13965]={start:$R[13966]={line:214,column:22,offset:6707},end:$R[13967]={line:214,column:31,offset:6716}},type:"text",value:"@yossydev"}],position:$R[13968]={start:$R[13969]={line:214,column:21,offset:6706},end:$R[13970]={line:214,column:62,offset:6747}},title:void 0,type:"link",url:"https://twitter.com/yossydev"},$R[13971]={position:$R[13972]={start:$R[13973]={line:214,column:62,offset:6747},end:$R[13974]={line:214,column:63,offset:6748}},type:"text",value:"、"},$R[13975]={children:$R[13976]=[$R[13977]={position:$R[13978]={start:$R[13979]={line:214,column:64,offset:6749},end:$R[13980]={line:214,column:76,offset:6761}},type:"text",value:"@shun_shobon"}],position:$R[13981]={start:$R[13982]={line:214,column:63,offset:6748},end:$R[13983]={line:214,column:110,offset:6795}},title:void 0,type:"link",url:"https://twitter.com/shun_shobon"},$R[13984]={position:$R[13985]={start:$R[13986]={line:214,column:110,offset:6795},end:$R[13987]={line:214,column:137,offset:6822}},type:"text",value:" と読んでいるので、興味がある方はぜひ見てみてほしい。"}],position:$R[13988]={start:$R[13989]={line:214,column:1,offset:6686},end:$R[13990]={line:214,column:137,offset:6822}},type:"paragraph"},$R[13991]={allowFullScreen:void 0,height:"360",position:$R[13992]={start:$R[13993]={line:216,column:1,offset:6824},end:$R[13994]={line:216,column:44,offset:6867}},src:"https://www.youtube.com/embed/PqPgr_hlVKM",type:"embed",width:"100%"}],position:$R[13995]={end:$R[13996]={line:216,column:44,offset:6867},start:$R[13997]={line:208,column:1,offset:6384}},type:"section"}],footnotes:$R[13998]=[$R[13999]={children:$R[14000]=[$R[14001]={children:$R[14002]=[$R[14003]={children:$R[14004]=[$R[14005]={position:$R[14006]={start:$R[14007]={line:25,column:7,offset:1161},end:$R[14008]={line:25,column:45,offset:1199}},type:"text",value:"https://react.dev/learn/react-compiler"}],position:$R[14009]={start:$R[14010]={line:25,column:7,offset:1161},end:$R[14011]={line:25,column:45,offset:1199}},title:void 0,type:"link",url:"https://react.dev/learn/react-compiler"}],position:$R[14012]={start:$R[14013]={line:25,column:7,offset:1161},end:$R[14014]={line:25,column:45,offset:1199}},type:"paragraph"}],count:1,index:0,position:$R[14015]={start:$R[14016]={line:25,column:1,offset:1155},end:$R[14017]={line:25,column:45,offset:1199}},type:"footnoteDefinition"},$R[14018]={children:$R[14019]=[$R[14020]={children:$R[14021]=[$R[14022]={children:$R[14023]=[$R[14024]={position:$R[14025]={start:$R[14026]={line:65,column:7,offset:2735},end:$R[14027]={line:65,column:55,offset:2783}},type:"text",value:"https://react.dev/reference/rules/rules-of-hooks"}],position:$R[14028]={start:$R[14029]={line:65,column:7,offset:2735},end:$R[14030]={line:65,column:55,offset:2783}},title:void 0,type:"link",url:"https://react.dev/reference/rules/rules-of-hooks"},$R[14031]={position:$R[14032]={start:$R[14033]={line:65,column:55,offset:2783},end:$R[14034]={line:65,column:110,offset:2838}},type:"text",value:" にある通り hoosk はコンポーネントのトップレベルもしくはカスタムフック内でのみ呼び出すべきであるなど。"}],position:$R[14035]={start:$R[14036]={line:65,column:7,offset:2735},end:$R[14037]={line:65,column:110,offset:2838}},type:"paragraph"}],count:1,index:1,position:$R[14038]={start:$R[14039]={line:65,column:1,offset:2729},end:$R[14040]={line:65,column:110,offset:2838}},type:"footnoteDefinition"},$R[14041]={children:$R[14042]=[$R[14043]={children:$R[14044]=[$R[14045]={children:$R[14046]=[$R[14047]={position:$R[14048]={start:$R[14049]={line:178,column:7,offset:5736},end:$R[14050]={line:178,column:36,offset:5765}},type:"text",value:"https://playground.react.dev/"}],position:$R[14051]={start:$R[14052]={line:178,column:7,offset:5736},end:$R[14053]={line:178,column:36,offset:5765}},title:void 0,type:"link",url:"https://playground.react.dev/"}],position:$R[14054]={start:$R[14055]={line:178,column:7,offset:5736},end:$R[14056]={line:178,column:36,offset:5765}},type:"paragraph"}],count:1,index:2,position:$R[14057]={start:$R[14058]={line:178,column:1,offset:5730},end:$R[14059]={line:178,column:36,offset:5765}},type:"footnoteDefinition"}],title:$R[14060]={children:$R[14061]=[$R[14062]={position:$R[14063]={start:$R[14064]={line:1,column:3,offset:2},end:$R[14065]={line:1,column:33,offset:32}},type:"text",value:"eslintSuppressionRules を考察してみる"}],id:"eslintsuppressionrules-を考察してみる",level:1,plain:"eslintSuppressionRules を考察してみる",position:$R[14066]={start:$R[14067]={line:1,column:1,offset:0},end:$R[14068]={line:1,column:33,offset:32}},type:"heading"},toc:$R[14069]=[$R[14070]={children:$R[14071]=[],id:"はじめに",plain:"はじめに",type:"toc"},$R[14072]={children:$R[14073]=[],id:"react-compiler-とは",plain:"React Compiler とは",type:"toc"},$R[14074]={children:$R[14075]=[$R[14076]={children:$R[14077]=[],id:"必要性",plain:"必要性",type:"toc"},$R[14078]={children:$R[14079]=[],id:"eslint-v9との関係と使い方",plain:"ESLint v9との関係と使い方",type:"toc"}],id:"eslintsuppressionrules",plain:"eslintSuppressionRules",type:"toc"},$R[14080]={children:$R[14081]=[],id:"まとめ",plain:"まとめ",type:"toc"}],type:"article"}},$R[14082]={content:"# React Compiler の opt-in と opt-out を整理する\n\n## はじめに\n\n先日に引き続き React Compiler のコードを読んでいる中で、opt-in と opt-out についての挙動がややこしいと感じたので整理してみた。\n\nこの記事で参照するコードの commit は [c015abd](https://github.com/facebook/react/commit/c015abd9dc32e9604e992cf351f1e130fd2a0de0) である。\n\n## opt-in と opt-out\n\nReact Compiler の設定に、`compilationMode` というものがある。これは次のように定義されている。\n\n```ts:Options.ts\nconst CompilationModeSchema = z.enum([\n /*\n * Compiles functions annotated with \"use forget\" or component/hook-like functions.\n * This latter includes:\n * * Components declared with component syntax.\n * * Functions which can be inferred to be a component or hook:\n * - Be named like a hook or component. This logic matches the ESLint rule.\n * - *and* create JSX and/or call a hook. This is an additional check to help prevent\n * false positives, since compilation has a greater impact than linting.\n * This is the default mode\n */\n \"infer\",\n // Compile only functions which are explicitly annotated with \"use forget\"\n \"annotation\",\n // Compile all top-level functions\n \"all\",\n]);\n```\n\nhttps://github.com/facebook/react/blob/d77dd31a329df55a051800fc76668af8da8332b4/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Options.ts#L116-L132\n\n### opt-out\n\n`opt-out` はそもそも公式で明言された呼び方ではないということに留意しておく。`opt-in` の逆なんだから `opt-out` やろ!というのが私の勝手な解釈である。\n\nデフォルトでは `infer` となっている。これは、コンポーネントやフックのような関数をコンパイルする。後者は、次の条件を満たす関数をコンパイルする。\n\n- `component` や `hook` で定義された関数\n - Flow のシンタックス\n - https://medium.com/flow-type/announcing-component-syntax-b6c5285660d0\n- コンポーネントやフックのような関数であると推測される関数\n - フックやコンポーネントのような名前が付けられている\n - JSX を生成するか、フックを呼び出す\n - `eslint-plugin-react` のルールに一致する\n\n> - フックやコンポーネントのような名前が付けられている\n> - JSXを生成するか、フックを呼び出す\n\nこれらは [ここ](https://github.com/facebook/react/blob/d77dd31a329df55a051800fc76668af8da8332b4/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts#L566-L787) で実装されている。なかなか味わいのあるコードだ。\n\n`infer` モードの嬉しさは、自動的にコンパイルされる関数を選択してくれることだ。\n\n私が `infer` モードを `opt-out` と読んでいるのは後で詳しく説明する `\"use no memo\"` というディレクティブでコンパイル対象から外すことができるからだ。\n\n### opt-in\n\n`annotation` モードは、`\"use memo\"` というディレクティブが付与された関数のみをコンパイルする。\n\nドキュメントでも言及されている通り、`opt-in` はあくまで既に存在する React のプロジェクトに対して段階的に React Compoler を導入するための仕組みだ。\n\n> In rare cases, you can also configure the compiler to run in “opt-in” mode using the compilationMode: \"annotation\" option. This makes it so the compiler will only compile components and hooks annotated with a \"use memo\" directive. Please note that the annotation mode is a temporary one to aid early adopters, and that we don’t intend for the \"use memo\" directive to be used for the long term.\n>\n> When you have more confidence with rolling out the compiler, you can expand coverage to other directories as well and slowly roll it out to your whole app.\n>\n> --- https://react.dev/learn/react-compiler#existing-projects\n\n## ややこしいディレクティブの挙動\n\nさて、本題だ(?)。`use memo` と `use no memo` というディレクティブがある。これらはどちらも関数やファイルの行頭に付与することでコンパイルの挙動を変更する。\n\n混乱するのは `compilationMode` の値とその時の挙動である。例えば...\n\n- `infer` の時に `\"use memo\"` を付与した時\n- `annotation` の時に `\"use no memo\"` を付与した時\n\nなど、挙動はどうなるのだろうか?\n\n解答はコードに隠されていた。\n\n```ts:Program.ts\nfunction getReactFunctionType(\n fn: BabelFn,\n pass: CompilerPass\n): ReactFunctionType | null {\n const hookPattern = pass.opts.environment?.hookPattern ?? null;\n if (fn.node.body.type === \"BlockStatement\") {\n // Opt-outs disable compilation regardless of mode\n const useNoForget = findDirectiveDisablingMemoization(\n fn.node.body.directives,\n pass.opts\n );\n if (useNoForget != null) {\n pass.opts.logger?.logEvent(pass.filename, {\n kind: \"CompileError\",\n fnLoc: fn.node.body.loc ?? null,\n detail: {\n severity: ErrorSeverity.Todo,\n reason: 'Skipped due to \"use no forget\" directive.',\n loc: useNoForget.loc ?? null,\n suggestions: null,\n },\n });\n return null;\n }\n // Otherwise opt-ins enable compilation regardless of mode\n if (findDirectiveEnablingMemoization(fn.node.body.directives) != null) {\n return getComponentOrHookLike(fn, hookPattern) ?? \"Other\";\n }\n }\n switch (pass.opts.compilationMode) {\n case \"annotation\": {\n // opt-ins are checked above\n return null;\n }\n case \"infer\": {\n // Component and hook declarations are known components/hooks\n if (fn.isFunctionDeclaration()) {\n if (isComponentDeclaration(fn.node)) {\n return \"Component\";\n } else if (isHookDeclaration(fn.node)) {\n return \"Hook\";\n }\n }\n\n // Otherwise check if this is a component or hook-like function\n return getComponentOrHookLike(fn, hookPattern);\n }\n case \"all\": {\n // Compile only top level functions\n if (fn.scope.getProgramParent() !== fn.scope.parent) {\n return null;\n }\n\n return getComponentOrHookLike(fn, hookPattern) ?? \"Other\";\n }\n default: {\n assertExhaustive(\n pass.opts.compilationMode,\n `Unexpected compilationMode \\`${pass.opts.compilationMode}\\``\n );\n }\n }\n}\n```\n\nhttps://github.com/facebook/react/blob/d77dd31a329df55a051800fc76668af8da8332b4/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts#L471-L533\n\n上記のコードコメントにある通り、ディレクティブが見つかった場合、`compilationMode` の値に関係なくディレクティブの指示に従う。つまり、`\"use no memo\"` が見つかった場合はコンパイルをスキップするし、`\"use memo\"` が見つかった場合はコンパイルを実行する。\n\n## まとめ\n\nReact Compiler の opt-in と opt-out について整理してみた。`compilationMode` は opt-in と opt-out の挙動を制御する。`\"use memo\"` と `\"use no memo\"` はどちらもコンパイルの挙動を変更するディレクティブで、`compilationMode` の値に関係なく挙動を変更する。\n\nReact Compiler の中身を [@yossydev](https://twitter.com/yossydev)、[@shun_shobon](https://twitter.com/shun_shobon) と読んでいるので、興味がある方はぜひ見てみてほしい。\n\nhttps://www.youtube.com/watch?v=PqPgr_hlVKM",description:"ややこしすぎるopt-inとopt-outの挙動を整理する。",published:!0,publishedAt:"2024-06-11T15:42:49.854+09:00[Asia/Tokyo]",tags:$R[14083]=["React","React Compiler"],title:"React Compilerのopt-inとopt-outを整理する",_meta:$R[14084]={filePath:"01J030HYBQ9T8NW4Q1GYH6NHHV/slug.md",fileName:"slug.md",directory:"01J030HYBQ9T8NW4Q1GYH6NHHV",extension:"md",path:"01J030HYBQ9T8NW4Q1GYH6NHHV/slug"},abstract:"React Compiler の opt-in と opt-out を整理するはじめに先日に引き続き React Compiler のコードを読んでいる中で、opt-in と opt-out についての挙動がややこしいと感じたので整理してみた。この記事で参照するコードの commit は c015abd である。opt-in と opt-outReact Compiler の設定に、compilationMode というものがある。これは次のように定義されている。const CompilationModeSchema = z.enum([\n /*\n * Compiles functions annotated with \"use forget\" or component/hook-like functions.\n * This latter includes:\n * * Co",mdast:$R[14085]={children:$R[14086]=[$R[14087]={children:$R[14088]=[$R[14089]={children:$R[14090]=[$R[14091]={position:$R[14092]={start:$R[14093]={line:3,column:4,offset:46},end:$R[14094]={line:3,column:8,offset:50}},type:"text",value:"はじめに"}],id:"はじめに",level:2,plain:"はじめに",position:$R[14095]={start:$R[14096]={line:3,column:1,offset:43},end:$R[14097]={line:3,column:8,offset:50}},type:"heading"},$R[14098]={children:$R[14099]=[$R[14100]={position:$R[14101]={start:$R[14102]={line:5,column:1,offset:52},end:$R[14103]={line:5,column:80,offset:131}},type:"text",value:"先日に引き続き React Compiler のコードを読んでいる中で、opt-in と opt-out についての挙動がややこしいと感じたので整理してみた。"}],position:$R[14104]={start:$R[14105]={line:5,column:1,offset:52},end:$R[14106]={line:5,column:80,offset:131}},type:"paragraph"},$R[14107]={children:$R[14108]=[$R[14109]={position:$R[14110]={start:$R[14111]={line:7,column:1,offset:133},end:$R[14112]={line:7,column:24,offset:156}},type:"text",value:"この記事で参照するコードの commit は "},$R[14113]={children:$R[14114]=[$R[14115]={position:$R[14116]={start:$R[14117]={line:7,column:25,offset:157},end:$R[14118]={line:7,column:32,offset:164}},type:"text",value:"c015abd"}],position:$R[14119]={start:$R[14120]={line:7,column:24,offset:156},end:$R[14121]={line:7,column:116,offset:248}},title:void 0,type:"link",url:"https://github.com/facebook/react/commit/c015abd9dc32e9604e992cf351f1e130fd2a0de0"},$R[14122]={position:$R[14123]={start:$R[14124]={line:7,column:116,offset:248},end:$R[14125]={line:7,column:121,offset:253}},type:"text",value:" である。"}],position:$R[14126]={start:$R[14127]={line:7,column:1,offset:133},end:$R[14128]={line:7,column:121,offset:253}},type:"paragraph"}],position:$R[14129]={end:$R[14130]={line:7,column:121,offset:253},start:$R[14131]={line:3,column:1,offset:43}},type:"section"},$R[14132]={children:$R[14133]=[$R[14134]={children:$R[14135]=[$R[14136]={position:$R[14137]={start:$R[14138]={line:9,column:4,offset:258},end:$R[14139]={line:9,column:20,offset:274}},type:"text",value:"opt-in と opt-out"}],id:"opt-in-と-opt-out",level:2,plain:"opt-in と opt-out",position:$R[14140]={start:$R[14141]={line:9,column:1,offset:255},end:$R[14142]={line:9,column:20,offset:274}},type:"heading"},$R[14143]={children:$R[14144]=[$R[14145]={position:$R[14146]={start:$R[14147]={line:11,column:1,offset:276},end:$R[14148]={line:11,column:21,offset:296}},type:"text",value:"React Compiler の設定に、"},$R[14149]={position:$R[14150]={start:$R[14151]={line:11,column:21,offset:296},end:$R[14152]={line:11,column:38,offset:313}},type:"inlineCode",value:"compilationMode"},$R[14153]={position:$R[14154]={start:$R[14155]={line:11,column:38,offset:313},end:$R[14156]={line:11,column:64,offset:339}},type:"text",value:" というものがある。これは次のように定義されている。"}],position:$R[14157]={start:$R[14158]={line:11,column:1,offset:276},end:$R[14159]={line:11,column:64,offset:339}},type:"paragraph"},$R[14160]={filename:"Options.ts ts",lang:"ts",position:$R[14161]={start:$R[14162]={line:13,column:1,offset:341},end:$R[14163]={line:31,column:4,offset:1073}},type:"code",value:"const CompilationModeSchema = z.enum([\n /*\n * Compiles functions annotated with \"use forget\" or component/hook-like functions.\n * This latter includes:\n * * Components declared with component syntax.\n * * Functions which can be inferred to be a component or hook:\n * - Be named like a hook or component. This logic matches the ESLint rule.\n * - *and* create JSX and/or call a hook. This is an additional check to help prevent\n * false positives, since compilation has a greater impact than linting.\n * This is the default mode\n */\n \"infer\",\n // Compile only functions which are explicitly annotated with \"use forget\"\n \"annotation\",\n // Compile all top-level functions\n \"all\",\n]);",hast:$R[14164]={type:"root",children:$R[14165]=[$R[14166]={type:"element",tagName:"pre",properties:$R[14167]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[14168]=[$R[14169]={type:"element",tagName:"code",properties:$R[14170]={},children:$R[14171]=[$R[14172]={type:"element",tagName:"span",properties:$R[14173]={class:"line"},children:$R[14174]=[$R[14175]={type:"element",tagName:"span",properties:$R[14176]={style:"color:#CB7676"},children:$R[14177]=[$R[14178]={type:"text",value:"const "}]},$R[14179]={type:"element",tagName:"span",properties:$R[14180]={style:"color:#BD976A"},children:$R[14181]=[$R[14182]={type:"text",value:"CompilationModeSchema"}]},$R[14183]={type:"element",tagName:"span",properties:$R[14184]={style:"color:#666666"},children:$R[14185]=[$R[14186]={type:"text",value:" ="}]},$R[14187]={type:"element",tagName:"span",properties:$R[14188]={style:"color:#BD976A"},children:$R[14189]=[$R[14190]={type:"text",value:" z"}]},$R[14191]={type:"element",tagName:"span",properties:$R[14192]={style:"color:#666666"},children:$R[14193]=[$R[14194]={type:"text",value:"."}]},$R[14195]={type:"element",tagName:"span",properties:$R[14196]={style:"color:#80A665"},children:$R[14197]=[$R[14198]={type:"text",value:"enum"}]},$R[14199]={type:"element",tagName:"span",properties:$R[14200]={style:"color:#666666"},children:$R[14201]=[$R[14202]={type:"text",value:"(["}]}]},$R[14203]={type:"text",value:"\n"},$R[14204]={type:"element",tagName:"span",properties:$R[14205]={class:"line"},children:$R[14206]=[$R[14207]={type:"element",tagName:"span",properties:$R[14208]={style:"color:#758575DD"},children:$R[14209]=[$R[14210]={type:"text",value:" /*"}]}]},$R[14211]={type:"text",value:"\n"},$R[14212]={type:"element",tagName:"span",properties:$R[14213]={class:"line"},children:$R[14214]=[$R[14215]={type:"element",tagName:"span",properties:$R[14216]={style:"color:#758575DD"},children:$R[14217]=[$R[14218]={type:"text",value:" * Compiles functions annotated with \"use forget\" or component/hook-like functions."}]}]},$R[14219]={type:"text",value:"\n"},$R[14220]={type:"element",tagName:"span",properties:$R[14221]={class:"line"},children:$R[14222]=[$R[14223]={type:"element",tagName:"span",properties:$R[14224]={style:"color:#758575DD"},children:$R[14225]=[$R[14226]={type:"text",value:" * This latter includes:"}]}]},$R[14227]={type:"text",value:"\n"},$R[14228]={type:"element",tagName:"span",properties:$R[14229]={class:"line"},children:$R[14230]=[$R[14231]={type:"element",tagName:"span",properties:$R[14232]={style:"color:#758575DD"},children:$R[14233]=[$R[14234]={type:"text",value:" * * Components declared with component syntax."}]}]},$R[14235]={type:"text",value:"\n"},$R[14236]={type:"element",tagName:"span",properties:$R[14237]={class:"line"},children:$R[14238]=[$R[14239]={type:"element",tagName:"span",properties:$R[14240]={style:"color:#758575DD"},children:$R[14241]=[$R[14242]={type:"text",value:" * * Functions which can be inferred to be a component or hook:"}]}]},$R[14243]={type:"text",value:"\n"},$R[14244]={type:"element",tagName:"span",properties:$R[14245]={class:"line"},children:$R[14246]=[$R[14247]={type:"element",tagName:"span",properties:$R[14248]={style:"color:#758575DD"},children:$R[14249]=[$R[14250]={type:"text",value:" * - Be named like a hook or component. This logic matches the ESLint rule."}]}]},$R[14251]={type:"text",value:"\n"},$R[14252]={type:"element",tagName:"span",properties:$R[14253]={class:"line"},children:$R[14254]=[$R[14255]={type:"element",tagName:"span",properties:$R[14256]={style:"color:#758575DD"},children:$R[14257]=[$R[14258]={type:"text",value:" * - *and* create JSX and/or call a hook. This is an additional check to help prevent"}]}]},$R[14259]={type:"text",value:"\n"},$R[14260]={type:"element",tagName:"span",properties:$R[14261]={class:"line"},children:$R[14262]=[$R[14263]={type:"element",tagName:"span",properties:$R[14264]={style:"color:#758575DD"},children:$R[14265]=[$R[14266]={type:"text",value:" * false positives, since compilation has a greater impact than linting."}]}]},$R[14267]={type:"text",value:"\n"},$R[14268]={type:"element",tagName:"span",properties:$R[14269]={class:"line"},children:$R[14270]=[$R[14271]={type:"element",tagName:"span",properties:$R[14272]={style:"color:#758575DD"},children:$R[14273]=[$R[14274]={type:"text",value:" * This is the default mode"}]}]},$R[14275]={type:"text",value:"\n"},$R[14276]={type:"element",tagName:"span",properties:$R[14277]={class:"line"},children:$R[14278]=[$R[14279]={type:"element",tagName:"span",properties:$R[14280]={style:"color:#758575DD"},children:$R[14281]=[$R[14282]={type:"text",value:" */"}]}]},$R[14283]={type:"text",value:"\n"},$R[14284]={type:"element",tagName:"span",properties:$R[14285]={class:"line"},children:$R[14286]=[$R[14287]={type:"element",tagName:"span",properties:$R[14288]={style:"color:#C98A7D77"},children:$R[14289]=[$R[14290]={type:"text",value:" \""}]},$R[14291]={type:"element",tagName:"span",properties:$R[14292]={style:"color:#C98A7D"},children:$R[14293]=[$R[14294]={type:"text",value:"infer"}]},$R[14295]={type:"element",tagName:"span",properties:$R[14296]={style:"color:#C98A7D77"},children:$R[14297]=[$R[14298]={type:"text",value:"\""}]},$R[14299]={type:"element",tagName:"span",properties:$R[14300]={style:"color:#666666"},children:$R[14301]=[$R[14302]={type:"text",value:","}]}]},$R[14303]={type:"text",value:"\n"},$R[14304]={type:"element",tagName:"span",properties:$R[14305]={class:"line"},children:$R[14306]=[$R[14307]={type:"element",tagName:"span",properties:$R[14308]={style:"color:#758575DD"},children:$R[14309]=[$R[14310]={type:"text",value:" // Compile only functions which are explicitly annotated with \"use forget\""}]}]},$R[14311]={type:"text",value:"\n"},$R[14312]={type:"element",tagName:"span",properties:$R[14313]={class:"line"},children:$R[14314]=[$R[14315]={type:"element",tagName:"span",properties:$R[14316]={style:"color:#C98A7D77"},children:$R[14317]=[$R[14318]={type:"text",value:" \""}]},$R[14319]={type:"element",tagName:"span",properties:$R[14320]={style:"color:#C98A7D"},children:$R[14321]=[$R[14322]={type:"text",value:"annotation"}]},$R[14323]={type:"element",tagName:"span",properties:$R[14324]={style:"color:#C98A7D77"},children:$R[14325]=[$R[14326]={type:"text",value:"\""}]},$R[14327]={type:"element",tagName:"span",properties:$R[14328]={style:"color:#666666"},children:$R[14329]=[$R[14330]={type:"text",value:","}]}]},$R[14331]={type:"text",value:"\n"},$R[14332]={type:"element",tagName:"span",properties:$R[14333]={class:"line"},children:$R[14334]=[$R[14335]={type:"element",tagName:"span",properties:$R[14336]={style:"color:#758575DD"},children:$R[14337]=[$R[14338]={type:"text",value:" // Compile all top-level functions"}]}]},$R[14339]={type:"text",value:"\n"},$R[14340]={type:"element",tagName:"span",properties:$R[14341]={class:"line"},children:$R[14342]=[$R[14343]={type:"element",tagName:"span",properties:$R[14344]={style:"color:#C98A7D77"},children:$R[14345]=[$R[14346]={type:"text",value:" \""}]},$R[14347]={type:"element",tagName:"span",properties:$R[14348]={style:"color:#C98A7D"},children:$R[14349]=[$R[14350]={type:"text",value:"all"}]},$R[14351]={type:"element",tagName:"span",properties:$R[14352]={style:"color:#C98A7D77"},children:$R[14353]=[$R[14354]={type:"text",value:"\""}]},$R[14355]={type:"element",tagName:"span",properties:$R[14356]={style:"color:#666666"},children:$R[14357]=[$R[14358]={type:"text",value:","}]}]},$R[14359]={type:"text",value:"\n"},$R[14360]={type:"element",tagName:"span",properties:$R[14361]={class:"line"},children:$R[14362]=[$R[14363]={type:"element",tagName:"span",properties:$R[14364]={style:"color:#666666"},children:$R[14365]=[$R[14366]={type:"text",value:"]);"}]}]}]}]}]}},$R[14367]={meta:$R[14368]={title:"react/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Options.ts at d77dd31a329df55a051800fc76668af8da8332b4 · facebook/react · GitHub",description:"The library for web and native user interfaces. Contribute to facebook/react development by creating an account on GitHub.",twitter_card:$R[14369]={images:$R[14370]=[$R[14371]={url:"https://opengraph.githubassets.com/42acbb3fec132253a9fe0fbe818ffd2fc796f89a9f13a5bad27fb17afe797e47/facebook/react"}],site:"@github",card:"summary_large_image",title:"react/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Options.ts at d77dd31a329df55a051800fc76668af8da8332b4 · facebook/react",description:"The library for web and native user interfaces. Contribute to facebook/react development by creating an account on GitHub."},open_graph:$R[14372]={images:$R[14373]=[$R[14374]={url:"https://opengraph.githubassets.com/42acbb3fec132253a9fe0fbe818ffd2fc796f89a9f13a5bad27fb17afe797e47/facebook/react",alt:"The library for web and native user interfaces. Contribute to facebook/react development by creating an account on GitHub.",width:1200,height:600}],site_name:"GitHub",type:"object",title:"react/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Options.ts at d77dd31a329df55a051800fc76668af8da8332b4 · facebook/react",url:"https://github.com/facebook/react/blob/d77dd31a329df55a051800fc76668af8da8332b4/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Options.ts",description:"The library for web and native user interfaces. Contribute to facebook/react development by creating an account on GitHub."},theme_color:"#1e2327",favicon:"https://github.githubassets.com/favicons/favicon.svg"},oembed:void 0,position:$R[14375]={start:$R[14376]={line:33,column:1,offset:1075},end:$R[14377]={line:33,column:162,offset:1236}},src:"https://github.com/facebook/react/blob/d77dd31a329df55a051800fc76668af8da8332b4/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Options.ts#L116-L132",type:"embed"},$R[14378]={children:$R[14379]=[$R[14380]={children:$R[14381]=[$R[14382]={position:$R[14383]={start:$R[14384]={line:35,column:5,offset:1242},end:$R[14385]={line:35,column:12,offset:1249}},type:"text",value:"opt-out"}],id:"opt-out",level:3,plain:"opt-out",position:$R[14386]={start:$R[14387]={line:35,column:1,offset:1238},end:$R[14388]={line:35,column:12,offset:1249}},type:"heading"},$R[14389]={children:$R[14390]=[$R[14391]={position:$R[14392]={start:$R[14393]={line:37,column:1,offset:1251},end:$R[14394]={line:37,column:10,offset:1260}},type:"inlineCode",value:"opt-out"},$R[14395]={position:$R[14396]={start:$R[14397]={line:37,column:10,offset:1260},end:$R[14398]={line:37,column:44,offset:1294}},type:"text",value:" はそもそも公式で明言された呼び方ではないということに留意しておく。"},$R[14399]={position:$R[14400]={start:$R[14401]={line:37,column:44,offset:1294},end:$R[14402]={line:37,column:52,offset:1302}},type:"inlineCode",value:"opt-in"},$R[14403]={position:$R[14404]={start:$R[14405]={line:37,column:52,offset:1302},end:$R[14406]={line:37,column:61,offset:1311}},type:"text",value:" の逆なんだから "},$R[14407]={position:$R[14408]={start:$R[14409]={line:37,column:61,offset:1311},end:$R[14410]={line:37,column:70,offset:1320}},type:"inlineCode",value:"opt-out"},$R[14411]={position:$R[14412]={start:$R[14413]={line:37,column:70,offset:1320},end:$R[14414]={line:37,column:90,offset:1340}},type:"text",value:" やろ!というのが私の勝手な解釈である。"}],position:$R[14415]={start:$R[14416]={line:37,column:1,offset:1251},end:$R[14417]={line:37,column:90,offset:1340}},type:"paragraph"},$R[14418]={children:$R[14419]=[$R[14420]={position:$R[14421]={start:$R[14422]={line:39,column:1,offset:1342},end:$R[14423]={line:39,column:9,offset:1350}},type:"text",value:"デフォルトでは "},$R[14424]={position:$R[14425]={start:$R[14426]={line:39,column:9,offset:1350},end:$R[14427]={line:39,column:16,offset:1357}},type:"inlineCode",value:"infer"},$R[14428]={position:$R[14429]={start:$R[14430]={line:39,column:16,offset:1357},end:$R[14431]={line:39,column:77,offset:1418}},type:"text",value:" となっている。これは、コンポーネントやフックのような関数をコンパイルする。後者は、次の条件を満たす関数をコンパイルする。"}],position:$R[14432]={start:$R[14433]={line:39,column:1,offset:1342},end:$R[14434]={line:39,column:77,offset:1418}},type:"paragraph"},$R[14435]={children:$R[14436]=[$R[14437]={children:$R[14438]=[$R[14439]={children:$R[14440]=[$R[14441]={position:$R[14442]={start:$R[14443]={line:41,column:3,offset:1422},end:$R[14444]={line:41,column:14,offset:1433}},type:"inlineCode",value:"component"},$R[14445]={position:$R[14446]={start:$R[14447]={line:41,column:14,offset:1433},end:$R[14448]={line:41,column:17,offset:1436}},type:"text",value:" や "},$R[14449]={position:$R[14450]={start:$R[14451]={line:41,column:17,offset:1436},end:$R[14452]={line:41,column:23,offset:1442}},type:"inlineCode",value:"hook"},$R[14453]={position:$R[14454]={start:$R[14455]={line:41,column:23,offset:1442},end:$R[14456]={line:41,column:32,offset:1451}},type:"text",value:" で定義された関数"}],position:$R[14457]={start:$R[14458]={line:41,column:3,offset:1422},end:$R[14459]={line:41,column:32,offset:1451}},type:"paragraph"},$R[14460]={children:$R[14461]=[$R[14462]={children:$R[14463]=[$R[14464]={children:$R[14465]=[$R[14466]={position:$R[14467]={start:$R[14468]={line:42,column:5,offset:1456},end:$R[14469]={line:42,column:17,offset:1468}},type:"text",value:"Flow のシンタックス"}],position:$R[14470]={start:$R[14471]={line:42,column:5,offset:1456},end:$R[14472]={line:42,column:17,offset:1468}},type:"paragraph"}],position:$R[14473]={start:$R[14474]={line:42,column:3,offset:1454},end:$R[14475]={line:42,column:17,offset:1468}},type:"listItem"},$R[14476]={children:$R[14477]=[$R[14478]={children:$R[14479]=[$R[14480]={children:$R[14481]=[$R[14482]={position:$R[14483]={start:$R[14484]={line:43,column:5,offset:1473},end:$R[14485]={line:43,column:74,offset:1542}},type:"text",value:"https://medium.com/flow-type/announcing-component-syntax-b6c5285660d0"}],position:$R[14486]={start:$R[14487]={line:43,column:5,offset:1473},end:$R[14488]={line:43,column:74,offset:1542}},title:void 0,type:"link",url:"https://medium.com/flow-type/announcing-component-syntax-b6c5285660d0"}],position:$R[14489]={start:$R[14490]={line:43,column:5,offset:1473},end:$R[14491]={line:43,column:74,offset:1542}},type:"paragraph"}],position:$R[14492]={start:$R[14493]={line:43,column:3,offset:1471},end:$R[14494]={line:43,column:74,offset:1542}},type:"listItem"}],position:$R[14495]={start:$R[14496]={line:42,column:3,offset:1454},end:$R[14497]={line:43,column:74,offset:1542}},type:"unorderedList"}],position:$R[14498]={start:$R[14499]={line:41,column:1,offset:1420},end:$R[14500]={line:43,column:74,offset:1542}},type:"listItem"},$R[14501]={children:$R[14502]=[$R[14503]={children:$R[14504]=[$R[14505]={position:$R[14506]={start:$R[14507]={line:44,column:3,offset:1545},end:$R[14508]={line:44,column:31,offset:1573}},type:"text",value:"コンポーネントやフックのような関数であると推測される関数"}],position:$R[14509]={start:$R[14510]={line:44,column:3,offset:1545},end:$R[14511]={line:44,column:31,offset:1573}},type:"paragraph"},$R[14512]={children:$R[14513]=[$R[14514]={children:$R[14515]=[$R[14516]={children:$R[14517]=[$R[14518]={position:$R[14519]={start:$R[14520]={line:45,column:5,offset:1578},end:$R[14521]={line:45,column:30,offset:1603}},type:"text",value:"フックやコンポーネントのような名前が付けられている"}],position:$R[14522]={start:$R[14523]={line:45,column:5,offset:1578},end:$R[14524]={line:45,column:30,offset:1603}},type:"paragraph"}],position:$R[14525]={start:$R[14526]={line:45,column:3,offset:1576},end:$R[14527]={line:45,column:30,offset:1603}},type:"listItem"},$R[14528]={children:$R[14529]=[$R[14530]={children:$R[14531]=[$R[14532]={position:$R[14533]={start:$R[14534]={line:46,column:5,offset:1608},end:$R[14535]={line:46,column:24,offset:1627}},type:"text",value:"JSX を生成するか、フックを呼び出す"}],position:$R[14536]={start:$R[14537]={line:46,column:5,offset:1608},end:$R[14538]={line:46,column:24,offset:1627}},type:"paragraph"}],position:$R[14539]={start:$R[14540]={line:46,column:3,offset:1606},end:$R[14541]={line:46,column:24,offset:1627}},type:"listItem"},$R[14542]={children:$R[14543]=[$R[14544]={children:$R[14545]=[$R[14546]={position:$R[14547]={start:$R[14548]={line:47,column:5,offset:1632},end:$R[14549]={line:47,column:26,offset:1653}},type:"inlineCode",value:"eslint-plugin-react"},$R[14550]={position:$R[14551]={start:$R[14552]={line:47,column:26,offset:1653},end:$R[14553]={line:47,column:36,offset:1663}},type:"text",value:" のルールに一致する"}],position:$R[14554]={start:$R[14555]={line:47,column:5,offset:1632},end:$R[14556]={line:47,column:36,offset:1663}},type:"paragraph"}],position:$R[14557]={start:$R[14558]={line:47,column:3,offset:1630},end:$R[14559]={line:47,column:36,offset:1663}},type:"listItem"}],position:$R[14560]={start:$R[14561]={line:45,column:3,offset:1576},end:$R[14562]={line:47,column:36,offset:1663}},type:"unorderedList"}],position:$R[14563]={start:$R[14564]={line:44,column:1,offset:1543},end:$R[14565]={line:47,column:36,offset:1663}},type:"listItem"}],position:$R[14566]={start:$R[14567]={line:41,column:1,offset:1420},end:$R[14568]={line:47,column:36,offset:1663}},type:"unorderedList"},$R[14569]={children:$R[14570]=[$R[14571]={children:$R[14572]=[$R[14573]={children:$R[14574]=[$R[14575]={children:$R[14576]=[$R[14577]={position:$R[14578]={start:$R[14579]={line:49,column:5,offset:1669},end:$R[14580]={line:49,column:30,offset:1694}},type:"text",value:"フックやコンポーネントのような名前が付けられている"}],position:$R[14581]={start:$R[14582]={line:49,column:5,offset:1669},end:$R[14583]={line:49,column:30,offset:1694}},type:"paragraph"}],position:$R[14584]={start:$R[14585]={line:49,column:3,offset:1667},end:$R[14586]={line:49,column:30,offset:1694}},type:"listItem"},$R[14587]={children:$R[14588]=[$R[14589]={children:$R[14590]=[$R[14591]={position:$R[14592]={start:$R[14593]={line:50,column:5,offset:1699},end:$R[14594]={line:50,column:23,offset:1717}},type:"text",value:"JSXを生成するか、フックを呼び出す"}],position:$R[14595]={start:$R[14596]={line:50,column:5,offset:1699},end:$R[14597]={line:50,column:23,offset:1717}},type:"paragraph"}],position:$R[14598]={start:$R[14599]={line:50,column:3,offset:1697},end:$R[14600]={line:50,column:23,offset:1717}},type:"listItem"}],position:$R[14601]={start:$R[14602]={line:49,column:3,offset:1667},end:$R[14603]={line:50,column:23,offset:1717}},type:"unorderedList"}],position:$R[14604]={start:$R[14605]={line:49,column:1,offset:1665},end:$R[14606]={line:50,column:23,offset:1717}},type:"blockquote"},$R[14607]={children:$R[14608]=[$R[14609]={position:$R[14610]={start:$R[14611]={line:52,column:1,offset:1719},end:$R[14612]={line:52,column:6,offset:1724}},type:"text",value:"これらは "},$R[14613]={children:$R[14614]=[$R[14615]={position:$R[14616]={start:$R[14617]={line:52,column:7,offset:1725},end:$R[14618]={line:52,column:9,offset:1727}},type:"text",value:"ここ"}],position:$R[14619]={start:$R[14620]={line:52,column:6,offset:1724},end:$R[14621]={line:52,column:173,offset:1891}},title:void 0,type:"link",url:"https://github.com/facebook/react/blob/d77dd31a329df55a051800fc76668af8da8332b4/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts#L566-L787"},$R[14622]={position:$R[14623]={start:$R[14624]={line:52,column:173,offset:1891},end:$R[14625]={line:52,column:198,offset:1916}},type:"text",value:" で実装されている。なかなか味わいのあるコードだ。"}],position:$R[14626]={start:$R[14627]={line:52,column:1,offset:1719},end:$R[14628]={line:52,column:198,offset:1916}},type:"paragraph"},$R[14629]={children:$R[14630]=[$R[14631]={position:$R[14632]={start:$R[14633]={line:54,column:1,offset:1918},end:$R[14634]={line:54,column:8,offset:1925}},type:"inlineCode",value:"infer"},$R[14635]={position:$R[14636]={start:$R[14637]={line:54,column:8,offset:1925},end:$R[14638]={line:54,column:44,offset:1961}},type:"text",value:" モードの嬉しさは、自動的にコンパイルされる関数を選択してくれることだ。"}],position:$R[14639]={start:$R[14640]={line:54,column:1,offset:1918},end:$R[14641]={line:54,column:44,offset:1961}},type:"paragraph"},$R[14642]={children:$R[14643]=[$R[14644]={position:$R[14645]={start:$R[14646]={line:56,column:1,offset:1963},end:$R[14647]={line:56,column:4,offset:1966}},type:"text",value:"私が "},$R[14648]={position:$R[14649]={start:$R[14650]={line:56,column:4,offset:1966},end:$R[14651]={line:56,column:11,offset:1973}},type:"inlineCode",value:"infer"},$R[14652]={position:$R[14653]={start:$R[14654]={line:56,column:11,offset:1973},end:$R[14655]={line:56,column:17,offset:1979}},type:"text",value:" モードを "},$R[14656]={position:$R[14657]={start:$R[14658]={line:56,column:17,offset:1979},end:$R[14659]={line:56,column:26,offset:1988}},type:"inlineCode",value:"opt-out"},$R[14660]={position:$R[14661]={start:$R[14662]={line:56,column:26,offset:1988},end:$R[14663]={line:56,column:45,offset:2007}},type:"text",value:" と読んでいるのは後で詳しく説明する "},$R[14664]={position:$R[14665]={start:$R[14666]={line:56,column:45,offset:2007},end:$R[14667]={line:56,column:60,offset:2022}},type:"inlineCode",value:"\"use no memo\""},$R[14668]={position:$R[14669]={start:$R[14670]={line:56,column:60,offset:2022},end:$R[14671]={line:56,column:93,offset:2055}},type:"text",value:" というディレクティブでコンパイル対象から外すことができるからだ。"}],position:$R[14672]={start:$R[14673]={line:56,column:1,offset:1963},end:$R[14674]={line:56,column:93,offset:2055}},type:"paragraph"}],position:$R[14675]={end:$R[14676]={line:56,column:93,offset:2055},start:$R[14677]={line:35,column:1,offset:1238}},type:"section"},$R[14678]={children:$R[14679]=[$R[14680]={children:$R[14681]=[$R[14682]={position:$R[14683]={start:$R[14684]={line:58,column:5,offset:2061},end:$R[14685]={line:58,column:11,offset:2067}},type:"text",value:"opt-in"}],id:"opt-in",level:3,plain:"opt-in",position:$R[14686]={start:$R[14687]={line:58,column:1,offset:2057},end:$R[14688]={line:58,column:11,offset:2067}},type:"heading"},$R[14689]={children:$R[14690]=[$R[14691]={position:$R[14692]={start:$R[14693]={line:60,column:1,offset:2069},end:$R[14694]={line:60,column:13,offset:2081}},type:"inlineCode",value:"annotation"},$R[14695]={position:$R[14696]={start:$R[14697]={line:60,column:13,offset:2081},end:$R[14698]={line:60,column:19,offset:2087}},type:"text",value:" モードは、"},$R[14699]={position:$R[14700]={start:$R[14701]={line:60,column:19,offset:2087},end:$R[14702]={line:60,column:31,offset:2099}},type:"inlineCode",value:"\"use memo\""},$R[14703]={position:$R[14704]={start:$R[14705]={line:60,column:31,offset:2099},end:$R[14706]={line:60,column:61,offset:2129}},type:"text",value:" というディレクティブが付与された関数のみをコンパイルする。"}],position:$R[14707]={start:$R[14708]={line:60,column:1,offset:2069},end:$R[14709]={line:60,column:61,offset:2129}},type:"paragraph"},$R[14710]={children:$R[14711]=[$R[14712]={position:$R[14713]={start:$R[14714]={line:62,column:1,offset:2131},end:$R[14715]={line:62,column:19,offset:2149}},type:"text",value:"ドキュメントでも言及されている通り、"},$R[14716]={position:$R[14717]={start:$R[14718]={line:62,column:19,offset:2149},end:$R[14719]={line:62,column:27,offset:2157}},type:"inlineCode",value:"opt-in"},$R[14720]={position:$R[14721]={start:$R[14722]={line:62,column:27,offset:2157},end:$R[14723]={line:62,column:90,offset:2220}},type:"text",value:" はあくまで既に存在する React のプロジェクトに対して段階的に React Compoler を導入するための仕組みだ。"}],position:$R[14724]={start:$R[14725]={line:62,column:1,offset:2131},end:$R[14726]={line:62,column:90,offset:2220}},type:"paragraph"},$R[14727]={children:$R[14728]=[$R[14729]={children:$R[14730]=[$R[14731]={position:$R[14732]={start:$R[14733]={line:64,column:3,offset:2224},end:$R[14734]={line:64,column:396,offset:2617}},type:"text",value:"In rare cases, you can also configure the compiler to run in “opt-in” mode using the compilationMode: \"annotation\" option. This makes it so the compiler will only compile components and hooks annotated with a \"use memo\" directive. Please note that the annotation mode is a temporary one to aid early adopters, and that we don’t intend for the \"use memo\" directive to be used for the long term."}],position:$R[14735]={start:$R[14736]={line:64,column:3,offset:2224},end:$R[14737]={line:64,column:396,offset:2617}},type:"paragraph"},$R[14738]={children:$R[14739]=[$R[14740]={position:$R[14741]={start:$R[14742]={line:66,column:3,offset:2622},end:$R[14743]={line:66,column:158,offset:2777}},type:"text",value:"When you have more confidence with rolling out the compiler, you can expand coverage to other directories as well and slowly roll it out to your whole app."}],position:$R[14744]={start:$R[14745]={line:66,column:3,offset:2622},end:$R[14746]={line:66,column:158,offset:2777}},type:"paragraph"},$R[14747]={children:$R[14748]=[$R[14749]={position:$R[14750]={start:$R[14751]={line:68,column:3,offset:2782},end:$R[14752]={line:68,column:7,offset:2786}},type:"text",value:"--- "},$R[14753]={children:$R[14754]=[$R[14755]={position:$R[14756]={start:$R[14757]={line:68,column:7,offset:2786},end:$R[14758]={line:68,column:63,offset:2842}},type:"text",value:"https://react.dev/learn/react-compiler#existing-projects"}],position:$R[14759]={start:$R[14760]={line:68,column:7,offset:2786},end:$R[14761]={line:68,column:63,offset:2842}},title:void 0,type:"link",url:"https://react.dev/learn/react-compiler#existing-projects"}],position:$R[14762]={start:$R[14763]={line:68,column:3,offset:2782},end:$R[14764]={line:68,column:63,offset:2842}},type:"paragraph"}],position:$R[14765]={start:$R[14766]={line:64,column:1,offset:2222},end:$R[14767]={line:68,column:63,offset:2842}},type:"blockquote"}],position:$R[14768]={end:$R[14769]={line:68,column:63,offset:2842},start:$R[14770]={line:58,column:1,offset:2057}},type:"section"}],position:$R[14771]={end:$R[14772]={line:68,column:63,offset:2842},start:$R[14773]={line:9,column:1,offset:255}},type:"section"},$R[14774]={children:$R[14775]=[$R[14776]={children:$R[14777]=[$R[14778]={position:$R[14779]={start:$R[14780]={line:70,column:4,offset:2847},end:$R[14781]={line:70,column:19,offset:2862}},type:"text",value:"ややこしいディレクティブの挙動"}],id:"ややこしいディレクティブの挙動",level:2,plain:"ややこしいディレクティブの挙動",position:$R[14782]={start:$R[14783]={line:70,column:1,offset:2844},end:$R[14784]={line:70,column:19,offset:2862}},type:"heading"},$R[14785]={children:$R[14786]=[$R[14787]={position:$R[14788]={start:$R[14789]={line:72,column:1,offset:2864},end:$R[14790]={line:72,column:11,offset:2874}},type:"text",value:"さて、本題だ(?)。"},$R[14791]={position:$R[14792]={start:$R[14793]={line:72,column:11,offset:2874},end:$R[14794]={line:72,column:21,offset:2884}},type:"inlineCode",value:"use memo"},$R[14795]={position:$R[14796]={start:$R[14797]={line:72,column:21,offset:2884},end:$R[14798]={line:72,column:24,offset:2887}},type:"text",value:" と "},$R[14799]={position:$R[14800]={start:$R[14801]={line:72,column:24,offset:2887},end:$R[14802]={line:72,column:37,offset:2900}},type:"inlineCode",value:"use no memo"},$R[14803]={position:$R[14804]={start:$R[14805]={line:72,column:37,offset:2900},end:$R[14806]={line:72,column:92,offset:2955}},type:"text",value:" というディレクティブがある。これらはどちらも関数やファイルの行頭に付与することでコンパイルの挙動を変更する。"}],position:$R[14807]={start:$R[14808]={line:72,column:1,offset:2864},end:$R[14809]={line:72,column:92,offset:2955}},type:"paragraph"},$R[14810]={children:$R[14811]=[$R[14812]={position:$R[14813]={start:$R[14814]={line:74,column:1,offset:2957},end:$R[14815]={line:74,column:8,offset:2964}},type:"text",value:"混乱するのは "},$R[14816]={position:$R[14817]={start:$R[14818]={line:74,column:8,offset:2964},end:$R[14819]={line:74,column:25,offset:2981}},type:"inlineCode",value:"compilationMode"},$R[14820]={position:$R[14821]={start:$R[14822]={line:74,column:25,offset:2981},end:$R[14823]={line:74,column:45,offset:3001}},type:"text",value:" の値とその時の挙動である。例えば..."}],position:$R[14824]={start:$R[14825]={line:74,column:1,offset:2957},end:$R[14826]={line:74,column:45,offset:3001}},type:"paragraph"},$R[14827]={children:$R[14828]=[$R[14829]={children:$R[14830]=[$R[14831]={children:$R[14832]=[$R[14833]={position:$R[14834]={start:$R[14835]={line:76,column:3,offset:3005},end:$R[14836]={line:76,column:10,offset:3012}},type:"inlineCode",value:"infer"},$R[14837]={position:$R[14838]={start:$R[14839]={line:76,column:10,offset:3012},end:$R[14840]={line:76,column:15,offset:3017}},type:"text",value:" の時に "},$R[14841]={position:$R[14842]={start:$R[14843]={line:76,column:15,offset:3017},end:$R[14844]={line:76,column:27,offset:3029}},type:"inlineCode",value:"\"use memo\""},$R[14845]={position:$R[14846]={start:$R[14847]={line:76,column:27,offset:3029},end:$R[14848]={line:76,column:34,offset:3036}},type:"text",value:" を付与した時"}],position:$R[14849]={start:$R[14850]={line:76,column:3,offset:3005},end:$R[14851]={line:76,column:34,offset:3036}},type:"paragraph"}],position:$R[14852]={start:$R[14853]={line:76,column:1,offset:3003},end:$R[14854]={line:76,column:34,offset:3036}},type:"listItem"},$R[14855]={children:$R[14856]=[$R[14857]={children:$R[14858]=[$R[14859]={position:$R[14860]={start:$R[14861]={line:77,column:3,offset:3039},end:$R[14862]={line:77,column:15,offset:3051}},type:"inlineCode",value:"annotation"},$R[14863]={position:$R[14864]={start:$R[14865]={line:77,column:15,offset:3051},end:$R[14866]={line:77,column:20,offset:3056}},type:"text",value:" の時に "},$R[14867]={position:$R[14868]={start:$R[14869]={line:77,column:20,offset:3056},end:$R[14870]={line:77,column:35,offset:3071}},type:"inlineCode",value:"\"use no memo\""},$R[14871]={position:$R[14872]={start:$R[14873]={line:77,column:35,offset:3071},end:$R[14874]={line:77,column:42,offset:3078}},type:"text",value:" を付与した時"}],position:$R[14875]={start:$R[14876]={line:77,column:3,offset:3039},end:$R[14877]={line:77,column:42,offset:3078}},type:"paragraph"}],position:$R[14878]={start:$R[14879]={line:77,column:1,offset:3037},end:$R[14880]={line:77,column:42,offset:3078}},type:"listItem"}],position:$R[14881]={start:$R[14882]={line:76,column:1,offset:3003},end:$R[14883]={line:77,column:42,offset:3078}},type:"unorderedList"},$R[14884]={children:$R[14885]=[$R[14886]={position:$R[14887]={start:$R[14888]={line:79,column:1,offset:3080},end:$R[14889]={line:79,column:17,offset:3096}},type:"text",value:"など、挙動はどうなるのだろうか?"}],position:$R[14890]={start:$R[14891]={line:79,column:1,offset:3080},end:$R[14892]={line:79,column:17,offset:3096}},type:"paragraph"},$R[14893]={children:$R[14894]=[$R[14895]={position:$R[14896]={start:$R[14897]={line:81,column:1,offset:3098},end:$R[14898]={line:81,column:15,offset:3112}},type:"text",value:"解答はコードに隠されていた。"}],position:$R[14899]={start:$R[14900]={line:81,column:1,offset:3098},end:$R[14901]={line:81,column:15,offset:3112}},type:"paragraph"},$R[14902]={filename:"Program.ts ts",lang:"ts",position:$R[14903]={start:$R[14904]={line:83,column:1,offset:3114},end:$R[14905]={line:147,column:4,offset:5055}},type:"code",value:"function getReactFunctionType(\n fn: BabelFn,\n pass: CompilerPass\n): ReactFunctionType | null {\n const hookPattern = pass.opts.environment?.hookPattern ?? null;\n if (fn.node.body.type === \"BlockStatement\") {\n // Opt-outs disable compilation regardless of mode\n const useNoForget = findDirectiveDisablingMemoization(\n fn.node.body.directives,\n pass.opts\n );\n if (useNoForget != null) {\n pass.opts.logger?.logEvent(pass.filename, {\n kind: \"CompileError\",\n fnLoc: fn.node.body.loc ?? null,\n detail: {\n severity: ErrorSeverity.Todo,\n reason: 'Skipped due to \"use no forget\" directive.',\n loc: useNoForget.loc ?? null,\n suggestions: null,\n },\n });\n return null;\n }\n // Otherwise opt-ins enable compilation regardless of mode\n if (findDirectiveEnablingMemoization(fn.node.body.directives) != null) {\n return getComponentOrHookLike(fn, hookPattern) ?? \"Other\";\n }\n }\n switch (pass.opts.compilationMode) {\n case \"annotation\": {\n // opt-ins are checked above\n return null;\n }\n case \"infer\": {\n // Component and hook declarations are known components/hooks\n if (fn.isFunctionDeclaration()) {\n if (isComponentDeclaration(fn.node)) {\n return \"Component\";\n } else if (isHookDeclaration(fn.node)) {\n return \"Hook\";\n }\n }\n\n // Otherwise check if this is a component or hook-like function\n return getComponentOrHookLike(fn, hookPattern);\n }\n case \"all\": {\n // Compile only top level functions\n if (fn.scope.getProgramParent() !== fn.scope.parent) {\n return null;\n }\n\n return getComponentOrHookLike(fn, hookPattern) ?? \"Other\";\n }\n default: {\n assertExhaustive(\n pass.opts.compilationMode,\n `Unexpected compilationMode \\`${pass.opts.compilationMode}\\``\n );\n }\n }\n}",hast:$R[14906]={type:"root",children:$R[14907]=[$R[14908]={type:"element",tagName:"pre",properties:$R[14909]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[14910]=[$R[14911]={type:"element",tagName:"code",properties:$R[14912]={},children:$R[14913]=[$R[14914]={type:"element",tagName:"span",properties:$R[14915]={class:"line"},children:$R[14916]=[$R[14917]={type:"element",tagName:"span",properties:$R[14918]={style:"color:#CB7676"},children:$R[14919]=[$R[14920]={type:"text",value:"function"}]},$R[14921]={type:"element",tagName:"span",properties:$R[14922]={style:"color:#80A665"},children:$R[14923]=[$R[14924]={type:"text",value:" getReactFunctionType"}]},$R[14925]={type:"element",tagName:"span",properties:$R[14926]={style:"color:#666666"},children:$R[14927]=[$R[14928]={type:"text",value:"("}]}]},$R[14929]={type:"text",value:"\n"},$R[14930]={type:"element",tagName:"span",properties:$R[14931]={class:"line"},children:$R[14932]=[$R[14933]={type:"element",tagName:"span",properties:$R[14934]={style:"color:#BD976A"},children:$R[14935]=[$R[14936]={type:"text",value:" fn"}]},$R[14937]={type:"element",tagName:"span",properties:$R[14938]={style:"color:#666666"},children:$R[14939]=[$R[14940]={type:"text",value:": "}]},$R[14941]={type:"element",tagName:"span",properties:$R[14942]={style:"color:#5DA994"},children:$R[14943]=[$R[14944]={type:"text",value:"BabelFn"}]},$R[14945]={type:"element",tagName:"span",properties:$R[14946]={style:"color:#666666"},children:$R[14947]=[$R[14948]={type:"text",value:","}]}]},$R[14949]={type:"text",value:"\n"},$R[14950]={type:"element",tagName:"span",properties:$R[14951]={class:"line"},children:$R[14952]=[$R[14953]={type:"element",tagName:"span",properties:$R[14954]={style:"color:#BD976A"},children:$R[14955]=[$R[14956]={type:"text",value:" pass"}]},$R[14957]={type:"element",tagName:"span",properties:$R[14958]={style:"color:#666666"},children:$R[14959]=[$R[14960]={type:"text",value:": "}]},$R[14961]={type:"element",tagName:"span",properties:$R[14962]={style:"color:#5DA994"},children:$R[14963]=[$R[14964]={type:"text",value:"CompilerPass"}]}]},$R[14965]={type:"text",value:"\n"},$R[14966]={type:"element",tagName:"span",properties:$R[14967]={class:"line"},children:$R[14968]=[$R[14969]={type:"element",tagName:"span",properties:$R[14970]={style:"color:#666666"},children:$R[14971]=[$R[14972]={type:"text",value:"):"}]},$R[14973]={type:"element",tagName:"span",properties:$R[14974]={style:"color:#5DA994"},children:$R[14975]=[$R[14976]={type:"text",value:" ReactFunctionType"}]},$R[14977]={type:"element",tagName:"span",properties:$R[14978]={style:"color:#666666"},children:$R[14979]=[$R[14980]={type:"text",value:" |"}]},$R[14981]={type:"element",tagName:"span",properties:$R[14982]={style:"color:#CB7676"},children:$R[14983]=[$R[14984]={type:"text",value:" null"}]},$R[14985]={type:"element",tagName:"span",properties:$R[14986]={style:"color:#666666"},children:$R[14987]=[$R[14988]={type:"text",value:" {"}]}]},$R[14989]={type:"text",value:"\n"},$R[14990]={type:"element",tagName:"span",properties:$R[14991]={class:"line"},children:$R[14992]=[$R[14993]={type:"element",tagName:"span",properties:$R[14994]={style:"color:#CB7676"},children:$R[14995]=[$R[14996]={type:"text",value:" const "}]},$R[14997]={type:"element",tagName:"span",properties:$R[14998]={style:"color:#BD976A"},children:$R[14999]=[$R[15000]={type:"text",value:"hookPattern"}]},$R[15001]={type:"element",tagName:"span",properties:$R[15002]={style:"color:#666666"},children:$R[15003]=[$R[15004]={type:"text",value:" ="}]},$R[15005]={type:"element",tagName:"span",properties:$R[15006]={style:"color:#BD976A"},children:$R[15007]=[$R[15008]={type:"text",value:" pass"}]},$R[15009]={type:"element",tagName:"span",properties:$R[15010]={style:"color:#666666"},children:$R[15011]=[$R[15012]={type:"text",value:"."}]},$R[15013]={type:"element",tagName:"span",properties:$R[15014]={style:"color:#BD976A"},children:$R[15015]=[$R[15016]={type:"text",value:"opts"}]},$R[15017]={type:"element",tagName:"span",properties:$R[15018]={style:"color:#666666"},children:$R[15019]=[$R[15020]={type:"text",value:"."}]},$R[15021]={type:"element",tagName:"span",properties:$R[15022]={style:"color:#BD976A"},children:$R[15023]=[$R[15024]={type:"text",value:"environment"}]},$R[15025]={type:"element",tagName:"span",properties:$R[15026]={style:"color:#666666"},children:$R[15027]=[$R[15028]={type:"text",value:"?."}]},$R[15029]={type:"element",tagName:"span",properties:$R[15030]={style:"color:#BD976A"},children:$R[15031]=[$R[15032]={type:"text",value:"hookPattern"}]},$R[15033]={type:"element",tagName:"span",properties:$R[15034]={style:"color:#CB7676"},children:$R[15035]=[$R[15036]={type:"text",value:" ?? null"}]},$R[15037]={type:"element",tagName:"span",properties:$R[15038]={style:"color:#666666"},children:$R[15039]=[$R[15040]={type:"text",value:";"}]}]},$R[15041]={type:"text",value:"\n"},$R[15042]={type:"element",tagName:"span",properties:$R[15043]={class:"line"},children:$R[15044]=[$R[15045]={type:"element",tagName:"span",properties:$R[15046]={style:"color:#4D9375"},children:$R[15047]=[$R[15048]={type:"text",value:" if"}]},$R[15049]={type:"element",tagName:"span",properties:$R[15050]={style:"color:#666666"},children:$R[15051]=[$R[15052]={type:"text",value:" ("}]},$R[15053]={type:"element",tagName:"span",properties:$R[15054]={style:"color:#BD976A"},children:$R[15055]=[$R[15056]={type:"text",value:"fn"}]},$R[15057]={type:"element",tagName:"span",properties:$R[15058]={style:"color:#666666"},children:$R[15059]=[$R[15060]={type:"text",value:"."}]},$R[15061]={type:"element",tagName:"span",properties:$R[15062]={style:"color:#BD976A"},children:$R[15063]=[$R[15064]={type:"text",value:"node"}]},$R[15065]={type:"element",tagName:"span",properties:$R[15066]={style:"color:#666666"},children:$R[15067]=[$R[15068]={type:"text",value:"."}]},$R[15069]={type:"element",tagName:"span",properties:$R[15070]={style:"color:#BD976A"},children:$R[15071]=[$R[15072]={type:"text",value:"body"}]},$R[15073]={type:"element",tagName:"span",properties:$R[15074]={style:"color:#666666"},children:$R[15075]=[$R[15076]={type:"text",value:"."}]},$R[15077]={type:"element",tagName:"span",properties:$R[15078]={style:"color:#BD976A"},children:$R[15079]=[$R[15080]={type:"text",value:"type"}]},$R[15081]={type:"element",tagName:"span",properties:$R[15082]={style:"color:#CB7676"},children:$R[15083]=[$R[15084]={type:"text",value:" ==="}]},$R[15085]={type:"element",tagName:"span",properties:$R[15086]={style:"color:#C98A7D77"},children:$R[15087]=[$R[15088]={type:"text",value:" \""}]},$R[15089]={type:"element",tagName:"span",properties:$R[15090]={style:"color:#C98A7D"},children:$R[15091]=[$R[15092]={type:"text",value:"BlockStatement"}]},$R[15093]={type:"element",tagName:"span",properties:$R[15094]={style:"color:#C98A7D77"},children:$R[15095]=[$R[15096]={type:"text",value:"\""}]},$R[15097]={type:"element",tagName:"span",properties:$R[15098]={style:"color:#666666"},children:$R[15099]=[$R[15100]={type:"text",value:")"}]},$R[15101]={type:"element",tagName:"span",properties:$R[15102]={style:"color:#666666"},children:$R[15103]=[$R[15104]={type:"text",value:" {"}]}]},$R[15105]={type:"text",value:"\n"},$R[15106]={type:"element",tagName:"span",properties:$R[15107]={class:"line"},children:$R[15108]=[$R[15109]={type:"element",tagName:"span",properties:$R[15110]={style:"color:#758575DD"},children:$R[15111]=[$R[15112]={type:"text",value:" // Opt-outs disable compilation regardless of mode"}]}]},$R[15113]={type:"text",value:"\n"},$R[15114]={type:"element",tagName:"span",properties:$R[15115]={class:"line"},children:$R[15116]=[$R[15117]={type:"element",tagName:"span",properties:$R[15118]={style:"color:#CB7676"},children:$R[15119]=[$R[15120]={type:"text",value:" const "}]},$R[15121]={type:"element",tagName:"span",properties:$R[15122]={style:"color:#BD976A"},children:$R[15123]=[$R[15124]={type:"text",value:"useNoForget"}]},$R[15125]={type:"element",tagName:"span",properties:$R[15126]={style:"color:#666666"},children:$R[15127]=[$R[15128]={type:"text",value:" ="}]},$R[15129]={type:"element",tagName:"span",properties:$R[15130]={style:"color:#80A665"},children:$R[15131]=[$R[15132]={type:"text",value:" findDirectiveDisablingMemoization"}]},$R[15133]={type:"element",tagName:"span",properties:$R[15134]={style:"color:#666666"},children:$R[15135]=[$R[15136]={type:"text",value:"("}]}]},$R[15137]={type:"text",value:"\n"},$R[15138]={type:"element",tagName:"span",properties:$R[15139]={class:"line"},children:$R[15140]=[$R[15141]={type:"element",tagName:"span",properties:$R[15142]={style:"color:#BD976A"},children:$R[15143]=[$R[15144]={type:"text",value:" fn"}]},$R[15145]={type:"element",tagName:"span",properties:$R[15146]={style:"color:#666666"},children:$R[15147]=[$R[15148]={type:"text",value:"."}]},$R[15149]={type:"element",tagName:"span",properties:$R[15150]={style:"color:#BD976A"},children:$R[15151]=[$R[15152]={type:"text",value:"node"}]},$R[15153]={type:"element",tagName:"span",properties:$R[15154]={style:"color:#666666"},children:$R[15155]=[$R[15156]={type:"text",value:"."}]},$R[15157]={type:"element",tagName:"span",properties:$R[15158]={style:"color:#BD976A"},children:$R[15159]=[$R[15160]={type:"text",value:"body"}]},$R[15161]={type:"element",tagName:"span",properties:$R[15162]={style:"color:#666666"},children:$R[15163]=[$R[15164]={type:"text",value:"."}]},$R[15165]={type:"element",tagName:"span",properties:$R[15166]={style:"color:#BD976A"},children:$R[15167]=[$R[15168]={type:"text",value:"directives"}]},$R[15169]={type:"element",tagName:"span",properties:$R[15170]={style:"color:#666666"},children:$R[15171]=[$R[15172]={type:"text",value:","}]}]},$R[15173]={type:"text",value:"\n"},$R[15174]={type:"element",tagName:"span",properties:$R[15175]={class:"line"},children:$R[15176]=[$R[15177]={type:"element",tagName:"span",properties:$R[15178]={style:"color:#BD976A"},children:$R[15179]=[$R[15180]={type:"text",value:" pass"}]},$R[15181]={type:"element",tagName:"span",properties:$R[15182]={style:"color:#666666"},children:$R[15183]=[$R[15184]={type:"text",value:"."}]},$R[15185]={type:"element",tagName:"span",properties:$R[15186]={style:"color:#BD976A"},children:$R[15187]=[$R[15188]={type:"text",value:"opts"}]}]},$R[15189]={type:"text",value:"\n"},$R[15190]={type:"element",tagName:"span",properties:$R[15191]={class:"line"},children:$R[15192]=[$R[15193]={type:"element",tagName:"span",properties:$R[15194]={style:"color:#666666"},children:$R[15195]=[$R[15196]={type:"text",value:" );"}]}]},$R[15197]={type:"text",value:"\n"},$R[15198]={type:"element",tagName:"span",properties:$R[15199]={class:"line"},children:$R[15200]=[$R[15201]={type:"element",tagName:"span",properties:$R[15202]={style:"color:#4D9375"},children:$R[15203]=[$R[15204]={type:"text",value:" if"}]},$R[15205]={type:"element",tagName:"span",properties:$R[15206]={style:"color:#666666"},children:$R[15207]=[$R[15208]={type:"text",value:" ("}]},$R[15209]={type:"element",tagName:"span",properties:$R[15210]={style:"color:#BD976A"},children:$R[15211]=[$R[15212]={type:"text",value:"useNoForget"}]},$R[15213]={type:"element",tagName:"span",properties:$R[15214]={style:"color:#CB7676"},children:$R[15215]=[$R[15216]={type:"text",value:" !="}]},$R[15217]={type:"element",tagName:"span",properties:$R[15218]={style:"color:#CB7676"},children:$R[15219]=[$R[15220]={type:"text",value:" null"}]},$R[15221]={type:"element",tagName:"span",properties:$R[15222]={style:"color:#666666"},children:$R[15223]=[$R[15224]={type:"text",value:")"}]},$R[15225]={type:"element",tagName:"span",properties:$R[15226]={style:"color:#666666"},children:$R[15227]=[$R[15228]={type:"text",value:" {"}]}]},$R[15229]={type:"text",value:"\n"},$R[15230]={type:"element",tagName:"span",properties:$R[15231]={class:"line"},children:$R[15232]=[$R[15233]={type:"element",tagName:"span",properties:$R[15234]={style:"color:#BD976A"},children:$R[15235]=[$R[15236]={type:"text",value:" pass"}]},$R[15237]={type:"element",tagName:"span",properties:$R[15238]={style:"color:#666666"},children:$R[15239]=[$R[15240]={type:"text",value:"."}]},$R[15241]={type:"element",tagName:"span",properties:$R[15242]={style:"color:#BD976A"},children:$R[15243]=[$R[15244]={type:"text",value:"opts"}]},$R[15245]={type:"element",tagName:"span",properties:$R[15246]={style:"color:#666666"},children:$R[15247]=[$R[15248]={type:"text",value:"."}]},$R[15249]={type:"element",tagName:"span",properties:$R[15250]={style:"color:#BD976A"},children:$R[15251]=[$R[15252]={type:"text",value:"logger"}]},$R[15253]={type:"element",tagName:"span",properties:$R[15254]={style:"color:#666666"},children:$R[15255]=[$R[15256]={type:"text",value:"?."}]},$R[15257]={type:"element",tagName:"span",properties:$R[15258]={style:"color:#80A665"},children:$R[15259]=[$R[15260]={type:"text",value:"logEvent"}]},$R[15261]={type:"element",tagName:"span",properties:$R[15262]={style:"color:#666666"},children:$R[15263]=[$R[15264]={type:"text",value:"("}]},$R[15265]={type:"element",tagName:"span",properties:$R[15266]={style:"color:#BD976A"},children:$R[15267]=[$R[15268]={type:"text",value:"pass"}]},$R[15269]={type:"element",tagName:"span",properties:$R[15270]={style:"color:#666666"},children:$R[15271]=[$R[15272]={type:"text",value:"."}]},$R[15273]={type:"element",tagName:"span",properties:$R[15274]={style:"color:#BD976A"},children:$R[15275]=[$R[15276]={type:"text",value:"filename"}]},$R[15277]={type:"element",tagName:"span",properties:$R[15278]={style:"color:#666666"},children:$R[15279]=[$R[15280]={type:"text",value:","}]},$R[15281]={type:"element",tagName:"span",properties:$R[15282]={style:"color:#666666"},children:$R[15283]=[$R[15284]={type:"text",value:" {"}]}]},$R[15285]={type:"text",value:"\n"},$R[15286]={type:"element",tagName:"span",properties:$R[15287]={class:"line"},children:$R[15288]=[$R[15289]={type:"element",tagName:"span",properties:$R[15290]={style:"color:#B8A965"},children:$R[15291]=[$R[15292]={type:"text",value:" kind"}]},$R[15293]={type:"element",tagName:"span",properties:$R[15294]={style:"color:#666666"},children:$R[15295]=[$R[15296]={type:"text",value:": "}]},$R[15297]={type:"element",tagName:"span",properties:$R[15298]={style:"color:#C98A7D77"},children:$R[15299]=[$R[15300]={type:"text",value:"\""}]},$R[15301]={type:"element",tagName:"span",properties:$R[15302]={style:"color:#C98A7D"},children:$R[15303]=[$R[15304]={type:"text",value:"CompileError"}]},$R[15305]={type:"element",tagName:"span",properties:$R[15306]={style:"color:#C98A7D77"},children:$R[15307]=[$R[15308]={type:"text",value:"\""}]},$R[15309]={type:"element",tagName:"span",properties:$R[15310]={style:"color:#666666"},children:$R[15311]=[$R[15312]={type:"text",value:","}]}]},$R[15313]={type:"text",value:"\n"},$R[15314]={type:"element",tagName:"span",properties:$R[15315]={class:"line"},children:$R[15316]=[$R[15317]={type:"element",tagName:"span",properties:$R[15318]={style:"color:#B8A965"},children:$R[15319]=[$R[15320]={type:"text",value:" fnLoc"}]},$R[15321]={type:"element",tagName:"span",properties:$R[15322]={style:"color:#666666"},children:$R[15323]=[$R[15324]={type:"text",value:": "}]},$R[15325]={type:"element",tagName:"span",properties:$R[15326]={style:"color:#BD976A"},children:$R[15327]=[$R[15328]={type:"text",value:"fn"}]},$R[15329]={type:"element",tagName:"span",properties:$R[15330]={style:"color:#666666"},children:$R[15331]=[$R[15332]={type:"text",value:"."}]},$R[15333]={type:"element",tagName:"span",properties:$R[15334]={style:"color:#BD976A"},children:$R[15335]=[$R[15336]={type:"text",value:"node"}]},$R[15337]={type:"element",tagName:"span",properties:$R[15338]={style:"color:#666666"},children:$R[15339]=[$R[15340]={type:"text",value:"."}]},$R[15341]={type:"element",tagName:"span",properties:$R[15342]={style:"color:#BD976A"},children:$R[15343]=[$R[15344]={type:"text",value:"body"}]},$R[15345]={type:"element",tagName:"span",properties:$R[15346]={style:"color:#666666"},children:$R[15347]=[$R[15348]={type:"text",value:"."}]},$R[15349]={type:"element",tagName:"span",properties:$R[15350]={style:"color:#BD976A"},children:$R[15351]=[$R[15352]={type:"text",value:"loc"}]},$R[15353]={type:"element",tagName:"span",properties:$R[15354]={style:"color:#CB7676"},children:$R[15355]=[$R[15356]={type:"text",value:" ??"}]},$R[15357]={type:"element",tagName:"span",properties:$R[15358]={style:"color:#CB7676"},children:$R[15359]=[$R[15360]={type:"text",value:" null"}]},$R[15361]={type:"element",tagName:"span",properties:$R[15362]={style:"color:#666666"},children:$R[15363]=[$R[15364]={type:"text",value:","}]}]},$R[15365]={type:"text",value:"\n"},$R[15366]={type:"element",tagName:"span",properties:$R[15367]={class:"line"},children:$R[15368]=[$R[15369]={type:"element",tagName:"span",properties:$R[15370]={style:"color:#B8A965"},children:$R[15371]=[$R[15372]={type:"text",value:" detail"}]},$R[15373]={type:"element",tagName:"span",properties:$R[15374]={style:"color:#666666"},children:$R[15375]=[$R[15376]={type:"text",value:": {"}]}]},$R[15377]={type:"text",value:"\n"},$R[15378]={type:"element",tagName:"span",properties:$R[15379]={class:"line"},children:$R[15380]=[$R[15381]={type:"element",tagName:"span",properties:$R[15382]={style:"color:#B8A965"},children:$R[15383]=[$R[15384]={type:"text",value:" severity"}]},$R[15385]={type:"element",tagName:"span",properties:$R[15386]={style:"color:#666666"},children:$R[15387]=[$R[15388]={type:"text",value:": "}]},$R[15389]={type:"element",tagName:"span",properties:$R[15390]={style:"color:#BD976A"},children:$R[15391]=[$R[15392]={type:"text",value:"ErrorSeverity"}]},$R[15393]={type:"element",tagName:"span",properties:$R[15394]={style:"color:#666666"},children:$R[15395]=[$R[15396]={type:"text",value:"."}]},$R[15397]={type:"element",tagName:"span",properties:$R[15398]={style:"color:#BD976A"},children:$R[15399]=[$R[15400]={type:"text",value:"Todo"}]},$R[15401]={type:"element",tagName:"span",properties:$R[15402]={style:"color:#666666"},children:$R[15403]=[$R[15404]={type:"text",value:","}]}]},$R[15405]={type:"text",value:"\n"},$R[15406]={type:"element",tagName:"span",properties:$R[15407]={class:"line"},children:$R[15408]=[$R[15409]={type:"element",tagName:"span",properties:$R[15410]={style:"color:#B8A965"},children:$R[15411]=[$R[15412]={type:"text",value:" reason"}]},$R[15413]={type:"element",tagName:"span",properties:$R[15414]={style:"color:#666666"},children:$R[15415]=[$R[15416]={type:"text",value:": "}]},$R[15417]={type:"element",tagName:"span",properties:$R[15418]={style:"color:#C98A7D77"},children:$R[15419]=[$R[15420]={type:"text",value:"'"}]},$R[15421]={type:"element",tagName:"span",properties:$R[15422]={style:"color:#C98A7D"},children:$R[15423]=[$R[15424]={type:"text",value:"Skipped due to \"use no forget\" directive."}]},$R[15425]={type:"element",tagName:"span",properties:$R[15426]={style:"color:#C98A7D77"},children:$R[15427]=[$R[15428]={type:"text",value:"'"}]},$R[15429]={type:"element",tagName:"span",properties:$R[15430]={style:"color:#666666"},children:$R[15431]=[$R[15432]={type:"text",value:","}]}]},$R[15433]={type:"text",value:"\n"},$R[15434]={type:"element",tagName:"span",properties:$R[15435]={class:"line"},children:$R[15436]=[$R[15437]={type:"element",tagName:"span",properties:$R[15438]={style:"color:#B8A965"},children:$R[15439]=[$R[15440]={type:"text",value:" loc"}]},$R[15441]={type:"element",tagName:"span",properties:$R[15442]={style:"color:#666666"},children:$R[15443]=[$R[15444]={type:"text",value:": "}]},$R[15445]={type:"element",tagName:"span",properties:$R[15446]={style:"color:#BD976A"},children:$R[15447]=[$R[15448]={type:"text",value:"useNoForget"}]},$R[15449]={type:"element",tagName:"span",properties:$R[15450]={style:"color:#666666"},children:$R[15451]=[$R[15452]={type:"text",value:"."}]},$R[15453]={type:"element",tagName:"span",properties:$R[15454]={style:"color:#BD976A"},children:$R[15455]=[$R[15456]={type:"text",value:"loc"}]},$R[15457]={type:"element",tagName:"span",properties:$R[15458]={style:"color:#CB7676"},children:$R[15459]=[$R[15460]={type:"text",value:" ??"}]},$R[15461]={type:"element",tagName:"span",properties:$R[15462]={style:"color:#CB7676"},children:$R[15463]=[$R[15464]={type:"text",value:" null"}]},$R[15465]={type:"element",tagName:"span",properties:$R[15466]={style:"color:#666666"},children:$R[15467]=[$R[15468]={type:"text",value:","}]}]},$R[15469]={type:"text",value:"\n"},$R[15470]={type:"element",tagName:"span",properties:$R[15471]={class:"line"},children:$R[15472]=[$R[15473]={type:"element",tagName:"span",properties:$R[15474]={style:"color:#B8A965"},children:$R[15475]=[$R[15476]={type:"text",value:" suggestions"}]},$R[15477]={type:"element",tagName:"span",properties:$R[15478]={style:"color:#666666"},children:$R[15479]=[$R[15480]={type:"text",value:": "}]},$R[15481]={type:"element",tagName:"span",properties:$R[15482]={style:"color:#CB7676"},children:$R[15483]=[$R[15484]={type:"text",value:"null"}]},$R[15485]={type:"element",tagName:"span",properties:$R[15486]={style:"color:#666666"},children:$R[15487]=[$R[15488]={type:"text",value:","}]}]},$R[15489]={type:"text",value:"\n"},$R[15490]={type:"element",tagName:"span",properties:$R[15491]={class:"line"},children:$R[15492]=[$R[15493]={type:"element",tagName:"span",properties:$R[15494]={style:"color:#666666"},children:$R[15495]=[$R[15496]={type:"text",value:" },"}]}]},$R[15497]={type:"text",value:"\n"},$R[15498]={type:"element",tagName:"span",properties:$R[15499]={class:"line"},children:$R[15500]=[$R[15501]={type:"element",tagName:"span",properties:$R[15502]={style:"color:#666666"},children:$R[15503]=[$R[15504]={type:"text",value:" });"}]}]},$R[15505]={type:"text",value:"\n"},$R[15506]={type:"element",tagName:"span",properties:$R[15507]={class:"line"},children:$R[15508]=[$R[15509]={type:"element",tagName:"span",properties:$R[15510]={style:"color:#4D9375"},children:$R[15511]=[$R[15512]={type:"text",value:" return"}]},$R[15513]={type:"element",tagName:"span",properties:$R[15514]={style:"color:#CB7676"},children:$R[15515]=[$R[15516]={type:"text",value:" null"}]},$R[15517]={type:"element",tagName:"span",properties:$R[15518]={style:"color:#666666"},children:$R[15519]=[$R[15520]={type:"text",value:";"}]}]},$R[15521]={type:"text",value:"\n"},$R[15522]={type:"element",tagName:"span",properties:$R[15523]={class:"line"},children:$R[15524]=[$R[15525]={type:"element",tagName:"span",properties:$R[15526]={style:"color:#666666"},children:$R[15527]=[$R[15528]={type:"text",value:" }"}]}]},$R[15529]={type:"text",value:"\n"},$R[15530]={type:"element",tagName:"span",properties:$R[15531]={class:"line"},children:$R[15532]=[$R[15533]={type:"element",tagName:"span",properties:$R[15534]={style:"color:#758575DD"},children:$R[15535]=[$R[15536]={type:"text",value:" // Otherwise opt-ins enable compilation regardless of mode"}]}]},$R[15537]={type:"text",value:"\n"},$R[15538]={type:"element",tagName:"span",properties:$R[15539]={class:"line"},children:$R[15540]=[$R[15541]={type:"element",tagName:"span",properties:$R[15542]={style:"color:#4D9375"},children:$R[15543]=[$R[15544]={type:"text",value:" if"}]},$R[15545]={type:"element",tagName:"span",properties:$R[15546]={style:"color:#666666"},children:$R[15547]=[$R[15548]={type:"text",value:" ("}]},$R[15549]={type:"element",tagName:"span",properties:$R[15550]={style:"color:#80A665"},children:$R[15551]=[$R[15552]={type:"text",value:"findDirectiveEnablingMemoization"}]},$R[15553]={type:"element",tagName:"span",properties:$R[15554]={style:"color:#666666"},children:$R[15555]=[$R[15556]={type:"text",value:"("}]},$R[15557]={type:"element",tagName:"span",properties:$R[15558]={style:"color:#BD976A"},children:$R[15559]=[$R[15560]={type:"text",value:"fn"}]},$R[15561]={type:"element",tagName:"span",properties:$R[15562]={style:"color:#666666"},children:$R[15563]=[$R[15564]={type:"text",value:"."}]},$R[15565]={type:"element",tagName:"span",properties:$R[15566]={style:"color:#BD976A"},children:$R[15567]=[$R[15568]={type:"text",value:"node"}]},$R[15569]={type:"element",tagName:"span",properties:$R[15570]={style:"color:#666666"},children:$R[15571]=[$R[15572]={type:"text",value:"."}]},$R[15573]={type:"element",tagName:"span",properties:$R[15574]={style:"color:#BD976A"},children:$R[15575]=[$R[15576]={type:"text",value:"body"}]},$R[15577]={type:"element",tagName:"span",properties:$R[15578]={style:"color:#666666"},children:$R[15579]=[$R[15580]={type:"text",value:"."}]},$R[15581]={type:"element",tagName:"span",properties:$R[15582]={style:"color:#BD976A"},children:$R[15583]=[$R[15584]={type:"text",value:"directives"}]},$R[15585]={type:"element",tagName:"span",properties:$R[15586]={style:"color:#666666"},children:$R[15587]=[$R[15588]={type:"text",value:")"}]},$R[15589]={type:"element",tagName:"span",properties:$R[15590]={style:"color:#CB7676"},children:$R[15591]=[$R[15592]={type:"text",value:" !="}]},$R[15593]={type:"element",tagName:"span",properties:$R[15594]={style:"color:#CB7676"},children:$R[15595]=[$R[15596]={type:"text",value:" null"}]},$R[15597]={type:"element",tagName:"span",properties:$R[15598]={style:"color:#666666"},children:$R[15599]=[$R[15600]={type:"text",value:")"}]},$R[15601]={type:"element",tagName:"span",properties:$R[15602]={style:"color:#666666"},children:$R[15603]=[$R[15604]={type:"text",value:" {"}]}]},$R[15605]={type:"text",value:"\n"},$R[15606]={type:"element",tagName:"span",properties:$R[15607]={class:"line"},children:$R[15608]=[$R[15609]={type:"element",tagName:"span",properties:$R[15610]={style:"color:#4D9375"},children:$R[15611]=[$R[15612]={type:"text",value:" return"}]},$R[15613]={type:"element",tagName:"span",properties:$R[15614]={style:"color:#80A665"},children:$R[15615]=[$R[15616]={type:"text",value:" getComponentOrHookLike"}]},$R[15617]={type:"element",tagName:"span",properties:$R[15618]={style:"color:#666666"},children:$R[15619]=[$R[15620]={type:"text",value:"("}]},$R[15621]={type:"element",tagName:"span",properties:$R[15622]={style:"color:#BD976A"},children:$R[15623]=[$R[15624]={type:"text",value:"fn"}]},$R[15625]={type:"element",tagName:"span",properties:$R[15626]={style:"color:#666666"},children:$R[15627]=[$R[15628]={type:"text",value:","}]},$R[15629]={type:"element",tagName:"span",properties:$R[15630]={style:"color:#BD976A"},children:$R[15631]=[$R[15632]={type:"text",value:" hookPattern"}]},$R[15633]={type:"element",tagName:"span",properties:$R[15634]={style:"color:#666666"},children:$R[15635]=[$R[15636]={type:"text",value:")"}]},$R[15637]={type:"element",tagName:"span",properties:$R[15638]={style:"color:#CB7676"},children:$R[15639]=[$R[15640]={type:"text",value:" ??"}]},$R[15641]={type:"element",tagName:"span",properties:$R[15642]={style:"color:#C98A7D77"},children:$R[15643]=[$R[15644]={type:"text",value:" \""}]},$R[15645]={type:"element",tagName:"span",properties:$R[15646]={style:"color:#C98A7D"},children:$R[15647]=[$R[15648]={type:"text",value:"Other"}]},$R[15649]={type:"element",tagName:"span",properties:$R[15650]={style:"color:#C98A7D77"},children:$R[15651]=[$R[15652]={type:"text",value:"\""}]},$R[15653]={type:"element",tagName:"span",properties:$R[15654]={style:"color:#666666"},children:$R[15655]=[$R[15656]={type:"text",value:";"}]}]},$R[15657]={type:"text",value:"\n"},$R[15658]={type:"element",tagName:"span",properties:$R[15659]={class:"line"},children:$R[15660]=[$R[15661]={type:"element",tagName:"span",properties:$R[15662]={style:"color:#666666"},children:$R[15663]=[$R[15664]={type:"text",value:" }"}]}]},$R[15665]={type:"text",value:"\n"},$R[15666]={type:"element",tagName:"span",properties:$R[15667]={class:"line"},children:$R[15668]=[$R[15669]={type:"element",tagName:"span",properties:$R[15670]={style:"color:#666666"},children:$R[15671]=[$R[15672]={type:"text",value:" }"}]}]},$R[15673]={type:"text",value:"\n"},$R[15674]={type:"element",tagName:"span",properties:$R[15675]={class:"line"},children:$R[15676]=[$R[15677]={type:"element",tagName:"span",properties:$R[15678]={style:"color:#4D9375"},children:$R[15679]=[$R[15680]={type:"text",value:" switch"}]},$R[15681]={type:"element",tagName:"span",properties:$R[15682]={style:"color:#666666"},children:$R[15683]=[$R[15684]={type:"text",value:" ("}]},$R[15685]={type:"element",tagName:"span",properties:$R[15686]={style:"color:#BD976A"},children:$R[15687]=[$R[15688]={type:"text",value:"pass"}]},$R[15689]={type:"element",tagName:"span",properties:$R[15690]={style:"color:#666666"},children:$R[15691]=[$R[15692]={type:"text",value:"."}]},$R[15693]={type:"element",tagName:"span",properties:$R[15694]={style:"color:#BD976A"},children:$R[15695]=[$R[15696]={type:"text",value:"opts"}]},$R[15697]={type:"element",tagName:"span",properties:$R[15698]={style:"color:#666666"},children:$R[15699]=[$R[15700]={type:"text",value:"."}]},$R[15701]={type:"element",tagName:"span",properties:$R[15702]={style:"color:#BD976A"},children:$R[15703]=[$R[15704]={type:"text",value:"compilationMode"}]},$R[15705]={type:"element",tagName:"span",properties:$R[15706]={style:"color:#666666"},children:$R[15707]=[$R[15708]={type:"text",value:")"}]},$R[15709]={type:"element",tagName:"span",properties:$R[15710]={style:"color:#666666"},children:$R[15711]=[$R[15712]={type:"text",value:" {"}]}]},$R[15713]={type:"text",value:"\n"},$R[15714]={type:"element",tagName:"span",properties:$R[15715]={class:"line"},children:$R[15716]=[$R[15717]={type:"element",tagName:"span",properties:$R[15718]={style:"color:#4D9375"},children:$R[15719]=[$R[15720]={type:"text",value:" case"}]},$R[15721]={type:"element",tagName:"span",properties:$R[15722]={style:"color:#C98A7D77"},children:$R[15723]=[$R[15724]={type:"text",value:" \""}]},$R[15725]={type:"element",tagName:"span",properties:$R[15726]={style:"color:#C98A7D"},children:$R[15727]=[$R[15728]={type:"text",value:"annotation"}]},$R[15729]={type:"element",tagName:"span",properties:$R[15730]={style:"color:#C98A7D77"},children:$R[15731]=[$R[15732]={type:"text",value:"\""}]},$R[15733]={type:"element",tagName:"span",properties:$R[15734]={style:"color:#666666"},children:$R[15735]=[$R[15736]={type:"text",value:":"}]},$R[15737]={type:"element",tagName:"span",properties:$R[15738]={style:"color:#666666"},children:$R[15739]=[$R[15740]={type:"text",value:" {"}]}]},$R[15741]={type:"text",value:"\n"},$R[15742]={type:"element",tagName:"span",properties:$R[15743]={class:"line"},children:$R[15744]=[$R[15745]={type:"element",tagName:"span",properties:$R[15746]={style:"color:#758575DD"},children:$R[15747]=[$R[15748]={type:"text",value:" // opt-ins are checked above"}]}]},$R[15749]={type:"text",value:"\n"},$R[15750]={type:"element",tagName:"span",properties:$R[15751]={class:"line"},children:$R[15752]=[$R[15753]={type:"element",tagName:"span",properties:$R[15754]={style:"color:#4D9375"},children:$R[15755]=[$R[15756]={type:"text",value:" return"}]},$R[15757]={type:"element",tagName:"span",properties:$R[15758]={style:"color:#CB7676"},children:$R[15759]=[$R[15760]={type:"text",value:" null"}]},$R[15761]={type:"element",tagName:"span",properties:$R[15762]={style:"color:#666666"},children:$R[15763]=[$R[15764]={type:"text",value:";"}]}]},$R[15765]={type:"text",value:"\n"},$R[15766]={type:"element",tagName:"span",properties:$R[15767]={class:"line"},children:$R[15768]=[$R[15769]={type:"element",tagName:"span",properties:$R[15770]={style:"color:#666666"},children:$R[15771]=[$R[15772]={type:"text",value:" }"}]}]},$R[15773]={type:"text",value:"\n"},$R[15774]={type:"element",tagName:"span",properties:$R[15775]={class:"line"},children:$R[15776]=[$R[15777]={type:"element",tagName:"span",properties:$R[15778]={style:"color:#4D9375"},children:$R[15779]=[$R[15780]={type:"text",value:" case"}]},$R[15781]={type:"element",tagName:"span",properties:$R[15782]={style:"color:#C98A7D77"},children:$R[15783]=[$R[15784]={type:"text",value:" \""}]},$R[15785]={type:"element",tagName:"span",properties:$R[15786]={style:"color:#C98A7D"},children:$R[15787]=[$R[15788]={type:"text",value:"infer"}]},$R[15789]={type:"element",tagName:"span",properties:$R[15790]={style:"color:#C98A7D77"},children:$R[15791]=[$R[15792]={type:"text",value:"\""}]},$R[15793]={type:"element",tagName:"span",properties:$R[15794]={style:"color:#666666"},children:$R[15795]=[$R[15796]={type:"text",value:":"}]},$R[15797]={type:"element",tagName:"span",properties:$R[15798]={style:"color:#666666"},children:$R[15799]=[$R[15800]={type:"text",value:" {"}]}]},$R[15801]={type:"text",value:"\n"},$R[15802]={type:"element",tagName:"span",properties:$R[15803]={class:"line"},children:$R[15804]=[$R[15805]={type:"element",tagName:"span",properties:$R[15806]={style:"color:#758575DD"},children:$R[15807]=[$R[15808]={type:"text",value:" // Component and hook declarations are known components/hooks"}]}]},$R[15809]={type:"text",value:"\n"},$R[15810]={type:"element",tagName:"span",properties:$R[15811]={class:"line"},children:$R[15812]=[$R[15813]={type:"element",tagName:"span",properties:$R[15814]={style:"color:#4D9375"},children:$R[15815]=[$R[15816]={type:"text",value:" if"}]},$R[15817]={type:"element",tagName:"span",properties:$R[15818]={style:"color:#666666"},children:$R[15819]=[$R[15820]={type:"text",value:" ("}]},$R[15821]={type:"element",tagName:"span",properties:$R[15822]={style:"color:#BD976A"},children:$R[15823]=[$R[15824]={type:"text",value:"fn"}]},$R[15825]={type:"element",tagName:"span",properties:$R[15826]={style:"color:#666666"},children:$R[15827]=[$R[15828]={type:"text",value:"."}]},$R[15829]={type:"element",tagName:"span",properties:$R[15830]={style:"color:#80A665"},children:$R[15831]=[$R[15832]={type:"text",value:"isFunctionDeclaration"}]},$R[15833]={type:"element",tagName:"span",properties:$R[15834]={style:"color:#666666"},children:$R[15835]=[$R[15836]={type:"text",value:"())"}]},$R[15837]={type:"element",tagName:"span",properties:$R[15838]={style:"color:#666666"},children:$R[15839]=[$R[15840]={type:"text",value:" {"}]}]},$R[15841]={type:"text",value:"\n"},$R[15842]={type:"element",tagName:"span",properties:$R[15843]={class:"line"},children:$R[15844]=[$R[15845]={type:"element",tagName:"span",properties:$R[15846]={style:"color:#4D9375"},children:$R[15847]=[$R[15848]={type:"text",value:" if"}]},$R[15849]={type:"element",tagName:"span",properties:$R[15850]={style:"color:#666666"},children:$R[15851]=[$R[15852]={type:"text",value:" ("}]},$R[15853]={type:"element",tagName:"span",properties:$R[15854]={style:"color:#80A665"},children:$R[15855]=[$R[15856]={type:"text",value:"isComponentDeclaration"}]},$R[15857]={type:"element",tagName:"span",properties:$R[15858]={style:"color:#666666"},children:$R[15859]=[$R[15860]={type:"text",value:"("}]},$R[15861]={type:"element",tagName:"span",properties:$R[15862]={style:"color:#BD976A"},children:$R[15863]=[$R[15864]={type:"text",value:"fn"}]},$R[15865]={type:"element",tagName:"span",properties:$R[15866]={style:"color:#666666"},children:$R[15867]=[$R[15868]={type:"text",value:"."}]},$R[15869]={type:"element",tagName:"span",properties:$R[15870]={style:"color:#BD976A"},children:$R[15871]=[$R[15872]={type:"text",value:"node"}]},$R[15873]={type:"element",tagName:"span",properties:$R[15874]={style:"color:#666666"},children:$R[15875]=[$R[15876]={type:"text",value:"))"}]},$R[15877]={type:"element",tagName:"span",properties:$R[15878]={style:"color:#666666"},children:$R[15879]=[$R[15880]={type:"text",value:" {"}]}]},$R[15881]={type:"text",value:"\n"},$R[15882]={type:"element",tagName:"span",properties:$R[15883]={class:"line"},children:$R[15884]=[$R[15885]={type:"element",tagName:"span",properties:$R[15886]={style:"color:#4D9375"},children:$R[15887]=[$R[15888]={type:"text",value:" return"}]},$R[15889]={type:"element",tagName:"span",properties:$R[15890]={style:"color:#C98A7D77"},children:$R[15891]=[$R[15892]={type:"text",value:" \""}]},$R[15893]={type:"element",tagName:"span",properties:$R[15894]={style:"color:#C98A7D"},children:$R[15895]=[$R[15896]={type:"text",value:"Component"}]},$R[15897]={type:"element",tagName:"span",properties:$R[15898]={style:"color:#C98A7D77"},children:$R[15899]=[$R[15900]={type:"text",value:"\""}]},$R[15901]={type:"element",tagName:"span",properties:$R[15902]={style:"color:#666666"},children:$R[15903]=[$R[15904]={type:"text",value:";"}]}]},$R[15905]={type:"text",value:"\n"},$R[15906]={type:"element",tagName:"span",properties:$R[15907]={class:"line"},children:$R[15908]=[$R[15909]={type:"element",tagName:"span",properties:$R[15910]={style:"color:#666666"},children:$R[15911]=[$R[15912]={type:"text",value:" }"}]},$R[15913]={type:"element",tagName:"span",properties:$R[15914]={style:"color:#4D9375"},children:$R[15915]=[$R[15916]={type:"text",value:" else"}]},$R[15917]={type:"element",tagName:"span",properties:$R[15918]={style:"color:#4D9375"},children:$R[15919]=[$R[15920]={type:"text",value:" if"}]},$R[15921]={type:"element",tagName:"span",properties:$R[15922]={style:"color:#666666"},children:$R[15923]=[$R[15924]={type:"text",value:" ("}]},$R[15925]={type:"element",tagName:"span",properties:$R[15926]={style:"color:#80A665"},children:$R[15927]=[$R[15928]={type:"text",value:"isHookDeclaration"}]},$R[15929]={type:"element",tagName:"span",properties:$R[15930]={style:"color:#666666"},children:$R[15931]=[$R[15932]={type:"text",value:"("}]},$R[15933]={type:"element",tagName:"span",properties:$R[15934]={style:"color:#BD976A"},children:$R[15935]=[$R[15936]={type:"text",value:"fn"}]},$R[15937]={type:"element",tagName:"span",properties:$R[15938]={style:"color:#666666"},children:$R[15939]=[$R[15940]={type:"text",value:"."}]},$R[15941]={type:"element",tagName:"span",properties:$R[15942]={style:"color:#BD976A"},children:$R[15943]=[$R[15944]={type:"text",value:"node"}]},$R[15945]={type:"element",tagName:"span",properties:$R[15946]={style:"color:#666666"},children:$R[15947]=[$R[15948]={type:"text",value:"))"}]},$R[15949]={type:"element",tagName:"span",properties:$R[15950]={style:"color:#666666"},children:$R[15951]=[$R[15952]={type:"text",value:" {"}]}]},$R[15953]={type:"text",value:"\n"},$R[15954]={type:"element",tagName:"span",properties:$R[15955]={class:"line"},children:$R[15956]=[$R[15957]={type:"element",tagName:"span",properties:$R[15958]={style:"color:#4D9375"},children:$R[15959]=[$R[15960]={type:"text",value:" return"}]},$R[15961]={type:"element",tagName:"span",properties:$R[15962]={style:"color:#C98A7D77"},children:$R[15963]=[$R[15964]={type:"text",value:" \""}]},$R[15965]={type:"element",tagName:"span",properties:$R[15966]={style:"color:#C98A7D"},children:$R[15967]=[$R[15968]={type:"text",value:"Hook"}]},$R[15969]={type:"element",tagName:"span",properties:$R[15970]={style:"color:#C98A7D77"},children:$R[15971]=[$R[15972]={type:"text",value:"\""}]},$R[15973]={type:"element",tagName:"span",properties:$R[15974]={style:"color:#666666"},children:$R[15975]=[$R[15976]={type:"text",value:";"}]}]},$R[15977]={type:"text",value:"\n"},$R[15978]={type:"element",tagName:"span",properties:$R[15979]={class:"line"},children:$R[15980]=[$R[15981]={type:"element",tagName:"span",properties:$R[15982]={style:"color:#666666"},children:$R[15983]=[$R[15984]={type:"text",value:" }"}]}]},$R[15985]={type:"text",value:"\n"},$R[15986]={type:"element",tagName:"span",properties:$R[15987]={class:"line"},children:$R[15988]=[$R[15989]={type:"element",tagName:"span",properties:$R[15990]={style:"color:#666666"},children:$R[15991]=[$R[15992]={type:"text",value:" }"}]}]},$R[15993]={type:"text",value:"\n"},$R[15994]={type:"element",tagName:"span",properties:$R[15995]={class:"line"},children:$R[15996]=[]},$R[15997]={type:"text",value:"\n"},$R[15998]={type:"element",tagName:"span",properties:$R[15999]={class:"line"},children:$R[16000]=[$R[16001]={type:"element",tagName:"span",properties:$R[16002]={style:"color:#758575DD"},children:$R[16003]=[$R[16004]={type:"text",value:" // Otherwise check if this is a component or hook-like function"}]}]},$R[16005]={type:"text",value:"\n"},$R[16006]={type:"element",tagName:"span",properties:$R[16007]={class:"line"},children:$R[16008]=[$R[16009]={type:"element",tagName:"span",properties:$R[16010]={style:"color:#4D9375"},children:$R[16011]=[$R[16012]={type:"text",value:" return"}]},$R[16013]={type:"element",tagName:"span",properties:$R[16014]={style:"color:#80A665"},children:$R[16015]=[$R[16016]={type:"text",value:" getComponentOrHookLike"}]},$R[16017]={type:"element",tagName:"span",properties:$R[16018]={style:"color:#666666"},children:$R[16019]=[$R[16020]={type:"text",value:"("}]},$R[16021]={type:"element",tagName:"span",properties:$R[16022]={style:"color:#BD976A"},children:$R[16023]=[$R[16024]={type:"text",value:"fn"}]},$R[16025]={type:"element",tagName:"span",properties:$R[16026]={style:"color:#666666"},children:$R[16027]=[$R[16028]={type:"text",value:","}]},$R[16029]={type:"element",tagName:"span",properties:$R[16030]={style:"color:#BD976A"},children:$R[16031]=[$R[16032]={type:"text",value:" hookPattern"}]},$R[16033]={type:"element",tagName:"span",properties:$R[16034]={style:"color:#666666"},children:$R[16035]=[$R[16036]={type:"text",value:");"}]}]},$R[16037]={type:"text",value:"\n"},$R[16038]={type:"element",tagName:"span",properties:$R[16039]={class:"line"},children:$R[16040]=[$R[16041]={type:"element",tagName:"span",properties:$R[16042]={style:"color:#666666"},children:$R[16043]=[$R[16044]={type:"text",value:" }"}]}]},$R[16045]={type:"text",value:"\n"},$R[16046]={type:"element",tagName:"span",properties:$R[16047]={class:"line"},children:$R[16048]=[$R[16049]={type:"element",tagName:"span",properties:$R[16050]={style:"color:#4D9375"},children:$R[16051]=[$R[16052]={type:"text",value:" case"}]},$R[16053]={type:"element",tagName:"span",properties:$R[16054]={style:"color:#C98A7D77"},children:$R[16055]=[$R[16056]={type:"text",value:" \""}]},$R[16057]={type:"element",tagName:"span",properties:$R[16058]={style:"color:#C98A7D"},children:$R[16059]=[$R[16060]={type:"text",value:"all"}]},$R[16061]={type:"element",tagName:"span",properties:$R[16062]={style:"color:#C98A7D77"},children:$R[16063]=[$R[16064]={type:"text",value:"\""}]},$R[16065]={type:"element",tagName:"span",properties:$R[16066]={style:"color:#666666"},children:$R[16067]=[$R[16068]={type:"text",value:":"}]},$R[16069]={type:"element",tagName:"span",properties:$R[16070]={style:"color:#666666"},children:$R[16071]=[$R[16072]={type:"text",value:" {"}]}]},$R[16073]={type:"text",value:"\n"},$R[16074]={type:"element",tagName:"span",properties:$R[16075]={class:"line"},children:$R[16076]=[$R[16077]={type:"element",tagName:"span",properties:$R[16078]={style:"color:#758575DD"},children:$R[16079]=[$R[16080]={type:"text",value:" // Compile only top level functions"}]}]},$R[16081]={type:"text",value:"\n"},$R[16082]={type:"element",tagName:"span",properties:$R[16083]={class:"line"},children:$R[16084]=[$R[16085]={type:"element",tagName:"span",properties:$R[16086]={style:"color:#4D9375"},children:$R[16087]=[$R[16088]={type:"text",value:" if"}]},$R[16089]={type:"element",tagName:"span",properties:$R[16090]={style:"color:#666666"},children:$R[16091]=[$R[16092]={type:"text",value:" ("}]},$R[16093]={type:"element",tagName:"span",properties:$R[16094]={style:"color:#BD976A"},children:$R[16095]=[$R[16096]={type:"text",value:"fn"}]},$R[16097]={type:"element",tagName:"span",properties:$R[16098]={style:"color:#666666"},children:$R[16099]=[$R[16100]={type:"text",value:"."}]},$R[16101]={type:"element",tagName:"span",properties:$R[16102]={style:"color:#BD976A"},children:$R[16103]=[$R[16104]={type:"text",value:"scope"}]},$R[16105]={type:"element",tagName:"span",properties:$R[16106]={style:"color:#666666"},children:$R[16107]=[$R[16108]={type:"text",value:"."}]},$R[16109]={type:"element",tagName:"span",properties:$R[16110]={style:"color:#80A665"},children:$R[16111]=[$R[16112]={type:"text",value:"getProgramParent"}]},$R[16113]={type:"element",tagName:"span",properties:$R[16114]={style:"color:#666666"},children:$R[16115]=[$R[16116]={type:"text",value:"()"}]},$R[16117]={type:"element",tagName:"span",properties:$R[16118]={style:"color:#CB7676"},children:$R[16119]=[$R[16120]={type:"text",value:" !=="}]},$R[16121]={type:"element",tagName:"span",properties:$R[16122]={style:"color:#BD976A"},children:$R[16123]=[$R[16124]={type:"text",value:" fn"}]},$R[16125]={type:"element",tagName:"span",properties:$R[16126]={style:"color:#666666"},children:$R[16127]=[$R[16128]={type:"text",value:"."}]},$R[16129]={type:"element",tagName:"span",properties:$R[16130]={style:"color:#BD976A"},children:$R[16131]=[$R[16132]={type:"text",value:"scope"}]},$R[16133]={type:"element",tagName:"span",properties:$R[16134]={style:"color:#666666"},children:$R[16135]=[$R[16136]={type:"text",value:"."}]},$R[16137]={type:"element",tagName:"span",properties:$R[16138]={style:"color:#BD976A"},children:$R[16139]=[$R[16140]={type:"text",value:"parent"}]},$R[16141]={type:"element",tagName:"span",properties:$R[16142]={style:"color:#666666"},children:$R[16143]=[$R[16144]={type:"text",value:")"}]},$R[16145]={type:"element",tagName:"span",properties:$R[16146]={style:"color:#666666"},children:$R[16147]=[$R[16148]={type:"text",value:" {"}]}]},$R[16149]={type:"text",value:"\n"},$R[16150]={type:"element",tagName:"span",properties:$R[16151]={class:"line"},children:$R[16152]=[$R[16153]={type:"element",tagName:"span",properties:$R[16154]={style:"color:#4D9375"},children:$R[16155]=[$R[16156]={type:"text",value:" return"}]},$R[16157]={type:"element",tagName:"span",properties:$R[16158]={style:"color:#CB7676"},children:$R[16159]=[$R[16160]={type:"text",value:" null"}]},$R[16161]={type:"element",tagName:"span",properties:$R[16162]={style:"color:#666666"},children:$R[16163]=[$R[16164]={type:"text",value:";"}]}]},$R[16165]={type:"text",value:"\n"},$R[16166]={type:"element",tagName:"span",properties:$R[16167]={class:"line"},children:$R[16168]=[$R[16169]={type:"element",tagName:"span",properties:$R[16170]={style:"color:#666666"},children:$R[16171]=[$R[16172]={type:"text",value:" }"}]}]},$R[16173]={type:"text",value:"\n"},$R[16174]={type:"element",tagName:"span",properties:$R[16175]={class:"line"},children:$R[16176]=[]},$R[16177]={type:"text",value:"\n"},$R[16178]={type:"element",tagName:"span",properties:$R[16179]={class:"line"},children:$R[16180]=[$R[16181]={type:"element",tagName:"span",properties:$R[16182]={style:"color:#4D9375"},children:$R[16183]=[$R[16184]={type:"text",value:" return"}]},$R[16185]={type:"element",tagName:"span",properties:$R[16186]={style:"color:#80A665"},children:$R[16187]=[$R[16188]={type:"text",value:" getComponentOrHookLike"}]},$R[16189]={type:"element",tagName:"span",properties:$R[16190]={style:"color:#666666"},children:$R[16191]=[$R[16192]={type:"text",value:"("}]},$R[16193]={type:"element",tagName:"span",properties:$R[16194]={style:"color:#BD976A"},children:$R[16195]=[$R[16196]={type:"text",value:"fn"}]},$R[16197]={type:"element",tagName:"span",properties:$R[16198]={style:"color:#666666"},children:$R[16199]=[$R[16200]={type:"text",value:","}]},$R[16201]={type:"element",tagName:"span",properties:$R[16202]={style:"color:#BD976A"},children:$R[16203]=[$R[16204]={type:"text",value:" hookPattern"}]},$R[16205]={type:"element",tagName:"span",properties:$R[16206]={style:"color:#666666"},children:$R[16207]=[$R[16208]={type:"text",value:")"}]},$R[16209]={type:"element",tagName:"span",properties:$R[16210]={style:"color:#CB7676"},children:$R[16211]=[$R[16212]={type:"text",value:" ??"}]},$R[16213]={type:"element",tagName:"span",properties:$R[16214]={style:"color:#C98A7D77"},children:$R[16215]=[$R[16216]={type:"text",value:" \""}]},$R[16217]={type:"element",tagName:"span",properties:$R[16218]={style:"color:#C98A7D"},children:$R[16219]=[$R[16220]={type:"text",value:"Other"}]},$R[16221]={type:"element",tagName:"span",properties:$R[16222]={style:"color:#C98A7D77"},children:$R[16223]=[$R[16224]={type:"text",value:"\""}]},$R[16225]={type:"element",tagName:"span",properties:$R[16226]={style:"color:#666666"},children:$R[16227]=[$R[16228]={type:"text",value:";"}]}]},$R[16229]={type:"text",value:"\n"},$R[16230]={type:"element",tagName:"span",properties:$R[16231]={class:"line"},children:$R[16232]=[$R[16233]={type:"element",tagName:"span",properties:$R[16234]={style:"color:#666666"},children:$R[16235]=[$R[16236]={type:"text",value:" }"}]}]},$R[16237]={type:"text",value:"\n"},$R[16238]={type:"element",tagName:"span",properties:$R[16239]={class:"line"},children:$R[16240]=[$R[16241]={type:"element",tagName:"span",properties:$R[16242]={style:"color:#4D9375"},children:$R[16243]=[$R[16244]={type:"text",value:" default"}]},$R[16245]={type:"element",tagName:"span",properties:$R[16246]={style:"color:#666666"},children:$R[16247]=[$R[16248]={type:"text",value:":"}]},$R[16249]={type:"element",tagName:"span",properties:$R[16250]={style:"color:#666666"},children:$R[16251]=[$R[16252]={type:"text",value:" {"}]}]},$R[16253]={type:"text",value:"\n"},$R[16254]={type:"element",tagName:"span",properties:$R[16255]={class:"line"},children:$R[16256]=[$R[16257]={type:"element",tagName:"span",properties:$R[16258]={style:"color:#80A665"},children:$R[16259]=[$R[16260]={type:"text",value:" assertExhaustive"}]},$R[16261]={type:"element",tagName:"span",properties:$R[16262]={style:"color:#666666"},children:$R[16263]=[$R[16264]={type:"text",value:"("}]}]},$R[16265]={type:"text",value:"\n"},$R[16266]={type:"element",tagName:"span",properties:$R[16267]={class:"line"},children:$R[16268]=[$R[16269]={type:"element",tagName:"span",properties:$R[16270]={style:"color:#BD976A"},children:$R[16271]=[$R[16272]={type:"text",value:" pass"}]},$R[16273]={type:"element",tagName:"span",properties:$R[16274]={style:"color:#666666"},children:$R[16275]=[$R[16276]={type:"text",value:"."}]},$R[16277]={type:"element",tagName:"span",properties:$R[16278]={style:"color:#BD976A"},children:$R[16279]=[$R[16280]={type:"text",value:"opts"}]},$R[16281]={type:"element",tagName:"span",properties:$R[16282]={style:"color:#666666"},children:$R[16283]=[$R[16284]={type:"text",value:"."}]},$R[16285]={type:"element",tagName:"span",properties:$R[16286]={style:"color:#BD976A"},children:$R[16287]=[$R[16288]={type:"text",value:"compilationMode"}]},$R[16289]={type:"element",tagName:"span",properties:$R[16290]={style:"color:#666666"},children:$R[16291]=[$R[16292]={type:"text",value:","}]}]},$R[16293]={type:"text",value:"\n"},$R[16294]={type:"element",tagName:"span",properties:$R[16295]={class:"line"},children:$R[16296]=[$R[16297]={type:"element",tagName:"span",properties:$R[16298]={style:"color:#C98A7D77"},children:$R[16299]=[$R[16300]={type:"text",value:" `"}]},$R[16301]={type:"element",tagName:"span",properties:$R[16302]={style:"color:#C98A7D"},children:$R[16303]=[$R[16304]={type:"text",value:"Unexpected compilationMode "}]},$R[16305]={type:"element",tagName:"span",properties:$R[16306]={style:"color:#C99076"},children:$R[16307]=[$R[16308]={type:"text",value:"\\`"}]},$R[16309]={type:"element",tagName:"span",properties:$R[16310]={style:"color:#4D9375"},children:$R[16311]=[$R[16312]={type:"text",value:"${"}]},$R[16313]={type:"element",tagName:"span",properties:$R[16314]={style:"color:#C98A7D"},children:$R[16315]=[$R[16316]={type:"text",value:"pass"}]},$R[16317]={type:"element",tagName:"span",properties:$R[16318]={style:"color:#666666"},children:$R[16319]=[$R[16320]={type:"text",value:"."}]},$R[16321]={type:"element",tagName:"span",properties:$R[16322]={style:"color:#C98A7D"},children:$R[16323]=[$R[16324]={type:"text",value:"opts"}]},$R[16325]={type:"element",tagName:"span",properties:$R[16326]={style:"color:#666666"},children:$R[16327]=[$R[16328]={type:"text",value:"."}]},$R[16329]={type:"element",tagName:"span",properties:$R[16330]={style:"color:#C98A7D"},children:$R[16331]=[$R[16332]={type:"text",value:"compilationMode"}]},$R[16333]={type:"element",tagName:"span",properties:$R[16334]={style:"color:#4D9375"},children:$R[16335]=[$R[16336]={type:"text",value:"}"}]},$R[16337]={type:"element",tagName:"span",properties:$R[16338]={style:"color:#C99076"},children:$R[16339]=[$R[16340]={type:"text",value:"\\`"}]},$R[16341]={type:"element",tagName:"span",properties:$R[16342]={style:"color:#C98A7D77"},children:$R[16343]=[$R[16344]={type:"text",value:"`"}]}]},$R[16345]={type:"text",value:"\n"},$R[16346]={type:"element",tagName:"span",properties:$R[16347]={class:"line"},children:$R[16348]=[$R[16349]={type:"element",tagName:"span",properties:$R[16350]={style:"color:#666666"},children:$R[16351]=[$R[16352]={type:"text",value:" );"}]}]},$R[16353]={type:"text",value:"\n"},$R[16354]={type:"element",tagName:"span",properties:$R[16355]={class:"line"},children:$R[16356]=[$R[16357]={type:"element",tagName:"span",properties:$R[16358]={style:"color:#666666"},children:$R[16359]=[$R[16360]={type:"text",value:" }"}]}]},$R[16361]={type:"text",value:"\n"},$R[16362]={type:"element",tagName:"span",properties:$R[16363]={class:"line"},children:$R[16364]=[$R[16365]={type:"element",tagName:"span",properties:$R[16366]={style:"color:#666666"},children:$R[16367]=[$R[16368]={type:"text",value:" }"}]}]},$R[16369]={type:"text",value:"\n"},$R[16370]={type:"element",tagName:"span",properties:$R[16371]={class:"line"},children:$R[16372]=[$R[16373]={type:"element",tagName:"span",properties:$R[16374]={style:"color:#666666"},children:$R[16375]=[$R[16376]={type:"text",value:"}"}]}]}]}]}]}},$R[16377]={meta:$R[16378]={title:"react/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts at d77dd31a329df55a051800fc76668af8da8332b4 · facebook/react · GitHub",description:"The library for web and native user interfaces. Contribute to facebook/react development by creating an account on GitHub.",twitter_card:$R[16379]={images:$R[16380]=[$R[16381]={url:"https://opengraph.githubassets.com/42acbb3fec132253a9fe0fbe818ffd2fc796f89a9f13a5bad27fb17afe797e47/facebook/react"}],site:"@github",card:"summary_large_image",title:"react/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts at d77dd31a329df55a051800fc76668af8da8332b4 · facebook/react",description:"The library for web and native user interfaces. Contribute to facebook/react development by creating an account on GitHub."},open_graph:$R[16382]={images:$R[16383]=[$R[16384]={url:"https://opengraph.githubassets.com/42acbb3fec132253a9fe0fbe818ffd2fc796f89a9f13a5bad27fb17afe797e47/facebook/react",alt:"The library for web and native user interfaces. Contribute to facebook/react development by creating an account on GitHub.",width:1200,height:600}],site_name:"GitHub",type:"object",title:"react/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts at d77dd31a329df55a051800fc76668af8da8332b4 · facebook/react",url:"https://github.com/facebook/react/blob/d77dd31a329df55a051800fc76668af8da8332b4/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts",description:"The library for web and native user interfaces. Contribute to facebook/react development by creating an account on GitHub."},theme_color:"#1e2327",favicon:"https://github.githubassets.com/favicons/favicon.svg"},oembed:void 0,position:$R[16385]={start:$R[16386]={line:149,column:1,offset:5057},end:$R[16387]={line:149,column:162,offset:5218}},src:"https://github.com/facebook/react/blob/d77dd31a329df55a051800fc76668af8da8332b4/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts#L471-L533",type:"embed"},$R[16388]={children:$R[16389]=[$R[16390]={position:$R[16391]={start:$R[16392]={line:151,column:1,offset:5220},end:$R[16393]={line:151,column:33,offset:5252}},type:"text",value:"上記のコードコメントにある通り、ディレクティブが見つかった場合、"},$R[16394]={position:$R[16395]={start:$R[16396]={line:151,column:33,offset:5252},end:$R[16397]={line:151,column:50,offset:5269}},type:"inlineCode",value:"compilationMode"},$R[16398]={position:$R[16399]={start:$R[16400]={line:151,column:50,offset:5269},end:$R[16401]={line:151,column:76,offset:5295}},type:"text",value:" の値に関係なくディレクティブの指示に従う。つまり、"},$R[16402]={position:$R[16403]={start:$R[16404]={line:151,column:76,offset:5295},end:$R[16405]={line:151,column:91,offset:5310}},type:"inlineCode",value:"\"use no memo\""},$R[16406]={position:$R[16407]={start:$R[16408]={line:151,column:91,offset:5310},end:$R[16409]={line:151,column:115,offset:5334}},type:"text",value:" が見つかった場合はコンパイルをスキップするし、"},$R[16410]={position:$R[16411]={start:$R[16412]={line:151,column:115,offset:5334},end:$R[16413]={line:151,column:127,offset:5346}},type:"inlineCode",value:"\"use memo\""},$R[16414]={position:$R[16415]={start:$R[16416]={line:151,column:127,offset:5346},end:$R[16417]={line:151,column:148,offset:5367}},type:"text",value:" が見つかった場合はコンパイルを実行する。"}],position:$R[16418]={start:$R[16419]={line:151,column:1,offset:5220},end:$R[16420]={line:151,column:148,offset:5367}},type:"paragraph"}],position:$R[16421]={end:$R[16422]={line:151,column:148,offset:5367},start:$R[16423]={line:70,column:1,offset:2844}},type:"section"},$R[16424]={children:$R[16425]=[$R[16426]={children:$R[16427]=[$R[16428]={position:$R[16429]={start:$R[16430]={line:153,column:4,offset:5372},end:$R[16431]={line:153,column:7,offset:5375}},type:"text",value:"まとめ"}],id:"まとめ",level:2,plain:"まとめ",position:$R[16432]={start:$R[16433]={line:153,column:1,offset:5369},end:$R[16434]={line:153,column:7,offset:5375}},type:"heading"},$R[16435]={children:$R[16436]=[$R[16437]={position:$R[16438]={start:$R[16439]={line:155,column:1,offset:5377},end:$R[16440]={line:155,column:46,offset:5422}},type:"text",value:"React Compiler の opt-in と opt-out について整理してみた。"},$R[16441]={position:$R[16442]={start:$R[16443]={line:155,column:46,offset:5422},end:$R[16444]={line:155,column:63,offset:5439}},type:"inlineCode",value:"compilationMode"},$R[16445]={position:$R[16446]={start:$R[16447]={line:155,column:63,offset:5439},end:$R[16448]={line:155,column:92,offset:5468}},type:"text",value:" は opt-in と opt-out の挙動を制御する。"},$R[16449]={position:$R[16450]={start:$R[16451]={line:155,column:92,offset:5468},end:$R[16452]={line:155,column:104,offset:5480}},type:"inlineCode",value:"\"use memo\""},$R[16453]={position:$R[16454]={start:$R[16455]={line:155,column:104,offset:5480},end:$R[16456]={line:155,column:107,offset:5483}},type:"text",value:" と "},$R[16457]={position:$R[16458]={start:$R[16459]={line:155,column:107,offset:5483},end:$R[16460]={line:155,column:122,offset:5498}},type:"inlineCode",value:"\"use no memo\""},$R[16461]={position:$R[16462]={start:$R[16463]={line:155,column:122,offset:5498},end:$R[16464]={line:155,column:150,offset:5526}},type:"text",value:" はどちらもコンパイルの挙動を変更するディレクティブで、"},$R[16465]={position:$R[16466]={start:$R[16467]={line:155,column:150,offset:5526},end:$R[16468]={line:155,column:167,offset:5543}},type:"inlineCode",value:"compilationMode"},$R[16469]={position:$R[16470]={start:$R[16471]={line:155,column:167,offset:5543},end:$R[16472]={line:155,column:183,offset:5559}},type:"text",value:" の値に関係なく挙動を変更する。"}],position:$R[16473]={start:$R[16474]={line:155,column:1,offset:5377},end:$R[16475]={line:155,column:183,offset:5559}},type:"paragraph"},$R[16476]={children:$R[16477]=[$R[16478]={position:$R[16479]={start:$R[16480]={line:157,column:1,offset:5561},end:$R[16481]={line:157,column:21,offset:5581}},type:"text",value:"React Compiler の中身を "},$R[16482]={children:$R[16483]=[$R[16484]={position:$R[16485]={start:$R[16486]={line:157,column:22,offset:5582},end:$R[16487]={line:157,column:31,offset:5591}},type:"text",value:"@yossydev"}],position:$R[16488]={start:$R[16489]={line:157,column:21,offset:5581},end:$R[16490]={line:157,column:62,offset:5622}},title:void 0,type:"link",url:"https://twitter.com/yossydev"},$R[16491]={position:$R[16492]={start:$R[16493]={line:157,column:62,offset:5622},end:$R[16494]={line:157,column:63,offset:5623}},type:"text",value:"、"},$R[16495]={children:$R[16496]=[$R[16497]={position:$R[16498]={start:$R[16499]={line:157,column:64,offset:5624},end:$R[16500]={line:157,column:76,offset:5636}},type:"text",value:"@shun_shobon"}],position:$R[16501]={start:$R[16502]={line:157,column:63,offset:5623},end:$R[16503]={line:157,column:110,offset:5670}},title:void 0,type:"link",url:"https://twitter.com/shun_shobon"},$R[16504]={position:$R[16505]={start:$R[16506]={line:157,column:110,offset:5670},end:$R[16507]={line:157,column:137,offset:5697}},type:"text",value:" と読んでいるので、興味がある方はぜひ見てみてほしい。"}],position:$R[16508]={start:$R[16509]={line:157,column:1,offset:5561},end:$R[16510]={line:157,column:137,offset:5697}},type:"paragraph"},$R[16511]={allowFullScreen:void 0,height:"360",position:$R[16512]={start:$R[16513]={line:159,column:1,offset:5699},end:$R[16514]={line:159,column:44,offset:5742}},src:"https://www.youtube.com/embed/PqPgr_hlVKM",type:"embed",width:"100%"}],position:$R[16515]={end:$R[16516]={line:159,column:44,offset:5742},start:$R[16517]={line:153,column:1,offset:5369}},type:"section"}],footnotes:$R[16518]=[],title:$R[16519]={children:$R[16520]=[$R[16521]={position:$R[16522]={start:$R[16523]={line:1,column:3,offset:2},end:$R[16524]={line:1,column:42,offset:41}},type:"text",value:"React Compiler の opt-in と opt-out を整理する"}],id:"react-compiler-の-opt-in-と-opt-out-を整理する",level:1,plain:"React Compiler の opt-in と opt-out を整理する",position:$R[16525]={start:$R[16526]={line:1,column:1,offset:0},end:$R[16527]={line:1,column:42,offset:41}},type:"heading"},toc:$R[16528]=[$R[16529]={children:$R[16530]=[],id:"はじめに",plain:"はじめに",type:"toc"},$R[16531]={children:$R[16532]=[$R[16533]={children:$R[16534]=[],id:"opt-out",plain:"opt-out",type:"toc"},$R[16535]={children:$R[16536]=[],id:"opt-in",plain:"opt-in",type:"toc"}],id:"opt-in-と-opt-out",plain:"opt-in と opt-out",type:"toc"},$R[16537]={children:$R[16538]=[],id:"ややこしいディレクティブの挙動",plain:"ややこしいディレクティブの挙動",type:"toc"},$R[16539]={children:$R[16540]=[],id:"まとめ",plain:"まとめ",type:"toc"}],type:"article"}},$R[16541]={content:"# EventListener のオプションメモ\n\n## はじめに\n\n`addEventListener` は DOM イベントを登録するためのメソッドである。このメソッドにはオプションを指定できる。このオプションについて調べてみた。\n\n## オプション\n\n`addEventListener` には以下のオプションを指定できる。\n\n```ts:sample.ts\ninterface EventListenerOptions {\n capture?: boolean;\n}\n\ninterface AddEventListenerOptions extends EventListenerOptions {\n once?: boolean;\n passive?: boolean;\n signal?: AbortSignal;\n}\n```\n\nそれぞれのオプションについて調べてみた。\n\n### capture\n\n`capture` オプションは、イベントの伝播をキャプチャリングフェーズで処理するかどうかを指定する。デフォルトは `false` である。Event Listener Options 対応以前の、 useCapture フラグ相当である。\n\n#### イベントの伝播順\n\nイベントの伝播順序を理解していなかったのでついでに調べてみた。[^1] [^2]\n\n- キャプチャリングフェーズ\n\n `window` から event target まで、DOM ツリーを下りるフェーズ。親要素から子要素に向かってイベントが伝播する。\n\n このフェーズで登録されている event listener は、event target の event listener よりも先に実行される。\n\n- ターゲットフェーズ\n\n event target に登録された event listener が実行される。\n\n- バブリングフェーズ\n\n event target から `window` まで、DOM ツリーを上りるフェーズ。子要素から親要素に向かってイベントが伝播する。\n\n このフェーズで登録されている event listener は、event target の event listener よりも後に実行される。\n\n例として次の HTML と JS を考える。\n\n```html:sample.html\n\x3Cbutton id=\"button\">foo\x3C/button>\n```\n\n```js:sample.js\nconst elm = document.getElementById('button');\n\ndocument.addEventListener('click', () => {\n console.log('document');\n}, { capture: false });\n\nelm.addEventListener('click', () => {\n console.log('button');\n}, { capture: false });\n```\n\nこの場合、ボタンをクリックしたとき、コンソールには次のように表示される。\n\n```log:console.log\nbutton\ndocument\n```\n\n`capture` オプションを `true` にすると、次のように表示される。\n\n```log:console.log\ndocument\nbutton\n```\n\n[^1]: [JavaScript Event order](https://www.quirksmode.org/js/events_order.html#link4)\n\n[^2]: [Event order](https://javascript.info/bubbling-and-capturing)\n\n### once\n\n`once` オプションは、event listener を一度だけ実行し削除するかどうかを指定する。デフォルトは `false` である。\n\n通常 event listner 及びそのスコープ変数は登録されている限り参照を保持するため、GC の対象にならず、メモリリークの原因になることがある。明示的に `removeEventListener` を呼び出すことで解決できるが、`once` オプションはより簡単に GC のケアができる。\n\n例外として useEffect で event listner を登録する処理を書く場合は、必ず useEffect のクリーンアップ関数で `removeEventListener` を呼び出すこと。`once` オプションはその event listner が実行されたときに自動的に削除されるだけなので、event listenr を持つ component を mount しただけで listner が発火しなかった場合、クリーンアップ関数が無い場合はメモリリークの原因になる。\n\n```tsx:sample.tsx\nconst Component: FC = () => {\n const ref = useRef\x3CHTMLButtonElement>(null);\n\n useEffect(() => {\n const handleClick = () => {\n console.log('click');\n };\n const button = ref.current;\n\n button?.addEventListener('click', handleClick, { once: true });\n\n return () => {\n button?.removeEventListener('click', handleClick);\n };\n }, []);\n\n return \x3Cbutton ref={ref}>click me\x3C/button>;\n}\n```\n\n### passive\n\nブラウザは通常ドキュメントのスクロール体験を最適化する。しかし scroll event に event listner が登録された場合、event listener 内で `preventDefault()` が呼ばれる場合はスクロールを止めなくてはならない。\n\nしかしブラウザは event listener 内で `preventDefault()` が呼ばれるかどうかを事前に判断できないため、scroll event に event listener が登録された場合はスクロールを止めるためにスクロールを待つ。これによりスクロール体験が悪くなる。\n\nこの問題は `passive` オプションを `true` にすることで解決できる。`passive` オプションを `true` にすると、event listener 内で `preventDefault()` を呼ばれないことが保証されるため、ブラウザは listener の完了を待たずにスクロールできる。\n\nどの程度ユーザー操作が改善されるかは以下記事内の動画が参考になる。\n\nhttps://developer.chrome.com/blog/passive-event-listeners?hl=ja\n\n### signal\n\n`signal` オプションは AbortSignal を指定する。AbortSignal は AbortController を通じて生成される。AbortSignal が abort されると、event listener は削除される。\n\n一見とても便利なオプションだが罠がある。Abort すればもちろん event listener が削除されるが、正常処理された場合を Signal だけからは判断できないため、event listener が削除されずメモリリークの原因になる可能性がある。\n\nこれらに対する対策は [@jxck](https://jxck.io/) さんのこの記事が参考になるのでそちらを参考にしてほしい。\n\nhttps://blog.jxck.io/entries/2023-06-01/abort-signal-any.html\n\n## まとめ\n\nこれらの提案は 2016 年〜 2020 年には既に提案 / 実装されていたが、なかなか使う機会がなかったので調べてみた。特に `once` オプションと `passive` オプション、`signal` オプションは今後の開発で使う機会があるかもしれないので、覚えておくと便利かもしれない。",description:"Event Listener Options について調べたのでまとめた。",published:!0,publishedAt:"2024-07-06T01:32:43.557+09:00[Asia/Tokyo]",tags:$R[16542]=["web","performance"],title:"EventListener のオプションメモ",_meta:$R[16543]={filePath:"01J21VVAH0AW64ZS4SGGE83R0C/slug.md",fileName:"slug.md",directory:"01J21VVAH0AW64ZS4SGGE83R0C",extension:"md",path:"01J21VVAH0AW64ZS4SGGE83R0C/slug"},abstract:"EventListener のオプションメモはじめにaddEventListener は DOM イベントを登録するためのメソッドである。このメソッドにはオプションを指定できる。このオプションについて調べてみた。オプションaddEventListener には以下のオプションを指定できる。interface EventListenerOptions {\n capture?: boolean;\n}\n\ninterface AddEventListenerOptions extends EventListenerOptions {\n once?: boolean;\n passive?: boolean;\n signal?: AbortSignal;\n}それぞれのオプションについて調べてみた。capturecapture オプションは、イベントの伝播をキャプチャリングフェー",mdast:$R[16544]={children:$R[16545]=[$R[16546]={children:$R[16547]=[$R[16548]={children:$R[16549]=[$R[16550]={position:$R[16551]={start:$R[16552]={line:3,column:4,offset:29},end:$R[16553]={line:3,column:8,offset:33}},type:"text",value:"はじめに"}],id:"はじめに",level:2,plain:"はじめに",position:$R[16554]={start:$R[16555]={line:3,column:1,offset:26},end:$R[16556]={line:3,column:8,offset:33}},type:"heading"},$R[16557]={children:$R[16558]=[$R[16559]={position:$R[16560]={start:$R[16561]={line:5,column:1,offset:35},end:$R[16562]={line:5,column:19,offset:53}},type:"inlineCode",value:"addEventListener"},$R[16563]={position:$R[16564]={start:$R[16565]={line:5,column:19,offset:53},end:$R[16566]={line:5,column:83,offset:117}},type:"text",value:" は DOM イベントを登録するためのメソッドである。このメソッドにはオプションを指定できる。このオプションについて調べてみた。"}],position:$R[16567]={start:$R[16568]={line:5,column:1,offset:35},end:$R[16569]={line:5,column:83,offset:117}},type:"paragraph"}],position:$R[16570]={end:$R[16571]={line:5,column:83,offset:117},start:$R[16572]={line:3,column:1,offset:26}},type:"section"},$R[16573]={children:$R[16574]=[$R[16575]={children:$R[16576]=[$R[16577]={position:$R[16578]={start:$R[16579]={line:7,column:4,offset:122},end:$R[16580]={line:7,column:9,offset:127}},type:"text",value:"オプション"}],id:"オプション",level:2,plain:"オプション",position:$R[16581]={start:$R[16582]={line:7,column:1,offset:119},end:$R[16583]={line:7,column:9,offset:127}},type:"heading"},$R[16584]={children:$R[16585]=[$R[16586]={position:$R[16587]={start:$R[16588]={line:9,column:1,offset:129},end:$R[16589]={line:9,column:19,offset:147}},type:"inlineCode",value:"addEventListener"},$R[16590]={position:$R[16591]={start:$R[16592]={line:9,column:19,offset:147},end:$R[16593]={line:9,column:37,offset:165}},type:"text",value:" には以下のオプションを指定できる。"}],position:$R[16594]={start:$R[16595]={line:9,column:1,offset:129},end:$R[16596]={line:9,column:37,offset:165}},type:"paragraph"},$R[16597]={filename:"sample.ts ts",lang:"ts",position:$R[16598]={start:$R[16599]={line:11,column:1,offset:167},end:$R[16600]={line:21,column:4,offset:381}},type:"code",value:"interface EventListenerOptions {\n capture?: boolean;\n}\n\ninterface AddEventListenerOptions extends EventListenerOptions {\n once?: boolean;\n passive?: boolean;\n signal?: AbortSignal;\n}",hast:$R[16601]={type:"root",children:$R[16602]=[$R[16603]={type:"element",tagName:"pre",properties:$R[16604]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[16605]=[$R[16606]={type:"element",tagName:"code",properties:$R[16607]={},children:$R[16608]=[$R[16609]={type:"element",tagName:"span",properties:$R[16610]={class:"line"},children:$R[16611]=[$R[16612]={type:"element",tagName:"span",properties:$R[16613]={style:"color:#CB7676"},children:$R[16614]=[$R[16615]={type:"text",value:"interface"}]},$R[16616]={type:"element",tagName:"span",properties:$R[16617]={style:"color:#5DA994"},children:$R[16618]=[$R[16619]={type:"text",value:" EventListenerOptions"}]},$R[16620]={type:"element",tagName:"span",properties:$R[16621]={style:"color:#666666"},children:$R[16622]=[$R[16623]={type:"text",value:" {"}]}]},$R[16624]={type:"text",value:"\n"},$R[16625]={type:"element",tagName:"span",properties:$R[16626]={class:"line"},children:$R[16627]=[$R[16628]={type:"element",tagName:"span",properties:$R[16629]={style:"color:#BD976A"},children:$R[16630]=[$R[16631]={type:"text",value:" capture"}]},$R[16632]={type:"element",tagName:"span",properties:$R[16633]={style:"color:#CB7676"},children:$R[16634]=[$R[16635]={type:"text",value:"?"}]},$R[16636]={type:"element",tagName:"span",properties:$R[16637]={style:"color:#666666"},children:$R[16638]=[$R[16639]={type:"text",value:": "}]},$R[16640]={type:"element",tagName:"span",properties:$R[16641]={style:"color:#5DA994"},children:$R[16642]=[$R[16643]={type:"text",value:"boolean"}]},$R[16644]={type:"element",tagName:"span",properties:$R[16645]={style:"color:#666666"},children:$R[16646]=[$R[16647]={type:"text",value:";"}]}]},$R[16648]={type:"text",value:"\n"},$R[16649]={type:"element",tagName:"span",properties:$R[16650]={class:"line"},children:$R[16651]=[$R[16652]={type:"element",tagName:"span",properties:$R[16653]={style:"color:#666666"},children:$R[16654]=[$R[16655]={type:"text",value:"}"}]}]},$R[16656]={type:"text",value:"\n"},$R[16657]={type:"element",tagName:"span",properties:$R[16658]={class:"line"},children:$R[16659]=[]},$R[16660]={type:"text",value:"\n"},$R[16661]={type:"element",tagName:"span",properties:$R[16662]={class:"line"},children:$R[16663]=[$R[16664]={type:"element",tagName:"span",properties:$R[16665]={style:"color:#CB7676"},children:$R[16666]=[$R[16667]={type:"text",value:"interface"}]},$R[16668]={type:"element",tagName:"span",properties:$R[16669]={style:"color:#5DA994"},children:$R[16670]=[$R[16671]={type:"text",value:" AddEventListenerOptions"}]},$R[16672]={type:"element",tagName:"span",properties:$R[16673]={style:"color:#CB7676"},children:$R[16674]=[$R[16675]={type:"text",value:" extends"}]},$R[16676]={type:"element",tagName:"span",properties:$R[16677]={style:"color:#80A665"},children:$R[16678]=[$R[16679]={type:"text",value:" EventListenerOptions"}]},$R[16680]={type:"element",tagName:"span",properties:$R[16681]={style:"color:#666666"},children:$R[16682]=[$R[16683]={type:"text",value:" {"}]}]},$R[16684]={type:"text",value:"\n"},$R[16685]={type:"element",tagName:"span",properties:$R[16686]={class:"line"},children:$R[16687]=[$R[16688]={type:"element",tagName:"span",properties:$R[16689]={style:"color:#BD976A"},children:$R[16690]=[$R[16691]={type:"text",value:" once"}]},$R[16692]={type:"element",tagName:"span",properties:$R[16693]={style:"color:#CB7676"},children:$R[16694]=[$R[16695]={type:"text",value:"?"}]},$R[16696]={type:"element",tagName:"span",properties:$R[16697]={style:"color:#666666"},children:$R[16698]=[$R[16699]={type:"text",value:": "}]},$R[16700]={type:"element",tagName:"span",properties:$R[16701]={style:"color:#5DA994"},children:$R[16702]=[$R[16703]={type:"text",value:"boolean"}]},$R[16704]={type:"element",tagName:"span",properties:$R[16705]={style:"color:#666666"},children:$R[16706]=[$R[16707]={type:"text",value:";"}]}]},$R[16708]={type:"text",value:"\n"},$R[16709]={type:"element",tagName:"span",properties:$R[16710]={class:"line"},children:$R[16711]=[$R[16712]={type:"element",tagName:"span",properties:$R[16713]={style:"color:#BD976A"},children:$R[16714]=[$R[16715]={type:"text",value:" passive"}]},$R[16716]={type:"element",tagName:"span",properties:$R[16717]={style:"color:#CB7676"},children:$R[16718]=[$R[16719]={type:"text",value:"?"}]},$R[16720]={type:"element",tagName:"span",properties:$R[16721]={style:"color:#666666"},children:$R[16722]=[$R[16723]={type:"text",value:": "}]},$R[16724]={type:"element",tagName:"span",properties:$R[16725]={style:"color:#5DA994"},children:$R[16726]=[$R[16727]={type:"text",value:"boolean"}]},$R[16728]={type:"element",tagName:"span",properties:$R[16729]={style:"color:#666666"},children:$R[16730]=[$R[16731]={type:"text",value:";"}]}]},$R[16732]={type:"text",value:"\n"},$R[16733]={type:"element",tagName:"span",properties:$R[16734]={class:"line"},children:$R[16735]=[$R[16736]={type:"element",tagName:"span",properties:$R[16737]={style:"color:#BD976A"},children:$R[16738]=[$R[16739]={type:"text",value:" signal"}]},$R[16740]={type:"element",tagName:"span",properties:$R[16741]={style:"color:#CB7676"},children:$R[16742]=[$R[16743]={type:"text",value:"?"}]},$R[16744]={type:"element",tagName:"span",properties:$R[16745]={style:"color:#666666"},children:$R[16746]=[$R[16747]={type:"text",value:": "}]},$R[16748]={type:"element",tagName:"span",properties:$R[16749]={style:"color:#5DA994"},children:$R[16750]=[$R[16751]={type:"text",value:"AbortSignal"}]},$R[16752]={type:"element",tagName:"span",properties:$R[16753]={style:"color:#666666"},children:$R[16754]=[$R[16755]={type:"text",value:";"}]}]},$R[16756]={type:"text",value:"\n"},$R[16757]={type:"element",tagName:"span",properties:$R[16758]={class:"line"},children:$R[16759]=[$R[16760]={type:"element",tagName:"span",properties:$R[16761]={style:"color:#666666"},children:$R[16762]=[$R[16763]={type:"text",value:"}"}]}]}]}]}]}},$R[16764]={children:$R[16765]=[$R[16766]={position:$R[16767]={start:$R[16768]={line:23,column:1,offset:383},end:$R[16769]={line:23,column:21,offset:403}},type:"text",value:"それぞれのオプションについて調べてみた。"}],position:$R[16770]={start:$R[16771]={line:23,column:1,offset:383},end:$R[16772]={line:23,column:21,offset:403}},type:"paragraph"},$R[16773]={children:$R[16774]=[$R[16775]={children:$R[16776]=[$R[16777]={position:$R[16778]={start:$R[16779]={line:25,column:5,offset:409},end:$R[16780]={line:25,column:12,offset:416}},type:"text",value:"capture"}],id:"capture",level:3,plain:"capture",position:$R[16781]={start:$R[16782]={line:25,column:1,offset:405},end:$R[16783]={line:25,column:12,offset:416}},type:"heading"},$R[16784]={children:$R[16785]=[$R[16786]={position:$R[16787]={start:$R[16788]={line:27,column:1,offset:418},end:$R[16789]={line:27,column:10,offset:427}},type:"inlineCode",value:"capture"},$R[16790]={position:$R[16791]={start:$R[16792]={line:27,column:10,offset:427},end:$R[16793]={line:27,column:60,offset:477}},type:"text",value:" オプションは、イベントの伝播をキャプチャリングフェーズで処理するかどうかを指定する。デフォルトは "},$R[16794]={position:$R[16795]={start:$R[16796]={line:27,column:60,offset:477},end:$R[16797]={line:27,column:67,offset:484}},type:"inlineCode",value:"false"},$R[16798]={position:$R[16799]={start:$R[16800]={line:27,column:67,offset:484},end:$R[16801]={line:27,column:122,offset:539}},type:"text",value:" である。Event Listener Options 対応以前の、 useCapture フラグ相当である。"}],position:$R[16802]={start:$R[16803]={line:27,column:1,offset:418},end:$R[16804]={line:27,column:122,offset:539}},type:"paragraph"},$R[16805]={children:$R[16806]=[$R[16807]={children:$R[16808]=[$R[16809]={position:$R[16810]={start:$R[16811]={line:29,column:6,offset:546},end:$R[16812]={line:29,column:14,offset:554}},type:"text",value:"イベントの伝播順"}],id:"イベントの伝播順",level:4,plain:"イベントの伝播順",position:$R[16813]={start:$R[16814]={line:29,column:1,offset:541},end:$R[16815]={line:29,column:14,offset:554}},type:"heading"},$R[16816]={children:$R[16817]=[$R[16818]={position:$R[16819]={start:$R[16820]={line:31,column:1,offset:556},end:$R[16821]={line:31,column:32,offset:587}},type:"text",value:"イベントの伝播順序を理解していなかったのでついでに調べてみた。"},$R[16822]={footnoteIndex:0,position:$R[16823]={start:$R[16824]={line:31,column:32,offset:587},end:$R[16825]={line:31,column:36,offset:591}},referenceIndex:1,type:"footnoteReference"},$R[16826]={position:$R[16827]={start:$R[16828]={line:31,column:36,offset:591},end:$R[16829]={line:31,column:37,offset:592}},type:"text",value:" "},$R[16830]={footnoteIndex:1,position:$R[16831]={start:$R[16832]={line:31,column:37,offset:592},end:$R[16833]={line:31,column:41,offset:596}},referenceIndex:1,type:"footnoteReference"}],position:$R[16834]={start:$R[16835]={line:31,column:1,offset:556},end:$R[16836]={line:31,column:41,offset:596}},type:"paragraph"},$R[16837]={children:$R[16838]=[$R[16839]={children:$R[16840]=[$R[16841]={children:$R[16842]=[$R[16843]={position:$R[16844]={start:$R[16845]={line:33,column:3,offset:600},end:$R[16846]={line:33,column:15,offset:612}},type:"text",value:"キャプチャリングフェーズ"}],position:$R[16847]={start:$R[16848]={line:33,column:3,offset:600},end:$R[16849]={line:33,column:15,offset:612}},type:"paragraph"},$R[16850]={children:$R[16851]=[$R[16852]={position:$R[16853]={start:$R[16854]={line:35,column:3,offset:616},end:$R[16855]={line:35,column:11,offset:624}},type:"inlineCode",value:"window"},$R[16856]={position:$R[16857]={start:$R[16858]={line:35,column:11,offset:624},end:$R[16859]={line:35,column:70,offset:683}},type:"text",value:" から event target まで、DOM ツリーを下りるフェーズ。親要素から子要素に向かってイベントが伝播する。"}],position:$R[16860]={start:$R[16861]={line:35,column:3,offset:616},end:$R[16862]={line:35,column:70,offset:683}},type:"paragraph"},$R[16863]={children:$R[16864]=[$R[16865]={position:$R[16866]={start:$R[16867]={line:37,column:3,offset:687},end:$R[16868]={line:37,column:76,offset:760}},type:"text",value:"このフェーズで登録されている event listener は、event target の event listener よりも先に実行される。"}],position:$R[16869]={start:$R[16870]={line:37,column:3,offset:687},end:$R[16871]={line:37,column:76,offset:760}},type:"paragraph"}],position:$R[16872]={start:$R[16873]={line:33,column:1,offset:598},end:$R[16874]={line:37,column:76,offset:760}},type:"listItem"},$R[16875]={children:$R[16876]=[$R[16877]={children:$R[16878]=[$R[16879]={position:$R[16880]={start:$R[16881]={line:39,column:3,offset:764},end:$R[16882]={line:39,column:12,offset:773}},type:"text",value:"ターゲットフェーズ"}],position:$R[16883]={start:$R[16884]={line:39,column:3,offset:764},end:$R[16885]={line:39,column:12,offset:773}},type:"paragraph"},$R[16886]={children:$R[16887]=[$R[16888]={position:$R[16889]={start:$R[16890]={line:41,column:3,offset:777},end:$R[16891]={line:41,column:45,offset:819}},type:"text",value:"event target に登録された event listener が実行される。"}],position:$R[16892]={start:$R[16893]={line:41,column:3,offset:777},end:$R[16894]={line:41,column:45,offset:819}},type:"paragraph"}],position:$R[16895]={start:$R[16896]={line:39,column:1,offset:762},end:$R[16897]={line:41,column:45,offset:819}},type:"listItem"},$R[16898]={children:$R[16899]=[$R[16900]={children:$R[16901]=[$R[16902]={position:$R[16903]={start:$R[16904]={line:43,column:3,offset:823},end:$R[16905]={line:43,column:12,offset:832}},type:"text",value:"バブリングフェーズ"}],position:$R[16906]={start:$R[16907]={line:43,column:3,offset:823},end:$R[16908]={line:43,column:12,offset:832}},type:"paragraph"},$R[16909]={children:$R[16910]=[$R[16911]={position:$R[16912]={start:$R[16913]={line:45,column:3,offset:836},end:$R[16914]={line:45,column:19,offset:852}},type:"text",value:"event target から "},$R[16915]={position:$R[16916]={start:$R[16917]={line:45,column:19,offset:852},end:$R[16918]={line:45,column:27,offset:860}},type:"inlineCode",value:"window"},$R[16919]={position:$R[16920]={start:$R[16921]={line:45,column:27,offset:860},end:$R[16922]={line:45,column:70,offset:903}},type:"text",value:" まで、DOM ツリーを上りるフェーズ。子要素から親要素に向かってイベントが伝播する。"}],position:$R[16923]={start:$R[16924]={line:45,column:3,offset:836},end:$R[16925]={line:45,column:70,offset:903}},type:"paragraph"},$R[16926]={children:$R[16927]=[$R[16928]={position:$R[16929]={start:$R[16930]={line:47,column:3,offset:907},end:$R[16931]={line:47,column:76,offset:980}},type:"text",value:"このフェーズで登録されている event listener は、event target の event listener よりも後に実行される。"}],position:$R[16932]={start:$R[16933]={line:47,column:3,offset:907},end:$R[16934]={line:47,column:76,offset:980}},type:"paragraph"}],position:$R[16935]={start:$R[16936]={line:43,column:1,offset:821},end:$R[16937]={line:47,column:76,offset:980}},type:"listItem"}],position:$R[16938]={start:$R[16939]={line:33,column:1,offset:598},end:$R[16940]={line:47,column:76,offset:980}},type:"unorderedList"},$R[16941]={children:$R[16942]=[$R[16943]={position:$R[16944]={start:$R[16945]={line:49,column:1,offset:982},end:$R[16946]={line:49,column:23,offset:1004}},type:"text",value:"例として次の HTML と JS を考える。"}],position:$R[16947]={start:$R[16948]={line:49,column:1,offset:982},end:$R[16949]={line:49,column:23,offset:1004}},type:"paragraph"},$R[16950]={filename:"sample.html html",lang:"html",position:$R[16951]={start:$R[16952]={line:51,column:1,offset:1006},end:$R[16953]={line:53,column:4,offset:1062}},type:"code",value:"\x3Cbutton id=\"button\">foo\x3C/button>",hast:$R[16954]={type:"root",children:$R[16955]=[$R[16956]={type:"element",tagName:"pre",properties:$R[16957]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[16958]=[$R[16959]={type:"element",tagName:"code",properties:$R[16960]={},children:$R[16961]=[$R[16962]={type:"element",tagName:"span",properties:$R[16963]={class:"line"},children:$R[16964]=[$R[16965]={type:"element",tagName:"span",properties:$R[16966]={style:"color:#666666"},children:$R[16967]=[$R[16968]={type:"text",value:"\x3C"}]},$R[16969]={type:"element",tagName:"span",properties:$R[16970]={style:"color:#4D9375"},children:$R[16971]=[$R[16972]={type:"text",value:"button"}]},$R[16973]={type:"element",tagName:"span",properties:$R[16974]={style:"color:#BD976A"},children:$R[16975]=[$R[16976]={type:"text",value:" id"}]},$R[16977]={type:"element",tagName:"span",properties:$R[16978]={style:"color:#666666"},children:$R[16979]=[$R[16980]={type:"text",value:"="}]},$R[16981]={type:"element",tagName:"span",properties:$R[16982]={style:"color:#C98A7D77"},children:$R[16983]=[$R[16984]={type:"text",value:"\""}]},$R[16985]={type:"element",tagName:"span",properties:$R[16986]={style:"color:#C98A7D"},children:$R[16987]=[$R[16988]={type:"text",value:"button"}]},$R[16989]={type:"element",tagName:"span",properties:$R[16990]={style:"color:#C98A7D77"},children:$R[16991]=[$R[16992]={type:"text",value:"\""}]},$R[16993]={type:"element",tagName:"span",properties:$R[16994]={style:"color:#666666"},children:$R[16995]=[$R[16996]={type:"text",value:">"}]},$R[16997]={type:"element",tagName:"span",properties:$R[16998]={style:"color:#DBD7CAEE"},children:$R[16999]=[$R[17000]={type:"text",value:"foo"}]},$R[17001]={type:"element",tagName:"span",properties:$R[17002]={style:"color:#666666"},children:$R[17003]=[$R[17004]={type:"text",value:"\x3C/"}]},$R[17005]={type:"element",tagName:"span",properties:$R[17006]={style:"color:#4D9375"},children:$R[17007]=[$R[17008]={type:"text",value:"button"}]},$R[17009]={type:"element",tagName:"span",properties:$R[17010]={style:"color:#666666"},children:$R[17011]=[$R[17012]={type:"text",value:">"}]}]}]}]}]}},$R[17013]={filename:"sample.js js",lang:"js",position:$R[17014]={start:$R[17015]={line:55,column:1,offset:1064},end:$R[17016]={line:65,column:4,offset:1317}},type:"code",value:"const elm = document.getElementById('button');\n\ndocument.addEventListener('click', () => {\n console.log('document');\n}, { capture: false });\n\nelm.addEventListener('click', () => {\n console.log('button');\n}, { capture: false });",hast:$R[17017]={type:"root",children:$R[17018]=[$R[17019]={type:"element",tagName:"pre",properties:$R[17020]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[17021]=[$R[17022]={type:"element",tagName:"code",properties:$R[17023]={},children:$R[17024]=[$R[17025]={type:"element",tagName:"span",properties:$R[17026]={class:"line"},children:$R[17027]=[$R[17028]={type:"element",tagName:"span",properties:$R[17029]={style:"color:#CB7676"},children:$R[17030]=[$R[17031]={type:"text",value:"const"}]},$R[17032]={type:"element",tagName:"span",properties:$R[17033]={style:"color:#BD976A"},children:$R[17034]=[$R[17035]={type:"text",value:" elm"}]},$R[17036]={type:"element",tagName:"span",properties:$R[17037]={style:"color:#666666"},children:$R[17038]=[$R[17039]={type:"text",value:" ="}]},$R[17040]={type:"element",tagName:"span",properties:$R[17041]={style:"color:#BD976A"},children:$R[17042]=[$R[17043]={type:"text",value:" document"}]},$R[17044]={type:"element",tagName:"span",properties:$R[17045]={style:"color:#666666"},children:$R[17046]=[$R[17047]={type:"text",value:"."}]},$R[17048]={type:"element",tagName:"span",properties:$R[17049]={style:"color:#80A665"},children:$R[17050]=[$R[17051]={type:"text",value:"getElementById"}]},$R[17052]={type:"element",tagName:"span",properties:$R[17053]={style:"color:#666666"},children:$R[17054]=[$R[17055]={type:"text",value:"("}]},$R[17056]={type:"element",tagName:"span",properties:$R[17057]={style:"color:#C98A7D77"},children:$R[17058]=[$R[17059]={type:"text",value:"'"}]},$R[17060]={type:"element",tagName:"span",properties:$R[17061]={style:"color:#C98A7D"},children:$R[17062]=[$R[17063]={type:"text",value:"button"}]},$R[17064]={type:"element",tagName:"span",properties:$R[17065]={style:"color:#C98A7D77"},children:$R[17066]=[$R[17067]={type:"text",value:"'"}]},$R[17068]={type:"element",tagName:"span",properties:$R[17069]={style:"color:#666666"},children:$R[17070]=[$R[17071]={type:"text",value:");"}]}]},$R[17072]={type:"text",value:"\n"},$R[17073]={type:"element",tagName:"span",properties:$R[17074]={class:"line"},children:$R[17075]=[]},$R[17076]={type:"text",value:"\n"},$R[17077]={type:"element",tagName:"span",properties:$R[17078]={class:"line"},children:$R[17079]=[$R[17080]={type:"element",tagName:"span",properties:$R[17081]={style:"color:#BD976A"},children:$R[17082]=[$R[17083]={type:"text",value:"document"}]},$R[17084]={type:"element",tagName:"span",properties:$R[17085]={style:"color:#666666"},children:$R[17086]=[$R[17087]={type:"text",value:"."}]},$R[17088]={type:"element",tagName:"span",properties:$R[17089]={style:"color:#80A665"},children:$R[17090]=[$R[17091]={type:"text",value:"addEventListener"}]},$R[17092]={type:"element",tagName:"span",properties:$R[17093]={style:"color:#666666"},children:$R[17094]=[$R[17095]={type:"text",value:"("}]},$R[17096]={type:"element",tagName:"span",properties:$R[17097]={style:"color:#C98A7D77"},children:$R[17098]=[$R[17099]={type:"text",value:"'"}]},$R[17100]={type:"element",tagName:"span",properties:$R[17101]={style:"color:#C98A7D"},children:$R[17102]=[$R[17103]={type:"text",value:"click"}]},$R[17104]={type:"element",tagName:"span",properties:$R[17105]={style:"color:#C98A7D77"},children:$R[17106]=[$R[17107]={type:"text",value:"'"}]},$R[17108]={type:"element",tagName:"span",properties:$R[17109]={style:"color:#666666"},children:$R[17110]=[$R[17111]={type:"text",value:","}]},$R[17112]={type:"element",tagName:"span",properties:$R[17113]={style:"color:#666666"},children:$R[17114]=[$R[17115]={type:"text",value:" ()"}]},$R[17116]={type:"element",tagName:"span",properties:$R[17117]={style:"color:#666666"},children:$R[17118]=[$R[17119]={type:"text",value:" =>"}]},$R[17120]={type:"element",tagName:"span",properties:$R[17121]={style:"color:#666666"},children:$R[17122]=[$R[17123]={type:"text",value:" {"}]}]},$R[17124]={type:"text",value:"\n"},$R[17125]={type:"element",tagName:"span",properties:$R[17126]={class:"line"},children:$R[17127]=[$R[17128]={type:"element",tagName:"span",properties:$R[17129]={style:"color:#BD976A"},children:$R[17130]=[$R[17131]={type:"text",value:" console"}]},$R[17132]={type:"element",tagName:"span",properties:$R[17133]={style:"color:#666666"},children:$R[17134]=[$R[17135]={type:"text",value:"."}]},$R[17136]={type:"element",tagName:"span",properties:$R[17137]={style:"color:#80A665"},children:$R[17138]=[$R[17139]={type:"text",value:"log"}]},$R[17140]={type:"element",tagName:"span",properties:$R[17141]={style:"color:#666666"},children:$R[17142]=[$R[17143]={type:"text",value:"("}]},$R[17144]={type:"element",tagName:"span",properties:$R[17145]={style:"color:#C98A7D77"},children:$R[17146]=[$R[17147]={type:"text",value:"'"}]},$R[17148]={type:"element",tagName:"span",properties:$R[17149]={style:"color:#C98A7D"},children:$R[17150]=[$R[17151]={type:"text",value:"document"}]},$R[17152]={type:"element",tagName:"span",properties:$R[17153]={style:"color:#C98A7D77"},children:$R[17154]=[$R[17155]={type:"text",value:"'"}]},$R[17156]={type:"element",tagName:"span",properties:$R[17157]={style:"color:#666666"},children:$R[17158]=[$R[17159]={type:"text",value:");"}]}]},$R[17160]={type:"text",value:"\n"},$R[17161]={type:"element",tagName:"span",properties:$R[17162]={class:"line"},children:$R[17163]=[$R[17164]={type:"element",tagName:"span",properties:$R[17165]={style:"color:#666666"},children:$R[17166]=[$R[17167]={type:"text",value:"},"}]},$R[17168]={type:"element",tagName:"span",properties:$R[17169]={style:"color:#666666"},children:$R[17170]=[$R[17171]={type:"text",value:" {"}]},$R[17172]={type:"element",tagName:"span",properties:$R[17173]={style:"color:#B8A965"},children:$R[17174]=[$R[17175]={type:"text",value:" capture"}]},$R[17176]={type:"element",tagName:"span",properties:$R[17177]={style:"color:#666666"},children:$R[17178]=[$R[17179]={type:"text",value:":"}]},$R[17180]={type:"element",tagName:"span",properties:$R[17181]={style:"color:#4D9375"},children:$R[17182]=[$R[17183]={type:"text",value:" false"}]},$R[17184]={type:"element",tagName:"span",properties:$R[17185]={style:"color:#666666"},children:$R[17186]=[$R[17187]={type:"text",value:" });"}]}]},$R[17188]={type:"text",value:"\n"},$R[17189]={type:"element",tagName:"span",properties:$R[17190]={class:"line"},children:$R[17191]=[]},$R[17192]={type:"text",value:"\n"},$R[17193]={type:"element",tagName:"span",properties:$R[17194]={class:"line"},children:$R[17195]=[$R[17196]={type:"element",tagName:"span",properties:$R[17197]={style:"color:#BD976A"},children:$R[17198]=[$R[17199]={type:"text",value:"elm"}]},$R[17200]={type:"element",tagName:"span",properties:$R[17201]={style:"color:#666666"},children:$R[17202]=[$R[17203]={type:"text",value:"."}]},$R[17204]={type:"element",tagName:"span",properties:$R[17205]={style:"color:#80A665"},children:$R[17206]=[$R[17207]={type:"text",value:"addEventListener"}]},$R[17208]={type:"element",tagName:"span",properties:$R[17209]={style:"color:#666666"},children:$R[17210]=[$R[17211]={type:"text",value:"("}]},$R[17212]={type:"element",tagName:"span",properties:$R[17213]={style:"color:#C98A7D77"},children:$R[17214]=[$R[17215]={type:"text",value:"'"}]},$R[17216]={type:"element",tagName:"span",properties:$R[17217]={style:"color:#C98A7D"},children:$R[17218]=[$R[17219]={type:"text",value:"click"}]},$R[17220]={type:"element",tagName:"span",properties:$R[17221]={style:"color:#C98A7D77"},children:$R[17222]=[$R[17223]={type:"text",value:"'"}]},$R[17224]={type:"element",tagName:"span",properties:$R[17225]={style:"color:#666666"},children:$R[17226]=[$R[17227]={type:"text",value:","}]},$R[17228]={type:"element",tagName:"span",properties:$R[17229]={style:"color:#666666"},children:$R[17230]=[$R[17231]={type:"text",value:" ()"}]},$R[17232]={type:"element",tagName:"span",properties:$R[17233]={style:"color:#666666"},children:$R[17234]=[$R[17235]={type:"text",value:" =>"}]},$R[17236]={type:"element",tagName:"span",properties:$R[17237]={style:"color:#666666"},children:$R[17238]=[$R[17239]={type:"text",value:" {"}]}]},$R[17240]={type:"text",value:"\n"},$R[17241]={type:"element",tagName:"span",properties:$R[17242]={class:"line"},children:$R[17243]=[$R[17244]={type:"element",tagName:"span",properties:$R[17245]={style:"color:#BD976A"},children:$R[17246]=[$R[17247]={type:"text",value:" console"}]},$R[17248]={type:"element",tagName:"span",properties:$R[17249]={style:"color:#666666"},children:$R[17250]=[$R[17251]={type:"text",value:"."}]},$R[17252]={type:"element",tagName:"span",properties:$R[17253]={style:"color:#80A665"},children:$R[17254]=[$R[17255]={type:"text",value:"log"}]},$R[17256]={type:"element",tagName:"span",properties:$R[17257]={style:"color:#666666"},children:$R[17258]=[$R[17259]={type:"text",value:"("}]},$R[17260]={type:"element",tagName:"span",properties:$R[17261]={style:"color:#C98A7D77"},children:$R[17262]=[$R[17263]={type:"text",value:"'"}]},$R[17264]={type:"element",tagName:"span",properties:$R[17265]={style:"color:#C98A7D"},children:$R[17266]=[$R[17267]={type:"text",value:"button"}]},$R[17268]={type:"element",tagName:"span",properties:$R[17269]={style:"color:#C98A7D77"},children:$R[17270]=[$R[17271]={type:"text",value:"'"}]},$R[17272]={type:"element",tagName:"span",properties:$R[17273]={style:"color:#666666"},children:$R[17274]=[$R[17275]={type:"text",value:");"}]}]},$R[17276]={type:"text",value:"\n"},$R[17277]={type:"element",tagName:"span",properties:$R[17278]={class:"line"},children:$R[17279]=[$R[17280]={type:"element",tagName:"span",properties:$R[17281]={style:"color:#666666"},children:$R[17282]=[$R[17283]={type:"text",value:"},"}]},$R[17284]={type:"element",tagName:"span",properties:$R[17285]={style:"color:#666666"},children:$R[17286]=[$R[17287]={type:"text",value:" {"}]},$R[17288]={type:"element",tagName:"span",properties:$R[17289]={style:"color:#B8A965"},children:$R[17290]=[$R[17291]={type:"text",value:" capture"}]},$R[17292]={type:"element",tagName:"span",properties:$R[17293]={style:"color:#666666"},children:$R[17294]=[$R[17295]={type:"text",value:":"}]},$R[17296]={type:"element",tagName:"span",properties:$R[17297]={style:"color:#4D9375"},children:$R[17298]=[$R[17299]={type:"text",value:" false"}]},$R[17300]={type:"element",tagName:"span",properties:$R[17301]={style:"color:#666666"},children:$R[17302]=[$R[17303]={type:"text",value:" });"}]}]}]}]}]}},$R[17304]={children:$R[17305]=[$R[17306]={position:$R[17307]={start:$R[17308]={line:67,column:1,offset:1319},end:$R[17309]={line:67,column:37,offset:1355}},type:"text",value:"この場合、ボタンをクリックしたとき、コンソールには次のように表示される。"}],position:$R[17310]={start:$R[17311]={line:67,column:1,offset:1319},end:$R[17312]={line:67,column:37,offset:1355}},type:"paragraph"},$R[17313]={filename:"console.log log",lang:"log",position:$R[17314]={start:$R[17315]={line:69,column:1,offset:1357},end:$R[17316]={line:72,column:4,offset:1395}},type:"code",value:"button\ndocument",hast:$R[17317]={type:"root",children:$R[17318]=[$R[17319]={type:"element",tagName:"pre",properties:$R[17320]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[17321]=[$R[17322]={type:"element",tagName:"code",properties:$R[17323]={},children:$R[17324]=[$R[17325]={type:"element",tagName:"span",properties:$R[17326]={class:"line"},children:$R[17327]=[$R[17328]={type:"element",tagName:"span",properties:$R[17329]={style:"color:#DBD7CAEE"},children:$R[17330]=[$R[17331]={type:"text",value:"button"}]}]},$R[17332]={type:"text",value:"\n"},$R[17333]={type:"element",tagName:"span",properties:$R[17334]={class:"line"},children:$R[17335]=[$R[17336]={type:"element",tagName:"span",properties:$R[17337]={style:"color:#DBD7CAEE"},children:$R[17338]=[$R[17339]={type:"text",value:"document"}]}]}]}]}]}},$R[17340]={children:$R[17341]=[$R[17342]={position:$R[17343]={start:$R[17344]={line:74,column:1,offset:1397},end:$R[17345]={line:74,column:10,offset:1406}},type:"inlineCode",value:"capture"},$R[17346]={position:$R[17347]={start:$R[17348]={line:74,column:10,offset:1406},end:$R[17349]={line:74,column:18,offset:1414}},type:"text",value:" オプションを "},$R[17350]={position:$R[17351]={start:$R[17352]={line:74,column:18,offset:1414},end:$R[17353]={line:74,column:24,offset:1420}},type:"inlineCode",value:"true"},$R[17354]={position:$R[17355]={start:$R[17356]={line:74,column:24,offset:1420},end:$R[17357]={line:74,column:41,offset:1437}},type:"text",value:" にすると、次のように表示される。"}],position:$R[17358]={start:$R[17359]={line:74,column:1,offset:1397},end:$R[17360]={line:74,column:41,offset:1437}},type:"paragraph"},$R[17361]={filename:"console.log log",lang:"log",position:$R[17362]={start:$R[17363]={line:76,column:1,offset:1439},end:$R[17364]={line:79,column:4,offset:1477}},type:"code",value:"document\nbutton",hast:$R[17365]={type:"root",children:$R[17366]=[$R[17367]={type:"element",tagName:"pre",properties:$R[17368]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[17369]=[$R[17370]={type:"element",tagName:"code",properties:$R[17371]={},children:$R[17372]=[$R[17373]={type:"element",tagName:"span",properties:$R[17374]={class:"line"},children:$R[17375]=[$R[17376]={type:"element",tagName:"span",properties:$R[17377]={style:"color:#DBD7CAEE"},children:$R[17378]=[$R[17379]={type:"text",value:"document"}]}]},$R[17380]={type:"text",value:"\n"},$R[17381]={type:"element",tagName:"span",properties:$R[17382]={class:"line"},children:$R[17383]=[$R[17384]={type:"element",tagName:"span",properties:$R[17385]={style:"color:#DBD7CAEE"},children:$R[17386]=[$R[17387]={type:"text",value:"button"}]}]}]}]}]}}],position:$R[17388]={end:$R[17389]={line:79,column:4,offset:1477},start:$R[17390]={line:29,column:1,offset:541}},type:"section"}],position:$R[17391]={end:$R[17392]={line:79,column:4,offset:1477},start:$R[17393]={line:25,column:1,offset:405}},type:"section"},$R[17394]={children:$R[17395]=[$R[17396]={children:$R[17397]=[$R[17398]={position:$R[17399]={start:$R[17400]={line:85,column:5,offset:1639},end:$R[17401]={line:85,column:9,offset:1643}},type:"text",value:"once"}],id:"once",level:3,plain:"once",position:$R[17402]={start:$R[17403]={line:85,column:1,offset:1635},end:$R[17404]={line:85,column:9,offset:1643}},type:"heading"},$R[17405]={children:$R[17406]=[$R[17407]={position:$R[17408]={start:$R[17409]={line:87,column:1,offset:1645},end:$R[17410]={line:87,column:7,offset:1651}},type:"inlineCode",value:"once"},$R[17411]={position:$R[17412]={start:$R[17413]={line:87,column:7,offset:1651},end:$R[17414]={line:87,column:59,offset:1703}},type:"text",value:" オプションは、event listener を一度だけ実行し削除するかどうかを指定する。デフォルトは "},$R[17415]={position:$R[17416]={start:$R[17417]={line:87,column:59,offset:1703},end:$R[17418]={line:87,column:66,offset:1710}},type:"inlineCode",value:"false"},$R[17419]={position:$R[17420]={start:$R[17421]={line:87,column:66,offset:1710},end:$R[17422]={line:87,column:71,offset:1715}},type:"text",value:" である。"}],position:$R[17423]={start:$R[17424]={line:87,column:1,offset:1645},end:$R[17425]={line:87,column:71,offset:1715}},type:"paragraph"},$R[17426]={children:$R[17427]=[$R[17428]={position:$R[17429]={start:$R[17430]={line:89,column:1,offset:1717},end:$R[17431]={line:89,column:82,offset:1798}},type:"text",value:"通常 event listner 及びそのスコープ変数は登録されている限り参照を保持するため、GC の対象にならず、メモリリークの原因になることがある。明示的に "},$R[17432]={position:$R[17433]={start:$R[17434]={line:89,column:82,offset:1798},end:$R[17435]={line:89,column:103,offset:1819}},type:"inlineCode",value:"removeEventListener"},$R[17436]={position:$R[17437]={start:$R[17438]={line:89,column:103,offset:1819},end:$R[17439]={line:89,column:119,offset:1835}},type:"text",value:" を呼び出すことで解決できるが、"},$R[17440]={position:$R[17441]={start:$R[17442]={line:89,column:119,offset:1835},end:$R[17443]={line:89,column:125,offset:1841}},type:"inlineCode",value:"once"},$R[17444]={position:$R[17445]={start:$R[17446]={line:89,column:125,offset:1841},end:$R[17447]={line:89,column:149,offset:1865}},type:"text",value:" オプションはより簡単に GC のケアができる。"}],position:$R[17448]={start:$R[17449]={line:89,column:1,offset:1717},end:$R[17450]={line:89,column:149,offset:1865}},type:"paragraph"},$R[17451]={children:$R[17452]=[$R[17453]={position:$R[17454]={start:$R[17455]={line:91,column:1,offset:1867},end:$R[17456]={line:91,column:72,offset:1938}},type:"text",value:"例外として useEffect で event listner を登録する処理を書く場合は、必ず useEffect のクリーンアップ関数で "},$R[17457]={position:$R[17458]={start:$R[17459]={line:91,column:72,offset:1938},end:$R[17460]={line:91,column:93,offset:1959}},type:"inlineCode",value:"removeEventListener"},$R[17461]={position:$R[17462]={start:$R[17463]={line:91,column:93,offset:1959},end:$R[17464]={line:91,column:102,offset:1968}},type:"text",value:" を呼び出すこと。"},$R[17465]={position:$R[17466]={start:$R[17467]={line:91,column:102,offset:1968},end:$R[17468]={line:91,column:108,offset:1974}},type:"inlineCode",value:"once"},$R[17469]={position:$R[17470]={start:$R[17471]={line:91,column:108,offset:1974},end:$R[17472]={line:91,column:245,offset:2111}},type:"text",value:" オプションはその event listner が実行されたときに自動的に削除されるだけなので、event listenr を持つ component を mount しただけで listner が発火しなかった場合、クリーンアップ関数が無い場合はメモリリークの原因になる。"}],position:$R[17473]={start:$R[17474]={line:91,column:1,offset:1867},end:$R[17475]={line:91,column:245,offset:2111}},type:"paragraph"},$R[17476]={filename:"sample.tsx tsx",lang:"tsx",position:$R[17477]={start:$R[17478]={line:93,column:1,offset:2113},end:$R[17479]={line:112,column:4,offset:2543}},type:"code",value:"const Component: FC = () => {\n const ref = useRef\x3CHTMLButtonElement>(null);\n\n useEffect(() => {\n const handleClick = () => {\n console.log('click');\n };\n const button = ref.current;\n\n button?.addEventListener('click', handleClick, { once: true });\n\n return () => {\n button?.removeEventListener('click', handleClick);\n };\n }, []);\n\n return \x3Cbutton ref={ref}>click me\x3C/button>;\n}",hast:$R[17480]={type:"root",children:$R[17481]=[$R[17482]={type:"element",tagName:"pre",properties:$R[17483]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[17484]=[$R[17485]={type:"element",tagName:"code",properties:$R[17486]={},children:$R[17487]=[$R[17488]={type:"element",tagName:"span",properties:$R[17489]={class:"line"},children:$R[17490]=[$R[17491]={type:"element",tagName:"span",properties:$R[17492]={style:"color:#CB7676"},children:$R[17493]=[$R[17494]={type:"text",value:"const"}]},$R[17495]={type:"element",tagName:"span",properties:$R[17496]={style:"color:#80A665"},children:$R[17497]=[$R[17498]={type:"text",value:" Component"}]},$R[17499]={type:"element",tagName:"span",properties:$R[17500]={style:"color:#666666"},children:$R[17501]=[$R[17502]={type:"text",value:": "}]},$R[17503]={type:"element",tagName:"span",properties:$R[17504]={style:"color:#5DA994"},children:$R[17505]=[$R[17506]={type:"text",value:"FC"}]},$R[17507]={type:"element",tagName:"span",properties:$R[17508]={style:"color:#666666"},children:$R[17509]=[$R[17510]={type:"text",value:" ="}]},$R[17511]={type:"element",tagName:"span",properties:$R[17512]={style:"color:#666666"},children:$R[17513]=[$R[17514]={type:"text",value:" ()"}]},$R[17515]={type:"element",tagName:"span",properties:$R[17516]={style:"color:#666666"},children:$R[17517]=[$R[17518]={type:"text",value:" =>"}]},$R[17519]={type:"element",tagName:"span",properties:$R[17520]={style:"color:#666666"},children:$R[17521]=[$R[17522]={type:"text",value:" {"}]}]},$R[17523]={type:"text",value:"\n"},$R[17524]={type:"element",tagName:"span",properties:$R[17525]={class:"line"},children:$R[17526]=[$R[17527]={type:"element",tagName:"span",properties:$R[17528]={style:"color:#CB7676"},children:$R[17529]=[$R[17530]={type:"text",value:" const"}]},$R[17531]={type:"element",tagName:"span",properties:$R[17532]={style:"color:#BD976A"},children:$R[17533]=[$R[17534]={type:"text",value:" ref"}]},$R[17535]={type:"element",tagName:"span",properties:$R[17536]={style:"color:#666666"},children:$R[17537]=[$R[17538]={type:"text",value:" ="}]},$R[17539]={type:"element",tagName:"span",properties:$R[17540]={style:"color:#80A665"},children:$R[17541]=[$R[17542]={type:"text",value:" useRef"}]},$R[17543]={type:"element",tagName:"span",properties:$R[17544]={style:"color:#666666"},children:$R[17545]=[$R[17546]={type:"text",value:"\x3C"}]},$R[17547]={type:"element",tagName:"span",properties:$R[17548]={style:"color:#5DA994"},children:$R[17549]=[$R[17550]={type:"text",value:"HTMLButtonElement"}]},$R[17551]={type:"element",tagName:"span",properties:$R[17552]={style:"color:#666666"},children:$R[17553]=[$R[17554]={type:"text",value:">("}]},$R[17555]={type:"element",tagName:"span",properties:$R[17556]={style:"color:#CB7676"},children:$R[17557]=[$R[17558]={type:"text",value:"null"}]},$R[17559]={type:"element",tagName:"span",properties:$R[17560]={style:"color:#666666"},children:$R[17561]=[$R[17562]={type:"text",value:");"}]}]},$R[17563]={type:"text",value:"\n"},$R[17564]={type:"element",tagName:"span",properties:$R[17565]={class:"line"},children:$R[17566]=[]},$R[17567]={type:"text",value:"\n"},$R[17568]={type:"element",tagName:"span",properties:$R[17569]={class:"line"},children:$R[17570]=[$R[17571]={type:"element",tagName:"span",properties:$R[17572]={style:"color:#80A665"},children:$R[17573]=[$R[17574]={type:"text",value:" useEffect"}]},$R[17575]={type:"element",tagName:"span",properties:$R[17576]={style:"color:#666666"},children:$R[17577]=[$R[17578]={type:"text",value:"(()"}]},$R[17579]={type:"element",tagName:"span",properties:$R[17580]={style:"color:#666666"},children:$R[17581]=[$R[17582]={type:"text",value:" =>"}]},$R[17583]={type:"element",tagName:"span",properties:$R[17584]={style:"color:#666666"},children:$R[17585]=[$R[17586]={type:"text",value:" {"}]}]},$R[17587]={type:"text",value:"\n"},$R[17588]={type:"element",tagName:"span",properties:$R[17589]={class:"line"},children:$R[17590]=[$R[17591]={type:"element",tagName:"span",properties:$R[17592]={style:"color:#CB7676"},children:$R[17593]=[$R[17594]={type:"text",value:" const"}]},$R[17595]={type:"element",tagName:"span",properties:$R[17596]={style:"color:#80A665"},children:$R[17597]=[$R[17598]={type:"text",value:" handleClick"}]},$R[17599]={type:"element",tagName:"span",properties:$R[17600]={style:"color:#666666"},children:$R[17601]=[$R[17602]={type:"text",value:" ="}]},$R[17603]={type:"element",tagName:"span",properties:$R[17604]={style:"color:#666666"},children:$R[17605]=[$R[17606]={type:"text",value:" ()"}]},$R[17607]={type:"element",tagName:"span",properties:$R[17608]={style:"color:#666666"},children:$R[17609]=[$R[17610]={type:"text",value:" =>"}]},$R[17611]={type:"element",tagName:"span",properties:$R[17612]={style:"color:#666666"},children:$R[17613]=[$R[17614]={type:"text",value:" {"}]}]},$R[17615]={type:"text",value:"\n"},$R[17616]={type:"element",tagName:"span",properties:$R[17617]={class:"line"},children:$R[17618]=[$R[17619]={type:"element",tagName:"span",properties:$R[17620]={style:"color:#BD976A"},children:$R[17621]=[$R[17622]={type:"text",value:" console"}]},$R[17623]={type:"element",tagName:"span",properties:$R[17624]={style:"color:#666666"},children:$R[17625]=[$R[17626]={type:"text",value:"."}]},$R[17627]={type:"element",tagName:"span",properties:$R[17628]={style:"color:#80A665"},children:$R[17629]=[$R[17630]={type:"text",value:"log"}]},$R[17631]={type:"element",tagName:"span",properties:$R[17632]={style:"color:#666666"},children:$R[17633]=[$R[17634]={type:"text",value:"("}]},$R[17635]={type:"element",tagName:"span",properties:$R[17636]={style:"color:#C98A7D77"},children:$R[17637]=[$R[17638]={type:"text",value:"'"}]},$R[17639]={type:"element",tagName:"span",properties:$R[17640]={style:"color:#C98A7D"},children:$R[17641]=[$R[17642]={type:"text",value:"click"}]},$R[17643]={type:"element",tagName:"span",properties:$R[17644]={style:"color:#C98A7D77"},children:$R[17645]=[$R[17646]={type:"text",value:"'"}]},$R[17647]={type:"element",tagName:"span",properties:$R[17648]={style:"color:#666666"},children:$R[17649]=[$R[17650]={type:"text",value:");"}]}]},$R[17651]={type:"text",value:"\n"},$R[17652]={type:"element",tagName:"span",properties:$R[17653]={class:"line"},children:$R[17654]=[$R[17655]={type:"element",tagName:"span",properties:$R[17656]={style:"color:#666666"},children:$R[17657]=[$R[17658]={type:"text",value:" };"}]}]},$R[17659]={type:"text",value:"\n"},$R[17660]={type:"element",tagName:"span",properties:$R[17661]={class:"line"},children:$R[17662]=[$R[17663]={type:"element",tagName:"span",properties:$R[17664]={style:"color:#CB7676"},children:$R[17665]=[$R[17666]={type:"text",value:" const"}]},$R[17667]={type:"element",tagName:"span",properties:$R[17668]={style:"color:#BD976A"},children:$R[17669]=[$R[17670]={type:"text",value:" button"}]},$R[17671]={type:"element",tagName:"span",properties:$R[17672]={style:"color:#666666"},children:$R[17673]=[$R[17674]={type:"text",value:" ="}]},$R[17675]={type:"element",tagName:"span",properties:$R[17676]={style:"color:#BD976A"},children:$R[17677]=[$R[17678]={type:"text",value:" ref"}]},$R[17679]={type:"element",tagName:"span",properties:$R[17680]={style:"color:#666666"},children:$R[17681]=[$R[17682]={type:"text",value:"."}]},$R[17683]={type:"element",tagName:"span",properties:$R[17684]={style:"color:#BD976A"},children:$R[17685]=[$R[17686]={type:"text",value:"current"}]},$R[17687]={type:"element",tagName:"span",properties:$R[17688]={style:"color:#666666"},children:$R[17689]=[$R[17690]={type:"text",value:";"}]}]},$R[17691]={type:"text",value:"\n"},$R[17692]={type:"element",tagName:"span",properties:$R[17693]={class:"line"},children:$R[17694]=[]},$R[17695]={type:"text",value:"\n"},$R[17696]={type:"element",tagName:"span",properties:$R[17697]={class:"line"},children:$R[17698]=[$R[17699]={type:"element",tagName:"span",properties:$R[17700]={style:"color:#BD976A"},children:$R[17701]=[$R[17702]={type:"text",value:" button"}]},$R[17703]={type:"element",tagName:"span",properties:$R[17704]={style:"color:#666666"},children:$R[17705]=[$R[17706]={type:"text",value:"?."}]},$R[17707]={type:"element",tagName:"span",properties:$R[17708]={style:"color:#80A665"},children:$R[17709]=[$R[17710]={type:"text",value:"addEventListener"}]},$R[17711]={type:"element",tagName:"span",properties:$R[17712]={style:"color:#666666"},children:$R[17713]=[$R[17714]={type:"text",value:"("}]},$R[17715]={type:"element",tagName:"span",properties:$R[17716]={style:"color:#C98A7D77"},children:$R[17717]=[$R[17718]={type:"text",value:"'"}]},$R[17719]={type:"element",tagName:"span",properties:$R[17720]={style:"color:#C98A7D"},children:$R[17721]=[$R[17722]={type:"text",value:"click"}]},$R[17723]={type:"element",tagName:"span",properties:$R[17724]={style:"color:#C98A7D77"},children:$R[17725]=[$R[17726]={type:"text",value:"'"}]},$R[17727]={type:"element",tagName:"span",properties:$R[17728]={style:"color:#666666"},children:$R[17729]=[$R[17730]={type:"text",value:","}]},$R[17731]={type:"element",tagName:"span",properties:$R[17732]={style:"color:#BD976A"},children:$R[17733]=[$R[17734]={type:"text",value:" handleClick"}]},$R[17735]={type:"element",tagName:"span",properties:$R[17736]={style:"color:#666666"},children:$R[17737]=[$R[17738]={type:"text",value:","}]},$R[17739]={type:"element",tagName:"span",properties:$R[17740]={style:"color:#666666"},children:$R[17741]=[$R[17742]={type:"text",value:" {"}]},$R[17743]={type:"element",tagName:"span",properties:$R[17744]={style:"color:#B8A965"},children:$R[17745]=[$R[17746]={type:"text",value:" once"}]},$R[17747]={type:"element",tagName:"span",properties:$R[17748]={style:"color:#666666"},children:$R[17749]=[$R[17750]={type:"text",value:":"}]},$R[17751]={type:"element",tagName:"span",properties:$R[17752]={style:"color:#4D9375"},children:$R[17753]=[$R[17754]={type:"text",value:" true"}]},$R[17755]={type:"element",tagName:"span",properties:$R[17756]={style:"color:#666666"},children:$R[17757]=[$R[17758]={type:"text",value:" });"}]}]},$R[17759]={type:"text",value:"\n"},$R[17760]={type:"element",tagName:"span",properties:$R[17761]={class:"line"},children:$R[17762]=[]},$R[17763]={type:"text",value:"\n"},$R[17764]={type:"element",tagName:"span",properties:$R[17765]={class:"line"},children:$R[17766]=[$R[17767]={type:"element",tagName:"span",properties:$R[17768]={style:"color:#4D9375"},children:$R[17769]=[$R[17770]={type:"text",value:" return"}]},$R[17771]={type:"element",tagName:"span",properties:$R[17772]={style:"color:#666666"},children:$R[17773]=[$R[17774]={type:"text",value:" ()"}]},$R[17775]={type:"element",tagName:"span",properties:$R[17776]={style:"color:#666666"},children:$R[17777]=[$R[17778]={type:"text",value:" =>"}]},$R[17779]={type:"element",tagName:"span",properties:$R[17780]={style:"color:#666666"},children:$R[17781]=[$R[17782]={type:"text",value:" {"}]}]},$R[17783]={type:"text",value:"\n"},$R[17784]={type:"element",tagName:"span",properties:$R[17785]={class:"line"},children:$R[17786]=[$R[17787]={type:"element",tagName:"span",properties:$R[17788]={style:"color:#BD976A"},children:$R[17789]=[$R[17790]={type:"text",value:" button"}]},$R[17791]={type:"element",tagName:"span",properties:$R[17792]={style:"color:#666666"},children:$R[17793]=[$R[17794]={type:"text",value:"?."}]},$R[17795]={type:"element",tagName:"span",properties:$R[17796]={style:"color:#80A665"},children:$R[17797]=[$R[17798]={type:"text",value:"removeEventListener"}]},$R[17799]={type:"element",tagName:"span",properties:$R[17800]={style:"color:#666666"},children:$R[17801]=[$R[17802]={type:"text",value:"("}]},$R[17803]={type:"element",tagName:"span",properties:$R[17804]={style:"color:#C98A7D77"},children:$R[17805]=[$R[17806]={type:"text",value:"'"}]},$R[17807]={type:"element",tagName:"span",properties:$R[17808]={style:"color:#C98A7D"},children:$R[17809]=[$R[17810]={type:"text",value:"click"}]},$R[17811]={type:"element",tagName:"span",properties:$R[17812]={style:"color:#C98A7D77"},children:$R[17813]=[$R[17814]={type:"text",value:"'"}]},$R[17815]={type:"element",tagName:"span",properties:$R[17816]={style:"color:#666666"},children:$R[17817]=[$R[17818]={type:"text",value:","}]},$R[17819]={type:"element",tagName:"span",properties:$R[17820]={style:"color:#BD976A"},children:$R[17821]=[$R[17822]={type:"text",value:" handleClick"}]},$R[17823]={type:"element",tagName:"span",properties:$R[17824]={style:"color:#666666"},children:$R[17825]=[$R[17826]={type:"text",value:");"}]}]},$R[17827]={type:"text",value:"\n"},$R[17828]={type:"element",tagName:"span",properties:$R[17829]={class:"line"},children:$R[17830]=[$R[17831]={type:"element",tagName:"span",properties:$R[17832]={style:"color:#666666"},children:$R[17833]=[$R[17834]={type:"text",value:" };"}]}]},$R[17835]={type:"text",value:"\n"},$R[17836]={type:"element",tagName:"span",properties:$R[17837]={class:"line"},children:$R[17838]=[$R[17839]={type:"element",tagName:"span",properties:$R[17840]={style:"color:#666666"},children:$R[17841]=[$R[17842]={type:"text",value:" },"}]},$R[17843]={type:"element",tagName:"span",properties:$R[17844]={style:"color:#666666"},children:$R[17845]=[$R[17846]={type:"text",value:" []);"}]}]},$R[17847]={type:"text",value:"\n"},$R[17848]={type:"element",tagName:"span",properties:$R[17849]={class:"line"},children:$R[17850]=[]},$R[17851]={type:"text",value:"\n"},$R[17852]={type:"element",tagName:"span",properties:$R[17853]={class:"line"},children:$R[17854]=[$R[17855]={type:"element",tagName:"span",properties:$R[17856]={style:"color:#4D9375"},children:$R[17857]=[$R[17858]={type:"text",value:" return"}]},$R[17859]={type:"element",tagName:"span",properties:$R[17860]={style:"color:#666666"},children:$R[17861]=[$R[17862]={type:"text",value:" \x3C"}]},$R[17863]={type:"element",tagName:"span",properties:$R[17864]={style:"color:#4D9375"},children:$R[17865]=[$R[17866]={type:"text",value:"button"}]},$R[17867]={type:"element",tagName:"span",properties:$R[17868]={style:"color:#BD976A"},children:$R[17869]=[$R[17870]={type:"text",value:" ref"}]},$R[17871]={type:"element",tagName:"span",properties:$R[17872]={style:"color:#666666"},children:$R[17873]=[$R[17874]={type:"text",value:"={"}]},$R[17875]={type:"element",tagName:"span",properties:$R[17876]={style:"color:#BD976A"},children:$R[17877]=[$R[17878]={type:"text",value:"ref"}]},$R[17879]={type:"element",tagName:"span",properties:$R[17880]={style:"color:#666666"},children:$R[17881]=[$R[17882]={type:"text",value:"}>"}]},$R[17883]={type:"element",tagName:"span",properties:$R[17884]={style:"color:#DBD7CAEE"},children:$R[17885]=[$R[17886]={type:"text",value:"click me"}]},$R[17887]={type:"element",tagName:"span",properties:$R[17888]={style:"color:#666666"},children:$R[17889]=[$R[17890]={type:"text",value:"\x3C/"}]},$R[17891]={type:"element",tagName:"span",properties:$R[17892]={style:"color:#4D9375"},children:$R[17893]=[$R[17894]={type:"text",value:"button"}]},$R[17895]={type:"element",tagName:"span",properties:$R[17896]={style:"color:#666666"},children:$R[17897]=[$R[17898]={type:"text",value:">;"}]}]},$R[17899]={type:"text",value:"\n"},$R[17900]={type:"element",tagName:"span",properties:$R[17901]={class:"line"},children:$R[17902]=[$R[17903]={type:"element",tagName:"span",properties:$R[17904]={style:"color:#666666"},children:$R[17905]=[$R[17906]={type:"text",value:"}"}]}]}]}]}]}}],position:$R[17907]={end:$R[17908]={line:112,column:4,offset:2543},start:$R[17909]={line:85,column:1,offset:1635}},type:"section"},$R[17910]={children:$R[17911]=[$R[17912]={children:$R[17913]=[$R[17914]={position:$R[17915]={start:$R[17916]={line:114,column:5,offset:2549},end:$R[17917]={line:114,column:12,offset:2556}},type:"text",value:"passive"}],id:"passive",level:3,plain:"passive",position:$R[17918]={start:$R[17919]={line:114,column:1,offset:2545},end:$R[17920]={line:114,column:12,offset:2556}},type:"heading"},$R[17921]={children:$R[17922]=[$R[17923]={position:$R[17924]={start:$R[17925]={line:116,column:1,offset:2558},end:$R[17926]={line:116,column:89,offset:2646}},type:"text",value:"ブラウザは通常ドキュメントのスクロール体験を最適化する。しかし scroll event に event listner が登録された場合、event listener 内で "},$R[17927]={position:$R[17928]={start:$R[17929]={line:116,column:89,offset:2646},end:$R[17930]={line:116,column:107,offset:2664}},type:"inlineCode",value:"preventDefault()"},$R[17931]={position:$R[17932]={start:$R[17933]={line:116,column:107,offset:2664},end:$R[17934]={line:116,column:133,offset:2690}},type:"text",value:" が呼ばれる場合はスクロールを止めなくてはならない。"}],position:$R[17935]={start:$R[17936]={line:116,column:1,offset:2558},end:$R[17937]={line:116,column:133,offset:2690}},type:"paragraph"},$R[17938]={children:$R[17939]=[$R[17940]={position:$R[17941]={start:$R[17942]={line:118,column:1,offset:2692},end:$R[17943]={line:118,column:28,offset:2719}},type:"text",value:"しかしブラウザは event listener 内で "},$R[17944]={position:$R[17945]={start:$R[17946]={line:118,column:28,offset:2719},end:$R[17947]={line:118,column:46,offset:2737}},type:"inlineCode",value:"preventDefault()"},$R[17948]={position:$R[17949]={start:$R[17950]={line:118,column:46,offset:2737},end:$R[17951]={line:118,column:147,offset:2838}},type:"text",value:" が呼ばれるかどうかを事前に判断できないため、scroll event に event listener が登録された場合はスクロールを止めるためにスクロールを待つ。これによりスクロール体験が悪くなる。"}],position:$R[17952]={start:$R[17953]={line:118,column:1,offset:2692},end:$R[17954]={line:118,column:147,offset:2838}},type:"paragraph"},$R[17955]={children:$R[17956]=[$R[17957]={position:$R[17958]={start:$R[17959]={line:120,column:1,offset:2840},end:$R[17960]={line:120,column:7,offset:2846}},type:"text",value:"この問題は "},$R[17961]={position:$R[17962]={start:$R[17963]={line:120,column:7,offset:2846},end:$R[17964]={line:120,column:16,offset:2855}},type:"inlineCode",value:"passive"},$R[17965]={position:$R[17966]={start:$R[17967]={line:120,column:16,offset:2855},end:$R[17968]={line:120,column:24,offset:2863}},type:"text",value:" オプションを "},$R[17969]={position:$R[17970]={start:$R[17971]={line:120,column:24,offset:2863},end:$R[17972]={line:120,column:30,offset:2869}},type:"inlineCode",value:"true"},$R[17973]={position:$R[17974]={start:$R[17975]={line:120,column:30,offset:2869},end:$R[17976]={line:120,column:43,offset:2882}},type:"text",value:" にすることで解決できる。"},$R[17977]={position:$R[17978]={start:$R[17979]={line:120,column:43,offset:2882},end:$R[17980]={line:120,column:52,offset:2891}},type:"inlineCode",value:"passive"},$R[17981]={position:$R[17982]={start:$R[17983]={line:120,column:52,offset:2891},end:$R[17984]={line:120,column:60,offset:2899}},type:"text",value:" オプションを "},$R[17985]={position:$R[17986]={start:$R[17987]={line:120,column:60,offset:2899},end:$R[17988]={line:120,column:66,offset:2905}},type:"inlineCode",value:"true"},$R[17989]={position:$R[17990]={start:$R[17991]={line:120,column:66,offset:2905},end:$R[17992]={line:120,column:90,offset:2929}},type:"text",value:" にすると、event listener 内で "},$R[17993]={position:$R[17994]={start:$R[17995]={line:120,column:90,offset:2929},end:$R[17996]={line:120,column:108,offset:2947}},type:"inlineCode",value:"preventDefault()"},$R[17997]={position:$R[17998]={start:$R[17999]={line:120,column:108,offset:2947},end:$R[18000]={line:120,column:158,offset:2997}},type:"text",value:" を呼ばれないことが保証されるため、ブラウザは listener の完了を待たずにスクロールできる。"}],position:$R[18001]={start:$R[18002]={line:120,column:1,offset:2840},end:$R[18003]={line:120,column:158,offset:2997}},type:"paragraph"},$R[18004]={children:$R[18005]=[$R[18006]={position:$R[18007]={start:$R[18008]={line:122,column:1,offset:2999},end:$R[18009]={line:122,column:34,offset:3032}},type:"text",value:"どの程度ユーザー操作が改善されるかは以下記事内の動画が参考になる。"}],position:$R[18010]={start:$R[18011]={line:122,column:1,offset:2999},end:$R[18012]={line:122,column:34,offset:3032}},type:"paragraph"},$R[18013]={meta:$R[18014]={open_graph:$R[18015]={site_name:"Chrome for Developers",type:"website",title:"パッシブ イベント リスナーによるスクロール パフォーマンスの改善 | Blog | Chrome for Developers",description:"Chrome 51 の新機能であるパッシブ イベント リスナーを使用すると、スクロールのパフォーマンスが大幅に向上する可能性があります。",url:"https://developer.chrome.com/blog/passive-event-listeners?hl=ja",locale:"ja"},theme_color:"#1a73e8",title:"パッシブ イベント リスナーによるスクロール パフォーマンスの改善 | Blog | Chrome for Developers",description:"Chrome 51 の新機能であるパッシブ イベント リスナーを使用すると、スクロールのパフォーマンスが大幅に向上する可能性があります。",favicon:"https://www.gstatic.com/devrel-devsite/prod/v63a7e59e7b93b62eb99aa3751cce206090432f0c0d09ff73f0d3636dcec4ab60/chrome/images/favicon.png",canonical_url:"https://developer.chrome.com/blog/passive-event-listeners?hl=ja"},oembed:void 0,position:$R[18016]={start:$R[18017]={line:124,column:1,offset:3034},end:$R[18018]={line:124,column:64,offset:3097}},src:"https://developer.chrome.com/blog/passive-event-listeners?hl=ja",type:"embed"}],position:$R[18019]={end:$R[18020]={line:124,column:64,offset:3097},start:$R[18021]={line:114,column:1,offset:2545}},type:"section"},$R[18022]={children:$R[18023]=[$R[18024]={children:$R[18025]=[$R[18026]={position:$R[18027]={start:$R[18028]={line:126,column:5,offset:3103},end:$R[18029]={line:126,column:11,offset:3109}},type:"text",value:"signal"}],id:"signal",level:3,plain:"signal",position:$R[18030]={start:$R[18031]={line:126,column:1,offset:3099},end:$R[18032]={line:126,column:11,offset:3109}},type:"heading"},$R[18033]={children:$R[18034]=[$R[18035]={position:$R[18036]={start:$R[18037]={line:128,column:1,offset:3111},end:$R[18038]={line:128,column:9,offset:3119}},type:"inlineCode",value:"signal"},$R[18039]={position:$R[18040]={start:$R[18041]={line:128,column:9,offset:3119},end:$R[18042]={line:128,column:122,offset:3232}},type:"text",value:" オプションは AbortSignal を指定する。AbortSignal は AbortController を通じて生成される。AbortSignal が abort されると、event listener は削除される。"}],position:$R[18043]={start:$R[18044]={line:128,column:1,offset:3111},end:$R[18045]={line:128,column:122,offset:3232}},type:"paragraph"},$R[18046]={children:$R[18047]=[$R[18048]={position:$R[18049]={start:$R[18050]={line:130,column:1,offset:3234},end:$R[18051]={line:130,column:130,offset:3363}},type:"text",value:"一見とても便利なオプションだが罠がある。Abort すればもちろん event listener が削除されるが、正常処理された場合を Signal だけからは判断できないため、event listener が削除されずメモリリークの原因になる可能性がある。"}],position:$R[18052]={start:$R[18053]={line:130,column:1,offset:3234},end:$R[18054]={line:130,column:130,offset:3363}},type:"paragraph"},$R[18055]={children:$R[18056]=[$R[18057]={position:$R[18058]={start:$R[18059]={line:132,column:1,offset:3365},end:$R[18060]={line:132,column:12,offset:3376}},type:"text",value:"これらに対する対策は "},$R[18061]={children:$R[18062]=[$R[18063]={position:$R[18064]={start:$R[18065]={line:132,column:13,offset:3377},end:$R[18066]={line:132,column:18,offset:3382}},type:"text",value:"@jxck"}],position:$R[18067]={start:$R[18068]={line:132,column:12,offset:3376},end:$R[18069]={line:132,column:37,offset:3401}},title:void 0,type:"link",url:"https://jxck.io/"},$R[18070]={position:$R[18071]={start:$R[18072]={line:132,column:37,offset:3401},end:$R[18073]={line:132,column:66,offset:3430}},type:"text",value:" さんのこの記事が参考になるのでそちらを参考にしてほしい。"}],position:$R[18074]={start:$R[18075]={line:132,column:1,offset:3365},end:$R[18076]={line:132,column:66,offset:3430}},type:"paragraph"},$R[18077]={meta:$R[18078]={author:"Jxck",description:"最近 AbortSignal.any() が提案され、急速に実装が進んでいる。すでに定義されている AbortSignal.timeout() や addEventListener() への Signal なども含め、非同期処理の中断を実装する際の API はかなり整備され...",keywords:$R[18079]=["timeout","abortsignal","promise"],theme_color:"#000000",open_graph:$R[18080]={type:"article",url:"https://blog.jxck.io/entries/2023-06-01/abort-signal-any.html",title:"AbortSignal.any(), AbortSignal.timeout(), そして addEventListener() の Signal | blog.jxck.io",site_name:"blog.jxck.io",description:"最近 AbortSignal.any() が提案され、急速に実装が進んでいる。すでに定義されている AbortSignal.timeout() や addEventListener() への Signal なども含め、非同期処理の中断を実装する際の API はかなり整備され...",images:$R[18081]=[$R[18082]={url:"https://blog.jxck.io/assets/img/jxck.600x600.png"}]},title:"AbortSignal.any(), AbortSignal.timeout(), そして addEventListener() の Signal | blog.jxck.io",favicon:"https://blog.jxck.io/assets/img/jxck.3000x3000.webp",canonical_url:"https://blog.jxck.io/entries/2023-06-01/abort-signal-any.html"},oembed:void 0,position:$R[18083]={start:$R[18084]={line:134,column:1,offset:3432},end:$R[18085]={line:134,column:62,offset:3493}},src:"https://blog.jxck.io/entries/2023-06-01/abort-signal-any.html",type:"embed"}],position:$R[18086]={end:$R[18087]={line:134,column:62,offset:3493},start:$R[18088]={line:126,column:1,offset:3099}},type:"section"}],position:$R[18089]={end:$R[18090]={line:134,column:62,offset:3493},start:$R[18091]={line:7,column:1,offset:119}},type:"section"},$R[18092]={children:$R[18093]=[$R[18094]={children:$R[18095]=[$R[18096]={position:$R[18097]={start:$R[18098]={line:136,column:4,offset:3498},end:$R[18099]={line:136,column:7,offset:3501}},type:"text",value:"まとめ"}],id:"まとめ",level:2,plain:"まとめ",position:$R[18100]={start:$R[18101]={line:136,column:1,offset:3495},end:$R[18102]={line:136,column:7,offset:3501}},type:"heading"},$R[18103]={children:$R[18104]=[$R[18105]={position:$R[18106]={start:$R[18107]={line:138,column:1,offset:3503},end:$R[18108]={line:138,column:65,offset:3567}},type:"text",value:"これらの提案は 2016 年〜 2020 年には既に提案 / 実装されていたが、なかなか使う機会がなかったので調べてみた。特に "},$R[18109]={position:$R[18110]={start:$R[18111]={line:138,column:65,offset:3567},end:$R[18112]={line:138,column:71,offset:3573}},type:"inlineCode",value:"once"},$R[18113]={position:$R[18114]={start:$R[18115]={line:138,column:71,offset:3573},end:$R[18116]={line:138,column:79,offset:3581}},type:"text",value:" オプションと "},$R[18117]={position:$R[18118]={start:$R[18119]={line:138,column:79,offset:3581},end:$R[18120]={line:138,column:88,offset:3590}},type:"inlineCode",value:"passive"},$R[18121]={position:$R[18122]={start:$R[18123]={line:138,column:88,offset:3590},end:$R[18124]={line:138,column:95,offset:3597}},type:"text",value:" オプション、"},$R[18125]={position:$R[18126]={start:$R[18127]={line:138,column:95,offset:3597},end:$R[18128]={line:138,column:103,offset:3605}},type:"inlineCode",value:"signal"},$R[18129]={position:$R[18130]={start:$R[18131]={line:138,column:103,offset:3605},end:$R[18132]={line:138,column:147,offset:3649}},type:"text",value:" オプションは今後の開発で使う機会があるかもしれないので、覚えておくと便利かもしれない。"}],position:$R[18133]={start:$R[18134]={line:138,column:1,offset:3503},end:$R[18135]={line:138,column:147,offset:3649}},type:"paragraph"}],position:$R[18136]={end:$R[18137]={line:138,column:147,offset:3649},start:$R[18138]={line:136,column:1,offset:3495}},type:"section"}],footnotes:$R[18139]=[$R[18140]={children:$R[18141]=[$R[18142]={children:$R[18143]=[$R[18144]={children:$R[18145]=[$R[18146]={position:$R[18147]={start:$R[18148]={line:81,column:8,offset:1486},end:$R[18149]={line:81,column:30,offset:1508}},type:"text",value:"JavaScript Event order"}],position:$R[18150]={start:$R[18151]={line:81,column:7,offset:1485},end:$R[18152]={line:81,column:86,offset:1564}},title:void 0,type:"link",url:"https://www.quirksmode.org/js/events_order.html#link4"}],position:$R[18153]={start:$R[18154]={line:81,column:7,offset:1485},end:$R[18155]={line:81,column:86,offset:1564}},type:"paragraph"}],count:1,index:0,position:$R[18156]={start:$R[18157]={line:81,column:1,offset:1479},end:$R[18158]={line:81,column:86,offset:1564}},type:"footnoteDefinition"},$R[18159]={children:$R[18160]=[$R[18161]={children:$R[18162]=[$R[18163]={children:$R[18164]=[$R[18165]={position:$R[18166]={start:$R[18167]={line:83,column:8,offset:1573},end:$R[18168]={line:83,column:19,offset:1584}},type:"text",value:"Event order"}],position:$R[18169]={start:$R[18170]={line:83,column:7,offset:1572},end:$R[18171]={line:83,column:68,offset:1633}},title:void 0,type:"link",url:"https://javascript.info/bubbling-and-capturing"}],position:$R[18172]={start:$R[18173]={line:83,column:7,offset:1572},end:$R[18174]={line:83,column:68,offset:1633}},type:"paragraph"}],count:1,index:1,position:$R[18175]={start:$R[18176]={line:83,column:1,offset:1566},end:$R[18177]={line:83,column:68,offset:1633}},type:"footnoteDefinition"}],title:$R[18178]={children:$R[18179]=[$R[18180]={position:$R[18181]={start:$R[18182]={line:1,column:3,offset:2},end:$R[18183]={line:1,column:25,offset:24}},type:"text",value:"EventListener のオプションメモ"}],id:"eventlistener-のオプションメモ",level:1,plain:"EventListener のオプションメモ",position:$R[18184]={start:$R[18185]={line:1,column:1,offset:0},end:$R[18186]={line:1,column:25,offset:24}},type:"heading"},toc:$R[18187]=[$R[18188]={children:$R[18189]=[],id:"はじめに",plain:"はじめに",type:"toc"},$R[18190]={children:$R[18191]=[$R[18192]={children:$R[18193]=[$R[18194]={children:$R[18195]=[],id:"イベントの伝播順",plain:"イベントの伝播順",type:"toc"}],id:"capture",plain:"capture",type:"toc"},$R[18196]={children:$R[18197]=[],id:"once",plain:"once",type:"toc"},$R[18198]={children:$R[18199]=[],id:"passive",plain:"passive",type:"toc"},$R[18200]={children:$R[18201]=[],id:"signal",plain:"signal",type:"toc"}],id:"オプション",plain:"オプション",type:"toc"},$R[18202]={children:$R[18203]=[],id:"まとめ",plain:"まとめ",type:"toc"}],type:"article"}},$R[18204]={content:"# Life Cycle Scripts を理解する\n\n## はじめに\n\nnpm scripts には、`pre` と `post` というプレフィックスのついたスクリプトがある。これは、スクリプトの前後に実行されるスクリプトを指定するものである。\n\nその中でも、特定の状況下で実行されるスクリプトがある。それらを Life Cycle Scripts と呼ぶ。この挙動が混乱しがちなので、整理してみた。\n\n## Life Cycle Scripts とは\n\nLife Cycle Scripts とは、`pre` や `post` のついたスクリプトの中でも、特定の状況下で実行されるスクリプトのことである。\n\n具体的には、以下のようなスクリプトが Life Cycle Scripts に該当する。\n\n### `prepublish`\n\n`npm install` や `npm ci` が実行されたときに実行されるスクリプトである。\n\n`npm publish` では実行されない。(ナント!!!)\n\nこのスクリプトは、名前と挙動の違いから混乱するという理由で非推奨[^1]であり、代わりに `prepare` スクリプトと `prepublishOnly` スクリプトを使うことが推奨されている。`prepublish` のユースケースを公式では以下のように説明されている。\n\n> If you need to perform operations on your package before it is used, in a way that is not dependent on the operating system or architecture of the target system, use a prepublish script. This includes tasks such as:\n>\n> - Compiling CoffeeScript source code into JavaScript.\n> - Creating minified versions of JavaScript source code.\n> - Fetching remote resources that your package will use.\n>\n> --- [Prepare and Prepublish](https://docs.npmjs.com/cli/v9/using-npm/scripts#prepare-and-prepublish)\n\n[^1]: https://github.com/npm/npm/issues/10074\n\n### `prepare`\n\n`prepare` スクリプトは、`npm install` や `npm publish` , `npm pack` が実行されたときに、実行されるスクリプトである。\n\n`prepublish` スクリプトの挙動の互換性の観点から、`prepare` スクリプトは `prepublishOnly` スクリプトの前に実行され、`prepublish` スクリプトの後に実行される。\n\n### `prepublishOnly`\n\n`prepublishOnly` スクリプトは、`npm publish` が実行されたときにのみ、実行されるスクリプトである。(シンプル!)\n\n### `prepack`\n\ntarball が作成される前に実行されるスクリプトである。tarball が作成されるタイミングは以下の通りである。\n\n- `npm pack`\n- `npm publish`\n- git URL でのインストール\n\nここで `npm run pack` と `npm pack` は別である。前者はユーザーが定義したスクリプトであり、`prepack` は実行されない。\n\n### `postpack`\n\ntarball が作成された後に実行されるスクリプトである。\n\n### `dependencies`\n\n`node_modules` ディレクトリが変更されたとき、変更の後に実行される。\n\n## Life Cycle Scripts が実行されるタイミング\n\n次に npm のコマンドが実行されたときに、どの Life Cycle Scripts がどの順番で実行されるかを整理する。\n\n| コマンド | 実行される Life Cycle Scripts の種類と順番 |\n| ----------------- | -------------------------------------------------------------------------------------------------------------- |\n| `npm cache add` | `prepare` |\n| `npm ci` | `preinstall` --> `install` --> `postinstall` --> `prepublish` --> `preprepare` --> `prepare` --> `postprepare` |\n| `npm diff` | `prepare` |\n| `npm install`[^2] | `preinstall` --> `install` --> `postinstall` --> `prepublish` --> `preprepare` --> `prepare` --> `postprepare` |\n| `npm pack` | `prepack` --> `pack` --> `postpack` |\n| `npm publish`[^3] | `prepublishOnly` --> `prepack` --> `prepare` --> `postpack` --> `publish` --> `postpublish` |\n| `npm rebuild`[^4] | `preinstall` --> `install` --> `postinstall` --> `prepare` |\n| `npm restart` | `prerestart` --> `restart` --> `postrestart` |\n| `npm start` | `prestart` --> `start` --> `poststart` |\n| `npm stop` | `prestop` --> `stop` --> `poststop` |\n| `npm test` | `pretest` --> `test` --> `posttest` |\n| `npm version` | `preversion` --> `version` --> `postversion` |\n\n[^2]: `binding.gyp` というファイルが存在する場合、`install` スクリプトは `node-gyp rebuild` が代わりに実行される。\n\n[^3]: `--dry-run` オプションを指定した場合、`prepare` は実行されない。\n\n[^4]: `prepare` はリンクされたパッケージなど、カレントディレクトリがシンボリックリンクの場合にのみ実行される。\n\n## npm 以外での挙動\n\n余談だが npm 以外のパッケージマネージャでは、原則 `pre` と `post` プレフィックスの付いたスクリプトは実行されない。これはワークフローの動作が複雑になることを避けるために設計されている。[^5][^6]\n\nまた yarn[^5] や pnpm[^7] では定義されている Life Cycle Scripts が npm と異なるので注意が必要である。\n\n---\n\n[@s6n_jp](https://twitter.com/s6n_jp) から指摘されて気づいたのだが、どうやら pnpm v9 以降では Life Cycle Scripts がサポートされるようになった[^8]ようだ。これにより、pnpm でも npm と同様に Life Cycle Scripts が実行されるようになった。\n\nTwitter で poll を取った結果[^9]入った変更のようで、多くの人がこの変更を望んでいたようだ。\n\n[^5]: https://yarnpkg.com/advanced/lifecycle-scripts\n\n[^6]: https://github.com/pnpm/pnpm/issues/2891\n\n[^7]: https://pnpm.io/scripts\n\n[^8]: https://github.com/pnpm/pnpm/pull/7634\n\n[^9]: https://twitter.com/pnpmjs/status/1755902257751605717\n\n## まとめ\n\n調べていくと、npm の Life Cycle Scripts は意外と複雑で、挙動が混乱しやすい。しかし、理解してしまえば、それほど難しいものではない。この記事が、少しでもその理解に役立てば幸いである。",description:"混乱しがちな Life Cycle Scripts の挙動を理解する",published:!0,publishedAt:"2024-11-08T21:04:11.79+09:00[Asia/Tokyo]",tags:$R[18205]=["npm scripts","package manager"],title:"Life Cycle Scripts を理解する",updatedAt:"2024-11-09T22:54:16.82+09:00[Asia/Tokyo]",_meta:$R[18206]={filePath:"01JC5CTQW9WVSPP08F4EB4GXF7/slug.md",fileName:"slug.md",directory:"01JC5CTQW9WVSPP08F4EB4GXF7",extension:"md",path:"01JC5CTQW9WVSPP08F4EB4GXF7/slug"},abstract:"Life Cycle Scripts を理解するはじめにnpm scripts には、pre と post というプレフィックスのついたスクリプトがある。これは、スクリプトの前後に実行されるスクリプトを指定するものである。その中でも、特定の状況下で実行されるスクリプトがある。それらを Life Cycle Scripts と呼ぶ。この挙動が混乱しがちなので、整理してみた。Life Cycle Scripts とはLife Cycle Scripts とは、pre や post のついたスクリプトの中でも、特定の状況下で実行されるスクリプトのことである。具体的には、以下のようなスクリプトが Life Cycle Scripts に該当する。prepublishnpm install や npm ci が実行されたときに実行されるスクリプトである。npm publish では実行されない。(ナ",mdast:$R[18207]={children:$R[18208]=[$R[18209]={children:$R[18210]=[$R[18211]={children:$R[18212]=[$R[18213]={position:$R[18214]={start:$R[18215]={line:3,column:4,offset:31},end:$R[18216]={line:3,column:8,offset:35}},type:"text",value:"はじめに"}],id:"はじめに",level:2,plain:"はじめに",position:$R[18217]={start:$R[18218]={line:3,column:1,offset:28},end:$R[18219]={line:3,column:8,offset:35}},type:"heading"},$R[18220]={children:$R[18221]=[$R[18222]={position:$R[18223]={start:$R[18224]={line:5,column:1,offset:37},end:$R[18225]={line:5,column:16,offset:52}},type:"text",value:"npm scripts には、"},$R[18226]={position:$R[18227]={start:$R[18228]={line:5,column:16,offset:52},end:$R[18229]={line:5,column:21,offset:57}},type:"inlineCode",value:"pre"},$R[18230]={position:$R[18231]={start:$R[18232]={line:5,column:21,offset:57},end:$R[18233]={line:5,column:24,offset:60}},type:"text",value:" と "},$R[18234]={position:$R[18235]={start:$R[18236]={line:5,column:24,offset:60},end:$R[18237]={line:5,column:30,offset:66}},type:"inlineCode",value:"post"},$R[18238]={position:$R[18239]={start:$R[18240]={line:5,column:30,offset:66},end:$R[18241]={line:5,column:88,offset:124}},type:"text",value:" というプレフィックスのついたスクリプトがある。これは、スクリプトの前後に実行されるスクリプトを指定するものである。"}],position:$R[18242]={start:$R[18243]={line:5,column:1,offset:37},end:$R[18244]={line:5,column:88,offset:124}},type:"paragraph"},$R[18245]={children:$R[18246]=[$R[18247]={position:$R[18248]={start:$R[18249]={line:7,column:1,offset:126},end:$R[18250]={line:7,column:77,offset:202}},type:"text",value:"その中でも、特定の状況下で実行されるスクリプトがある。それらを Life Cycle Scripts と呼ぶ。この挙動が混乱しがちなので、整理してみた。"}],position:$R[18251]={start:$R[18252]={line:7,column:1,offset:126},end:$R[18253]={line:7,column:77,offset:202}},type:"paragraph"}],position:$R[18254]={end:$R[18255]={line:7,column:77,offset:202},start:$R[18256]={line:3,column:1,offset:28}},type:"section"},$R[18257]={children:$R[18258]=[$R[18259]={children:$R[18260]=[$R[18261]={position:$R[18262]={start:$R[18263]={line:9,column:4,offset:207},end:$R[18264]={line:9,column:25,offset:228}},type:"text",value:"Life Cycle Scripts とは"}],id:"life-cycle-scripts-とは",level:2,plain:"Life Cycle Scripts とは",position:$R[18265]={start:$R[18266]={line:9,column:1,offset:204},end:$R[18267]={line:9,column:25,offset:228}},type:"heading"},$R[18268]={children:$R[18269]=[$R[18270]={position:$R[18271]={start:$R[18272]={line:11,column:1,offset:230},end:$R[18273]={line:11,column:23,offset:252}},type:"text",value:"Life Cycle Scripts とは、"},$R[18274]={position:$R[18275]={start:$R[18276]={line:11,column:23,offset:252},end:$R[18277]={line:11,column:28,offset:257}},type:"inlineCode",value:"pre"},$R[18278]={position:$R[18279]={start:$R[18280]={line:11,column:28,offset:257},end:$R[18281]={line:11,column:31,offset:260}},type:"text",value:" や "},$R[18282]={position:$R[18283]={start:$R[18284]={line:11,column:31,offset:260},end:$R[18285]={line:11,column:37,offset:266}},type:"inlineCode",value:"post"},$R[18286]={position:$R[18287]={start:$R[18288]={line:11,column:37,offset:266},end:$R[18289]={line:11,column:76,offset:305}},type:"text",value:" のついたスクリプトの中でも、特定の状況下で実行されるスクリプトのことである。"}],position:$R[18290]={start:$R[18291]={line:11,column:1,offset:230},end:$R[18292]={line:11,column:76,offset:305}},type:"paragraph"},$R[18293]={children:$R[18294]=[$R[18295]={position:$R[18296]={start:$R[18297]={line:13,column:1,offset:307},end:$R[18298]={line:13,column:45,offset:351}},type:"text",value:"具体的には、以下のようなスクリプトが Life Cycle Scripts に該当する。"}],position:$R[18299]={start:$R[18300]={line:13,column:1,offset:307},end:$R[18301]={line:13,column:45,offset:351}},type:"paragraph"},$R[18302]={children:$R[18303]=[$R[18304]={children:$R[18305]=[$R[18306]={position:$R[18307]={start:$R[18308]={line:15,column:5,offset:357},end:$R[18309]={line:15,column:17,offset:369}},type:"inlineCode",value:"prepublish"}],id:"prepublish",level:3,plain:"prepublish",position:$R[18310]={start:$R[18311]={line:15,column:1,offset:353},end:$R[18312]={line:15,column:17,offset:369}},type:"heading"},$R[18313]={children:$R[18314]=[$R[18315]={position:$R[18316]={start:$R[18317]={line:17,column:1,offset:371},end:$R[18318]={line:17,column:14,offset:384}},type:"inlineCode",value:"npm install"},$R[18319]={position:$R[18320]={start:$R[18321]={line:17,column:14,offset:384},end:$R[18322]={line:17,column:17,offset:387}},type:"text",value:" や "},$R[18323]={position:$R[18324]={start:$R[18325]={line:17,column:17,offset:387},end:$R[18326]={line:17,column:25,offset:395}},type:"inlineCode",value:"npm ci"},$R[18327]={position:$R[18328]={start:$R[18329]={line:17,column:25,offset:395},end:$R[18330]={line:17,column:49,offset:419}},type:"text",value:" が実行されたときに実行されるスクリプトである。"}],position:$R[18331]={start:$R[18332]={line:17,column:1,offset:371},end:$R[18333]={line:17,column:49,offset:419}},type:"paragraph"},$R[18334]={children:$R[18335]=[$R[18336]={position:$R[18337]={start:$R[18338]={line:19,column:1,offset:421},end:$R[18339]={line:19,column:14,offset:434}},type:"inlineCode",value:"npm publish"},$R[18340]={position:$R[18341]={start:$R[18342]={line:19,column:14,offset:434},end:$R[18343]={line:19,column:32,offset:452}},type:"text",value:" では実行されない。(ナント!!!)"}],position:$R[18344]={start:$R[18345]={line:19,column:1,offset:421},end:$R[18346]={line:19,column:32,offset:452}},type:"paragraph"},$R[18347]={children:$R[18348]=[$R[18349]={position:$R[18350]={start:$R[18351]={line:21,column:1,offset:454},end:$R[18352]={line:21,column:33,offset:486}},type:"text",value:"このスクリプトは、名前と挙動の違いから混乱するという理由で非推奨"},$R[18353]={footnoteIndex:0,position:$R[18354]={start:$R[18355]={line:21,column:33,offset:486},end:$R[18356]={line:21,column:37,offset:490}},referenceIndex:1,type:"footnoteReference"},$R[18357]={position:$R[18358]={start:$R[18359]={line:21,column:37,offset:490},end:$R[18360]={line:21,column:46,offset:499}},type:"text",value:"であり、代わりに "},$R[18361]={position:$R[18362]={start:$R[18363]={line:21,column:46,offset:499},end:$R[18364]={line:21,column:55,offset:508}},type:"inlineCode",value:"prepare"},$R[18365]={position:$R[18366]={start:$R[18367]={line:21,column:55,offset:508},end:$R[18368]={line:21,column:63,offset:516}},type:"text",value:" スクリプトと "},$R[18369]={position:$R[18370]={start:$R[18371]={line:21,column:63,offset:516},end:$R[18372]={line:21,column:79,offset:532}},type:"inlineCode",value:"prepublishOnly"},$R[18373]={position:$R[18374]={start:$R[18375]={line:21,column:79,offset:532},end:$R[18376]={line:21,column:99,offset:552}},type:"text",value:" スクリプトを使うことが推奨されている。"},$R[18377]={position:$R[18378]={start:$R[18379]={line:21,column:99,offset:552},end:$R[18380]={line:21,column:111,offset:564}},type:"inlineCode",value:"prepublish"},$R[18381]={position:$R[18382]={start:$R[18383]={line:21,column:111,offset:564},end:$R[18384]={line:21,column:138,offset:591}},type:"text",value:" のユースケースを公式では以下のように説明されている。"}],position:$R[18385]={start:$R[18386]={line:21,column:1,offset:454},end:$R[18387]={line:21,column:138,offset:591}},type:"paragraph"},$R[18388]={children:$R[18389]=[$R[18390]={children:$R[18391]=[$R[18392]={position:$R[18393]={start:$R[18394]={line:23,column:3,offset:595},end:$R[18395]={line:23,column:218,offset:810}},type:"text",value:"If you need to perform operations on your package before it is used, in a way that is not dependent on the operating system or architecture of the target system, use a prepublish script. This includes tasks such as:"}],position:$R[18396]={start:$R[18397]={line:23,column:3,offset:595},end:$R[18398]={line:23,column:218,offset:810}},type:"paragraph"},$R[18399]={children:$R[18400]=[$R[18401]={children:$R[18402]=[$R[18403]={children:$R[18404]=[$R[18405]={position:$R[18406]={start:$R[18407]={line:25,column:5,offset:817},end:$R[18408]={line:25,column:56,offset:868}},type:"text",value:"Compiling CoffeeScript source code into JavaScript."}],position:$R[18409]={start:$R[18410]={line:25,column:5,offset:817},end:$R[18411]={line:25,column:56,offset:868}},type:"paragraph"}],position:$R[18412]={start:$R[18413]={line:25,column:3,offset:815},end:$R[18414]={line:25,column:56,offset:868}},type:"listItem"},$R[18415]={children:$R[18416]=[$R[18417]={children:$R[18418]=[$R[18419]={position:$R[18420]={start:$R[18421]={line:26,column:5,offset:873},end:$R[18422]={line:26,column:58,offset:926}},type:"text",value:"Creating minified versions of JavaScript source code."}],position:$R[18423]={start:$R[18424]={line:26,column:5,offset:873},end:$R[18425]={line:26,column:58,offset:926}},type:"paragraph"}],position:$R[18426]={start:$R[18427]={line:26,column:3,offset:871},end:$R[18428]={line:26,column:58,offset:926}},type:"listItem"},$R[18429]={children:$R[18430]=[$R[18431]={children:$R[18432]=[$R[18433]={position:$R[18434]={start:$R[18435]={line:27,column:5,offset:931},end:$R[18436]={line:27,column:58,offset:984}},type:"text",value:"Fetching remote resources that your package will use."}],position:$R[18437]={start:$R[18438]={line:27,column:5,offset:931},end:$R[18439]={line:27,column:58,offset:984}},type:"paragraph"}],position:$R[18440]={start:$R[18441]={line:27,column:3,offset:929},end:$R[18442]={line:27,column:58,offset:984}},type:"listItem"}],position:$R[18443]={start:$R[18444]={line:25,column:3,offset:815},end:$R[18445]={line:28,column:2,offset:986}},type:"unorderedList"},$R[18446]={children:$R[18447]=[$R[18448]={position:$R[18449]={start:$R[18450]={line:29,column:3,offset:989},end:$R[18451]={line:29,column:7,offset:993}},type:"text",value:"--- "},$R[18452]={children:$R[18453]=[$R[18454]={position:$R[18455]={start:$R[18456]={line:29,column:8,offset:994},end:$R[18457]={line:29,column:30,offset:1016}},type:"text",value:"Prepare and Prepublish"}],position:$R[18458]={start:$R[18459]={line:29,column:7,offset:993},end:$R[18460]={line:29,column:103,offset:1089}},title:void 0,type:"link",url:"https://docs.npmjs.com/cli/v9/using-npm/scripts#prepare-and-prepublish"}],position:$R[18461]={start:$R[18462]={line:29,column:3,offset:989},end:$R[18463]={line:29,column:103,offset:1089}},type:"paragraph"}],position:$R[18464]={start:$R[18465]={line:23,column:1,offset:593},end:$R[18466]={line:29,column:103,offset:1089}},type:"blockquote"}],position:$R[18467]={end:$R[18468]={line:29,column:103,offset:1089},start:$R[18469]={line:15,column:1,offset:353}},type:"section"},$R[18470]={children:$R[18471]=[$R[18472]={children:$R[18473]=[$R[18474]={position:$R[18475]={start:$R[18476]={line:33,column:5,offset:1142},end:$R[18477]={line:33,column:14,offset:1151}},type:"inlineCode",value:"prepare"}],id:"prepare",level:3,plain:"prepare",position:$R[18478]={start:$R[18479]={line:33,column:1,offset:1138},end:$R[18480]={line:33,column:14,offset:1151}},type:"heading"},$R[18481]={children:$R[18482]=[$R[18483]={position:$R[18484]={start:$R[18485]={line:35,column:1,offset:1153},end:$R[18486]={line:35,column:10,offset:1162}},type:"inlineCode",value:"prepare"},$R[18487]={position:$R[18488]={start:$R[18489]={line:35,column:10,offset:1162},end:$R[18490]={line:35,column:18,offset:1170}},type:"text",value:" スクリプトは、"},$R[18491]={position:$R[18492]={start:$R[18493]={line:35,column:18,offset:1170},end:$R[18494]={line:35,column:31,offset:1183}},type:"inlineCode",value:"npm install"},$R[18495]={position:$R[18496]={start:$R[18497]={line:35,column:31,offset:1183},end:$R[18498]={line:35,column:34,offset:1186}},type:"text",value:" や "},$R[18499]={position:$R[18500]={start:$R[18501]={line:35,column:34,offset:1186},end:$R[18502]={line:35,column:47,offset:1199}},type:"inlineCode",value:"npm publish"},$R[18503]={position:$R[18504]={start:$R[18505]={line:35,column:47,offset:1199},end:$R[18506]={line:35,column:50,offset:1202}},type:"text",value:" , "},$R[18507]={position:$R[18508]={start:$R[18509]={line:35,column:50,offset:1202},end:$R[18510]={line:35,column:60,offset:1212}},type:"inlineCode",value:"npm pack"},$R[18511]={position:$R[18512]={start:$R[18513]={line:35,column:60,offset:1212},end:$R[18514]={line:35,column:85,offset:1237}},type:"text",value:" が実行されたときに、実行されるスクリプトである。"}],position:$R[18515]={start:$R[18516]={line:35,column:1,offset:1153},end:$R[18517]={line:35,column:85,offset:1237}},type:"paragraph"},$R[18518]={children:$R[18519]=[$R[18520]={position:$R[18521]={start:$R[18522]={line:37,column:1,offset:1239},end:$R[18523]={line:37,column:13,offset:1251}},type:"inlineCode",value:"prepublish"},$R[18524]={position:$R[18525]={start:$R[18526]={line:37,column:13,offset:1251},end:$R[18527]={line:37,column:32,offset:1270}},type:"text",value:" スクリプトの挙動の互換性の観点から、"},$R[18528]={position:$R[18529]={start:$R[18530]={line:37,column:32,offset:1270},end:$R[18531]={line:37,column:41,offset:1279}},type:"inlineCode",value:"prepare"},$R[18532]={position:$R[18533]={start:$R[18534]={line:37,column:41,offset:1279},end:$R[18535]={line:37,column:49,offset:1287}},type:"text",value:" スクリプトは "},$R[18536]={position:$R[18537]={start:$R[18538]={line:37,column:49,offset:1287},end:$R[18539]={line:37,column:65,offset:1303}},type:"inlineCode",value:"prepublishOnly"},$R[18540]={position:$R[18541]={start:$R[18542]={line:37,column:65,offset:1303},end:$R[18543]={line:37,column:79,offset:1317}},type:"text",value:" スクリプトの前に実行され、"},$R[18544]={position:$R[18545]={start:$R[18546]={line:37,column:79,offset:1317},end:$R[18547]={line:37,column:91,offset:1329}},type:"inlineCode",value:"prepublish"},$R[18548]={position:$R[18549]={start:$R[18550]={line:37,column:91,offset:1329},end:$R[18551]={line:37,column:106,offset:1344}},type:"text",value:" スクリプトの後に実行される。"}],position:$R[18552]={start:$R[18553]={line:37,column:1,offset:1239},end:$R[18554]={line:37,column:106,offset:1344}},type:"paragraph"}],position:$R[18555]={end:$R[18556]={line:37,column:106,offset:1344},start:$R[18557]={line:33,column:1,offset:1138}},type:"section"},$R[18558]={children:$R[18559]=[$R[18560]={children:$R[18561]=[$R[18562]={position:$R[18563]={start:$R[18564]={line:39,column:5,offset:1350},end:$R[18565]={line:39,column:21,offset:1366}},type:"inlineCode",value:"prepublishOnly"}],id:"prepublishonly",level:3,plain:"prepublishOnly",position:$R[18566]={start:$R[18567]={line:39,column:1,offset:1346},end:$R[18568]={line:39,column:21,offset:1366}},type:"heading"},$R[18569]={children:$R[18570]=[$R[18571]={position:$R[18572]={start:$R[18573]={line:41,column:1,offset:1368},end:$R[18574]={line:41,column:17,offset:1384}},type:"inlineCode",value:"prepublishOnly"},$R[18575]={position:$R[18576]={start:$R[18577]={line:41,column:17,offset:1384},end:$R[18578]={line:41,column:25,offset:1392}},type:"text",value:" スクリプトは、"},$R[18579]={position:$R[18580]={start:$R[18581]={line:41,column:25,offset:1392},end:$R[18582]={line:41,column:38,offset:1405}},type:"inlineCode",value:"npm publish"},$R[18583]={position:$R[18584]={start:$R[18585]={line:41,column:38,offset:1405},end:$R[18586]={line:41,column:72,offset:1439}},type:"text",value:" が実行されたときにのみ、実行されるスクリプトである。(シンプル!)"}],position:$R[18587]={start:$R[18588]={line:41,column:1,offset:1368},end:$R[18589]={line:41,column:72,offset:1439}},type:"paragraph"}],position:$R[18590]={end:$R[18591]={line:41,column:72,offset:1439},start:$R[18592]={line:39,column:1,offset:1346}},type:"section"},$R[18593]={children:$R[18594]=[$R[18595]={children:$R[18596]=[$R[18597]={position:$R[18598]={start:$R[18599]={line:43,column:5,offset:1445},end:$R[18600]={line:43,column:14,offset:1454}},type:"inlineCode",value:"prepack"}],id:"prepack",level:3,plain:"prepack",position:$R[18601]={start:$R[18602]={line:43,column:1,offset:1441},end:$R[18603]={line:43,column:14,offset:1454}},type:"heading"},$R[18604]={children:$R[18605]=[$R[18606]={position:$R[18607]={start:$R[18608]={line:45,column:1,offset:1456},end:$R[18609]={line:45,column:60,offset:1515}},type:"text",value:"tarball が作成される前に実行されるスクリプトである。tarball が作成されるタイミングは以下の通りである。"}],position:$R[18610]={start:$R[18611]={line:45,column:1,offset:1456},end:$R[18612]={line:45,column:60,offset:1515}},type:"paragraph"},$R[18613]={children:$R[18614]=[$R[18615]={children:$R[18616]=[$R[18617]={children:$R[18618]=[$R[18619]={position:$R[18620]={start:$R[18621]={line:47,column:3,offset:1519},end:$R[18622]={line:47,column:13,offset:1529}},type:"inlineCode",value:"npm pack"}],position:$R[18623]={start:$R[18624]={line:47,column:3,offset:1519},end:$R[18625]={line:47,column:13,offset:1529}},type:"paragraph"}],position:$R[18626]={start:$R[18627]={line:47,column:1,offset:1517},end:$R[18628]={line:47,column:13,offset:1529}},type:"listItem"},$R[18629]={children:$R[18630]=[$R[18631]={children:$R[18632]=[$R[18633]={position:$R[18634]={start:$R[18635]={line:48,column:3,offset:1532},end:$R[18636]={line:48,column:16,offset:1545}},type:"inlineCode",value:"npm publish"}],position:$R[18637]={start:$R[18638]={line:48,column:3,offset:1532},end:$R[18639]={line:48,column:16,offset:1545}},type:"paragraph"}],position:$R[18640]={start:$R[18641]={line:48,column:1,offset:1530},end:$R[18642]={line:48,column:16,offset:1545}},type:"listItem"},$R[18643]={children:$R[18644]=[$R[18645]={children:$R[18646]=[$R[18647]={position:$R[18648]={start:$R[18649]={line:49,column:3,offset:1548},end:$R[18650]={line:49,column:19,offset:1564}},type:"text",value:"git URL でのインストール"}],position:$R[18651]={start:$R[18652]={line:49,column:3,offset:1548},end:$R[18653]={line:49,column:19,offset:1564}},type:"paragraph"}],position:$R[18654]={start:$R[18655]={line:49,column:1,offset:1546},end:$R[18656]={line:49,column:19,offset:1564}},type:"listItem"}],position:$R[18657]={start:$R[18658]={line:47,column:1,offset:1517},end:$R[18659]={line:49,column:19,offset:1564}},type:"unorderedList"},$R[18660]={children:$R[18661]=[$R[18662]={position:$R[18663]={start:$R[18664]={line:51,column:1,offset:1566},end:$R[18665]={line:51,column:5,offset:1570}},type:"text",value:"ここで "},$R[18666]={position:$R[18667]={start:$R[18668]={line:51,column:5,offset:1570},end:$R[18669]={line:51,column:19,offset:1584}},type:"inlineCode",value:"npm run pack"},$R[18670]={position:$R[18671]={start:$R[18672]={line:51,column:19,offset:1584},end:$R[18673]={line:51,column:22,offset:1587}},type:"text",value:" と "},$R[18674]={position:$R[18675]={start:$R[18676]={line:51,column:22,offset:1587},end:$R[18677]={line:51,column:32,offset:1597}},type:"inlineCode",value:"npm pack"},$R[18678]={position:$R[18679]={start:$R[18680]={line:51,column:32,offset:1597},end:$R[18681]={line:51,column:60,offset:1625}},type:"text",value:" は別である。前者はユーザーが定義したスクリプトであり、"},$R[18682]={position:$R[18683]={start:$R[18684]={line:51,column:60,offset:1625},end:$R[18685]={line:51,column:69,offset:1634}},type:"inlineCode",value:"prepack"},$R[18686]={position:$R[18687]={start:$R[18688]={line:51,column:69,offset:1634},end:$R[18689]={line:51,column:78,offset:1643}},type:"text",value:" は実行されない。"}],position:$R[18690]={start:$R[18691]={line:51,column:1,offset:1566},end:$R[18692]={line:51,column:78,offset:1643}},type:"paragraph"}],position:$R[18693]={end:$R[18694]={line:51,column:78,offset:1643},start:$R[18695]={line:43,column:1,offset:1441}},type:"section"},$R[18696]={children:$R[18697]=[$R[18698]={children:$R[18699]=[$R[18700]={position:$R[18701]={start:$R[18702]={line:53,column:5,offset:1649},end:$R[18703]={line:53,column:15,offset:1659}},type:"inlineCode",value:"postpack"}],id:"postpack",level:3,plain:"postpack",position:$R[18704]={start:$R[18705]={line:53,column:1,offset:1645},end:$R[18706]={line:53,column:15,offset:1659}},type:"heading"},$R[18707]={children:$R[18708]=[$R[18709]={position:$R[18710]={start:$R[18711]={line:55,column:1,offset:1661},end:$R[18712]={line:55,column:31,offset:1691}},type:"text",value:"tarball が作成された後に実行されるスクリプトである。"}],position:$R[18713]={start:$R[18714]={line:55,column:1,offset:1661},end:$R[18715]={line:55,column:31,offset:1691}},type:"paragraph"}],position:$R[18716]={end:$R[18717]={line:55,column:31,offset:1691},start:$R[18718]={line:53,column:1,offset:1645}},type:"section"},$R[18719]={children:$R[18720]=[$R[18721]={children:$R[18722]=[$R[18723]={position:$R[18724]={start:$R[18725]={line:57,column:5,offset:1697},end:$R[18726]={line:57,column:19,offset:1711}},type:"inlineCode",value:"dependencies"}],id:"dependencies",level:3,plain:"dependencies",position:$R[18727]={start:$R[18728]={line:57,column:1,offset:1693},end:$R[18729]={line:57,column:19,offset:1711}},type:"heading"},$R[18730]={children:$R[18731]=[$R[18732]={position:$R[18733]={start:$R[18734]={line:59,column:1,offset:1713},end:$R[18735]={line:59,column:15,offset:1727}},type:"inlineCode",value:"node_modules"},$R[18736]={position:$R[18737]={start:$R[18738]={line:59,column:15,offset:1727},end:$R[18739]={line:59,column:42,offset:1754}},type:"text",value:" ディレクトリが変更されたとき、変更の後に実行される。"}],position:$R[18740]={start:$R[18741]={line:59,column:1,offset:1713},end:$R[18742]={line:59,column:42,offset:1754}},type:"paragraph"}],position:$R[18743]={end:$R[18744]={line:59,column:42,offset:1754},start:$R[18745]={line:57,column:1,offset:1693}},type:"section"}],position:$R[18746]={end:$R[18747]={line:59,column:42,offset:1754},start:$R[18748]={line:9,column:1,offset:204}},type:"section"},$R[18749]={children:$R[18750]=[$R[18751]={children:$R[18752]=[$R[18753]={position:$R[18754]={start:$R[18755]={line:61,column:4,offset:1759},end:$R[18756]={line:61,column:34,offset:1789}},type:"text",value:"Life Cycle Scripts が実行されるタイミング"}],id:"life-cycle-scripts-が実行されるタイミング",level:2,plain:"Life Cycle Scripts が実行されるタイミング",position:$R[18757]={start:$R[18758]={line:61,column:1,offset:1756},end:$R[18759]={line:61,column:34,offset:1789}},type:"heading"},$R[18760]={children:$R[18761]=[$R[18762]={position:$R[18763]={start:$R[18764]={line:63,column:1,offset:1791},end:$R[18765]={line:63,column:63,offset:1853}},type:"text",value:"次に npm のコマンドが実行されたときに、どの Life Cycle Scripts がどの順番で実行されるかを整理する。"}],position:$R[18766]={start:$R[18767]={line:63,column:1,offset:1791},end:$R[18768]={line:63,column:63,offset:1853}},type:"paragraph"},$R[18769]={align:$R[18770]=[null,null],children:$R[18771]=[$R[18772]={children:$R[18773]=[$R[18774]={children:$R[18775]=[$R[18776]={position:$R[18777]={start:$R[18778]={line:65,column:3,offset:1857},end:$R[18779]={line:65,column:7,offset:1861}},type:"text",value:"コマンド"}],position:$R[18780]={start:$R[18781]={line:65,column:1,offset:1855},end:$R[18782]={line:65,column:17,offset:1871}},type:"tableCell"},$R[18783]={children:$R[18784]=[$R[18785]={position:$R[18786]={start:$R[18787]={line:65,column:19,offset:1873},end:$R[18788]={line:65,column:50,offset:1904}},type:"text",value:"実行される Life Cycle Scripts の種類と順番"}],position:$R[18789]={start:$R[18790]={line:65,column:17,offset:1871},end:$R[18791]={line:65,column:120,offset:1974}},type:"tableCell"}],position:$R[18792]={start:$R[18793]={line:65,column:1,offset:1855},end:$R[18794]={line:65,column:120,offset:1974}},type:"tableRow"},$R[18795]={children:$R[18796]=[$R[18797]={children:$R[18798]=[$R[18799]={position:$R[18800]={start:$R[18801]={line:67,column:3,offset:2112},end:$R[18802]={line:67,column:18,offset:2127}},type:"inlineCode",value:"npm cache add"}],position:$R[18803]={start:$R[18804]={line:67,column:1,offset:2110},end:$R[18805]={line:67,column:21,offset:2130}},type:"tableCell"},$R[18806]={children:$R[18807]=[$R[18808]={position:$R[18809]={start:$R[18810]={line:67,column:23,offset:2132},end:$R[18811]={line:67,column:32,offset:2141}},type:"inlineCode",value:"prepare"}],position:$R[18812]={start:$R[18813]={line:67,column:21,offset:2130},end:$R[18814]={line:67,column:135,offset:2244}},type:"tableCell"}],position:$R[18815]={start:$R[18816]={line:67,column:1,offset:2110},end:$R[18817]={line:67,column:135,offset:2244}},type:"tableRow"},$R[18818]={children:$R[18819]=[$R[18820]={children:$R[18821]=[$R[18822]={position:$R[18823]={start:$R[18824]={line:68,column:3,offset:2247},end:$R[18825]={line:68,column:11,offset:2255}},type:"inlineCode",value:"npm ci"}],position:$R[18826]={start:$R[18827]={line:68,column:1,offset:2245},end:$R[18828]={line:68,column:21,offset:2265}},type:"tableCell"},$R[18829]={children:$R[18830]=[$R[18831]={position:$R[18832]={start:$R[18833]={line:68,column:23,offset:2267},end:$R[18834]={line:68,column:35,offset:2279}},type:"inlineCode",value:"preinstall"},$R[18835]={position:$R[18836]={start:$R[18837]={line:68,column:35,offset:2279},end:$R[18838]={line:68,column:40,offset:2284}},type:"text",value:" --> "},$R[18839]={position:$R[18840]={start:$R[18841]={line:68,column:40,offset:2284},end:$R[18842]={line:68,column:49,offset:2293}},type:"inlineCode",value:"install"},$R[18843]={position:$R[18844]={start:$R[18845]={line:68,column:49,offset:2293},end:$R[18846]={line:68,column:54,offset:2298}},type:"text",value:" --> "},$R[18847]={position:$R[18848]={start:$R[18849]={line:68,column:54,offset:2298},end:$R[18850]={line:68,column:67,offset:2311}},type:"inlineCode",value:"postinstall"},$R[18851]={position:$R[18852]={start:$R[18853]={line:68,column:67,offset:2311},end:$R[18854]={line:68,column:72,offset:2316}},type:"text",value:" --> "},$R[18855]={position:$R[18856]={start:$R[18857]={line:68,column:72,offset:2316},end:$R[18858]={line:68,column:84,offset:2328}},type:"inlineCode",value:"prepublish"},$R[18859]={position:$R[18860]={start:$R[18861]={line:68,column:84,offset:2328},end:$R[18862]={line:68,column:89,offset:2333}},type:"text",value:" --> "},$R[18863]={position:$R[18864]={start:$R[18865]={line:68,column:89,offset:2333},end:$R[18866]={line:68,column:101,offset:2345}},type:"inlineCode",value:"preprepare"},$R[18867]={position:$R[18868]={start:$R[18869]={line:68,column:101,offset:2345},end:$R[18870]={line:68,column:106,offset:2350}},type:"text",value:" --> "},$R[18871]={position:$R[18872]={start:$R[18873]={line:68,column:106,offset:2350},end:$R[18874]={line:68,column:115,offset:2359}},type:"inlineCode",value:"prepare"},$R[18875]={position:$R[18876]={start:$R[18877]={line:68,column:115,offset:2359},end:$R[18878]={line:68,column:120,offset:2364}},type:"text",value:" --> "},$R[18879]={position:$R[18880]={start:$R[18881]={line:68,column:120,offset:2364},end:$R[18882]={line:68,column:133,offset:2377}},type:"inlineCode",value:"postprepare"}],position:$R[18883]={start:$R[18884]={line:68,column:21,offset:2265},end:$R[18885]={line:68,column:135,offset:2379}},type:"tableCell"}],position:$R[18886]={start:$R[18887]={line:68,column:1,offset:2245},end:$R[18888]={line:68,column:135,offset:2379}},type:"tableRow"},$R[18889]={children:$R[18890]=[$R[18891]={children:$R[18892]=[$R[18893]={position:$R[18894]={start:$R[18895]={line:69,column:3,offset:2382},end:$R[18896]={line:69,column:13,offset:2392}},type:"inlineCode",value:"npm diff"}],position:$R[18897]={start:$R[18898]={line:69,column:1,offset:2380},end:$R[18899]={line:69,column:21,offset:2400}},type:"tableCell"},$R[18900]={children:$R[18901]=[$R[18902]={position:$R[18903]={start:$R[18904]={line:69,column:23,offset:2402},end:$R[18905]={line:69,column:32,offset:2411}},type:"inlineCode",value:"prepare"}],position:$R[18906]={start:$R[18907]={line:69,column:21,offset:2400},end:$R[18908]={line:69,column:135,offset:2514}},type:"tableCell"}],position:$R[18909]={start:$R[18910]={line:69,column:1,offset:2380},end:$R[18911]={line:69,column:135,offset:2514}},type:"tableRow"},$R[18912]={children:$R[18913]=[$R[18914]={children:$R[18915]=[$R[18916]={position:$R[18917]={start:$R[18918]={line:70,column:3,offset:2517},end:$R[18919]={line:70,column:16,offset:2530}},type:"inlineCode",value:"npm install"},$R[18920]={footnoteIndex:1,position:$R[18921]={start:$R[18922]={line:70,column:16,offset:2530},end:$R[18923]={line:70,column:20,offset:2534}},referenceIndex:1,type:"footnoteReference"}],position:$R[18924]={start:$R[18925]={line:70,column:1,offset:2515},end:$R[18926]={line:70,column:21,offset:2535}},type:"tableCell"},$R[18927]={children:$R[18928]=[$R[18929]={position:$R[18930]={start:$R[18931]={line:70,column:23,offset:2537},end:$R[18932]={line:70,column:35,offset:2549}},type:"inlineCode",value:"preinstall"},$R[18933]={position:$R[18934]={start:$R[18935]={line:70,column:35,offset:2549},end:$R[18936]={line:70,column:40,offset:2554}},type:"text",value:" --> "},$R[18937]={position:$R[18938]={start:$R[18939]={line:70,column:40,offset:2554},end:$R[18940]={line:70,column:49,offset:2563}},type:"inlineCode",value:"install"},$R[18941]={position:$R[18942]={start:$R[18943]={line:70,column:49,offset:2563},end:$R[18944]={line:70,column:54,offset:2568}},type:"text",value:" --> "},$R[18945]={position:$R[18946]={start:$R[18947]={line:70,column:54,offset:2568},end:$R[18948]={line:70,column:67,offset:2581}},type:"inlineCode",value:"postinstall"},$R[18949]={position:$R[18950]={start:$R[18951]={line:70,column:67,offset:2581},end:$R[18952]={line:70,column:72,offset:2586}},type:"text",value:" --> "},$R[18953]={position:$R[18954]={start:$R[18955]={line:70,column:72,offset:2586},end:$R[18956]={line:70,column:84,offset:2598}},type:"inlineCode",value:"prepublish"},$R[18957]={position:$R[18958]={start:$R[18959]={line:70,column:84,offset:2598},end:$R[18960]={line:70,column:89,offset:2603}},type:"text",value:" --> "},$R[18961]={position:$R[18962]={start:$R[18963]={line:70,column:89,offset:2603},end:$R[18964]={line:70,column:101,offset:2615}},type:"inlineCode",value:"preprepare"},$R[18965]={position:$R[18966]={start:$R[18967]={line:70,column:101,offset:2615},end:$R[18968]={line:70,column:106,offset:2620}},type:"text",value:" --> "},$R[18969]={position:$R[18970]={start:$R[18971]={line:70,column:106,offset:2620},end:$R[18972]={line:70,column:115,offset:2629}},type:"inlineCode",value:"prepare"},$R[18973]={position:$R[18974]={start:$R[18975]={line:70,column:115,offset:2629},end:$R[18976]={line:70,column:120,offset:2634}},type:"text",value:" --> "},$R[18977]={position:$R[18978]={start:$R[18979]={line:70,column:120,offset:2634},end:$R[18980]={line:70,column:133,offset:2647}},type:"inlineCode",value:"postprepare"}],position:$R[18981]={start:$R[18982]={line:70,column:21,offset:2535},end:$R[18983]={line:70,column:135,offset:2649}},type:"tableCell"}],position:$R[18984]={start:$R[18985]={line:70,column:1,offset:2515},end:$R[18986]={line:70,column:135,offset:2649}},type:"tableRow"},$R[18987]={children:$R[18988]=[$R[18989]={children:$R[18990]=[$R[18991]={position:$R[18992]={start:$R[18993]={line:71,column:3,offset:2652},end:$R[18994]={line:71,column:13,offset:2662}},type:"inlineCode",value:"npm pack"}],position:$R[18995]={start:$R[18996]={line:71,column:1,offset:2650},end:$R[18997]={line:71,column:21,offset:2670}},type:"tableCell"},$R[18998]={children:$R[18999]=[$R[19000]={position:$R[19001]={start:$R[19002]={line:71,column:23,offset:2672},end:$R[19003]={line:71,column:32,offset:2681}},type:"inlineCode",value:"prepack"},$R[19004]={position:$R[19005]={start:$R[19006]={line:71,column:32,offset:2681},end:$R[19007]={line:71,column:37,offset:2686}},type:"text",value:" --> "},$R[19008]={position:$R[19009]={start:$R[19010]={line:71,column:37,offset:2686},end:$R[19011]={line:71,column:43,offset:2692}},type:"inlineCode",value:"pack"},$R[19012]={position:$R[19013]={start:$R[19014]={line:71,column:43,offset:2692},end:$R[19015]={line:71,column:48,offset:2697}},type:"text",value:" --> "},$R[19016]={position:$R[19017]={start:$R[19018]={line:71,column:48,offset:2697},end:$R[19019]={line:71,column:58,offset:2707}},type:"inlineCode",value:"postpack"}],position:$R[19020]={start:$R[19021]={line:71,column:21,offset:2670},end:$R[19022]={line:71,column:135,offset:2784}},type:"tableCell"}],position:$R[19023]={start:$R[19024]={line:71,column:1,offset:2650},end:$R[19025]={line:71,column:135,offset:2784}},type:"tableRow"},$R[19026]={children:$R[19027]=[$R[19028]={children:$R[19029]=[$R[19030]={position:$R[19031]={start:$R[19032]={line:72,column:3,offset:2787},end:$R[19033]={line:72,column:16,offset:2800}},type:"inlineCode",value:"npm publish"},$R[19034]={footnoteIndex:2,position:$R[19035]={start:$R[19036]={line:72,column:16,offset:2800},end:$R[19037]={line:72,column:20,offset:2804}},referenceIndex:1,type:"footnoteReference"}],position:$R[19038]={start:$R[19039]={line:72,column:1,offset:2785},end:$R[19040]={line:72,column:21,offset:2805}},type:"tableCell"},$R[19041]={children:$R[19042]=[$R[19043]={position:$R[19044]={start:$R[19045]={line:72,column:23,offset:2807},end:$R[19046]={line:72,column:39,offset:2823}},type:"inlineCode",value:"prepublishOnly"},$R[19047]={position:$R[19048]={start:$R[19049]={line:72,column:39,offset:2823},end:$R[19050]={line:72,column:44,offset:2828}},type:"text",value:" --> "},$R[19051]={position:$R[19052]={start:$R[19053]={line:72,column:44,offset:2828},end:$R[19054]={line:72,column:53,offset:2837}},type:"inlineCode",value:"prepack"},$R[19055]={position:$R[19056]={start:$R[19057]={line:72,column:53,offset:2837},end:$R[19058]={line:72,column:58,offset:2842}},type:"text",value:" --> "},$R[19059]={position:$R[19060]={start:$R[19061]={line:72,column:58,offset:2842},end:$R[19062]={line:72,column:67,offset:2851}},type:"inlineCode",value:"prepare"},$R[19063]={position:$R[19064]={start:$R[19065]={line:72,column:67,offset:2851},end:$R[19066]={line:72,column:72,offset:2856}},type:"text",value:" --> "},$R[19067]={position:$R[19068]={start:$R[19069]={line:72,column:72,offset:2856},end:$R[19070]={line:72,column:82,offset:2866}},type:"inlineCode",value:"postpack"},$R[19071]={position:$R[19072]={start:$R[19073]={line:72,column:82,offset:2866},end:$R[19074]={line:72,column:87,offset:2871}},type:"text",value:" --> "},$R[19075]={position:$R[19076]={start:$R[19077]={line:72,column:87,offset:2871},end:$R[19078]={line:72,column:96,offset:2880}},type:"inlineCode",value:"publish"},$R[19079]={position:$R[19080]={start:$R[19081]={line:72,column:96,offset:2880},end:$R[19082]={line:72,column:101,offset:2885}},type:"text",value:" --> "},$R[19083]={position:$R[19084]={start:$R[19085]={line:72,column:101,offset:2885},end:$R[19086]={line:72,column:114,offset:2898}},type:"inlineCode",value:"postpublish"}],position:$R[19087]={start:$R[19088]={line:72,column:21,offset:2805},end:$R[19089]={line:72,column:135,offset:2919}},type:"tableCell"}],position:$R[19090]={start:$R[19091]={line:72,column:1,offset:2785},end:$R[19092]={line:72,column:135,offset:2919}},type:"tableRow"},$R[19093]={children:$R[19094]=[$R[19095]={children:$R[19096]=[$R[19097]={position:$R[19098]={start:$R[19099]={line:73,column:3,offset:2922},end:$R[19100]={line:73,column:16,offset:2935}},type:"inlineCode",value:"npm rebuild"},$R[19101]={footnoteIndex:3,position:$R[19102]={start:$R[19103]={line:73,column:16,offset:2935},end:$R[19104]={line:73,column:20,offset:2939}},referenceIndex:1,type:"footnoteReference"}],position:$R[19105]={start:$R[19106]={line:73,column:1,offset:2920},end:$R[19107]={line:73,column:21,offset:2940}},type:"tableCell"},$R[19108]={children:$R[19109]=[$R[19110]={position:$R[19111]={start:$R[19112]={line:73,column:23,offset:2942},end:$R[19113]={line:73,column:35,offset:2954}},type:"inlineCode",value:"preinstall"},$R[19114]={position:$R[19115]={start:$R[19116]={line:73,column:35,offset:2954},end:$R[19117]={line:73,column:40,offset:2959}},type:"text",value:" --> "},$R[19118]={position:$R[19119]={start:$R[19120]={line:73,column:40,offset:2959},end:$R[19121]={line:73,column:49,offset:2968}},type:"inlineCode",value:"install"},$R[19122]={position:$R[19123]={start:$R[19124]={line:73,column:49,offset:2968},end:$R[19125]={line:73,column:54,offset:2973}},type:"text",value:" --> "},$R[19126]={position:$R[19127]={start:$R[19128]={line:73,column:54,offset:2973},end:$R[19129]={line:73,column:67,offset:2986}},type:"inlineCode",value:"postinstall"},$R[19130]={position:$R[19131]={start:$R[19132]={line:73,column:67,offset:2986},end:$R[19133]={line:73,column:72,offset:2991}},type:"text",value:" --> "},$R[19134]={position:$R[19135]={start:$R[19136]={line:73,column:72,offset:2991},end:$R[19137]={line:73,column:81,offset:3000}},type:"inlineCode",value:"prepare"}],position:$R[19138]={start:$R[19139]={line:73,column:21,offset:2940},end:$R[19140]={line:73,column:135,offset:3054}},type:"tableCell"}],position:$R[19141]={start:$R[19142]={line:73,column:1,offset:2920},end:$R[19143]={line:73,column:135,offset:3054}},type:"tableRow"},$R[19144]={children:$R[19145]=[$R[19146]={children:$R[19147]=[$R[19148]={position:$R[19149]={start:$R[19150]={line:74,column:3,offset:3057},end:$R[19151]={line:74,column:16,offset:3070}},type:"inlineCode",value:"npm restart"}],position:$R[19152]={start:$R[19153]={line:74,column:1,offset:3055},end:$R[19154]={line:74,column:21,offset:3075}},type:"tableCell"},$R[19155]={children:$R[19156]=[$R[19157]={position:$R[19158]={start:$R[19159]={line:74,column:23,offset:3077},end:$R[19160]={line:74,column:35,offset:3089}},type:"inlineCode",value:"prerestart"},$R[19161]={position:$R[19162]={start:$R[19163]={line:74,column:35,offset:3089},end:$R[19164]={line:74,column:40,offset:3094}},type:"text",value:" --> "},$R[19165]={position:$R[19166]={start:$R[19167]={line:74,column:40,offset:3094},end:$R[19168]={line:74,column:49,offset:3103}},type:"inlineCode",value:"restart"},$R[19169]={position:$R[19170]={start:$R[19171]={line:74,column:49,offset:3103},end:$R[19172]={line:74,column:54,offset:3108}},type:"text",value:" --> "},$R[19173]={position:$R[19174]={start:$R[19175]={line:74,column:54,offset:3108},end:$R[19176]={line:74,column:67,offset:3121}},type:"inlineCode",value:"postrestart"}],position:$R[19177]={start:$R[19178]={line:74,column:21,offset:3075},end:$R[19179]={line:74,column:135,offset:3189}},type:"tableCell"}],position:$R[19180]={start:$R[19181]={line:74,column:1,offset:3055},end:$R[19182]={line:74,column:135,offset:3189}},type:"tableRow"},$R[19183]={children:$R[19184]=[$R[19185]={children:$R[19186]=[$R[19187]={position:$R[19188]={start:$R[19189]={line:75,column:3,offset:3192},end:$R[19190]={line:75,column:14,offset:3203}},type:"inlineCode",value:"npm start"}],position:$R[19191]={start:$R[19192]={line:75,column:1,offset:3190},end:$R[19193]={line:75,column:21,offset:3210}},type:"tableCell"},$R[19194]={children:$R[19195]=[$R[19196]={position:$R[19197]={start:$R[19198]={line:75,column:23,offset:3212},end:$R[19199]={line:75,column:33,offset:3222}},type:"inlineCode",value:"prestart"},$R[19200]={position:$R[19201]={start:$R[19202]={line:75,column:33,offset:3222},end:$R[19203]={line:75,column:38,offset:3227}},type:"text",value:" --> "},$R[19204]={position:$R[19205]={start:$R[19206]={line:75,column:38,offset:3227},end:$R[19207]={line:75,column:45,offset:3234}},type:"inlineCode",value:"start"},$R[19208]={position:$R[19209]={start:$R[19210]={line:75,column:45,offset:3234},end:$R[19211]={line:75,column:50,offset:3239}},type:"text",value:" --> "},$R[19212]={position:$R[19213]={start:$R[19214]={line:75,column:50,offset:3239},end:$R[19215]={line:75,column:61,offset:3250}},type:"inlineCode",value:"poststart"}],position:$R[19216]={start:$R[19217]={line:75,column:21,offset:3210},end:$R[19218]={line:75,column:135,offset:3324}},type:"tableCell"}],position:$R[19219]={start:$R[19220]={line:75,column:1,offset:3190},end:$R[19221]={line:75,column:135,offset:3324}},type:"tableRow"},$R[19222]={children:$R[19223]=[$R[19224]={children:$R[19225]=[$R[19226]={position:$R[19227]={start:$R[19228]={line:76,column:3,offset:3327},end:$R[19229]={line:76,column:13,offset:3337}},type:"inlineCode",value:"npm stop"}],position:$R[19230]={start:$R[19231]={line:76,column:1,offset:3325},end:$R[19232]={line:76,column:21,offset:3345}},type:"tableCell"},$R[19233]={children:$R[19234]=[$R[19235]={position:$R[19236]={start:$R[19237]={line:76,column:23,offset:3347},end:$R[19238]={line:76,column:32,offset:3356}},type:"inlineCode",value:"prestop"},$R[19239]={position:$R[19240]={start:$R[19241]={line:76,column:32,offset:3356},end:$R[19242]={line:76,column:37,offset:3361}},type:"text",value:" --> "},$R[19243]={position:$R[19244]={start:$R[19245]={line:76,column:37,offset:3361},end:$R[19246]={line:76,column:43,offset:3367}},type:"inlineCode",value:"stop"},$R[19247]={position:$R[19248]={start:$R[19249]={line:76,column:43,offset:3367},end:$R[19250]={line:76,column:48,offset:3372}},type:"text",value:" --> "},$R[19251]={position:$R[19252]={start:$R[19253]={line:76,column:48,offset:3372},end:$R[19254]={line:76,column:58,offset:3382}},type:"inlineCode",value:"poststop"}],position:$R[19255]={start:$R[19256]={line:76,column:21,offset:3345},end:$R[19257]={line:76,column:135,offset:3459}},type:"tableCell"}],position:$R[19258]={start:$R[19259]={line:76,column:1,offset:3325},end:$R[19260]={line:76,column:135,offset:3459}},type:"tableRow"},$R[19261]={children:$R[19262]=[$R[19263]={children:$R[19264]=[$R[19265]={position:$R[19266]={start:$R[19267]={line:77,column:3,offset:3462},end:$R[19268]={line:77,column:13,offset:3472}},type:"inlineCode",value:"npm test"}],position:$R[19269]={start:$R[19270]={line:77,column:1,offset:3460},end:$R[19271]={line:77,column:21,offset:3480}},type:"tableCell"},$R[19272]={children:$R[19273]=[$R[19274]={position:$R[19275]={start:$R[19276]={line:77,column:23,offset:3482},end:$R[19277]={line:77,column:32,offset:3491}},type:"inlineCode",value:"pretest"},$R[19278]={position:$R[19279]={start:$R[19280]={line:77,column:32,offset:3491},end:$R[19281]={line:77,column:37,offset:3496}},type:"text",value:" --> "},$R[19282]={position:$R[19283]={start:$R[19284]={line:77,column:37,offset:3496},end:$R[19285]={line:77,column:43,offset:3502}},type:"inlineCode",value:"test"},$R[19286]={position:$R[19287]={start:$R[19288]={line:77,column:43,offset:3502},end:$R[19289]={line:77,column:48,offset:3507}},type:"text",value:" --> "},$R[19290]={position:$R[19291]={start:$R[19292]={line:77,column:48,offset:3507},end:$R[19293]={line:77,column:58,offset:3517}},type:"inlineCode",value:"posttest"}],position:$R[19294]={start:$R[19295]={line:77,column:21,offset:3480},end:$R[19296]={line:77,column:135,offset:3594}},type:"tableCell"}],position:$R[19297]={start:$R[19298]={line:77,column:1,offset:3460},end:$R[19299]={line:77,column:135,offset:3594}},type:"tableRow"},$R[19300]={children:$R[19301]=[$R[19302]={children:$R[19303]=[$R[19304]={position:$R[19305]={start:$R[19306]={line:78,column:3,offset:3597},end:$R[19307]={line:78,column:16,offset:3610}},type:"inlineCode",value:"npm version"}],position:$R[19308]={start:$R[19309]={line:78,column:1,offset:3595},end:$R[19310]={line:78,column:21,offset:3615}},type:"tableCell"},$R[19311]={children:$R[19312]=[$R[19313]={position:$R[19314]={start:$R[19315]={line:78,column:23,offset:3617},end:$R[19316]={line:78,column:35,offset:3629}},type:"inlineCode",value:"preversion"},$R[19317]={position:$R[19318]={start:$R[19319]={line:78,column:35,offset:3629},end:$R[19320]={line:78,column:40,offset:3634}},type:"text",value:" --> "},$R[19321]={position:$R[19322]={start:$R[19323]={line:78,column:40,offset:3634},end:$R[19324]={line:78,column:49,offset:3643}},type:"inlineCode",value:"version"},$R[19325]={position:$R[19326]={start:$R[19327]={line:78,column:49,offset:3643},end:$R[19328]={line:78,column:54,offset:3648}},type:"text",value:" --> "},$R[19329]={position:$R[19330]={start:$R[19331]={line:78,column:54,offset:3648},end:$R[19332]={line:78,column:67,offset:3661}},type:"inlineCode",value:"postversion"}],position:$R[19333]={start:$R[19334]={line:78,column:21,offset:3615},end:$R[19335]={line:78,column:135,offset:3729}},type:"tableCell"}],position:$R[19336]={start:$R[19337]={line:78,column:1,offset:3595},end:$R[19338]={line:78,column:135,offset:3729}},type:"tableRow"}],position:$R[19339]={start:$R[19340]={line:65,column:1,offset:1855},end:$R[19341]={line:78,column:135,offset:3729}},type:"table"}],position:$R[19342]={end:$R[19343]={line:78,column:135,offset:3729},start:$R[19344]={line:61,column:1,offset:1756}},type:"section"},$R[19345]={children:$R[19346]=[$R[19347]={children:$R[19348]=[$R[19349]={position:$R[19350]={start:$R[19351]={line:86,column:4,offset:3934},end:$R[19352]={line:86,column:14,offset:3944}},type:"text",value:"npm 以外での挙動"}],id:"npm-以外での挙動",level:2,plain:"npm 以外での挙動",position:$R[19353]={start:$R[19354]={line:86,column:1,offset:3931},end:$R[19355]={line:86,column:14,offset:3944}},type:"heading"},$R[19356]={children:$R[19357]=[$R[19358]={position:$R[19359]={start:$R[19360]={line:88,column:1,offset:3946},end:$R[19361]={line:88,column:29,offset:3974}},type:"text",value:"余談だが npm 以外のパッケージマネージャでは、原則 "},$R[19362]={position:$R[19363]={start:$R[19364]={line:88,column:29,offset:3974},end:$R[19365]={line:88,column:34,offset:3979}},type:"inlineCode",value:"pre"},$R[19366]={position:$R[19367]={start:$R[19368]={line:88,column:34,offset:3979},end:$R[19369]={line:88,column:37,offset:3982}},type:"text",value:" と "},$R[19370]={position:$R[19371]={start:$R[19372]={line:88,column:37,offset:3982},end:$R[19373]={line:88,column:43,offset:3988}},type:"inlineCode",value:"post"},$R[19374]={position:$R[19375]={start:$R[19376]={line:88,column:43,offset:3988},end:$R[19377]={line:88,column:103,offset:4048}},type:"text",value:" プレフィックスの付いたスクリプトは実行されない。これはワークフローの動作が複雑になることを避けるために設計されている。"},$R[19378]={footnoteIndex:4,position:$R[19379]={start:$R[19380]={line:88,column:103,offset:4048},end:$R[19381]={line:88,column:107,offset:4052}},referenceIndex:1,type:"footnoteReference"},$R[19382]={footnoteIndex:5,position:$R[19383]={start:$R[19384]={line:88,column:107,offset:4052},end:$R[19385]={line:88,column:111,offset:4056}},referenceIndex:1,type:"footnoteReference"}],position:$R[19386]={start:$R[19387]={line:88,column:1,offset:3946},end:$R[19388]={line:88,column:111,offset:4056}},type:"paragraph"},$R[19389]={children:$R[19390]=[$R[19391]={position:$R[19392]={start:$R[19393]={line:90,column:1,offset:4058},end:$R[19394]={line:90,column:8,offset:4065}},type:"text",value:"また yarn"},$R[19395]={footnoteIndex:4,position:$R[19396]={start:$R[19397]={line:90,column:8,offset:4065},end:$R[19398]={line:90,column:12,offset:4069}},referenceIndex:2,type:"footnoteReference"},$R[19399]={position:$R[19400]={start:$R[19401]={line:90,column:12,offset:4069},end:$R[19402]={line:90,column:19,offset:4076}},type:"text",value:" や pnpm"},$R[19403]={footnoteIndex:6,position:$R[19404]={start:$R[19405]={line:90,column:19,offset:4076},end:$R[19406]={line:90,column:23,offset:4080}},referenceIndex:1,type:"footnoteReference"},$R[19407]={position:$R[19408]={start:$R[19409]={line:90,column:23,offset:4080},end:$R[19410]={line:90,column:74,offset:4131}},type:"text",value:" では定義されている Life Cycle Scripts が npm と異なるので注意が必要である。"}],position:$R[19411]={start:$R[19412]={line:90,column:1,offset:4058},end:$R[19413]={line:90,column:74,offset:4131}},type:"paragraph"},$R[19414]={position:$R[19415]={start:$R[19416]={line:92,column:1,offset:4133},end:$R[19417]={line:92,column:4,offset:4136}},type:"thematicBreak"},$R[19418]={children:$R[19419]=[$R[19420]={children:$R[19421]=[$R[19422]={position:$R[19423]={start:$R[19424]={line:94,column:2,offset:4139},end:$R[19425]={line:94,column:9,offset:4146}},type:"text",value:"@s6n_jp"}],position:$R[19426]={start:$R[19427]={line:94,column:1,offset:4138},end:$R[19428]={line:94,column:38,offset:4175}},title:void 0,type:"link",url:"https://twitter.com/s6n_jp"},$R[19429]={position:$R[19430]={start:$R[19431]={line:94,column:38,offset:4175},end:$R[19432]={line:94,column:105,offset:4242}},type:"text",value:" から指摘されて気づいたのだが、どうやら pnpm v9 以降では Life Cycle Scripts がサポートされるようになった"},$R[19433]={footnoteIndex:7,position:$R[19434]={start:$R[19435]={line:94,column:105,offset:4242},end:$R[19436]={line:94,column:109,offset:4246}},referenceIndex:1,type:"footnoteReference"},$R[19437]={position:$R[19438]={start:$R[19439]={line:94,column:109,offset:4246},end:$R[19440]={line:94,column:168,offset:4305}},type:"text",value:"ようだ。これにより、pnpm でも npm と同様に Life Cycle Scripts が実行されるようになった。"}],position:$R[19441]={start:$R[19442]={line:94,column:1,offset:4138},end:$R[19443]={line:94,column:168,offset:4305}},type:"paragraph"},$R[19444]={children:$R[19445]=[$R[19446]={position:$R[19447]={start:$R[19448]={line:96,column:1,offset:4307},end:$R[19449]={line:96,column:22,offset:4328}},type:"text",value:"Twitter で poll を取った結果"},$R[19450]={footnoteIndex:8,position:$R[19451]={start:$R[19452]={line:96,column:22,offset:4328},end:$R[19453]={line:96,column:26,offset:4332}},referenceIndex:1,type:"footnoteReference"},$R[19454]={position:$R[19455]={start:$R[19456]={line:96,column:26,offset:4332},end:$R[19457]={line:96,column:55,offset:4361}},type:"text",value:"入った変更のようで、多くの人がこの変更を望んでいたようだ。"}],position:$R[19458]={start:$R[19459]={line:96,column:1,offset:4307},end:$R[19460]={line:96,column:55,offset:4361}},type:"paragraph"}],position:$R[19461]={end:$R[19462]={line:96,column:55,offset:4361},start:$R[19463]={line:86,column:1,offset:3931}},type:"section"},$R[19464]={children:$R[19465]=[$R[19466]={children:$R[19467]=[$R[19468]={position:$R[19469]={start:$R[19470]={line:108,column:4,offset:4606},end:$R[19471]={line:108,column:7,offset:4609}},type:"text",value:"まとめ"}],id:"まとめ",level:2,plain:"まとめ",position:$R[19472]={start:$R[19473]={line:108,column:1,offset:4603},end:$R[19474]={line:108,column:7,offset:4609}},type:"heading"},$R[19475]={children:$R[19476]=[$R[19477]={position:$R[19478]={start:$R[19479]={line:110,column:1,offset:4611},end:$R[19480]={line:110,column:103,offset:4713}},type:"text",value:"調べていくと、npm の Life Cycle Scripts は意外と複雑で、挙動が混乱しやすい。しかし、理解してしまえば、それほど難しいものではない。この記事が、少しでもその理解に役立てば幸いである。"}],position:$R[19481]={start:$R[19482]={line:110,column:1,offset:4611},end:$R[19483]={line:110,column:103,offset:4713}},type:"paragraph"}],position:$R[19484]={end:$R[19485]={line:110,column:103,offset:4713},start:$R[19486]={line:108,column:1,offset:4603}},type:"section"}],footnotes:$R[19487]=[$R[19488]={children:$R[19489]=[$R[19490]={children:$R[19491]=[$R[19492]={children:$R[19493]=[$R[19494]={position:$R[19495]={start:$R[19496]={line:31,column:7,offset:1097},end:$R[19497]={line:31,column:46,offset:1136}},type:"text",value:"https://github.com/npm/npm/issues/10074"}],position:$R[19498]={start:$R[19499]={line:31,column:7,offset:1097},end:$R[19500]={line:31,column:46,offset:1136}},title:void 0,type:"link",url:"https://github.com/npm/npm/issues/10074"}],position:$R[19501]={start:$R[19502]={line:31,column:7,offset:1097},end:$R[19503]={line:31,column:46,offset:1136}},type:"paragraph"}],count:1,index:0,position:$R[19504]={start:$R[19505]={line:31,column:1,offset:1091},end:$R[19506]={line:31,column:46,offset:1136}},type:"footnoteDefinition"},$R[19507]={children:$R[19508]=[$R[19509]={children:$R[19510]=[$R[19511]={position:$R[19512]={start:$R[19513]={line:80,column:7,offset:3737},end:$R[19514]={line:80,column:20,offset:3750}},type:"inlineCode",value:"binding.gyp"},$R[19515]={position:$R[19516]={start:$R[19517]={line:80,column:20,offset:3750},end:$R[19518]={line:80,column:36,offset:3766}},type:"text",value:" というファイルが存在する場合、"},$R[19519]={position:$R[19520]={start:$R[19521]={line:80,column:36,offset:3766},end:$R[19522]={line:80,column:45,offset:3775}},type:"inlineCode",value:"install"},$R[19523]={position:$R[19524]={start:$R[19525]={line:80,column:45,offset:3775},end:$R[19526]={line:80,column:53,offset:3783}},type:"text",value:" スクリプトは "},$R[19527]={position:$R[19528]={start:$R[19529]={line:80,column:53,offset:3783},end:$R[19530]={line:80,column:71,offset:3801}},type:"inlineCode",value:"node-gyp rebuild"},$R[19531]={position:$R[19532]={start:$R[19533]={line:80,column:71,offset:3801},end:$R[19534]={line:80,column:83,offset:3813}},type:"text",value:" が代わりに実行される。"}],position:$R[19535]={start:$R[19536]={line:80,column:7,offset:3737},end:$R[19537]={line:80,column:83,offset:3813}},type:"paragraph"}],count:1,index:1,position:$R[19538]={start:$R[19539]={line:80,column:1,offset:3731},end:$R[19540]={line:80,column:83,offset:3813}},type:"footnoteDefinition"},$R[19541]={children:$R[19542]=[$R[19543]={children:$R[19544]=[$R[19545]={position:$R[19546]={start:$R[19547]={line:82,column:7,offset:3821},end:$R[19548]={line:82,column:18,offset:3832}},type:"inlineCode",value:"--dry-run"},$R[19549]={position:$R[19550]={start:$R[19551]={line:82,column:18,offset:3832},end:$R[19552]={line:82,column:32,offset:3846}},type:"text",value:" オプションを指定した場合、"},$R[19553]={position:$R[19554]={start:$R[19555]={line:82,column:32,offset:3846},end:$R[19556]={line:82,column:41,offset:3855}},type:"inlineCode",value:"prepare"},$R[19557]={position:$R[19558]={start:$R[19559]={line:82,column:41,offset:3855},end:$R[19560]={line:82,column:50,offset:3864}},type:"text",value:" は実行されない。"}],position:$R[19561]={start:$R[19562]={line:82,column:7,offset:3821},end:$R[19563]={line:82,column:50,offset:3864}},type:"paragraph"}],count:1,index:2,position:$R[19564]={start:$R[19565]={line:82,column:1,offset:3815},end:$R[19566]={line:82,column:50,offset:3864}},type:"footnoteDefinition"},$R[19567]={children:$R[19568]=[$R[19569]={children:$R[19570]=[$R[19571]={position:$R[19572]={start:$R[19573]={line:84,column:7,offset:3872},end:$R[19574]={line:84,column:16,offset:3881}},type:"inlineCode",value:"prepare"},$R[19575]={position:$R[19576]={start:$R[19577]={line:84,column:16,offset:3881},end:$R[19578]={line:84,column:64,offset:3929}},type:"text",value:" はリンクされたパッケージなど、カレントディレクトリがシンボリックリンクの場合にのみ実行される。"}],position:$R[19579]={start:$R[19580]={line:84,column:7,offset:3872},end:$R[19581]={line:84,column:64,offset:3929}},type:"paragraph"}],count:1,index:3,position:$R[19582]={start:$R[19583]={line:84,column:1,offset:3866},end:$R[19584]={line:84,column:64,offset:3929}},type:"footnoteDefinition"},$R[19585]={children:$R[19586]=[$R[19587]={children:$R[19588]=[$R[19589]={children:$R[19590]=[$R[19591]={position:$R[19592]={start:$R[19593]={line:98,column:7,offset:4369},end:$R[19594]={line:98,column:53,offset:4415}},type:"text",value:"https://yarnpkg.com/advanced/lifecycle-scripts"}],position:$R[19595]={start:$R[19596]={line:98,column:7,offset:4369},end:$R[19597]={line:98,column:53,offset:4415}},title:void 0,type:"link",url:"https://yarnpkg.com/advanced/lifecycle-scripts"}],position:$R[19598]={start:$R[19599]={line:98,column:7,offset:4369},end:$R[19600]={line:98,column:53,offset:4415}},type:"paragraph"}],count:2,index:4,position:$R[19601]={start:$R[19602]={line:98,column:1,offset:4363},end:$R[19603]={line:98,column:53,offset:4415}},type:"footnoteDefinition"},$R[19604]={children:$R[19605]=[$R[19606]={children:$R[19607]=[$R[19608]={children:$R[19609]=[$R[19610]={position:$R[19611]={start:$R[19612]={line:100,column:7,offset:4423},end:$R[19613]={line:100,column:47,offset:4463}},type:"text",value:"https://github.com/pnpm/pnpm/issues/2891"}],position:$R[19614]={start:$R[19615]={line:100,column:7,offset:4423},end:$R[19616]={line:100,column:47,offset:4463}},title:void 0,type:"link",url:"https://github.com/pnpm/pnpm/issues/2891"}],position:$R[19617]={start:$R[19618]={line:100,column:7,offset:4423},end:$R[19619]={line:100,column:47,offset:4463}},type:"paragraph"}],count:1,index:5,position:$R[19620]={start:$R[19621]={line:100,column:1,offset:4417},end:$R[19622]={line:100,column:47,offset:4463}},type:"footnoteDefinition"},$R[19623]={children:$R[19624]=[$R[19625]={children:$R[19626]=[$R[19627]={children:$R[19628]=[$R[19629]={position:$R[19630]={start:$R[19631]={line:102,column:7,offset:4471},end:$R[19632]={line:102,column:30,offset:4494}},type:"text",value:"https://pnpm.io/scripts"}],position:$R[19633]={start:$R[19634]={line:102,column:7,offset:4471},end:$R[19635]={line:102,column:30,offset:4494}},title:void 0,type:"link",url:"https://pnpm.io/scripts"}],position:$R[19636]={start:$R[19637]={line:102,column:7,offset:4471},end:$R[19638]={line:102,column:30,offset:4494}},type:"paragraph"}],count:1,index:6,position:$R[19639]={start:$R[19640]={line:102,column:1,offset:4465},end:$R[19641]={line:102,column:30,offset:4494}},type:"footnoteDefinition"},$R[19642]={children:$R[19643]=[$R[19644]={children:$R[19645]=[$R[19646]={children:$R[19647]=[$R[19648]={position:$R[19649]={start:$R[19650]={line:104,column:7,offset:4502},end:$R[19651]={line:104,column:45,offset:4540}},type:"text",value:"https://github.com/pnpm/pnpm/pull/7634"}],position:$R[19652]={start:$R[19653]={line:104,column:7,offset:4502},end:$R[19654]={line:104,column:45,offset:4540}},title:void 0,type:"link",url:"https://github.com/pnpm/pnpm/pull/7634"}],position:$R[19655]={start:$R[19656]={line:104,column:7,offset:4502},end:$R[19657]={line:104,column:45,offset:4540}},type:"paragraph"}],count:1,index:7,position:$R[19658]={start:$R[19659]={line:104,column:1,offset:4496},end:$R[19660]={line:104,column:45,offset:4540}},type:"footnoteDefinition"},$R[19661]={children:$R[19662]=[$R[19663]={children:$R[19664]=[$R[19665]={children:$R[19666]=[$R[19667]={position:$R[19668]={start:$R[19669]={line:106,column:7,offset:4548},end:$R[19670]={line:106,column:60,offset:4601}},type:"text",value:"https://twitter.com/pnpmjs/status/1755902257751605717"}],position:$R[19671]={start:$R[19672]={line:106,column:7,offset:4548},end:$R[19673]={line:106,column:60,offset:4601}},title:void 0,type:"link",url:"https://twitter.com/pnpmjs/status/1755902257751605717"}],position:$R[19674]={start:$R[19675]={line:106,column:7,offset:4548},end:$R[19676]={line:106,column:60,offset:4601}},type:"paragraph"}],count:1,index:8,position:$R[19677]={start:$R[19678]={line:106,column:1,offset:4542},end:$R[19679]={line:106,column:60,offset:4601}},type:"footnoteDefinition"}],title:$R[19680]={children:$R[19681]=[$R[19682]={position:$R[19683]={start:$R[19684]={line:1,column:3,offset:2},end:$R[19685]={line:1,column:27,offset:26}},type:"text",value:"Life Cycle Scripts を理解する"}],id:"life-cycle-scripts-を理解する",level:1,plain:"Life Cycle Scripts を理解する",position:$R[19686]={start:$R[19687]={line:1,column:1,offset:0},end:$R[19688]={line:1,column:27,offset:26}},type:"heading"},toc:$R[19689]=[$R[19690]={children:$R[19691]=[],id:"はじめに",plain:"はじめに",type:"toc"},$R[19692]={children:$R[19693]=[$R[19694]={children:$R[19695]=[],id:"prepublish",plain:"prepublish",type:"toc"},$R[19696]={children:$R[19697]=[],id:"prepare",plain:"prepare",type:"toc"},$R[19698]={children:$R[19699]=[],id:"prepublishonly",plain:"prepublishOnly",type:"toc"},$R[19700]={children:$R[19701]=[],id:"prepack",plain:"prepack",type:"toc"},$R[19702]={children:$R[19703]=[],id:"postpack",plain:"postpack",type:"toc"},$R[19704]={children:$R[19705]=[],id:"dependencies",plain:"dependencies",type:"toc"}],id:"life-cycle-scripts-とは",plain:"Life Cycle Scripts とは",type:"toc"},$R[19706]={children:$R[19707]=[],id:"life-cycle-scripts-が実行されるタイミング",plain:"Life Cycle Scripts が実行されるタイミング",type:"toc"},$R[19708]={children:$R[19709]=[],id:"npm-以外での挙動",plain:"npm 以外での挙動",type:"toc"},$R[19710]={children:$R[19711]=[],id:"まとめ",plain:"まとめ",type:"toc"}],type:"article"}},$R[19712]={content:"# @cloudflare/workers-types の Compatibility dates を知っているか\n\n## はじめに\n\nCloudflare Workers で TypeScript を使う際に、`@cloudflare/workers-types` という型定義パッケージを使う。\n\n## Compatibility dates\n\nCloudflare Workers には Compatibility dates という概念がある。これは後方互換性を保つためにある。\n\n通常これは `wrangler.toml` に記述することで Cloudflare Workers ランタイムのバージョンをプロジェクトで指定できる。\n\n## @cloudflare/workers-types にもある Compatibility dates\n\n筆者は今日まで知らなかったが、`@cloudflare/workers-types` にも Compatibility dates がある。\n\nhttps://www.npmjs.com/package/@cloudflare/workers-types\n\nここの `Compatibility dates` には、現在 `@cloudflare/workers-types` で設定できる Compatibility dates が記載されている。筆者が特に気になったのはこれらの記述である。\n\n- `@cloudflare/workers-types`\n - よくブログや記事で見かける書き方であるが、これは最新のバージョンを指定してくれているわけではなく、`2021-11-03` よりも前の互換性を保証しているということである。\n- `@cloudflare/workers-types/experimental`\n - これは最新の Cloudflare Workers ランタイムに追従した型定義である。プロダクションなどで使う際には注意が必要である。\n\n## さいごに\n\nみんな困っていないのだろうか...",description:"@cloudflare/workers-types の 仕様を今知ったので書いた",published:!0,publishedAt:"2024-11-09T23:01:29.591+09:00[Asia/Tokyo]",tags:$R[19713]=["Cloudflare Workers","TypeScript"],title:"@cloudflare/workers-types の Compatibility dates を知っているか",_meta:$R[19714]={filePath:"01JC8KNP7H6T9K7DDGPQ7AW398/slug.md",fileName:"slug.md",directory:"01JC8KNP7H6T9K7DDGPQ7AW398",extension:"md",path:"01JC8KNP7H6T9K7DDGPQ7AW398/slug"},abstract:"@cloudflare/workers-types の Compatibility dates を知っているかはじめにCloudflare Workers で TypeScript を使う際に、@cloudflare/workers-types という型定義パッケージを使う。Compatibility datesCloudflare Workers には Compatibility dates という概念がある。これは後方互換性を保つためにある。通常これは wrangler.toml に記述することで Cloudflare Workers ランタイムのバージョンをプロジェクトで指定できる。@cloudflare/workers-types にもある Compatibility dates筆者は今日まで知らなかったが、@cloudflare/workers-types にも Compatib",mdast:$R[19715]={children:$R[19716]=[$R[19717]={children:$R[19718]=[$R[19719]={children:$R[19720]=[$R[19721]={position:$R[19722]={start:$R[19723]={line:3,column:4,offset:62},end:$R[19724]={line:3,column:8,offset:66}},type:"text",value:"はじめに"}],id:"はじめに",level:2,plain:"はじめに",position:$R[19725]={start:$R[19726]={line:3,column:1,offset:59},end:$R[19727]={line:3,column:8,offset:66}},type:"heading"},$R[19728]={children:$R[19729]=[$R[19730]={position:$R[19731]={start:$R[19732]={line:5,column:1,offset:68},end:$R[19733]={line:5,column:39,offset:106}},type:"text",value:"Cloudflare Workers で TypeScript を使う際に、"},$R[19734]={position:$R[19735]={start:$R[19736]={line:5,column:39,offset:106},end:$R[19737]={line:5,column:66,offset:133}},type:"inlineCode",value:"@cloudflare/workers-types"},$R[19738]={position:$R[19739]={start:$R[19740]={line:5,column:66,offset:133},end:$R[19741]={line:5,column:82,offset:149}},type:"text",value:" という型定義パッケージを使う。"}],position:$R[19742]={start:$R[19743]={line:5,column:1,offset:68},end:$R[19744]={line:5,column:82,offset:149}},type:"paragraph"}],position:$R[19745]={end:$R[19746]={line:5,column:82,offset:149},start:$R[19747]={line:3,column:1,offset:59}},type:"section"},$R[19748]={children:$R[19749]=[$R[19750]={children:$R[19751]=[$R[19752]={position:$R[19753]={start:$R[19754]={line:7,column:4,offset:154},end:$R[19755]={line:7,column:23,offset:173}},type:"text",value:"Compatibility dates"}],id:"compatibility-dates",level:2,plain:"Compatibility dates",position:$R[19756]={start:$R[19757]={line:7,column:1,offset:151},end:$R[19758]={line:7,column:23,offset:173}},type:"heading"},$R[19759]={children:$R[19760]=[$R[19761]={position:$R[19762]={start:$R[19763]={line:9,column:1,offset:175},end:$R[19764]={line:9,column:69,offset:243}},type:"text",value:"Cloudflare Workers には Compatibility dates という概念がある。これは後方互換性を保つためにある。"}],position:$R[19765]={start:$R[19766]={line:9,column:1,offset:175},end:$R[19767]={line:9,column:69,offset:243}},type:"paragraph"},$R[19768]={children:$R[19769]=[$R[19770]={position:$R[19771]={start:$R[19772]={line:11,column:1,offset:245},end:$R[19773]={line:11,column:7,offset:251}},type:"text",value:"通常これは "},$R[19774]={position:$R[19775]={start:$R[19776]={line:11,column:7,offset:251},end:$R[19777]={line:11,column:22,offset:266}},type:"inlineCode",value:"wrangler.toml"},$R[19778]={position:$R[19779]={start:$R[19780]={line:11,column:22,offset:266},end:$R[19781]={line:11,column:76,offset:320}},type:"text",value:" に記述することで Cloudflare Workers ランタイムのバージョンをプロジェクトで指定できる。"}],position:$R[19782]={start:$R[19783]={line:11,column:1,offset:245},end:$R[19784]={line:11,column:76,offset:320}},type:"paragraph"}],position:$R[19785]={end:$R[19786]={line:11,column:76,offset:320},start:$R[19787]={line:7,column:1,offset:151}},type:"section"},$R[19788]={children:$R[19789]=[$R[19790]={children:$R[19791]=[$R[19792]={position:$R[19793]={start:$R[19794]={line:13,column:4,offset:325},end:$R[19795]={line:13,column:54,offset:375}},type:"text",value:"@cloudflare/workers-types にもある Compatibility dates"}],id:"cloudflareworkers-types-にもある-compatibility-dates",level:2,plain:"@cloudflare/workers-types にもある Compatibility dates",position:$R[19796]={start:$R[19797]={line:13,column:1,offset:322},end:$R[19798]={line:13,column:54,offset:375}},type:"heading"},$R[19799]={children:$R[19800]=[$R[19801]={position:$R[19802]={start:$R[19803]={line:15,column:1,offset:377},end:$R[19804]={line:15,column:16,offset:392}},type:"text",value:"筆者は今日まで知らなかったが、"},$R[19805]={position:$R[19806]={start:$R[19807]={line:15,column:16,offset:392},end:$R[19808]={line:15,column:43,offset:419}},type:"inlineCode",value:"@cloudflare/workers-types"},$R[19809]={position:$R[19810]={start:$R[19811]={line:15,column:43,offset:419},end:$R[19812]={line:15,column:71,offset:447}},type:"text",value:" にも Compatibility dates がある。"}],position:$R[19813]={start:$R[19814]={line:15,column:1,offset:377},end:$R[19815]={line:15,column:71,offset:447}},type:"paragraph"},$R[19816]={meta:$R[19817]={title:"@cloudflare/workers-types - npm",open_graph:$R[19818]={images:$R[19819]=[$R[19820]={url:"https://static-production.npmjs.com/338e4905a2684ca96e08c7780fc68412.png"}],description:"TypeScript typings for Cloudflare Workers. Latest version: 4.20250401.0, last published: 3 hours ago. Start using @cloudflare/workers-types in your project by running `npm i @cloudflare/workers-types`. There are 172 other projects in the npm registry using @cloudflare/workers-types.",title:"@cloudflare/workers-types",url:"https://www.npmjs.com/package/@cloudflare/workers-types",site_name:"npm"},theme_color:"#cb3837",description:"TypeScript typings for Cloudflare Workers. Latest version: 4.20250401.0, last published: 3 hours ago. Start using @cloudflare/workers-types in your project by running `npm i @cloudflare/workers-types`. There are 172 other projects in the npm registry using @cloudflare/workers-types.",twitter_card:$R[19821]={card:"summary",url:"https://www.npmjs.com/package/@cloudflare/workers-types",title:"npm: @cloudflare/workers-types",description:"TypeScript typings for Cloudflare Workers. Latest version: 4.20250401.0, last published: 3 hours ago. Start using @cloudflare/workers-types in your project by running `npm i @cloudflare/workers-types`. There are 172 other projects in the npm registry using @cloudflare/workers-types."},favicon:"https://static-production.npmjs.com/da3ab40fb0861d15c83854c29f5f2962.png"},oembed:void 0,position:$R[19822]={start:$R[19823]={line:17,column:1,offset:449},end:$R[19824]={line:17,column:56,offset:504}},src:"https://www.npmjs.com/package/@cloudflare/workers-types",type:"embed"},$R[19825]={children:$R[19826]=[$R[19827]={position:$R[19828]={start:$R[19829]={line:19,column:1,offset:506},end:$R[19830]={line:19,column:5,offset:510}},type:"text",value:"ここの "},$R[19831]={position:$R[19832]={start:$R[19833]={line:19,column:5,offset:510},end:$R[19834]={line:19,column:26,offset:531}},type:"inlineCode",value:"Compatibility dates"},$R[19835]={position:$R[19836]={start:$R[19837]={line:19,column:26,offset:531},end:$R[19838]={line:19,column:33,offset:538}},type:"text",value:" には、現在 "},$R[19839]={position:$R[19840]={start:$R[19841]={line:19,column:33,offset:538},end:$R[19842]={line:19,column:60,offset:565}},type:"inlineCode",value:"@cloudflare/workers-types"},$R[19843]={position:$R[19844]={start:$R[19845]={line:19,column:60,offset:565},end:$R[19846]={line:19,column:119,offset:624}},type:"text",value:" で設定できる Compatibility dates が記載されている。筆者が特に気になったのはこれらの記述である。"}],position:$R[19847]={start:$R[19848]={line:19,column:1,offset:506},end:$R[19849]={line:19,column:119,offset:624}},type:"paragraph"},$R[19850]={children:$R[19851]=[$R[19852]={children:$R[19853]=[$R[19854]={children:$R[19855]=[$R[19856]={position:$R[19857]={start:$R[19858]={line:21,column:3,offset:628},end:$R[19859]={line:21,column:30,offset:655}},type:"inlineCode",value:"@cloudflare/workers-types"}],position:$R[19860]={start:$R[19861]={line:21,column:3,offset:628},end:$R[19862]={line:21,column:30,offset:655}},type:"paragraph"},$R[19863]={children:$R[19864]=[$R[19865]={children:$R[19866]=[$R[19867]={children:$R[19868]=[$R[19869]={position:$R[19870]={start:$R[19871]={line:22,column:5,offset:660},end:$R[19872]={line:22,column:54,offset:709}},type:"text",value:"よくブログや記事で見かける書き方であるが、これは最新のバージョンを指定してくれているわけではなく、"},$R[19873]={position:$R[19874]={start:$R[19875]={line:22,column:54,offset:709},end:$R[19876]={line:22,column:66,offset:721}},type:"inlineCode",value:"2021-11-03"},$R[19877]={position:$R[19878]={start:$R[19879]={line:22,column:66,offset:721},end:$R[19880]={line:22,column:91,offset:746}},type:"text",value:" よりも前の互換性を保証しているということである。"}],position:$R[19881]={start:$R[19882]={line:22,column:5,offset:660},end:$R[19883]={line:22,column:91,offset:746}},type:"paragraph"}],position:$R[19884]={start:$R[19885]={line:22,column:3,offset:658},end:$R[19886]={line:22,column:91,offset:746}},type:"listItem"}],position:$R[19887]={start:$R[19888]={line:22,column:3,offset:658},end:$R[19889]={line:22,column:91,offset:746}},type:"unorderedList"}],position:$R[19890]={start:$R[19891]={line:21,column:1,offset:626},end:$R[19892]={line:22,column:91,offset:746}},type:"listItem"},$R[19893]={children:$R[19894]=[$R[19895]={children:$R[19896]=[$R[19897]={position:$R[19898]={start:$R[19899]={line:23,column:3,offset:749},end:$R[19900]={line:23,column:43,offset:789}},type:"inlineCode",value:"@cloudflare/workers-types/experimental"}],position:$R[19901]={start:$R[19902]={line:23,column:3,offset:749},end:$R[19903]={line:23,column:43,offset:789}},type:"paragraph"},$R[19904]={children:$R[19905]=[$R[19906]={children:$R[19907]=[$R[19908]={children:$R[19909]=[$R[19910]={position:$R[19911]={start:$R[19912]={line:24,column:5,offset:794},end:$R[19913]={line:24,column:72,offset:861}},type:"text",value:"これは最新の Cloudflare Workers ランタイムに追従した型定義である。プロダクションなどで使う際には注意が必要である。"}],position:$R[19914]={start:$R[19915]={line:24,column:5,offset:794},end:$R[19916]={line:24,column:72,offset:861}},type:"paragraph"}],position:$R[19917]={start:$R[19918]={line:24,column:3,offset:792},end:$R[19919]={line:24,column:72,offset:861}},type:"listItem"}],position:$R[19920]={start:$R[19921]={line:24,column:3,offset:792},end:$R[19922]={line:24,column:72,offset:861}},type:"unorderedList"}],position:$R[19923]={start:$R[19924]={line:23,column:1,offset:747},end:$R[19925]={line:24,column:72,offset:861}},type:"listItem"}],position:$R[19926]={start:$R[19927]={line:21,column:1,offset:626},end:$R[19928]={line:24,column:72,offset:861}},type:"unorderedList"}],position:$R[19929]={end:$R[19930]={line:24,column:72,offset:861},start:$R[19931]={line:13,column:1,offset:322}},type:"section"},$R[19932]={children:$R[19933]=[$R[19934]={children:$R[19935]=[$R[19936]={position:$R[19937]={start:$R[19938]={line:26,column:4,offset:866},end:$R[19939]={line:26,column:8,offset:870}},type:"text",value:"さいごに"}],id:"さいごに",level:2,plain:"さいごに",position:$R[19940]={start:$R[19941]={line:26,column:1,offset:863},end:$R[19942]={line:26,column:8,offset:870}},type:"heading"},$R[19943]={children:$R[19944]=[$R[19945]={position:$R[19946]={start:$R[19947]={line:28,column:1,offset:872},end:$R[19948]={line:28,column:18,offset:889}},type:"text",value:"みんな困っていないのだろうか..."}],position:$R[19949]={start:$R[19950]={line:28,column:1,offset:872},end:$R[19951]={line:28,column:18,offset:889}},type:"paragraph"}],position:$R[19952]={end:$R[19953]={line:28,column:18,offset:889},start:$R[19954]={line:26,column:1,offset:863}},type:"section"}],footnotes:$R[19955]=[],title:$R[19956]={children:$R[19957]=[$R[19958]={position:$R[19959]={start:$R[19960]={line:1,column:3,offset:2},end:$R[19961]={line:1,column:58,offset:57}},type:"text",value:"@cloudflare/workers-types の Compatibility dates を知っているか"}],id:"cloudflareworkers-types-の-compatibility-dates-を知っているか",level:1,plain:"@cloudflare/workers-types の Compatibility dates を知っているか",position:$R[19962]={start:$R[19963]={line:1,column:1,offset:0},end:$R[19964]={line:1,column:58,offset:57}},type:"heading"},toc:$R[19965]=[$R[19966]={children:$R[19967]=[],id:"はじめに",plain:"はじめに",type:"toc"},$R[19968]={children:$R[19969]=[],id:"compatibility-dates",plain:"Compatibility dates",type:"toc"},$R[19970]={children:$R[19971]=[],id:"cloudflareworkers-types-にもある-compatibility-dates",plain:"@cloudflare/workers-types にもある Compatibility dates",type:"toc"},$R[19972]={children:$R[19973]=[],id:"さいごに",plain:"さいごに",type:"toc"}],type:"article"}},$R[19974]={content:"# Cf pages と Hydration Error\n\n## はじめに\n\nCloudflare Pages で custom domains を割り当てたところ、hydration error が発生するようになった。この記事ではその解決方法を記す。\n\n## 解決の糸口となった記事\n\nhttps://medium.com/@Shivam010/cloudflare-pages-and-react-hydration-problems-only-on-custom-domain-957f5598ebe8\n\nこの記事では、 hydration error が起こった理由を Email Address Obfuscation という Cloudflare のサービスが website で有効化されており、それが原因であると指摘している。\n\n## Cloudflare で設定できる最適化一覧\n\n以下が Cloudflare で設定できる最適化の一覧である。\n\n\n\n今回この問題に直面して調査した結果、この一覧にはある共通点があることに気づいた。\n\nそれは、Cloudflare から配信される HTML に対して変更を加えないものたちであることだ。[^1]\n\n[^1]: 正確には、[Speed Brain](https://developers.cloudflare.com/speed/optimization/content/speed-brain/) と呼ばれる機能は Speculation Rules API によって実現されているため、本来は script tag が埋め込まれるはずだが、現状は埋め込まれていない。\n\n## 配信している HTML に変更を加える最適化達\n\n以下の最適化は、Cloudflare から配信される HTML に変更を加えるものである。\n\n### Cloudflare Fonts\n\nオリジンから返却される HTML を CDN 上で解析し、`\x3Clink href=\"https://fonts.googleapis.com...省略\" rel=\"stylesheet\">` に書かれている CSS をブラウザではなくエッジ上でダウンロードする。\nそして、その CSS の内容を head にインラインのスタイル `\x3Cstyle>` として書き込んでから、ブラウザに HTML を返却する。\n\n以下がその例である。\n\n\n\n### Rocket Loader\n\nRocket Loader は、ページの読み込みを高速化するために、ページ上の JavaScript の読み込みをレンダリング後まで延期する。\nそれにより、ウェブサイトのコンテンツ(テキスト、画像、フォントなど)を優先的に読み込むことができる。\n\n以下のような script tag が埋め込まれる。\n\n```html:index.html\n\x3Cscript src=\"/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js\" data-cf-settings=\"78debd8b89ee77d3369ad146-|49\" defer>\x3C/script>\n```\n\n## HTML の書き換えにより起こる問題\n\nCloudflare から配信される HTML が書き換えられることにより、hydration error が発生する。\n\nこれは SSR した HTML が使われずに CSR が行われることを意味する。\n\n以下のようなフローをたどり、最終的にブラウザ上に表示されるため CLS が発生してしまう。\n\nhydration 前の SSR された HTML --> CSR される --> hydration される\n\n## まとめ\n\nCloudflare で配信される HTML に変更を加える最適化は、React の hydration に影響を及ぼす可能性がある。ダッシュボードでトグルをオンにするだけで手軽に最適化を行えるが、大いなる力には大いなる責任が伴う[^2]ことを忘れてはならない。\n\n[^2]: [大いなる力には、大いなる責任が伴う - ピクシブ百科事典](https://dic.pixiv.net/a/%E5%A4%A7%E3%81%84%E3%81%AA%E3%82%8B%E5%8A%9B%E3%81%AB%E3%81%AF%E3%80%81%E5%A4%A7%E3%81%84%E3%81%AA%E3%82%8B%E8%B2%AC%E4%BB%BB%E3%81%8C%E4%BC%B4%E3%81%86)",description:"custom domains を割り当てた Cf pages でのみ起こる hydration error を討伐する方法。",published:!0,publishedAt:"2024-11-26T00:49:05.96+09:00[Asia/Tokyo]",tags:$R[19975]=["Cloudflare pages","React"],title:"Cf pages と Hydration Error",_meta:$R[19976]={filePath:"01JDJ06793Q65CFFYBTTSRDWBS/slug.md",fileName:"slug.md",directory:"01JDJ06793Q65CFFYBTTSRDWBS",extension:"md",path:"01JDJ06793Q65CFFYBTTSRDWBS/slug"},abstract:"Cf pages と Hydration ErrorはじめにCloudflare Pages で custom domains を割り当てたところ、hydration error が発生するようになった。この記事ではその解決方法を記す。解決の糸口となった記事https://medium.com/@Shivam010/cloudflare-pages-and-react-hydration-problems-only-on-custom-domain-957f5598ebe8この記事では、 hydration error が起こった理由を Email Address Obfuscation という Cloudflare のサービスが website で有効化されており、それが原因であると指摘している。Cloudflare で設定できる最適化一覧以下が Cloudflare で設定できる最適化",mdast:$R[19977]={children:$R[19978]=[$R[19979]={children:$R[19980]=[$R[19981]={children:$R[19982]=[$R[19983]={position:$R[19984]={start:$R[19985]={line:3,column:4,offset:33},end:$R[19986]={line:3,column:8,offset:37}},type:"text",value:"はじめに"}],id:"はじめに",level:2,plain:"はじめに",position:$R[19987]={start:$R[19988]={line:3,column:1,offset:30},end:$R[19989]={line:3,column:8,offset:37}},type:"heading"},$R[19990]={children:$R[19991]=[$R[19992]={position:$R[19993]={start:$R[19994]={line:5,column:1,offset:39},end:$R[19995]={line:5,column:89,offset:127}},type:"text",value:"Cloudflare Pages で custom domains を割り当てたところ、hydration error が発生するようになった。この記事ではその解決方法を記す。"}],position:$R[19996]={start:$R[19997]={line:5,column:1,offset:39},end:$R[19998]={line:5,column:89,offset:127}},type:"paragraph"}],position:$R[19999]={end:$R[20000]={line:5,column:89,offset:127},start:$R[20001]={line:3,column:1,offset:30}},type:"section"},$R[20002]={children:$R[20003]=[$R[20004]={children:$R[20005]=[$R[20006]={position:$R[20007]={start:$R[20008]={line:7,column:4,offset:132},end:$R[20009]={line:7,column:15,offset:143}},type:"text",value:"解決の糸口となった記事"}],id:"解決の糸口となった記事",level:2,plain:"解決の糸口となった記事",position:$R[20010]={start:$R[20011]={line:7,column:1,offset:129},end:$R[20012]={line:7,column:15,offset:143}},type:"heading"},$R[20013]={meta:$R[20014]={title:"Cloudflare Pages and React Hydration problems only on custom domain! | by Shivam Rathore | Medium",theme_color:"#000000",twitter_card:$R[20015]={apps:$R[20016]={iphone:$R[20017]={name:"Medium",id:"828256236",url:"medium://p/957f5598ebe8"}},title:"Cloudflare Pages and React Hydration problems only on custom domain!",site:"@Medium",description:"Problem you are facing is not because of your code but because of some Cloudflare service, modifying your code to protect your code! 😅",images:$R[20018]=[$R[20019]={url:"https://miro.medium.com/v2/da:true/resize:fit:1200/0*k1Y8bGCH7KTDS54R"}],card:"summary_large_image",creator:"@010Shivam"},open_graph:$R[20020]={site_name:"Medium",type:"article",articles:$R[20021]=[$R[20022]={published_time:"2023-07-14T12:51:52.445Z",author:"https://medium.com/@Shivam010"}],title:"Cloudflare Pages and React Hydration problems only on custom domain!",description:"Problem you are facing is not because of your code but because of some Cloudflare service, modifying your code to protect your code! 😅",url:"https://medium.com/@Shivam010/cloudflare-pages-and-react-hydration-problems-only-on-custom-domain-957f5598ebe8",images:$R[20023]=[$R[20024]={url:"https://miro.medium.com/v2/da:true/resize:fit:1200/0*k1Y8bGCH7KTDS54R"}]},description:"The problem you are facing is not because of your code but because of some Cloudflare service, modifying your code to protect your code! 😅",author:"Shivam Rathore",favicon:"https://miro.medium.com/v2/5d8de952517e8160e40ef9841c781cdc14a5db313057fa3c3de41c6f5b494b19",canonical_url:"https://medium.com/@Shivam010/cloudflare-pages-and-react-hydration-problems-only-on-custom-domain-957f5598ebe8"},oembed:void 0,position:$R[20025]={start:$R[20026]={line:9,column:1,offset:145},end:$R[20027]={line:9,column:111,offset:255}},src:"https://medium.com/@Shivam010/cloudflare-pages-and-react-hydration-problems-only-on-custom-domain-957f5598ebe8",type:"embed"},$R[20028]={children:$R[20029]=[$R[20030]={position:$R[20031]={start:$R[20032]={line:11,column:1,offset:257},end:$R[20033]={line:11,column:116,offset:372}},type:"text",value:"この記事では、 hydration error が起こった理由を Email Address Obfuscation という Cloudflare のサービスが website で有効化されており、それが原因であると指摘している。"}],position:$R[20034]={start:$R[20035]={line:11,column:1,offset:257},end:$R[20036]={line:11,column:116,offset:372}},type:"paragraph"}],position:$R[20037]={end:$R[20038]={line:11,column:116,offset:372},start:$R[20039]={line:7,column:1,offset:129}},type:"section"},$R[20040]={children:$R[20041]=[$R[20042]={children:$R[20043]=[$R[20044]={position:$R[20045]={start:$R[20046]={line:13,column:4,offset:377},end:$R[20047]={line:13,column:26,offset:399}},type:"text",value:"Cloudflare で設定できる最適化一覧"}],id:"cloudflare-で設定できる最適化一覧",level:2,plain:"Cloudflare で設定できる最適化一覧",position:$R[20048]={start:$R[20049]={line:13,column:1,offset:374},end:$R[20050]={line:13,column:26,offset:399}},type:"heading"},$R[20051]={children:$R[20052]=[$R[20053]={position:$R[20054]={start:$R[20055]={line:15,column:1,offset:401},end:$R[20056]={line:15,column:32,offset:432}},type:"text",value:"以下が Cloudflare で設定できる最適化の一覧である。"}],position:$R[20057]={start:$R[20058]={line:15,column:1,offset:401},end:$R[20059]={line:15,column:32,offset:432}},type:"paragraph"},$R[20060]={children:$R[20061]=[$R[20062]={alt:"Cloudflare で設定できる Optimization 一覧",position:$R[20063]={start:$R[20064]={line:17,column:1,offset:434},end:$R[20065]={line:17,column:61,offset:494}},title:void 0,type:"image",url:"./cf_optimize_list.png",transformed:$R[20066]=[$R[20067]={dim:$R[20068]={h:1021,w:1069},path:"/img/cf_optimize_list-ZvBXD7Te-1069x1021.webp"},$R[20069]={dim:$R[20070]={h:715,w:748},path:"/img/cf_optimize_list-ZvBXD7Te-748x715.webp"},$R[20071]={dim:$R[20072]={h:500,w:524},path:"/img/cf_optimize_list-ZvBXD7Te-524x500.webp"},$R[20073]={dim:$R[20074]={h:350,w:367},path:"/img/cf_optimize_list-ZvBXD7Te-367x350.webp"}]}],position:$R[20075]={start:$R[20076]={line:17,column:1,offset:434},end:$R[20077]={line:17,column:61,offset:494}},type:"paragraph"},$R[20078]={children:$R[20079]=[$R[20080]={position:$R[20081]={start:$R[20082]={line:19,column:1,offset:496},end:$R[20083]={line:19,column:41,offset:536}},type:"text",value:"今回この問題に直面して調査した結果、この一覧にはある共通点があることに気づいた。"}],position:$R[20084]={start:$R[20085]={line:19,column:1,offset:496},end:$R[20086]={line:19,column:41,offset:536}},type:"paragraph"},$R[20087]={children:$R[20088]=[$R[20089]={position:$R[20090]={start:$R[20091]={line:21,column:1,offset:538},end:$R[20092]={line:21,column:51,offset:588}},type:"text",value:"それは、Cloudflare から配信される HTML に対して変更を加えないものたちであることだ。"},$R[20093]={footnoteIndex:0,position:$R[20094]={start:$R[20095]={line:21,column:51,offset:588},end:$R[20096]={line:21,column:55,offset:592}},referenceIndex:1,type:"footnoteReference"}],position:$R[20097]={start:$R[20098]={line:21,column:1,offset:538},end:$R[20099]={line:21,column:55,offset:592}},type:"paragraph"}],position:$R[20100]={end:$R[20101]={line:21,column:55,offset:592},start:$R[20102]={line:13,column:1,offset:374}},type:"section"},$R[20103]={children:$R[20104]=[$R[20105]={children:$R[20106]=[$R[20107]={position:$R[20108]={start:$R[20109]={line:25,column:4,offset:784},end:$R[20110]={line:25,column:27,offset:807}},type:"text",value:"配信している HTML に変更を加える最適化達"}],id:"配信している-html-に変更を加える最適化達",level:2,plain:"配信している HTML に変更を加える最適化達",position:$R[20111]={start:$R[20112]={line:25,column:1,offset:781},end:$R[20113]={line:25,column:27,offset:807}},type:"heading"},$R[20114]={children:$R[20115]=[$R[20116]={position:$R[20117]={start:$R[20118]={line:27,column:1,offset:809},end:$R[20119]={line:27,column:46,offset:854}},type:"text",value:"以下の最適化は、Cloudflare から配信される HTML に変更を加えるものである。"}],position:$R[20120]={start:$R[20121]={line:27,column:1,offset:809},end:$R[20122]={line:27,column:46,offset:854}},type:"paragraph"},$R[20123]={children:$R[20124]=[$R[20125]={children:$R[20126]=[$R[20127]={position:$R[20128]={start:$R[20129]={line:29,column:5,offset:860},end:$R[20130]={line:29,column:21,offset:876}},type:"text",value:"Cloudflare Fonts"}],id:"cloudflare-fonts",level:3,plain:"Cloudflare Fonts",position:$R[20131]={start:$R[20132]={line:29,column:1,offset:856},end:$R[20133]={line:29,column:21,offset:876}},type:"heading"},$R[20134]={children:$R[20135]=[$R[20136]={position:$R[20137]={start:$R[20138]={line:31,column:1,offset:878},end:$R[20139]={line:31,column:30,offset:907}},type:"text",value:"オリジンから返却される HTML を CDN 上で解析し、"},$R[20140]={position:$R[20141]={start:$R[20142]={line:31,column:30,offset:907},end:$R[20143]={line:31,column:96,offset:973}},type:"inlineCode",value:"\x3Clink href=\"https://fonts.googleapis.com...省略\" rel=\"stylesheet\">"},$R[20144]={position:$R[20145]={start:$R[20146]={line:31,column:96,offset:973},end:$R[20147]={line:32,column:34,offset:1043}},type:"text",value:" に書かれている CSS をブラウザではなくエッジ上でダウンロードする。\nそして、その CSS の内容を head にインラインのスタイル "},$R[20148]={position:$R[20149]={start:$R[20150]={line:32,column:34,offset:1043},end:$R[20151]={line:32,column:43,offset:1052}},type:"inlineCode",value:"\x3Cstyle>"},$R[20152]={position:$R[20153]={start:$R[20154]={line:32,column:43,offset:1052},end:$R[20155]={line:32,column:72,offset:1081}},type:"text",value:" として書き込んでから、ブラウザに HTML を返却する。"}],position:$R[20156]={start:$R[20157]={line:31,column:1,offset:878},end:$R[20158]={line:32,column:72,offset:1081}},type:"paragraph"},$R[20159]={children:$R[20160]=[$R[20161]={position:$R[20162]={start:$R[20163]={line:34,column:1,offset:1083},end:$R[20164]={line:34,column:11,offset:1093}},type:"text",value:"以下がその例である。"}],position:$R[20165]={start:$R[20166]={line:34,column:1,offset:1083},end:$R[20167]={line:34,column:11,offset:1093}},type:"paragraph"},$R[20168]={children:$R[20169]=[$R[20170]={alt:"Cloudflare Fonts の例",position:$R[20171]={start:$R[20172]={line:36,column:1,offset:1095},end:$R[20173]={line:36,column:47,offset:1141}},title:void 0,type:"image",url:"./cf_optimize_font.png",transformed:$R[20174]=[$R[20175]={dim:$R[20176]={h:1013,w:1765},path:"/img/cf_optimize_font-H7mknwM2-1765x1013.webp"},$R[20177]={dim:$R[20178]={h:709,w:1236},path:"/img/cf_optimize_font-H7mknwM2-1236x709.webp"},$R[20179]={dim:$R[20180]={h:496,w:865},path:"/img/cf_optimize_font-H7mknwM2-865x496.webp"},$R[20181]={dim:$R[20182]={h:347,w:605},path:"/img/cf_optimize_font-H7mknwM2-605x347.webp"},$R[20183]={dim:$R[20184]={h:243,w:424},path:"/img/cf_optimize_font-H7mknwM2-424x243.webp"}]}],position:$R[20185]={start:$R[20186]={line:36,column:1,offset:1095},end:$R[20187]={line:36,column:47,offset:1141}},type:"paragraph"}],position:$R[20188]={end:$R[20189]={line:36,column:47,offset:1141},start:$R[20190]={line:29,column:1,offset:856}},type:"section"},$R[20191]={children:$R[20192]=[$R[20193]={children:$R[20194]=[$R[20195]={position:$R[20196]={start:$R[20197]={line:38,column:5,offset:1147},end:$R[20198]={line:38,column:18,offset:1160}},type:"text",value:"Rocket Loader"}],id:"rocket-loader",level:3,plain:"Rocket Loader",position:$R[20199]={start:$R[20200]={line:38,column:1,offset:1143},end:$R[20201]={line:38,column:18,offset:1160}},type:"heading"},$R[20202]={children:$R[20203]=[$R[20204]={position:$R[20205]={start:$R[20206]={line:40,column:1,offset:1162},end:$R[20207]={line:41,column:51,offset:1284}},type:"text",value:"Rocket Loader は、ページの読み込みを高速化するために、ページ上の JavaScript の読み込みをレンダリング後まで延期する。\nそれにより、ウェブサイトのコンテンツ(テキスト、画像、フォントなど)を優先的に読み込むことができる。"}],position:$R[20208]={start:$R[20209]={line:40,column:1,offset:1162},end:$R[20210]={line:41,column:51,offset:1284}},type:"paragraph"},$R[20211]={children:$R[20212]=[$R[20213]={position:$R[20214]={start:$R[20215]={line:43,column:1,offset:1286},end:$R[20216]={line:43,column:27,offset:1312}},type:"text",value:"以下のような script tag が埋め込まれる。"}],position:$R[20217]={start:$R[20218]={line:43,column:1,offset:1286},end:$R[20219]={line:43,column:27,offset:1312}},type:"paragraph"},$R[20220]={filename:"index.html html",lang:"html",position:$R[20221]={start:$R[20222]={line:45,column:1,offset:1314},end:$R[20223]={line:47,column:4,offset:1479}},type:"code",value:"\x3Cscript src=\"/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js\" data-cf-settings=\"78debd8b89ee77d3369ad146-|49\" defer>\x3C/script>",hast:$R[20224]={type:"root",children:$R[20225]=[$R[20226]={type:"element",tagName:"pre",properties:$R[20227]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[20228]=[$R[20229]={type:"element",tagName:"code",properties:$R[20230]={},children:$R[20231]=[$R[20232]={type:"element",tagName:"span",properties:$R[20233]={class:"line"},children:$R[20234]=[$R[20235]={type:"element",tagName:"span",properties:$R[20236]={style:"color:#666666"},children:$R[20237]=[$R[20238]={type:"text",value:"\x3C"}]},$R[20239]={type:"element",tagName:"span",properties:$R[20240]={style:"color:#4D9375"},children:$R[20241]=[$R[20242]={type:"text",value:"script"}]},$R[20243]={type:"element",tagName:"span",properties:$R[20244]={style:"color:#BD976A"},children:$R[20245]=[$R[20246]={type:"text",value:" src"}]},$R[20247]={type:"element",tagName:"span",properties:$R[20248]={style:"color:#666666"},children:$R[20249]=[$R[20250]={type:"text",value:"="}]},$R[20251]={type:"element",tagName:"span",properties:$R[20252]={style:"color:#C98A7D77"},children:$R[20253]=[$R[20254]={type:"text",value:"\""}]},$R[20255]={type:"element",tagName:"span",properties:$R[20256]={style:"color:#C98A7D"},children:$R[20257]=[$R[20258]={type:"text",value:"/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js"}]},$R[20259]={type:"element",tagName:"span",properties:$R[20260]={style:"color:#C98A7D77"},children:$R[20261]=[$R[20262]={type:"text",value:"\""}]},$R[20263]={type:"element",tagName:"span",properties:$R[20264]={style:"color:#BD976A"},children:$R[20265]=[$R[20266]={type:"text",value:" data-cf-settings"}]},$R[20267]={type:"element",tagName:"span",properties:$R[20268]={style:"color:#666666"},children:$R[20269]=[$R[20270]={type:"text",value:"="}]},$R[20271]={type:"element",tagName:"span",properties:$R[20272]={style:"color:#C98A7D77"},children:$R[20273]=[$R[20274]={type:"text",value:"\""}]},$R[20275]={type:"element",tagName:"span",properties:$R[20276]={style:"color:#C98A7D"},children:$R[20277]=[$R[20278]={type:"text",value:"78debd8b89ee77d3369ad146-|49"}]},$R[20279]={type:"element",tagName:"span",properties:$R[20280]={style:"color:#C98A7D77"},children:$R[20281]=[$R[20282]={type:"text",value:"\""}]},$R[20283]={type:"element",tagName:"span",properties:$R[20284]={style:"color:#BD976A"},children:$R[20285]=[$R[20286]={type:"text",value:" defer"}]},$R[20287]={type:"element",tagName:"span",properties:$R[20288]={style:"color:#666666"},children:$R[20289]=[$R[20290]={type:"text",value:">\x3C/"}]},$R[20291]={type:"element",tagName:"span",properties:$R[20292]={style:"color:#4D9375"},children:$R[20293]=[$R[20294]={type:"text",value:"script"}]},$R[20295]={type:"element",tagName:"span",properties:$R[20296]={style:"color:#666666"},children:$R[20297]=[$R[20298]={type:"text",value:">"}]}]}]}]}]}}],position:$R[20299]={end:$R[20300]={line:47,column:4,offset:1479},start:$R[20301]={line:38,column:1,offset:1143}},type:"section"}],position:$R[20302]={end:$R[20303]={line:47,column:4,offset:1479},start:$R[20304]={line:25,column:1,offset:781}},type:"section"},$R[20305]={children:$R[20306]=[$R[20307]={children:$R[20308]=[$R[20309]={position:$R[20310]={start:$R[20311]={line:49,column:4,offset:1484},end:$R[20312]={line:49,column:22,offset:1502}},type:"text",value:"HTML の書き換えにより起こる問題"}],id:"html-の書き換えにより起こる問題",level:2,plain:"HTML の書き換えにより起こる問題",position:$R[20313]={start:$R[20314]={line:49,column:1,offset:1481},end:$R[20315]={line:49,column:22,offset:1502}},type:"heading"},$R[20316]={children:$R[20317]=[$R[20318]={position:$R[20319]={start:$R[20320]={line:51,column:1,offset:1504},end:$R[20321]={line:51,column:61,offset:1564}},type:"text",value:"Cloudflare から配信される HTML が書き換えられることにより、hydration error が発生する。"}],position:$R[20322]={start:$R[20323]={line:51,column:1,offset:1504},end:$R[20324]={line:51,column:61,offset:1564}},type:"paragraph"},$R[20325]={children:$R[20326]=[$R[20327]={position:$R[20328]={start:$R[20329]={line:53,column:1,offset:1566},end:$R[20330]={line:53,column:41,offset:1606}},type:"text",value:"これは SSR した HTML が使われずに CSR が行われることを意味する。"}],position:$R[20331]={start:$R[20332]={line:53,column:1,offset:1566},end:$R[20333]={line:53,column:41,offset:1606}},type:"paragraph"},$R[20334]={children:$R[20335]=[$R[20336]={position:$R[20337]={start:$R[20338]={line:55,column:1,offset:1608},end:$R[20339]={line:55,column:46,offset:1653}},type:"text",value:"以下のようなフローをたどり、最終的にブラウザ上に表示されるため CLS が発生してしまう。"}],position:$R[20340]={start:$R[20341]={line:55,column:1,offset:1608},end:$R[20342]={line:55,column:46,offset:1653}},type:"paragraph"},$R[20343]={children:$R[20344]=[$R[20345]={position:$R[20346]={start:$R[20347]={line:57,column:1,offset:1655},end:$R[20348]={line:57,column:56,offset:1710}},type:"text",value:"hydration 前の SSR された HTML --> CSR される --> hydration される"}],position:$R[20349]={start:$R[20350]={line:57,column:1,offset:1655},end:$R[20351]={line:57,column:56,offset:1710}},type:"paragraph"}],position:$R[20352]={end:$R[20353]={line:57,column:56,offset:1710},start:$R[20354]={line:49,column:1,offset:1481}},type:"section"},$R[20355]={children:$R[20356]=[$R[20357]={children:$R[20358]=[$R[20359]={position:$R[20360]={start:$R[20361]={line:59,column:4,offset:1715},end:$R[20362]={line:59,column:7,offset:1718}},type:"text",value:"まとめ"}],id:"まとめ",level:2,plain:"まとめ",position:$R[20363]={start:$R[20364]={line:59,column:1,offset:1712},end:$R[20365]={line:59,column:7,offset:1718}},type:"heading"},$R[20366]={children:$R[20367]=[$R[20368]={position:$R[20369]={start:$R[20370]={line:61,column:1,offset:1720},end:$R[20371]={line:61,column:116,offset:1835}},type:"text",value:"Cloudflare で配信される HTML に変更を加える最適化は、React の hydration に影響を及ぼす可能性がある。ダッシュボードでトグルをオンにするだけで手軽に最適化を行えるが、大いなる力には大いなる責任が伴う"},$R[20372]={footnoteIndex:1,position:$R[20373]={start:$R[20374]={line:61,column:116,offset:1835},end:$R[20375]={line:61,column:120,offset:1839}},referenceIndex:1,type:"footnoteReference"},$R[20376]={position:$R[20377]={start:$R[20378]={line:61,column:120,offset:1839},end:$R[20379]={line:61,column:132,offset:1851}},type:"text",value:"ことを忘れてはならない。"}],position:$R[20380]={start:$R[20381]={line:61,column:1,offset:1720},end:$R[20382]={line:61,column:132,offset:1851}},type:"paragraph"}],position:$R[20383]={end:$R[20384]={line:61,column:132,offset:1851},start:$R[20385]={line:59,column:1,offset:1712}},type:"section"}],footnotes:$R[20386]=[$R[20387]={children:$R[20388]=[$R[20389]={children:$R[20390]=[$R[20391]={position:$R[20392]={start:$R[20393]={line:23,column:7,offset:600},end:$R[20394]={line:23,column:12,offset:605}},type:"text",value:"正確には、"},$R[20395]={children:$R[20396]=[$R[20397]={position:$R[20398]={start:$R[20399]={line:23,column:13,offset:606},end:$R[20400]={line:23,column:24,offset:617}},type:"text",value:"Speed Brain"}],position:$R[20401]={start:$R[20402]={line:23,column:12,offset:605},end:$R[20403]={line:23,column:100,offset:693}},title:void 0,type:"link",url:"https://developers.cloudflare.com/speed/optimization/content/speed-brain/"},$R[20404]={position:$R[20405]={start:$R[20406]={line:23,column:100,offset:693},end:$R[20407]={line:23,column:186,offset:779}},type:"text",value:" と呼ばれる機能は Speculation Rules API によって実現されているため、本来は script tag が埋め込まれるはずだが、現状は埋め込まれていない。"}],position:$R[20408]={start:$R[20409]={line:23,column:7,offset:600},end:$R[20410]={line:23,column:186,offset:779}},type:"paragraph"}],count:1,index:0,position:$R[20411]={start:$R[20412]={line:23,column:1,offset:594},end:$R[20413]={line:23,column:186,offset:779}},type:"footnoteDefinition"},$R[20414]={children:$R[20415]=[$R[20416]={children:$R[20417]=[$R[20418]={children:$R[20419]=[$R[20420]={position:$R[20421]={start:$R[20422]={line:63,column:8,offset:1860},end:$R[20423]={line:63,column:36,offset:1888}},type:"text",value:"大いなる力には、大いなる責任が伴う - ピクシブ百科事典"}],position:$R[20424]={start:$R[20425]={line:63,column:7,offset:1859},end:$R[20426]={line:63,column:216,offset:2068}},title:void 0,type:"link",url:"https://dic.pixiv.net/a/%E5%A4%A7%E3%81%84%E3%81%AA%E3%82%8B%E5%8A%9B%E3%81%AB%E3%81%AF%E3%80%81%E5%A4%A7%E3%81%84%E3%81%AA%E3%82%8B%E8%B2%AC%E4%BB%BB%E3%81%8C%E4%BC%B4%E3%81%86"}],position:$R[20427]={start:$R[20428]={line:63,column:7,offset:1859},end:$R[20429]={line:63,column:216,offset:2068}},type:"paragraph"}],count:1,index:1,position:$R[20430]={start:$R[20431]={line:63,column:1,offset:1853},end:$R[20432]={line:63,column:216,offset:2068}},type:"footnoteDefinition"}],title:$R[20433]={children:$R[20434]=[$R[20435]={position:$R[20436]={start:$R[20437]={line:1,column:3,offset:2},end:$R[20438]={line:1,column:29,offset:28}},type:"text",value:"Cf pages と Hydration Error"}],id:"cf-pages-と-hydration-error",level:1,plain:"Cf pages と Hydration Error",position:$R[20439]={start:$R[20440]={line:1,column:1,offset:0},end:$R[20441]={line:1,column:29,offset:28}},type:"heading"},toc:$R[20442]=[$R[20443]={children:$R[20444]=[],id:"はじめに",plain:"はじめに",type:"toc"},$R[20445]={children:$R[20446]=[],id:"解決の糸口となった記事",plain:"解決の糸口となった記事",type:"toc"},$R[20447]={children:$R[20448]=[],id:"cloudflare-で設定できる最適化一覧",plain:"Cloudflare で設定できる最適化一覧",type:"toc"},$R[20449]={children:$R[20450]=[$R[20451]={children:$R[20452]=[],id:"cloudflare-fonts",plain:"Cloudflare Fonts",type:"toc"},$R[20453]={children:$R[20454]=[],id:"rocket-loader",plain:"Rocket Loader",type:"toc"}],id:"配信している-html-に変更を加える最適化達",plain:"配信している HTML に変更を加える最適化達",type:"toc"},$R[20455]={children:$R[20456]=[],id:"html-の書き換えにより起こる問題",plain:"HTML の書き換えにより起こる問題",type:"toc"},$R[20457]={children:$R[20458]=[],id:"まとめ",plain:"まとめ",type:"toc"}],type:"article"}},$R[20459]={content:"# pnpm とセキュアな依存管理\n\n## はじめに\n\npnpm v10 から、依存するパッケージのライフサイクルスクリプトをデフォルトで実行しないようになる。\n\n## ライフサイクルスクリプトが必要なパッケージとは\n\n昨今、swc や esbuild など異なる言語で書かれたパッケージを npm でインストールすることが一般的になってきた。\nこれらは、バイナリで提供されているため、インストールしたユーザーのアーキテクチャに合わせて用意される必要がある。\n\nhttps://github.com/swc-project/swc/blob/f960d52364e72fa7548cc8aaaf6367dfdf7b9a8f/packages/core/postinstall.js\n\nこのコードは。swc の postinstall script で、インストール時に実行される。\n内容は、適切なアーキテクチャのバイナリを検証し、無い場合は `@swc/wasm` を取得してくるというものである。\n\n## ライフサイクルスクリプトが必要なパッケージの課題\n\nnpm レジストリのパッケージは度々サプライチェーンの標的にされる。[^1][^2]\n\n[^1]: https://github.com/advisories/GHSA-5rqg-jm4f-cqx7\n\n[^2]: https://github.com/advisories/GHSA-pjwm-rvh2-c87w\n\nここで読者の皆さんに質問したい。あなたはある npm パッケージをインストールするときに、そのパッケージがどのようなライフサイクルスクリプトを持っているかを確認しているだろうか?\n私はしていない。\n\n前述した通り、ライフサイクルスクリプトを必要とする npm パッケージは必要な理由がある。\nきっと読者含め多くの人が、その理由を理解しているからこそ必要とされるパッケージに、ライフサイクルスクリプトがあってもおかしくないな、という気持ちを持っているだろう。\n\nしかし、やべーハカーは、ライフサイクルスクリプトを悪用する。\n直近にも、npm パッケージのライフサイクルスクリプトを悪用した脆弱性が報告されている。[^3]\n\n[^3]: https://github.com/web-infra-dev/rspack/issues/8767\n\nこれは余談だが、rspack はどうやらライフサイクルスクリプトを必要としないらしい。\n対応していないアーキテクチャで rspack を使おうとすると例外が投げられて死ぬ。\n\nhttps://github.com/web-infra-dev/rspack/blob/cc5e3f6a49073b354c08ec4b8c75142e602d02ee/crates/node_binding/binding.js\n\n## pnpm v10 での変更点\n\nhttps://github.com/pnpm/pnpm/releases/tag/v10.0.0\n\npnpm v10 では Node.js から corepack が分離する決定[^4]に伴い、`package.json#packageManager` を見て pnpm が指定されているプロジェクトでは、そのプロジェクトの pnpm を使う挙動がデフォルトとなった。\n\n[^4]: https://github.com/nodejs/package-maintenance/blob/c3519284e9f1e2a4acc4c3586c585cf0c3b2fed9/docs/version-management/proposal-next-steps.md\n\n詳しい話は [euxn23](https://x.com/euxn23) さんの記事を読んでほしい。めちゃ分かりやすい。\n\nhttps://zenn.dev/euxn23/articles/399a6815ddac93\n\n他にも store バージョンの更新や、`pnpm link` の挙動変更など、多くの変更があるが、本記事ではライフサイクルスクリプトの実行周りについてのみ触れる。\n\n### onlyBuiltDependencies\n\nhttps://github.com/pnpm/pnpm/pull/8897\n\n直近に起こった rspack の脆弱性を受けて、pnpm team は改めて Twitter でライフサイクルスクリプトの実行についてユーザーアンケートを募った。[^5]\n\n[^5]: https://x.com/pnpmjs/status/1869911712763093048\n\nその結果、ライフサイクルスクリプトの実行をデフォルトで無効化することが決定され、実装された。\n\n[リリースノート](https://github.com/pnpm/pnpm/releases/tag/v10.0.0) にも記載されている通り、特定の依存関係のライフサイクルスクリプトを許可するには、package.json に以下のように追記することで可能となる。\n\n```json:package.json\n{\n\t\"pnpm\": {\n\t\t\"onlyBuiltDependencies\": [\"fsevents\"]\n\t}\n}\n```\n\nこの例では、`fsevents` というパッケージのライフサイクルスクリプトのみを許可する設定となる。\n\n### bun のアプローチとの違い\n\n実装の PR では bun のアプローチとの違いについて議論されている。\n\nbun も pnpm と同様にライフサイクルスクリプトの実行をデフォルトで無効化しているが、bun はデフォルトでライフサイクルスクリプトの実行を許可するパッケージのリストを持っている。\n\nhttps://github.com/oven-sh/bun/blob/8c75c777c2ffa418b18f313fcde23df4c147e964/src/install/default-trusted-dependencies.txt\n\n実装の PR では bun のようにデフォルトで許可するパッケージのリストを持つことを求める声もあったが、pnpm はそのようなアプローチを取らなかった。\n\npnpm team はリストのメンテナンスが大変であることや冗長であることなどから、ユーザーが明示的に許可するパッケージを指定することで、より安全な環境を提供することを目指した。\n\n## pnpm v10.1 と体験の向上\n\npnpm v10 で依存のライフサイクルスクリプトの実行は制限されたが、onlyBuiltDependencies に設定している配列を**良い感じ**に管理することは難しい。\n\nそこで pnpm v10.1 では新たに `pnpm ignored-builds` と `pnpm approve-builds` というコマンドが追加された。\n\nhttps://github.com/pnpm/pnpm/pull/8963\n\n`pnpm ignored-builds` は、ライフサイクルスクリプトを持った依存関係を一覧表示するコマンドである。\n`pnpm approve-builds` は、ライフサイクルスクリプトを持った依存関係を許可するコマンドである。\n\nこれらのコマンドを使用することで、対話的にライフサイクルスクリプトを持った依存関係を管理することが可能となる。\n(読んでみた感じ追加ができるだけで削除はできないようで、ほしいなぁと思うのだ)\n\n## まとめ\n\npnpm v10 から、依存するパッケージのライフサイクルスクリプトをデフォルトで実行しないようになった。\n\nJavaScript のエコシステムは日々進化している。その中で、セキュリティに関する問題も増えている。\nすこしでもセキュリティを意識して、より安全な環境を提供するために、pnpm v10 での変更は大きな意味を持つ。",description:"pnpm v10 で登場した機能とその背景",published:!0,publishedAt:"2025-01-31T23:48:55.604+09:00[Asia/Tokyo]",tags:$R[20460]=["pnpm","security"],title:"pnpm とセキュアな依存管理",_meta:$R[20461]={filePath:"01JJPCQXJEF4YTQTCZZPXBF69E/slug.md",fileName:"slug.md",directory:"01JJPCQXJEF4YTQTCZZPXBF69E",extension:"md",path:"01JJPCQXJEF4YTQTCZZPXBF69E/slug"},abstract:"pnpm とセキュアな依存管理はじめにpnpm v10 から、依存するパッケージのライフサイクルスクリプトをデフォルトで実行しないようになる。ライフサイクルスクリプトが必要なパッケージとは昨今、swc や esbuild など異なる言語で書かれたパッケージを npm でインストールすることが一般的になってきた。\nこれらは、バイナリで提供されているため、インストールしたユーザーのアーキテクチャに合わせて用意される必要がある。https://github.com/swc-project/swc/blob/f960d52364e72fa7548cc8aaaf6367dfdf7b9a8f/packages/core/postinstall.jsこのコードは。swc の postinstall script で、インストール時に実行される。\n内容は、適切なアーキテクチャのバイナリを検証し、無い場合は",mdast:$R[20462]={children:$R[20463]=[$R[20464]={children:$R[20465]=[$R[20466]={children:$R[20467]=[$R[20468]={position:$R[20469]={start:$R[20470]={line:3,column:4,offset:22},end:$R[20471]={line:3,column:8,offset:26}},type:"text",value:"はじめに"}],id:"はじめに",level:2,plain:"はじめに",position:$R[20472]={start:$R[20473]={line:3,column:1,offset:19},end:$R[20474]={line:3,column:8,offset:26}},type:"heading"},$R[20475]={children:$R[20476]=[$R[20477]={position:$R[20478]={start:$R[20479]={line:5,column:1,offset:28},end:$R[20480]={line:5,column:53,offset:80}},type:"text",value:"pnpm v10 から、依存するパッケージのライフサイクルスクリプトをデフォルトで実行しないようになる。"}],position:$R[20481]={start:$R[20482]={line:5,column:1,offset:28},end:$R[20483]={line:5,column:53,offset:80}},type:"paragraph"}],position:$R[20484]={end:$R[20485]={line:5,column:53,offset:80},start:$R[20486]={line:3,column:1,offset:19}},type:"section"},$R[20487]={children:$R[20488]=[$R[20489]={children:$R[20490]=[$R[20491]={position:$R[20492]={start:$R[20493]={line:7,column:4,offset:85},end:$R[20494]={line:7,column:27,offset:108}},type:"text",value:"ライフサイクルスクリプトが必要なパッケージとは"}],id:"ライフサイクルスクリプトが必要なパッケージとは",level:2,plain:"ライフサイクルスクリプトが必要なパッケージとは",position:$R[20495]={start:$R[20496]={line:7,column:1,offset:82},end:$R[20497]={line:7,column:27,offset:108}},type:"heading"},$R[20498]={children:$R[20499]=[$R[20500]={position:$R[20501]={start:$R[20502]={line:9,column:1,offset:110},end:$R[20503]={line:10,column:57,offset:229}},type:"text",value:"昨今、swc や esbuild など異なる言語で書かれたパッケージを npm でインストールすることが一般的になってきた。\nこれらは、バイナリで提供されているため、インストールしたユーザーのアーキテクチャに合わせて用意される必要がある。"}],position:$R[20504]={start:$R[20505]={line:9,column:1,offset:110},end:$R[20506]={line:10,column:57,offset:229}},type:"paragraph"},$R[20507]={meta:$R[20508]={title:"swc/packages/core/postinstall.js at f960d52364e72fa7548cc8aaaf6367dfdf7b9a8f · swc-project/swc · GitHub",description:"Rust-based platform for the Web. Contribute to swc-project/swc development by creating an account on GitHub.",twitter_card:$R[20509]={images:$R[20510]=[$R[20511]={url:"https://opengraph.githubassets.com/d6a2b4e4af45549d9f98307ea699c5db701a2df81114a86725adeb5ed0e52578/swc-project/swc"}],site:"@github",card:"summary_large_image",title:"swc/packages/core/postinstall.js at f960d52364e72fa7548cc8aaaf6367dfdf7b9a8f · swc-project/swc",description:"Rust-based platform for the Web. Contribute to swc-project/swc development by creating an account on GitHub."},open_graph:$R[20512]={images:$R[20513]=[$R[20514]={url:"https://opengraph.githubassets.com/d6a2b4e4af45549d9f98307ea699c5db701a2df81114a86725adeb5ed0e52578/swc-project/swc",alt:"Rust-based platform for the Web. Contribute to swc-project/swc development by creating an account on GitHub.",width:1200,height:600}],site_name:"GitHub",type:"object",title:"swc/packages/core/postinstall.js at f960d52364e72fa7548cc8aaaf6367dfdf7b9a8f · swc-project/swc",url:"https://github.com/swc-project/swc/blob/f960d52364e72fa7548cc8aaaf6367dfdf7b9a8f/packages/core/postinstall.js",description:"Rust-based platform for the Web. Contribute to swc-project/swc development by creating an account on GitHub."},theme_color:"#1e2327",favicon:"https://github.githubassets.com/favicons/favicon.svg"},oembed:void 0,position:$R[20515]={start:$R[20516]={line:12,column:1,offset:231},end:$R[20517]={line:12,column:110,offset:340}},src:"https://github.com/swc-project/swc/blob/f960d52364e72fa7548cc8aaaf6367dfdf7b9a8f/packages/core/postinstall.js",type:"embed"},$R[20518]={children:$R[20519]=[$R[20520]={position:$R[20521]={start:$R[20522]={line:14,column:1,offset:342},end:$R[20523]={line:15,column:31,offset:421}},type:"text",value:"このコードは。swc の postinstall script で、インストール時に実行される。\n内容は、適切なアーキテクチャのバイナリを検証し、無い場合は "},$R[20524]={position:$R[20525]={start:$R[20526]={line:15,column:31,offset:421},end:$R[20527]={line:15,column:42,offset:432}},type:"inlineCode",value:"@swc/wasm"},$R[20528]={position:$R[20529]={start:$R[20530]={line:15,column:42,offset:432},end:$R[20531]={line:15,column:59,offset:449}},type:"text",value:" を取得してくるというものである。"}],position:$R[20532]={start:$R[20533]={line:14,column:1,offset:342},end:$R[20534]={line:15,column:59,offset:449}},type:"paragraph"}],position:$R[20535]={end:$R[20536]={line:15,column:59,offset:449},start:$R[20537]={line:7,column:1,offset:82}},type:"section"},$R[20538]={children:$R[20539]=[$R[20540]={children:$R[20541]=[$R[20542]={position:$R[20543]={start:$R[20544]={line:17,column:4,offset:454},end:$R[20545]={line:17,column:28,offset:478}},type:"text",value:"ライフサイクルスクリプトが必要なパッケージの課題"}],id:"ライフサイクルスクリプトが必要なパッケージの課題",level:2,plain:"ライフサイクルスクリプトが必要なパッケージの課題",position:$R[20546]={start:$R[20547]={line:17,column:1,offset:451},end:$R[20548]={line:17,column:28,offset:478}},type:"heading"},$R[20549]={children:$R[20550]=[$R[20551]={position:$R[20552]={start:$R[20553]={line:19,column:1,offset:480},end:$R[20554]={line:19,column:35,offset:514}},type:"text",value:"npm レジストリのパッケージは度々サプライチェーンの標的にされる。"},$R[20555]={footnoteIndex:0,position:$R[20556]={start:$R[20557]={line:19,column:35,offset:514},end:$R[20558]={line:19,column:39,offset:518}},referenceIndex:1,type:"footnoteReference"},$R[20559]={footnoteIndex:1,position:$R[20560]={start:$R[20561]={line:19,column:39,offset:518},end:$R[20562]={line:19,column:43,offset:522}},referenceIndex:1,type:"footnoteReference"}],position:$R[20563]={start:$R[20564]={line:19,column:1,offset:480},end:$R[20565]={line:19,column:43,offset:522}},type:"paragraph"},$R[20566]={children:$R[20567]=[$R[20568]={position:$R[20569]={start:$R[20570]={line:25,column:1,offset:638},end:$R[20571]={line:26,column:9,offset:736}},type:"text",value:"ここで読者の皆さんに質問したい。あなたはある npm パッケージをインストールするときに、そのパッケージがどのようなライフサイクルスクリプトを持っているかを確認しているだろうか?\n私はしていない。"}],position:$R[20572]={start:$R[20573]={line:25,column:1,offset:638},end:$R[20574]={line:26,column:9,offset:736}},type:"paragraph"},$R[20575]={children:$R[20576]=[$R[20577]={position:$R[20578]={start:$R[20579]={line:28,column:1,offset:738},end:$R[20580]={line:29,column:83,offset:866}},type:"text",value:"前述した通り、ライフサイクルスクリプトを必要とする npm パッケージは必要な理由がある。\nきっと読者含め多くの人が、その理由を理解しているからこそ必要とされるパッケージに、ライフサイクルスクリプトがあってもおかしくないな、という気持ちを持っているだろう。"}],position:$R[20581]={start:$R[20582]={line:28,column:1,offset:738},end:$R[20583]={line:29,column:83,offset:866}},type:"paragraph"},$R[20584]={children:$R[20585]=[$R[20586]={position:$R[20587]={start:$R[20588]={line:31,column:1,offset:868},end:$R[20589]={line:32,column:45,offset:943}},type:"text",value:"しかし、やべーハカーは、ライフサイクルスクリプトを悪用する。\n直近にも、npm パッケージのライフサイクルスクリプトを悪用した脆弱性が報告されている。"},$R[20590]={footnoteIndex:2,position:$R[20591]={start:$R[20592]={line:32,column:45,offset:943},end:$R[20593]={line:32,column:49,offset:947}},referenceIndex:1,type:"footnoteReference"}],position:$R[20594]={start:$R[20595]={line:31,column:1,offset:868},end:$R[20596]={line:32,column:49,offset:947}},type:"paragraph"},$R[20597]={children:$R[20598]=[$R[20599]={position:$R[20600]={start:$R[20601]={line:36,column:1,offset:1008},end:$R[20602]={line:37,column:43,offset:1094}},type:"text",value:"これは余談だが、rspack はどうやらライフサイクルスクリプトを必要としないらしい。\n対応していないアーキテクチャで rspack を使おうとすると例外が投げられて死ぬ。"}],position:$R[20603]={start:$R[20604]={line:36,column:1,offset:1008},end:$R[20605]={line:37,column:43,offset:1094}},type:"paragraph"},$R[20606]={meta:$R[20607]={title:"rspack/crates/node_binding/binding.js at cc5e3f6a49073b354c08ec4b8c75142e602d02ee · web-infra-dev/rspack · GitHub",description:"The fast Rust-based web bundler with webpack-compatible API 🦀️ - rspack/crates/node_binding/binding.js at cc5e3f6a49073b354c08ec4b8c75142e602d02ee · web-infra-dev/rspack",twitter_card:$R[20608]={images:$R[20609]=[$R[20610]={url:"https://repository-images.githubusercontent.com/476642602/6ffe069d-8b22-4d89-b3ad-574f9f658d7c"}],site:"@github",card:"summary_large_image",title:"rspack/crates/node_binding/binding.js at cc5e3f6a49073b354c08ec4b8c75142e602d02ee · web-infra-dev/rspack",description:"The fast Rust-based web bundler with webpack-compatible API 🦀️ - web-infra-dev/rspack"},open_graph:$R[20611]={images:$R[20612]=[$R[20613]={url:"https://repository-images.githubusercontent.com/476642602/6ffe069d-8b22-4d89-b3ad-574f9f658d7c",alt:"The fast Rust-based web bundler with webpack-compatible API 🦀️ - web-infra-dev/rspack"}],site_name:"GitHub",type:"object",title:"rspack/crates/node_binding/binding.js at cc5e3f6a49073b354c08ec4b8c75142e602d02ee · web-infra-dev/rspack",url:"https://github.com/web-infra-dev/rspack/blob/cc5e3f6a49073b354c08ec4b8c75142e602d02ee/crates/node_binding/binding.js",description:"The fast Rust-based web bundler with webpack-compatible API 🦀️ - web-infra-dev/rspack"},theme_color:"#1e2327",favicon:"https://github.githubassets.com/favicons/favicon.svg"},oembed:void 0,position:$R[20614]={start:$R[20615]={line:39,column:1,offset:1096},end:$R[20616]={line:39,column:117,offset:1212}},src:"https://github.com/web-infra-dev/rspack/blob/cc5e3f6a49073b354c08ec4b8c75142e602d02ee/crates/node_binding/binding.js",type:"embed"}],position:$R[20617]={end:$R[20618]={line:39,column:117,offset:1212},start:$R[20619]={line:17,column:1,offset:451}},type:"section"},$R[20620]={children:$R[20621]=[$R[20622]={children:$R[20623]=[$R[20624]={position:$R[20625]={start:$R[20626]={line:41,column:4,offset:1217},end:$R[20627]={line:41,column:18,offset:1231}},type:"text",value:"pnpm v10 での変更点"}],id:"pnpm-v10-での変更点",level:2,plain:"pnpm v10 での変更点",position:$R[20628]={start:$R[20629]={line:41,column:1,offset:1214},end:$R[20630]={line:41,column:18,offset:1231}},type:"heading"},$R[20631]={meta:$R[20632]={title:"Release pnpm 10 · pnpm/pnpm · GitHub",description:"Fast, disk space efficient package manager. Contribute to pnpm/pnpm development by creating an account on GitHub.",twitter_card:$R[20633]={images:$R[20634]=[$R[20635]={url:"https://opengraph.githubassets.com/af91ee8c45a905773cd64e3e8dd41b6248e4d7f737c4407cae96f99737f24c0d/pnpm/pnpm/releases/tag/v10.0.0"}],site:"@github",card:"summary_large_image",title:"Release pnpm 10 · pnpm/pnpm",description:"Major Changes\n\n\nLifecycle scripts of dependencies are not executed during installation by default! This is a breaking change aimed at increasing security. In order to allow lifecycle scripts of spe..."},open_graph:$R[20636]={images:$R[20637]=[$R[20638]={url:"https://opengraph.githubassets.com/af91ee8c45a905773cd64e3e8dd41b6248e4d7f737c4407cae96f99737f24c0d/pnpm/pnpm/releases/tag/v10.0.0",alt:"Major Changes\n\n\nLifecycle scripts of dependencies are not executed during installation by default! This is a breaking change aimed at increasing security. In order to allow lifecycle scripts of spe...",width:1200,height:600}],site_name:"GitHub",type:"object",title:"Release pnpm 10 · pnpm/pnpm",url:"https://github.com/pnpm/pnpm/releases/tag/v10.0.0",description:"Major Changes\n\n\nLifecycle scripts of dependencies are not executed during installation by default! This is a breaking change aimed at increasing security. In order to allow lifecycle scripts of spe..."},theme_color:"#1e2327",favicon:"https://github.githubassets.com/favicons/favicon.svg"},oembed:void 0,position:$R[20639]={start:$R[20640]={line:43,column:1,offset:1233},end:$R[20641]={line:43,column:50,offset:1282}},src:"https://github.com/pnpm/pnpm/releases/tag/v10.0.0",type:"embed"},$R[20642]={children:$R[20643]=[$R[20644]={position:$R[20645]={start:$R[20646]={line:45,column:1,offset:1284},end:$R[20647]={line:45,column:40,offset:1323}},type:"text",value:"pnpm v10 では Node.js から corepack が分離する決定"},$R[20648]={footnoteIndex:3,position:$R[20649]={start:$R[20650]={line:45,column:40,offset:1323},end:$R[20651]={line:45,column:44,offset:1327}},referenceIndex:1,type:"footnoteReference"},$R[20652]={position:$R[20653]={start:$R[20654]={line:45,column:44,offset:1327},end:$R[20655]={line:45,column:48,offset:1331}},type:"text",value:"に伴い、"},$R[20656]={position:$R[20657]={start:$R[20658]={line:45,column:48,offset:1331},end:$R[20659]={line:45,column:77,offset:1360}},type:"inlineCode",value:"package.json#packageManager"},$R[20660]={position:$R[20661]={start:$R[20662]={line:45,column:77,offset:1360},end:$R[20663]={line:45,column:135,offset:1418}},type:"text",value:" を見て pnpm が指定されているプロジェクトでは、そのプロジェクトの pnpm を使う挙動がデフォルトとなった。"}],position:$R[20664]={start:$R[20665]={line:45,column:1,offset:1284},end:$R[20666]={line:45,column:135,offset:1418}},type:"paragraph"},$R[20667]={children:$R[20668]=[$R[20669]={position:$R[20670]={start:$R[20671]={line:49,column:1,offset:1566},end:$R[20672]={line:49,column:7,offset:1572}},type:"text",value:"詳しい話は "},$R[20673]={children:$R[20674]=[$R[20675]={position:$R[20676]={start:$R[20677]={line:49,column:8,offset:1573},end:$R[20678]={line:49,column:14,offset:1579}},type:"text",value:"euxn23"}],position:$R[20679]={start:$R[20680]={line:49,column:7,offset:1572},end:$R[20681]={line:49,column:37,offset:1602}},title:void 0,type:"link",url:"https://x.com/euxn23"},$R[20682]={position:$R[20683]={start:$R[20684]={line:49,column:37,offset:1602},end:$R[20685]={line:49,column:61,offset:1626}},type:"text",value:" さんの記事を読んでほしい。めちゃ分かりやすい。"}],position:$R[20686]={start:$R[20687]={line:49,column:1,offset:1566},end:$R[20688]={line:49,column:61,offset:1626}},type:"paragraph"},$R[20689]={meta:$R[20690]={title:"pnpm v10 で corepack 不要で pnpm 自身のバージョン管理が可能に",twitter_card:$R[20691]={card:"summary_large_image"},open_graph:$R[20692]={url:"https://zenn.dev/euxn23/articles/399a6815ddac93",title:"pnpm v10 で corepack 不要で pnpm 自身のバージョン管理が可能に",images:$R[20693]=[$R[20694]={url:"https://res.cloudinary.com/zenn/image/upload/s--_iBIIjSl--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:pnpm%2520v10%2520%25E3%2581%25A7%2520corepack%2520%25E4%25B8%258D%25E8%25A6%2581%25E3%2581%25A7%2520pnpm%2520%25E8%2587%25AA%25E8%25BA%25AB%25E3%2581%25AE%25E3%2583%2590%25E3%2583%25BC%25E3%2582%25B8%25E3%2583%25A7%25E3%2583%25B3%25E7%25AE%25A1%25E7%2590%2586%25E3%2581%258C%25E5%258F%25AF%25E8%2583%25BD%25E3%2581%25AB%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:%25E3%2583%25A6%25E3%2583%25BC%25E3%2583%25B3%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL2EtL0FPaDE0R2o0cUtwdExNU0hJbGJoaFVxd2FsSmloNWp4Q1RqSFdZM1M4OHNrPXM5Ni1j%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png"}],type:"article",site_name:"Zenn"},favicon:"https://static.zenn.studio/images/logo-transparent.png",canonical_url:"https://zenn.dev/euxn23/articles/399a6815ddac93"},oembed:void 0,position:$R[20695]={start:$R[20696]={line:51,column:1,offset:1628},end:$R[20697]={line:51,column:48,offset:1675}},src:"https://zenn.dev/euxn23/articles/399a6815ddac93",type:"embed"},$R[20698]={children:$R[20699]=[$R[20700]={position:$R[20701]={start:$R[20702]={line:53,column:1,offset:1677},end:$R[20703]={line:53,column:21,offset:1697}},type:"text",value:"他にも store バージョンの更新や、"},$R[20704]={position:$R[20705]={start:$R[20706]={line:53,column:21,offset:1697},end:$R[20707]={line:53,column:32,offset:1708}},type:"inlineCode",value:"pnpm link"},$R[20708]={position:$R[20709]={start:$R[20710]={line:53,column:32,offset:1708},end:$R[20711]={line:53,column:83,offset:1759}},type:"text",value:" の挙動変更など、多くの変更があるが、本記事ではライフサイクルスクリプトの実行周りについてのみ触れる。"}],position:$R[20712]={start:$R[20713]={line:53,column:1,offset:1677},end:$R[20714]={line:53,column:83,offset:1759}},type:"paragraph"},$R[20715]={children:$R[20716]=[$R[20717]={children:$R[20718]=[$R[20719]={position:$R[20720]={start:$R[20721]={line:55,column:5,offset:1765},end:$R[20722]={line:55,column:26,offset:1786}},type:"text",value:"onlyBuiltDependencies"}],id:"onlybuiltdependencies",level:3,plain:"onlyBuiltDependencies",position:$R[20723]={start:$R[20724]={line:55,column:1,offset:1761},end:$R[20725]={line:55,column:26,offset:1786}},type:"heading"},$R[20726]={meta:$R[20727]={title:"feat!: use an allow list of built dependencies by default by zkochan · Pull Request #8897 · pnpm/pnpm · GitHub",description:"By default no dependency is allowed to run lifecycle scripts during installation.",twitter_card:$R[20728]={images:$R[20729]=[$R[20730]={url:"https://opengraph.githubassets.com/fa82368e8fd566e77ec196d567a52639eff7315369cbe3ebe34482e887146722/pnpm/pnpm/pull/8897"}],site:"@github",card:"summary_large_image",title:"feat!: use an allow list of built dependencies by default by zkochan · Pull Request #8897 · pnpm/pnpm",description:"By default no dependency is allowed to run lifecycle scripts during installation."},open_graph:$R[20731]={images:$R[20732]=[$R[20733]={url:"https://opengraph.githubassets.com/fa82368e8fd566e77ec196d567a52639eff7315369cbe3ebe34482e887146722/pnpm/pnpm/pull/8897",alt:"By default no dependency is allowed to run lifecycle scripts during installation.",width:1200,height:600}],site_name:"GitHub",type:"object",title:"feat!: use an allow list of built dependencies by default by zkochan · Pull Request #8897 · pnpm/pnpm",url:"https://github.com/pnpm/pnpm/pull/8897",description:"By default no dependency is allowed to run lifecycle scripts during installation."},theme_color:"#1e2327",favicon:"https://github.githubassets.com/favicons/favicon.svg"},oembed:void 0,position:$R[20734]={start:$R[20735]={line:57,column:1,offset:1788},end:$R[20736]={line:57,column:39,offset:1826}},src:"https://github.com/pnpm/pnpm/pull/8897",type:"embed"},$R[20737]={children:$R[20738]=[$R[20739]={position:$R[20740]={start:$R[20741]={line:59,column:1,offset:1828},end:$R[20742]={line:59,column:82,offset:1909}},type:"text",value:"直近に起こった rspack の脆弱性を受けて、pnpm team は改めて Twitter でライフサイクルスクリプトの実行についてユーザーアンケートを募った。"},$R[20743]={footnoteIndex:4,position:$R[20744]={start:$R[20745]={line:59,column:82,offset:1909},end:$R[20746]={line:59,column:86,offset:1913}},referenceIndex:1,type:"footnoteReference"}],position:$R[20747]={start:$R[20748]={line:59,column:1,offset:1828},end:$R[20749]={line:59,column:86,offset:1913}},type:"paragraph"},$R[20750]={children:$R[20751]=[$R[20752]={position:$R[20753]={start:$R[20754]={line:63,column:1,offset:1970},end:$R[20755]={line:63,column:47,offset:2016}},type:"text",value:"その結果、ライフサイクルスクリプトの実行をデフォルトで無効化することが決定され、実装された。"}],position:$R[20756]={start:$R[20757]={line:63,column:1,offset:1970},end:$R[20758]={line:63,column:47,offset:2016}},type:"paragraph"},$R[20759]={children:$R[20760]=[$R[20761]={children:$R[20762]=[$R[20763]={position:$R[20764]={start:$R[20765]={line:65,column:2,offset:2019},end:$R[20766]={line:65,column:9,offset:2026}},type:"text",value:"リリースノート"}],position:$R[20767]={start:$R[20768]={line:65,column:1,offset:2018},end:$R[20769]={line:65,column:61,offset:2078}},title:void 0,type:"link",url:"https://github.com/pnpm/pnpm/releases/tag/v10.0.0"},$R[20770]={position:$R[20771]={start:$R[20772]={line:65,column:61,offset:2078},end:$R[20773]={line:65,column:135,offset:2152}},type:"text",value:" にも記載されている通り、特定の依存関係のライフサイクルスクリプトを許可するには、package.json に以下のように追記することで可能となる。"}],position:$R[20774]={start:$R[20775]={line:65,column:1,offset:2018},end:$R[20776]={line:65,column:135,offset:2152}},type:"paragraph"},$R[20777]={filename:"package.json json",lang:"json",position:$R[20778]={start:$R[20779]={line:67,column:1,offset:2154},end:$R[20780]={line:73,column:4,offset:2236}},type:"code",value:"{\n\t\"pnpm\": {\n\t\t\"onlyBuiltDependencies\": [\"fsevents\"]\n\t}\n}",hast:$R[20781]={type:"root",children:$R[20782]=[$R[20783]={type:"element",tagName:"pre",properties:$R[20784]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[20785]=[$R[20786]={type:"element",tagName:"code",properties:$R[20787]={},children:$R[20788]=[$R[20789]={type:"element",tagName:"span",properties:$R[20790]={class:"line"},children:$R[20791]=[$R[20792]={type:"element",tagName:"span",properties:$R[20793]={style:"color:#666666"},children:$R[20794]=[$R[20795]={type:"text",value:"{"}]}]},$R[20796]={type:"text",value:"\n"},$R[20797]={type:"element",tagName:"span",properties:$R[20798]={class:"line"},children:$R[20799]=[$R[20800]={type:"element",tagName:"span",properties:$R[20801]={style:"color:#B8A96577"},children:$R[20802]=[$R[20803]={type:"text",value:"\t\""}]},$R[20804]={type:"element",tagName:"span",properties:$R[20805]={style:"color:#B8A965"},children:$R[20806]=[$R[20807]={type:"text",value:"pnpm"}]},$R[20808]={type:"element",tagName:"span",properties:$R[20809]={style:"color:#B8A96577"},children:$R[20810]=[$R[20811]={type:"text",value:"\""}]},$R[20812]={type:"element",tagName:"span",properties:$R[20813]={style:"color:#666666"},children:$R[20814]=[$R[20815]={type:"text",value:":"}]},$R[20816]={type:"element",tagName:"span",properties:$R[20817]={style:"color:#666666"},children:$R[20818]=[$R[20819]={type:"text",value:" {"}]}]},$R[20820]={type:"text",value:"\n"},$R[20821]={type:"element",tagName:"span",properties:$R[20822]={class:"line"},children:$R[20823]=[$R[20824]={type:"element",tagName:"span",properties:$R[20825]={style:"color:#B8A96577"},children:$R[20826]=[$R[20827]={type:"text",value:"\t\t\""}]},$R[20828]={type:"element",tagName:"span",properties:$R[20829]={style:"color:#B8A965"},children:$R[20830]=[$R[20831]={type:"text",value:"onlyBuiltDependencies"}]},$R[20832]={type:"element",tagName:"span",properties:$R[20833]={style:"color:#B8A96577"},children:$R[20834]=[$R[20835]={type:"text",value:"\""}]},$R[20836]={type:"element",tagName:"span",properties:$R[20837]={style:"color:#666666"},children:$R[20838]=[$R[20839]={type:"text",value:":"}]},$R[20840]={type:"element",tagName:"span",properties:$R[20841]={style:"color:#666666"},children:$R[20842]=[$R[20843]={type:"text",value:" ["}]},$R[20844]={type:"element",tagName:"span",properties:$R[20845]={style:"color:#C98A7D77"},children:$R[20846]=[$R[20847]={type:"text",value:"\""}]},$R[20848]={type:"element",tagName:"span",properties:$R[20849]={style:"color:#C98A7D"},children:$R[20850]=[$R[20851]={type:"text",value:"fsevents"}]},$R[20852]={type:"element",tagName:"span",properties:$R[20853]={style:"color:#C98A7D77"},children:$R[20854]=[$R[20855]={type:"text",value:"\""}]},$R[20856]={type:"element",tagName:"span",properties:$R[20857]={style:"color:#666666"},children:$R[20858]=[$R[20859]={type:"text",value:"]"}]}]},$R[20860]={type:"text",value:"\n"},$R[20861]={type:"element",tagName:"span",properties:$R[20862]={class:"line"},children:$R[20863]=[$R[20864]={type:"element",tagName:"span",properties:$R[20865]={style:"color:#666666"},children:$R[20866]=[$R[20867]={type:"text",value:"\t}"}]}]},$R[20868]={type:"text",value:"\n"},$R[20869]={type:"element",tagName:"span",properties:$R[20870]={class:"line"},children:$R[20871]=[$R[20872]={type:"element",tagName:"span",properties:$R[20873]={style:"color:#666666"},children:$R[20874]=[$R[20875]={type:"text",value:"}"}]}]}]}]}]}},$R[20876]={children:$R[20877]=[$R[20878]={position:$R[20879]={start:$R[20880]={line:75,column:1,offset:2238},end:$R[20881]={line:75,column:7,offset:2244}},type:"text",value:"この例では、"},$R[20882]={position:$R[20883]={start:$R[20884]={line:75,column:7,offset:2244},end:$R[20885]={line:75,column:17,offset:2254}},type:"inlineCode",value:"fsevents"},$R[20886]={position:$R[20887]={start:$R[20888]={line:75,column:17,offset:2254},end:$R[20889]={line:75,column:52,offset:2289}},type:"text",value:" というパッケージのライフサイクルスクリプトのみを許可する設定となる。"}],position:$R[20890]={start:$R[20891]={line:75,column:1,offset:2238},end:$R[20892]={line:75,column:52,offset:2289}},type:"paragraph"}],position:$R[20893]={end:$R[20894]={line:75,column:52,offset:2289},start:$R[20895]={line:55,column:1,offset:1761}},type:"section"},$R[20896]={children:$R[20897]=[$R[20898]={children:$R[20899]=[$R[20900]={position:$R[20901]={start:$R[20902]={line:77,column:5,offset:2295},end:$R[20903]={line:77,column:19,offset:2309}},type:"text",value:"bun のアプローチとの違い"}],id:"bun-のアプローチとの違い",level:3,plain:"bun のアプローチとの違い",position:$R[20904]={start:$R[20905]={line:77,column:1,offset:2291},end:$R[20906]={line:77,column:19,offset:2309}},type:"heading"},$R[20907]={children:$R[20908]=[$R[20909]={position:$R[20910]={start:$R[20911]={line:79,column:1,offset:2311},end:$R[20912]={line:79,column:37,offset:2347}},type:"text",value:"実装の PR では bun のアプローチとの違いについて議論されている。"}],position:$R[20913]={start:$R[20914]={line:79,column:1,offset:2311},end:$R[20915]={line:79,column:37,offset:2347}},type:"paragraph"},$R[20916]={children:$R[20917]=[$R[20918]={position:$R[20919]={start:$R[20920]={line:81,column:1,offset:2349},end:$R[20921]={line:81,column:94,offset:2442}},type:"text",value:"bun も pnpm と同様にライフサイクルスクリプトの実行をデフォルトで無効化しているが、bun はデフォルトでライフサイクルスクリプトの実行を許可するパッケージのリストを持っている。"}],position:$R[20922]={start:$R[20923]={line:81,column:1,offset:2349},end:$R[20924]={line:81,column:94,offset:2442}},type:"paragraph"},$R[20925]={meta:$R[20926]={title:"bun/src/install/default-trusted-dependencies.txt at 8c75c777c2ffa418b18f313fcde23df4c147e964 · oven-sh/bun · GitHub",description:"Incredibly fast JavaScript runtime, bundler, test runner, and package manager – all in one - bun/src/install/default-trusted-dependencies.txt at 8c75c777c2ffa418b18f313fcde23df4c147e964 · oven-sh/bun",twitter_card:$R[20927]={images:$R[20928]=[$R[20929]={url:"https://opengraph.githubassets.com/e9496d536e17c5e6a5e82a50cff920008d7a8ae12c740e84a6521ab7c35568b7/oven-sh/bun"}],site:"@github",card:"summary_large_image",title:"bun/src/install/default-trusted-dependencies.txt at 8c75c777c2ffa418b18f313fcde23df4c147e964 · oven-sh/bun",description:"Incredibly fast JavaScript runtime, bundler, test runner, and package manager – all in one - oven-sh/bun"},open_graph:$R[20930]={images:$R[20931]=[$R[20932]={url:"https://opengraph.githubassets.com/e9496d536e17c5e6a5e82a50cff920008d7a8ae12c740e84a6521ab7c35568b7/oven-sh/bun",alt:"Incredibly fast JavaScript runtime, bundler, test runner, and package manager – all in one - oven-sh/bun",width:1200,height:600}],site_name:"GitHub",type:"object",title:"bun/src/install/default-trusted-dependencies.txt at 8c75c777c2ffa418b18f313fcde23df4c147e964 · oven-sh/bun",url:"https://github.com/oven-sh/bun/blob/8c75c777c2ffa418b18f313fcde23df4c147e964/src/install/default-trusted-dependencies.txt",description:"Incredibly fast JavaScript runtime, bundler, test runner, and package manager – all in one - oven-sh/bun"},theme_color:"#1e2327",favicon:"https://github.githubassets.com/favicons/favicon.svg"},oembed:void 0,position:$R[20933]={start:$R[20934]={line:83,column:1,offset:2444},end:$R[20935]={line:83,column:122,offset:2565}},src:"https://github.com/oven-sh/bun/blob/8c75c777c2ffa418b18f313fcde23df4c147e964/src/install/default-trusted-dependencies.txt",type:"embed"},$R[20936]={children:$R[20937]=[$R[20938]={position:$R[20939]={start:$R[20940]={line:85,column:1,offset:2567},end:$R[20941]={line:85,column:78,offset:2644}},type:"text",value:"実装の PR では bun のようにデフォルトで許可するパッケージのリストを持つことを求める声もあったが、pnpm はそのようなアプローチを取らなかった。"}],position:$R[20942]={start:$R[20943]={line:85,column:1,offset:2567},end:$R[20944]={line:85,column:78,offset:2644}},type:"paragraph"},$R[20945]={children:$R[20946]=[$R[20947]={position:$R[20948]={start:$R[20949]={line:87,column:1,offset:2646},end:$R[20950]={line:87,column:90,offset:2735}},type:"text",value:"pnpm team はリストのメンテナンスが大変であることや冗長であることなどから、ユーザーが明示的に許可するパッケージを指定することで、より安全な環境を提供することを目指した。"}],position:$R[20951]={start:$R[20952]={line:87,column:1,offset:2646},end:$R[20953]={line:87,column:90,offset:2735}},type:"paragraph"}],position:$R[20954]={end:$R[20955]={line:87,column:90,offset:2735},start:$R[20956]={line:77,column:1,offset:2291}},type:"section"}],position:$R[20957]={end:$R[20958]={line:87,column:90,offset:2735},start:$R[20959]={line:41,column:1,offset:1214}},type:"section"},$R[20960]={children:$R[20961]=[$R[20962]={children:$R[20963]=[$R[20964]={position:$R[20965]={start:$R[20966]={line:89,column:4,offset:2740},end:$R[20967]={line:89,column:21,offset:2757}},type:"text",value:"pnpm v10.1 と体験の向上"}],id:"pnpm-v101-と体験の向上",level:2,plain:"pnpm v10.1 と体験の向上",position:$R[20968]={start:$R[20969]={line:89,column:1,offset:2737},end:$R[20970]={line:89,column:21,offset:2757}},type:"heading"},$R[20971]={children:$R[20972]=[$R[20973]={position:$R[20974]={start:$R[20975]={line:91,column:1,offset:2759},end:$R[20976]={line:91,column:69,offset:2827}},type:"text",value:"pnpm v10 で依存のライフサイクルスクリプトの実行は制限されたが、onlyBuiltDependencies に設定している配列を"},$R[20977]={children:$R[20978]=[$R[20979]={position:$R[20980]={start:$R[20981]={line:91,column:71,offset:2829},end:$R[20982]={line:91,column:75,offset:2833}},type:"text",value:"良い感じ"}],position:$R[20983]={start:$R[20984]={line:91,column:69,offset:2827},end:$R[20985]={line:91,column:77,offset:2835}},type:"strong"},$R[20986]={position:$R[20987]={start:$R[20988]={line:91,column:77,offset:2835},end:$R[20989]={line:91,column:89,offset:2847}},type:"text",value:"に管理することは難しい。"}],position:$R[20990]={start:$R[20991]={line:91,column:1,offset:2759},end:$R[20992]={line:91,column:89,offset:2847}},type:"paragraph"},$R[20993]={children:$R[20994]=[$R[20995]={position:$R[20996]={start:$R[20997]={line:93,column:1,offset:2849},end:$R[20998]={line:93,column:22,offset:2870}},type:"text",value:"そこで pnpm v10.1 では新たに "},$R[20999]={position:$R[21000]={start:$R[21001]={line:93,column:22,offset:2870},end:$R[21002]={line:93,column:43,offset:2891}},type:"inlineCode",value:"pnpm ignored-builds"},$R[21003]={position:$R[21004]={start:$R[21005]={line:93,column:43,offset:2891},end:$R[21006]={line:93,column:46,offset:2894}},type:"text",value:" と "},$R[21007]={position:$R[21008]={start:$R[21009]={line:93,column:46,offset:2894},end:$R[21010]={line:93,column:67,offset:2915}},type:"inlineCode",value:"pnpm approve-builds"},$R[21011]={position:$R[21012]={start:$R[21013]={line:93,column:67,offset:2915},end:$R[21014]={line:93,column:82,offset:2930}},type:"text",value:" というコマンドが追加された。"}],position:$R[21015]={start:$R[21016]={line:93,column:1,offset:2849},end:$R[21017]={line:93,column:82,offset:2930}},type:"paragraph"},$R[21018]={meta:$R[21019]={title:"feat: add ignored-builds command by zkochan · Pull Request #8963 · pnpm/pnpm · GitHub",description:"Related PR:\n\nfeat!: use an allow list of built dependencies by default #8897",twitter_card:$R[21020]={images:$R[21021]=[$R[21022]={url:"https://opengraph.githubassets.com/58f20e1f8045852cedd94d40b879ccdca8876c098cf6db642f7392f6033b219e/pnpm/pnpm/pull/8963"}],site:"@github",card:"summary_large_image",title:"feat: add ignored-builds command by zkochan · Pull Request #8963 · pnpm/pnpm",description:"Related PR:\n\nfeat!: use an allow list of built dependencies by default #8897"},open_graph:$R[21023]={images:$R[21024]=[$R[21025]={url:"https://opengraph.githubassets.com/58f20e1f8045852cedd94d40b879ccdca8876c098cf6db642f7392f6033b219e/pnpm/pnpm/pull/8963",alt:"Related PR:\n\nfeat!: use an allow list of built dependencies by default #8897",width:1200,height:600}],site_name:"GitHub",type:"object",title:"feat: add ignored-builds command by zkochan · Pull Request #8963 · pnpm/pnpm",url:"https://github.com/pnpm/pnpm/pull/8963",description:"Related PR:\n\nfeat!: use an allow list of built dependencies by default #8897"},theme_color:"#1e2327",favicon:"https://github.githubassets.com/favicons/favicon.svg"},oembed:void 0,position:$R[21026]={start:$R[21027]={line:95,column:1,offset:2932},end:$R[21028]={line:95,column:39,offset:2970}},src:"https://github.com/pnpm/pnpm/pull/8963",type:"embed"},$R[21029]={children:$R[21030]=[$R[21031]={position:$R[21032]={start:$R[21033]={line:97,column:1,offset:2972},end:$R[21034]={line:97,column:22,offset:2993}},type:"inlineCode",value:"pnpm ignored-builds"},$R[21035]={position:$R[21036]={start:$R[21037]={line:97,column:22,offset:2993},end:$R[21038]={line:98,column:1,offset:3032}},type:"text",value:" は、ライフサイクルスクリプトを持った依存関係を一覧表示するコマンドである。\n"},$R[21039]={position:$R[21040]={start:$R[21041]={line:98,column:1,offset:3032},end:$R[21042]={line:98,column:22,offset:3053}},type:"inlineCode",value:"pnpm approve-builds"},$R[21043]={position:$R[21044]={start:$R[21045]={line:98,column:22,offset:3053},end:$R[21046]={line:98,column:58,offset:3089}},type:"text",value:" は、ライフサイクルスクリプトを持った依存関係を許可するコマンドである。"}],position:$R[21047]={start:$R[21048]={line:97,column:1,offset:2972},end:$R[21049]={line:98,column:58,offset:3089}},type:"paragraph"},$R[21050]={children:$R[21051]=[$R[21052]={position:$R[21053]={start:$R[21054]={line:100,column:1,offset:3091},end:$R[21055]={line:101,column:40,offset:3186}},type:"text",value:"これらのコマンドを使用することで、対話的にライフサイクルスクリプトを持った依存関係を管理することが可能となる。\n(読んでみた感じ追加ができるだけで削除はできないようで、ほしいなぁと思うのだ)"}],position:$R[21056]={start:$R[21057]={line:100,column:1,offset:3091},end:$R[21058]={line:101,column:40,offset:3186}},type:"paragraph"}],position:$R[21059]={end:$R[21060]={line:101,column:40,offset:3186},start:$R[21061]={line:89,column:1,offset:2737}},type:"section"},$R[21062]={children:$R[21063]=[$R[21064]={children:$R[21065]=[$R[21066]={position:$R[21067]={start:$R[21068]={line:103,column:4,offset:3191},end:$R[21069]={line:103,column:7,offset:3194}},type:"text",value:"まとめ"}],id:"まとめ",level:2,plain:"まとめ",position:$R[21070]={start:$R[21071]={line:103,column:1,offset:3188},end:$R[21072]={line:103,column:7,offset:3194}},type:"heading"},$R[21073]={children:$R[21074]=[$R[21075]={position:$R[21076]={start:$R[21077]={line:105,column:1,offset:3196},end:$R[21078]={line:105,column:54,offset:3249}},type:"text",value:"pnpm v10 から、依存するパッケージのライフサイクルスクリプトをデフォルトで実行しないようになった。"}],position:$R[21079]={start:$R[21080]={line:105,column:1,offset:3196},end:$R[21081]={line:105,column:54,offset:3249}},type:"paragraph"},$R[21082]={children:$R[21083]=[$R[21084]={position:$R[21085]={start:$R[21086]={line:107,column:1,offset:3251},end:$R[21087]={line:108,column:57,offset:3360}},type:"text",value:"JavaScript のエコシステムは日々進化している。その中で、セキュリティに関する問題も増えている。\nすこしでもセキュリティを意識して、より安全な環境を提供するために、pnpm v10 での変更は大きな意味を持つ。"}],position:$R[21088]={start:$R[21089]={line:107,column:1,offset:3251},end:$R[21090]={line:108,column:57,offset:3360}},type:"paragraph"}],position:$R[21091]={end:$R[21092]={line:108,column:57,offset:3360},start:$R[21093]={line:103,column:1,offset:3188}},type:"section"}],footnotes:$R[21094]=[$R[21095]={children:$R[21096]=[$R[21097]={children:$R[21098]=[$R[21099]={children:$R[21100]=[$R[21101]={position:$R[21102]={start:$R[21103]={line:21,column:7,offset:530},end:$R[21104]={line:21,column:56,offset:579}},type:"text",value:"https://github.com/advisories/GHSA-5rqg-jm4f-cqx7"}],position:$R[21105]={start:$R[21106]={line:21,column:7,offset:530},end:$R[21107]={line:21,column:56,offset:579}},title:void 0,type:"link",url:"https://github.com/advisories/GHSA-5rqg-jm4f-cqx7"}],position:$R[21108]={start:$R[21109]={line:21,column:7,offset:530},end:$R[21110]={line:21,column:56,offset:579}},type:"paragraph"}],count:1,index:0,position:$R[21111]={start:$R[21112]={line:21,column:1,offset:524},end:$R[21113]={line:21,column:56,offset:579}},type:"footnoteDefinition"},$R[21114]={children:$R[21115]=[$R[21116]={children:$R[21117]=[$R[21118]={children:$R[21119]=[$R[21120]={position:$R[21121]={start:$R[21122]={line:23,column:7,offset:587},end:$R[21123]={line:23,column:56,offset:636}},type:"text",value:"https://github.com/advisories/GHSA-pjwm-rvh2-c87w"}],position:$R[21124]={start:$R[21125]={line:23,column:7,offset:587},end:$R[21126]={line:23,column:56,offset:636}},title:void 0,type:"link",url:"https://github.com/advisories/GHSA-pjwm-rvh2-c87w"}],position:$R[21127]={start:$R[21128]={line:23,column:7,offset:587},end:$R[21129]={line:23,column:56,offset:636}},type:"paragraph"}],count:1,index:1,position:$R[21130]={start:$R[21131]={line:23,column:1,offset:581},end:$R[21132]={line:23,column:56,offset:636}},type:"footnoteDefinition"},$R[21133]={children:$R[21134]=[$R[21135]={children:$R[21136]=[$R[21137]={children:$R[21138]=[$R[21139]={position:$R[21140]={start:$R[21141]={line:34,column:7,offset:955},end:$R[21142]={line:34,column:58,offset:1006}},type:"text",value:"https://github.com/web-infra-dev/rspack/issues/8767"}],position:$R[21143]={start:$R[21144]={line:34,column:7,offset:955},end:$R[21145]={line:34,column:58,offset:1006}},title:void 0,type:"link",url:"https://github.com/web-infra-dev/rspack/issues/8767"}],position:$R[21146]={start:$R[21147]={line:34,column:7,offset:955},end:$R[21148]={line:34,column:58,offset:1006}},type:"paragraph"}],count:1,index:2,position:$R[21149]={start:$R[21150]={line:34,column:1,offset:949},end:$R[21151]={line:34,column:58,offset:1006}},type:"footnoteDefinition"},$R[21152]={children:$R[21153]=[$R[21154]={children:$R[21155]=[$R[21156]={children:$R[21157]=[$R[21158]={position:$R[21159]={start:$R[21160]={line:47,column:7,offset:1426},end:$R[21161]={line:47,column:145,offset:1564}},type:"text",value:"https://github.com/nodejs/package-maintenance/blob/c3519284e9f1e2a4acc4c3586c585cf0c3b2fed9/docs/version-management/proposal-next-steps.md"}],position:$R[21162]={start:$R[21163]={line:47,column:7,offset:1426},end:$R[21164]={line:47,column:145,offset:1564}},title:void 0,type:"link",url:"https://github.com/nodejs/package-maintenance/blob/c3519284e9f1e2a4acc4c3586c585cf0c3b2fed9/docs/version-management/proposal-next-steps.md"}],position:$R[21165]={start:$R[21166]={line:47,column:7,offset:1426},end:$R[21167]={line:47,column:145,offset:1564}},type:"paragraph"}],count:1,index:3,position:$R[21168]={start:$R[21169]={line:47,column:1,offset:1420},end:$R[21170]={line:47,column:145,offset:1564}},type:"footnoteDefinition"},$R[21171]={children:$R[21172]=[$R[21173]={children:$R[21174]=[$R[21175]={children:$R[21176]=[$R[21177]={position:$R[21178]={start:$R[21179]={line:61,column:7,offset:1921},end:$R[21180]={line:61,column:54,offset:1968}},type:"text",value:"https://x.com/pnpmjs/status/1869911712763093048"}],position:$R[21181]={start:$R[21182]={line:61,column:7,offset:1921},end:$R[21183]={line:61,column:54,offset:1968}},title:void 0,type:"link",url:"https://x.com/pnpmjs/status/1869911712763093048"}],position:$R[21184]={start:$R[21185]={line:61,column:7,offset:1921},end:$R[21186]={line:61,column:54,offset:1968}},type:"paragraph"}],count:1,index:4,position:$R[21187]={start:$R[21188]={line:61,column:1,offset:1915},end:$R[21189]={line:61,column:54,offset:1968}},type:"footnoteDefinition"}],title:$R[21190]={children:$R[21191]=[$R[21192]={position:$R[21193]={start:$R[21194]={line:1,column:3,offset:2},end:$R[21195]={line:1,column:18,offset:17}},type:"text",value:"pnpm とセキュアな依存管理"}],id:"pnpm-とセキュアな依存管理",level:1,plain:"pnpm とセキュアな依存管理",position:$R[21196]={start:$R[21197]={line:1,column:1,offset:0},end:$R[21198]={line:1,column:18,offset:17}},type:"heading"},toc:$R[21199]=[$R[21200]={children:$R[21201]=[],id:"はじめに",plain:"はじめに",type:"toc"},$R[21202]={children:$R[21203]=[],id:"ライフサイクルスクリプトが必要なパッケージとは",plain:"ライフサイクルスクリプトが必要なパッケージとは",type:"toc"},$R[21204]={children:$R[21205]=[],id:"ライフサイクルスクリプトが必要なパッケージの課題",plain:"ライフサイクルスクリプトが必要なパッケージの課題",type:"toc"},$R[21206]={children:$R[21207]=[$R[21208]={children:$R[21209]=[],id:"onlybuiltdependencies",plain:"onlyBuiltDependencies",type:"toc"},$R[21210]={children:$R[21211]=[],id:"bun-のアプローチとの違い",plain:"bun のアプローチとの違い",type:"toc"}],id:"pnpm-v10-での変更点",plain:"pnpm v10 での変更点",type:"toc"},$R[21212]={children:$R[21213]=[],id:"pnpm-v101-と体験の向上",plain:"pnpm v10.1 と体験の向上",type:"toc"},$R[21214]={children:$R[21215]=[],id:"まとめ",plain:"まとめ",type:"toc"}],type:"article"}},$R[21216]={content:"# Web の未来と僕達\n\n## はじめに\n\n今月のはじめに「[フロントエンドチョットデキル 2025](https://chot.connpass.com/event/339257/)」というイベントがあった。\nこのイベントではデザインシステムからエディタなどの複雑 UI、果てはブラウザへのコントリビュートの話まで、web プラットフォームに対して様々な切り口から議論を広げる良いイベントだった。\n\n今回筆者が中でも興味を持ったのは、[jxck](https://jxck.io/) さんの基調講演、「Web Platform の変化がフロントエンド開発に与える影響」だった。\nそれは、筆者は直近に友達が就活を 27 卒で受けようか 29 卒で受けようか悩んでいるという相談を受けていたが、jxck さんの基調講演が自分には無い視点からこの相談に対して 1 つの答えを出すための判断材料を提供しているように感じたからだ。\n\n一方でこの基調講演は、あくまで Chromium の現在の政治的な立場を踏まえつつ jxck さんが個人的に考える未来の予測であるという前提がある。\nそのため筆者も違った角度からこの未来の予測を考えてみたいと思った。\n\n## Web の未来\n\njxck さんの基調講演とは違い、筆者は web プラットフォームそのものの技術の移り変わりやキャリアという視点から、Web の未来を考えてみたいと思う。\n\n### Web プラットフォームの未来\n\njxck さんの基調講演は、この web プラットフォームの現在の在り方と、DOJ による Chrome の売却を求めている話[^1]などから web プラットフォームそのものの未来は誰にも予想できないということを示唆しているように感じた。\n\n[^1]: [グーグルがブラウザ標準搭載契約見直し案、独禁法違反訴訟で是正策](https://jp.reuters.com/business/QB7N5O7UD5IAHF4YCEB3OOKXFY-2024-12-22/)\n\n政治的な話や企業の置かれている情勢などを考えると、web プラットフォームそのものの未来は誰にも予想できないというのは筆者も同感である。\nしかし、筆者は難しいことを考えるのが苦手なので、ここではそういう難しいドロドロした話は置いておいて純粋に技術的な視点から Web の未来を考えてみたいと思う。\n\n変化が目まぐるしいと言われる web 技術だが、本当にそうだろうか。\n筆者は常々疑問に思っている。\n\nたしかに、フレームワークやライブラリの、流行り廃りや仕様の変更などは目まぐるしい。\n\nしかし、それはあくまで技術の表面的な部分であり、web プラットフォームそのものの変化はそこまで激しいものではない。\n\n仕様は標準化され、web プラットフォームの数々は多くの合意と共に成り立っている。\nそのため、web プラットフォームそのものが大きく変わることは少ないと考えられる。\n\nまた冒頭で、フレームワークやライブラリの流行り廃りが目まぐるしいと言ったが、それはあくまで技術の表面的な部分である。\n流行り廃りが目まぐるしい理由を考えてみると、それは web を作る上で開発体験やユーザー体験のために、標準化されている仕様を超えて様々な試行錯誤を昔から今日まで繰り返してきたからだと考えられる。\n根幹は何も変わらず、より良い体験を提供することを目指しているだけである。\n\n一方で web プラットフォームを取り巻く技術というのは予想できない。\n[t_wada](https://x.com/t_wada) さんの「技術選定の審美眼」というスライド[^2]では技術は振り子のような螺旋構造で変化していると表現されている。\nこのスライドで t_wada さんは、変化の差分を見て、技術の進化を見極めることが重要であると述べている。\nこの主張はこれからの web プラットフォームと向き合う上でも重要な視点であると筆者は考える。\nスライドでは Unix や RDBMS,REST の哲学を昔からある変わらないものとして、それらの特徴を extract している。\nこの視点は今の web プラットフォームの激しい変化においても有効であると考えられる。\n同じ目的に対して無数の異なるアプローチがある web だが、その根幹にあるものは変わらないということを理解することが重要である。\n\n[^2]: [技術選定の審美眼(2023年版)](https://speakerdeck.com/twada/understanding-the-spiral-of-technologies-2023-edition)\n\n### LLM の登場と web\n\n前提としてここから先は筆者の過剰考察を多分に含むため、「ほーん、そういう考えの人もいるのね」くらいの気持ちで読んでいただけると幸いである。\n\n目まぐるしく移り変わりする web という世界に、昨今ゲームチェンジャーが現れたと筆者は感じている。\nそれは LLM の登場である。\n\nここで、LLM が開発にどう影響するか、という視点での話はしない。筆者はまだ LLM によって魂を震わされておらず、その影響を理解できていないからだ。\n詳しい話は [mizchi](https://x.com/mizchi) さんや [laiso](https://x.com/laiso) さんに聞いてほしい。\n\nここで話すのは、筆者は LLM が web の体験やコンテンツに与える影響の考察と、その考察はこの先のキャリア選択にどのような影響を与えるか、という視点での話である。\n筆者は、LLM が登場してから自分の未知の分野を検索するときの体験が向上し、それと同時に得られる情報の正確性がこれまでよりも低下したと感じる。\nこれは、LLM が自分の知識を補完してくれる一方で、その知識の正確性を保証することが難しくなったからだと考えられる。\nこの変化は、web という形式、存在自体を変えかねないものであると筆者は感じている。\n筆者にとって web とは、先人たちの知恵や生きた記録をデジタルに残し、現代の我々がそれを参照して学び、発展させるためのものである。\nしかし、LLM が登場した現代、多くの不確かな情報が web 上に溢れている。\n「情報」は web という仕組みにおいて無くてはならない。\nその中で「情報」への信頼が落ちるということは web という仕組みそのものが揺らぐことを意味すると考える。\n筆者は飽き性なのでこれから web という形態がどう変化するまでは考察する前に飽きてしまったが、そういう未来もありそうだよなって思う。\n\nLLM 登場後の負の面を書いてしまったが、もちろん良い面もあるし筆者は常日頃助けられている。\nそれが「検索」という体験を補完してくれる点だ。\nLLM 登場以前は、未知の分野を調べるとき、`Aを調べる --> Aを説明するための BとCを調べる --> 調べて分かったことを文脈として理解しAを知るために補完する` みたいな感じで調べていた。\nもちろん、これでも十分に情報を得ることはできるが、LLM が登場してからは `Aを調べる --> Aを説明する` という流れで情報を得ることができるようになった。\nここの「A を説明する」の真偽を明らかにするため、説明に必要な知識も説明してもらい気になる点は調べる必要があるが、それでも以前よりも効率的に情報を得ることができるようになった。\nこれは、web という形式が持つ情報の取得の手段を変えることで、情報の取得の効率を向上させたということである。\n\n### web を軸に置いたキャリア\n\nこれらを踏まえた上で web を軸に置いたキャリアについて考えてみたい。\n\nweb エンジニアのニーズは駆け出しが溢れたっていうのは昔話の如く氷河期に入るとは思うが、今の我々の仕事は形を変えてそれでも web とは結びついた形で残ると思う。\n\nまた、web を軸と言っても幅広い。\n入りはマークアップを頑張り、そのうち UX に興味を持ち、関心はユーザー体験を考えられるサービスグロースに携わる選択肢もあるし。\nインフラに興味を持ち、web の基盤を支える選択肢もある。\n上に挙げた選択肢はきっと web という形態が変わっても無くならないだろうし、変化に強い堅牢なキャリアだと筆者は感じる。\n逆に web という仕組みが好きで、言語仕様やライブラリに精通して、web という大きなドメインのエキスパートになるという選択肢は、常に過渡期の中心にいると思う。\n仕様やライブラリの本質を理解し、変化したとしても落ち着いて理解の抽象を当てはめて適応できるかどうかが鍵になると筆者は考える。\n\nこれは昔から変わらないだろうが、変化に柔軟なキャリアが web エンジニアには求められると考える。\n\n## まとめ\n\nweb プラットフォームそのものの未来は誰にも予想できない。しかし技術的な視点では予想はでき、変化の差分の本質を掴むことが大事である。\nまた web を軸としたキャリアは変化に柔軟に対応できるかどうかが鍵となる。",description:"web の未来について妄想した記録.",published:!0,publishedAt:"2025-02-28T12:35:16.703+09:00[Asia/Tokyo]",tags:$R[21217]=["web"],title:"Web の未来と僕達",_meta:$R[21218]={filePath:"01JN59YTYVPGKXDYD5PF991MHR/slug.md",fileName:"slug.md",directory:"01JN59YTYVPGKXDYD5PF991MHR",extension:"md",path:"01JN59YTYVPGKXDYD5PF991MHR/slug"},abstract:"Web の未来と僕達はじめに今月のはじめに「フロントエンドチョットデキル 2025」というイベントがあった。\nこのイベントではデザインシステムからエディタなどの複雑 UI、果てはブラウザへのコントリビュートの話まで、web プラットフォームに対して様々な切り口から議論を広げる良いイベントだった。今回筆者が中でも興味を持ったのは、jxck さんの基調講演、「Web Platform の変化がフロントエンド開発に与える影響」だった。\nそれは、筆者は直近に友達が就活を 27 卒で受けようか 29 卒で受けようか悩んでいるという相談を受けていたが、jxck さんの基調講演が自分には無い視点からこの相談に対して 1 つの答えを出すための判断材料を提供しているように感じたからだ。一方でこの基調講演は、あくまで Chromium の現在の政治的な立場を踏まえつつ jxck さんが個人的に考える未来の予測",mdast:$R[21219]={children:$R[21220]=[$R[21221]={children:$R[21222]=[$R[21223]={children:$R[21224]=[$R[21225]={position:$R[21226]={start:$R[21227]={line:3,column:4,offset:17},end:$R[21228]={line:3,column:8,offset:21}},type:"text",value:"はじめに"}],id:"はじめに",level:2,plain:"はじめに",position:$R[21229]={start:$R[21230]={line:3,column:1,offset:14},end:$R[21231]={line:3,column:8,offset:21}},type:"heading"},$R[21232]={children:$R[21233]=[$R[21234]={position:$R[21235]={start:$R[21236]={line:5,column:1,offset:23},end:$R[21237]={line:5,column:9,offset:31}},type:"text",value:"今月のはじめに「"},$R[21238]={children:$R[21239]=[$R[21240]={position:$R[21241]={start:$R[21242]={line:5,column:10,offset:32},end:$R[21243]={line:5,column:29,offset:51}},type:"text",value:"フロントエンドチョットデキル 2025"}],position:$R[21244]={start:$R[21245]={line:5,column:9,offset:31},end:$R[21246]={line:5,column:71,offset:93}},title:void 0,type:"link",url:"https://chot.connpass.com/event/339257/"},$R[21247]={position:$R[21248]={start:$R[21249]={line:5,column:71,offset:93},end:$R[21250]={line:6,column:94,offset:200}},type:"text",value:"」というイベントがあった。\nこのイベントではデザインシステムからエディタなどの複雑 UI、果てはブラウザへのコントリビュートの話まで、web プラットフォームに対して様々な切り口から議論を広げる良いイベントだった。"}],position:$R[21251]={start:$R[21252]={line:5,column:1,offset:23},end:$R[21253]={line:6,column:94,offset:200}},type:"paragraph"},$R[21254]={children:$R[21255]=[$R[21256]={position:$R[21257]={start:$R[21258]={line:8,column:1,offset:202},end:$R[21259]={line:8,column:18,offset:219}},type:"text",value:"今回筆者が中でも興味を持ったのは、"},$R[21260]={children:$R[21261]=[$R[21262]={position:$R[21263]={start:$R[21264]={line:8,column:19,offset:220},end:$R[21265]={line:8,column:23,offset:224}},type:"text",value:"jxck"}],position:$R[21266]={start:$R[21267]={line:8,column:18,offset:219},end:$R[21268]={line:8,column:42,offset:243}},title:void 0,type:"link",url:"https://jxck.io/"},$R[21269]={position:$R[21270]={start:$R[21271]={line:8,column:42,offset:243},end:$R[21272]={line:9,column:122,offset:412}},type:"text",value:" さんの基調講演、「Web Platform の変化がフロントエンド開発に与える影響」だった。\nそれは、筆者は直近に友達が就活を 27 卒で受けようか 29 卒で受けようか悩んでいるという相談を受けていたが、jxck さんの基調講演が自分には無い視点からこの相談に対して 1 つの答えを出すための判断材料を提供しているように感じたからだ。"}],position:$R[21273]={start:$R[21274]={line:8,column:1,offset:202},end:$R[21275]={line:9,column:122,offset:412}},type:"paragraph"},$R[21276]={children:$R[21277]=[$R[21278]={position:$R[21279]={start:$R[21280]={line:11,column:1,offset:414},end:$R[21281]={line:12,column:34,offset:522}},type:"text",value:"一方でこの基調講演は、あくまで Chromium の現在の政治的な立場を踏まえつつ jxck さんが個人的に考える未来の予測であるという前提がある。\nそのため筆者も違った角度からこの未来の予測を考えてみたいと思った。"}],position:$R[21282]={start:$R[21283]={line:11,column:1,offset:414},end:$R[21284]={line:12,column:34,offset:522}},type:"paragraph"}],position:$R[21285]={end:$R[21286]={line:12,column:34,offset:522},start:$R[21287]={line:3,column:1,offset:14}},type:"section"},$R[21288]={children:$R[21289]=[$R[21290]={children:$R[21291]=[$R[21292]={position:$R[21293]={start:$R[21294]={line:14,column:4,offset:527},end:$R[21295]={line:14,column:11,offset:534}},type:"text",value:"Web の未来"}],id:"web-の未来",level:2,plain:"Web の未来",position:$R[21296]={start:$R[21297]={line:14,column:1,offset:524},end:$R[21298]={line:14,column:11,offset:534}},type:"heading"},$R[21299]={children:$R[21300]=[$R[21301]={position:$R[21302]={start:$R[21303]={line:16,column:1,offset:536},end:$R[21304]={line:16,column:78,offset:613}},type:"text",value:"jxck さんの基調講演とは違い、筆者は web プラットフォームそのものの技術の移り変わりやキャリアという視点から、Web の未来を考えてみたいと思う。"}],position:$R[21305]={start:$R[21306]={line:16,column:1,offset:536},end:$R[21307]={line:16,column:78,offset:613}},type:"paragraph"},$R[21308]={children:$R[21309]=[$R[21310]={children:$R[21311]=[$R[21312]={position:$R[21313]={start:$R[21314]={line:18,column:5,offset:619},end:$R[21315]={line:18,column:20,offset:634}},type:"text",value:"Web プラットフォームの未来"}],id:"web-プラットフォームの未来",level:3,plain:"Web プラットフォームの未来",position:$R[21316]={start:$R[21317]={line:18,column:1,offset:615},end:$R[21318]={line:18,column:20,offset:634}},type:"heading"},$R[21319]={children:$R[21320]=[$R[21321]={position:$R[21322]={start:$R[21323]={line:20,column:1,offset:636},end:$R[21324]={line:20,column:64,offset:699}},type:"text",value:"jxck さんの基調講演は、この web プラットフォームの現在の在り方と、DOJ による Chrome の売却を求めている話"},$R[21325]={footnoteIndex:0,position:$R[21326]={start:$R[21327]={line:20,column:64,offset:699},end:$R[21328]={line:20,column:68,offset:703}},referenceIndex:1,type:"footnoteReference"},$R[21329]={position:$R[21330]={start:$R[21331]={line:20,column:68,offset:703},end:$R[21332]={line:20,column:121,offset:756}},type:"text",value:"などから web プラットフォームそのものの未来は誰にも予想できないということを示唆しているように感じた。"}],position:$R[21333]={start:$R[21334]={line:20,column:1,offset:636},end:$R[21335]={line:20,column:121,offset:756}},type:"paragraph"},$R[21336]={children:$R[21337]=[$R[21338]={position:$R[21339]={start:$R[21340]={line:24,column:1,offset:871},end:$R[21341]={line:25,column:80,offset:1019}},type:"text",value:"政治的な話や企業の置かれている情勢などを考えると、web プラットフォームそのものの未来は誰にも予想できないというのは筆者も同感である。\nしかし、筆者は難しいことを考えるのが苦手なので、ここではそういう難しいドロドロした話は置いておいて純粋に技術的な視点から Web の未来を考えてみたいと思う。"}],position:$R[21342]={start:$R[21343]={line:24,column:1,offset:871},end:$R[21344]={line:25,column:80,offset:1019}},type:"paragraph"},$R[21345]={children:$R[21346]=[$R[21347]={position:$R[21348]={start:$R[21349]={line:27,column:1,offset:1021},end:$R[21350]={line:28,column:15,offset:1070}},type:"text",value:"変化が目まぐるしいと言われる web 技術だが、本当にそうだろうか。\n筆者は常々疑問に思っている。"}],position:$R[21351]={start:$R[21352]={line:27,column:1,offset:1021},end:$R[21353]={line:28,column:15,offset:1070}},type:"paragraph"},$R[21354]={children:$R[21355]=[$R[21356]={position:$R[21357]={start:$R[21358]={line:30,column:1,offset:1072},end:$R[21359]={line:30,column:42,offset:1113}},type:"text",value:"たしかに、フレームワークやライブラリの、流行り廃りや仕様の変更などは目まぐるしい。"}],position:$R[21360]={start:$R[21361]={line:30,column:1,offset:1072},end:$R[21362]={line:30,column:42,offset:1113}},type:"paragraph"},$R[21363]={children:$R[21364]=[$R[21365]={position:$R[21366]={start:$R[21367]={line:32,column:1,offset:1115},end:$R[21368]={line:32,column:59,offset:1173}},type:"text",value:"しかし、それはあくまで技術の表面的な部分であり、web プラットフォームそのものの変化はそこまで激しいものではない。"}],position:$R[21369]={start:$R[21370]={line:32,column:1,offset:1115},end:$R[21371]={line:32,column:59,offset:1173}},type:"paragraph"},$R[21372]={children:$R[21373]=[$R[21374]={position:$R[21375]={start:$R[21376]={line:34,column:1,offset:1175},end:$R[21377]={line:35,column:42,offset:1258}},type:"text",value:"仕様は標準化され、web プラットフォームの数々は多くの合意と共に成り立っている。\nそのため、web プラットフォームそのものが大きく変わることは少ないと考えられる。"}],position:$R[21378]={start:$R[21379]={line:34,column:1,offset:1175},end:$R[21380]={line:35,column:42,offset:1258}},type:"paragraph"},$R[21381]={children:$R[21382]=[$R[21383]={position:$R[21384]={start:$R[21385]={line:37,column:1,offset:1260},end:$R[21386]={line:39,column:37,offset:1453}},type:"text",value:"また冒頭で、フレームワークやライブラリの流行り廃りが目まぐるしいと言ったが、それはあくまで技術の表面的な部分である。\n流行り廃りが目まぐるしい理由を考えてみると、それは web を作る上で開発体験やユーザー体験のために、標準化されている仕様を超えて様々な試行錯誤を昔から今日まで繰り返してきたからだと考えられる。\n根幹は何も変わらず、より良い体験を提供することを目指しているだけである。"}],position:$R[21387]={start:$R[21388]={line:37,column:1,offset:1260},end:$R[21389]={line:39,column:37,offset:1453}},type:"paragraph"},$R[21390]={children:$R[21391]=[$R[21392]={position:$R[21393]={start:$R[21394]={line:41,column:1,offset:1455},end:$R[21395]={line:42,column:1,offset:1491}},type:"text",value:"一方で web プラットフォームを取り巻く技術というのは予想できない。\n"},$R[21396]={children:$R[21397]=[$R[21398]={position:$R[21399]={start:$R[21400]={line:42,column:2,offset:1492},end:$R[21401]={line:42,column:8,offset:1498}},type:"text",value:"t_wada"}],position:$R[21402]={start:$R[21403]={line:42,column:1,offset:1491},end:$R[21404]={line:42,column:31,offset:1521}},title:void 0,type:"link",url:"https://x.com/t_wada"},$R[21405]={position:$R[21406]={start:$R[21407]={line:42,column:31,offset:1521},end:$R[21408]={line:42,column:52,offset:1542}},type:"text",value:" さんの「技術選定の審美眼」というスライド"},$R[21409]={footnoteIndex:1,position:$R[21410]={start:$R[21411]={line:42,column:52,offset:1542},end:$R[21412]={line:42,column:56,offset:1546}},referenceIndex:1,type:"footnoteReference"},$R[21413]={position:$R[21414]={start:$R[21415]={line:42,column:56,offset:1546},end:$R[21416]={line:47,column:65,offset:1856}},type:"text",value:"では技術は振り子のような螺旋構造で変化していると表現されている。\nこのスライドで t_wada さんは、変化の差分を見て、技術の進化を見極めることが重要であると述べている。\nこの主張はこれからの web プラットフォームと向き合う上でも重要な視点であると筆者は考える。\nスライドでは Unix や RDBMS,REST の哲学を昔からある変わらないものとして、それらの特徴を extract している。\nこの視点は今の web プラットフォームの激しい変化においても有効であると考えられる。\n同じ目的に対して無数の異なるアプローチがある web だが、その根幹にあるものは変わらないということを理解することが重要である。"}],position:$R[21417]={start:$R[21418]={line:41,column:1,offset:1455},end:$R[21419]={line:47,column:65,offset:1856}},type:"paragraph"}],position:$R[21420]={end:$R[21421]={line:47,column:65,offset:1856},start:$R[21422]={line:18,column:1,offset:615}},type:"section"},$R[21423]={children:$R[21424]=[$R[21425]={children:$R[21426]=[$R[21427]={position:$R[21428]={start:$R[21429]={line:51,column:5,offset:1973},end:$R[21430]={line:51,column:17,offset:1985}},type:"text",value:"LLM の登場と web"}],id:"llm-の登場と-web",level:3,plain:"LLM の登場と web",position:$R[21431]={start:$R[21432]={line:51,column:1,offset:1969},end:$R[21433]={line:51,column:17,offset:1985}},type:"heading"},$R[21434]={children:$R[21435]=[$R[21436]={position:$R[21437]={start:$R[21438]={line:53,column:1,offset:1987},end:$R[21439]={line:53,column:70,offset:2056}},type:"text",value:"前提としてここから先は筆者の過剰考察を多分に含むため、「ほーん、そういう考えの人もいるのね」くらいの気持ちで読んでいただけると幸いである。"}],position:$R[21440]={start:$R[21441]={line:53,column:1,offset:1987},end:$R[21442]={line:53,column:70,offset:2056}},type:"paragraph"},$R[21443]={children:$R[21444]=[$R[21445]={position:$R[21446]={start:$R[21447]={line:55,column:1,offset:2058},end:$R[21448]={line:56,column:16,offset:2124}},type:"text",value:"目まぐるしく移り変わりする web という世界に、昨今ゲームチェンジャーが現れたと筆者は感じている。\nそれは LLM の登場である。"}],position:$R[21449]={start:$R[21450]={line:55,column:1,offset:2058},end:$R[21451]={line:56,column:16,offset:2124}},type:"paragraph"},$R[21452]={children:$R[21453]=[$R[21454]={position:$R[21455]={start:$R[21456]={line:58,column:1,offset:2126},end:$R[21457]={line:59,column:7,offset:2208}},type:"text",value:"ここで、LLM が開発にどう影響するか、という視点での話はしない。筆者はまだ LLM によって魂を震わされておらず、その影響を理解できていないからだ。\n詳しい話は "},$R[21458]={children:$R[21459]=[$R[21460]={position:$R[21461]={start:$R[21462]={line:59,column:8,offset:2209},end:$R[21463]={line:59,column:14,offset:2215}},type:"text",value:"mizchi"}],position:$R[21464]={start:$R[21465]={line:59,column:7,offset:2208},end:$R[21466]={line:59,column:37,offset:2238}},title:void 0,type:"link",url:"https://x.com/mizchi"},$R[21467]={position:$R[21468]={start:$R[21469]={line:59,column:37,offset:2238},end:$R[21470]={line:59,column:42,offset:2243}},type:"text",value:" さんや "},$R[21471]={children:$R[21472]=[$R[21473]={position:$R[21474]={start:$R[21475]={line:59,column:43,offset:2244},end:$R[21476]={line:59,column:48,offset:2249}},type:"text",value:"laiso"}],position:$R[21477]={start:$R[21478]={line:59,column:42,offset:2243},end:$R[21479]={line:59,column:70,offset:2271}},title:void 0,type:"link",url:"https://x.com/laiso"},$R[21480]={position:$R[21481]={start:$R[21482]={line:59,column:70,offset:2271},end:$R[21483]={line:59,column:81,offset:2282}},type:"text",value:" さんに聞いてほしい。"}],position:$R[21484]={start:$R[21485]={line:58,column:1,offset:2126},end:$R[21486]={line:59,column:81,offset:2282}},type:"paragraph"},$R[21487]={children:$R[21488]=[$R[21489]={position:$R[21490]={start:$R[21491]={line:61,column:1,offset:2284},end:$R[21492]={line:69,column:68,offset:2800}},type:"text",value:"ここで話すのは、筆者は LLM が web の体験やコンテンツに与える影響の考察と、その考察はこの先のキャリア選択にどのような影響を与えるか、という視点での話である。\n筆者は、LLM が登場してから自分の未知の分野を検索するときの体験が向上し、それと同時に得られる情報の正確性がこれまでよりも低下したと感じる。\nこれは、LLM が自分の知識を補完してくれる一方で、その知識の正確性を保証することが難しくなったからだと考えられる。\nこの変化は、web という形式、存在自体を変えかねないものであると筆者は感じている。\n筆者にとって web とは、先人たちの知恵や生きた記録をデジタルに残し、現代の我々がそれを参照して学び、発展させるためのものである。\nしかし、LLM が登場した現代、多くの不確かな情報が web 上に溢れている。\n「情報」は web という仕組みにおいて無くてはならない。\nその中で「情報」への信頼が落ちるということは web という仕組みそのものが揺らぐことを意味すると考える。\n筆者は飽き性なのでこれから web という形態がどう変化するまでは考察する前に飽きてしまったが、そういう未来もありそうだよなって思う。"}],position:$R[21493]={start:$R[21494]={line:61,column:1,offset:2284},end:$R[21495]={line:69,column:68,offset:2800}},type:"paragraph"},$R[21496]={children:$R[21497]=[$R[21498]={position:$R[21499]={start:$R[21500]={line:71,column:1,offset:2802},end:$R[21501]={line:73,column:23,offset:2895}},type:"text",value:"LLM 登場後の負の面を書いてしまったが、もちろん良い面もあるし筆者は常日頃助けられている。\nそれが「検索」という体験を補完してくれる点だ。\nLLM 登場以前は、未知の分野を調べるとき、"},$R[21502]={position:$R[21503]={start:$R[21504]={line:73,column:23,offset:2895},end:$R[21505]={line:73,column:86,offset:2958}},type:"inlineCode",value:"Aを調べる --> Aを説明するための BとCを調べる --> 調べて分かったことを文脈として理解しAを知るために補完する"},$R[21506]={position:$R[21507]={start:$R[21508]={line:73,column:86,offset:2958},end:$R[21509]={line:74,column:39,offset:3011}},type:"text",value:" みたいな感じで調べていた。\nもちろん、これでも十分に情報を得ることはできるが、LLM が登場してからは "},$R[21510]={position:$R[21511]={start:$R[21512]={line:74,column:39,offset:3011},end:$R[21513]={line:74,column:57,offset:3029}},type:"inlineCode",value:"Aを調べる --> Aを説明する"},$R[21514]={position:$R[21515]={start:$R[21516]={line:74,column:57,offset:3029},end:$R[21517]={line:76,column:56,offset:3199}},type:"text",value:" という流れで情報を得ることができるようになった。\nここの「A を説明する」の真偽を明らかにするため、説明に必要な知識も説明してもらい気になる点は調べる必要があるが、それでも以前よりも効率的に情報を得ることができるようになった。\nこれは、web という形式が持つ情報の取得の手段を変えることで、情報の取得の効率を向上させたということである。"}],position:$R[21518]={start:$R[21519]={line:71,column:1,offset:2802},end:$R[21520]={line:76,column:56,offset:3199}},type:"paragraph"}],position:$R[21521]={end:$R[21522]={line:76,column:56,offset:3199},start:$R[21523]={line:51,column:1,offset:1969}},type:"section"},$R[21524]={children:$R[21525]=[$R[21526]={children:$R[21527]=[$R[21528]={position:$R[21529]={start:$R[21530]={line:78,column:5,offset:3205},end:$R[21531]={line:78,column:19,offset:3219}},type:"text",value:"web を軸に置いたキャリア"}],id:"web-を軸に置いたキャリア",level:3,plain:"web を軸に置いたキャリア",position:$R[21532]={start:$R[21533]={line:78,column:1,offset:3201},end:$R[21534]={line:78,column:19,offset:3219}},type:"heading"},$R[21535]={children:$R[21536]=[$R[21537]={position:$R[21538]={start:$R[21539]={line:80,column:1,offset:3221},end:$R[21540]={line:80,column:37,offset:3257}},type:"text",value:"これらを踏まえた上で web を軸に置いたキャリアについて考えてみたい。"}],position:$R[21541]={start:$R[21542]={line:80,column:1,offset:3221},end:$R[21543]={line:80,column:37,offset:3257}},type:"paragraph"},$R[21544]={children:$R[21545]=[$R[21546]={position:$R[21547]={start:$R[21548]={line:82,column:1,offset:3259},end:$R[21549]={line:82,column:83,offset:3341}},type:"text",value:"web エンジニアのニーズは駆け出しが溢れたっていうのは昔話の如く氷河期に入るとは思うが、今の我々の仕事は形を変えてそれでも web とは結びついた形で残ると思う。"}],position:$R[21550]={start:$R[21551]={line:82,column:1,offset:3259},end:$R[21552]={line:82,column:83,offset:3341}},type:"paragraph"},$R[21553]={children:$R[21554]=[$R[21555]={position:$R[21556]={start:$R[21557]={line:84,column:1,offset:3343},end:$R[21558]={line:89,column:63,offset:3662}},type:"text",value:"また、web を軸と言っても幅広い。\n入りはマークアップを頑張り、そのうち UX に興味を持ち、関心はユーザー体験を考えられるサービスグロースに携わる選択肢もあるし。\nインフラに興味を持ち、web の基盤を支える選択肢もある。\n上に挙げた選択肢はきっと web という形態が変わっても無くならないだろうし、変化に強い堅牢なキャリアだと筆者は感じる。\n逆に web という仕組みが好きで、言語仕様やライブラリに精通して、web という大きなドメインのエキスパートになるという選択肢は、常に過渡期の中心にいると思う。\n仕様やライブラリの本質を理解し、変化したとしても落ち着いて理解の抽象を当てはめて適応できるかどうかが鍵になると筆者は考える。"}],position:$R[21559]={start:$R[21560]={line:84,column:1,offset:3343},end:$R[21561]={line:89,column:63,offset:3662}},type:"paragraph"},$R[21562]={children:$R[21563]=[$R[21564]={position:$R[21565]={start:$R[21566]={line:91,column:1,offset:3664},end:$R[21567]={line:91,column:50,offset:3713}},type:"text",value:"これは昔から変わらないだろうが、変化に柔軟なキャリアが web エンジニアには求められると考える。"}],position:$R[21568]={start:$R[21569]={line:91,column:1,offset:3664},end:$R[21570]={line:91,column:50,offset:3713}},type:"paragraph"}],position:$R[21571]={end:$R[21572]={line:91,column:50,offset:3713},start:$R[21573]={line:78,column:1,offset:3201}},type:"section"}],position:$R[21574]={end:$R[21575]={line:91,column:50,offset:3713},start:$R[21576]={line:14,column:1,offset:524}},type:"section"},$R[21577]={children:$R[21578]=[$R[21579]={children:$R[21580]=[$R[21581]={position:$R[21582]={start:$R[21583]={line:93,column:4,offset:3718},end:$R[21584]={line:93,column:7,offset:3721}},type:"text",value:"まとめ"}],id:"まとめ",level:2,plain:"まとめ",position:$R[21585]={start:$R[21586]={line:93,column:1,offset:3715},end:$R[21587]={line:93,column:7,offset:3721}},type:"heading"},$R[21588]={children:$R[21589]=[$R[21590]={position:$R[21591]={start:$R[21592]={line:95,column:1,offset:3723},end:$R[21593]={line:96,column:39,offset:3829}},type:"text",value:"web プラットフォームそのものの未来は誰にも予想できない。しかし技術的な視点では予想はでき、変化の差分の本質を掴むことが大事である。\nまた web を軸としたキャリアは変化に柔軟に対応できるかどうかが鍵となる。"}],position:$R[21594]={start:$R[21595]={line:95,column:1,offset:3723},end:$R[21596]={line:96,column:39,offset:3829}},type:"paragraph"}],position:$R[21597]={end:$R[21598]={line:96,column:39,offset:3829},start:$R[21599]={line:93,column:1,offset:3715}},type:"section"}],footnotes:$R[21600]=[$R[21601]={children:$R[21602]=[$R[21603]={children:$R[21604]=[$R[21605]={children:$R[21606]=[$R[21607]={position:$R[21608]={start:$R[21609]={line:22,column:8,offset:765},end:$R[21610]={line:22,column:39,offset:796}},type:"text",value:"グーグルがブラウザ標準搭載契約見直し案、独禁法違反訴訟で是正策"}],position:$R[21611]={start:$R[21612]={line:22,column:7,offset:764},end:$R[21613]={line:22,column:112,offset:869}},title:void 0,type:"link",url:"https://jp.reuters.com/business/QB7N5O7UD5IAHF4YCEB3OOKXFY-2024-12-22/"}],position:$R[21614]={start:$R[21615]={line:22,column:7,offset:764},end:$R[21616]={line:22,column:112,offset:869}},type:"paragraph"}],count:1,index:0,position:$R[21617]={start:$R[21618]={line:22,column:1,offset:758},end:$R[21619]={line:22,column:112,offset:869}},type:"footnoteDefinition"},$R[21620]={children:$R[21621]=[$R[21622]={children:$R[21623]=[$R[21624]={children:$R[21625]=[$R[21626]={position:$R[21627]={start:$R[21628]={line:49,column:8,offset:1865},end:$R[21629]={line:49,column:24,offset:1881}},type:"text",value:"技術選定の審美眼(2023年版)"}],position:$R[21630]={start:$R[21631]={line:49,column:7,offset:1864},end:$R[21632]={line:49,column:110,offset:1967}},title:void 0,type:"link",url:"https://speakerdeck.com/twada/understanding-the-spiral-of-technologies-2023-edition"}],position:$R[21633]={start:$R[21634]={line:49,column:7,offset:1864},end:$R[21635]={line:49,column:110,offset:1967}},type:"paragraph"}],count:1,index:1,position:$R[21636]={start:$R[21637]={line:49,column:1,offset:1858},end:$R[21638]={line:49,column:110,offset:1967}},type:"footnoteDefinition"}],title:$R[21639]={children:$R[21640]=[$R[21641]={position:$R[21642]={start:$R[21643]={line:1,column:3,offset:2},end:$R[21644]={line:1,column:13,offset:12}},type:"text",value:"Web の未来と僕達"}],id:"web-の未来と僕達",level:1,plain:"Web の未来と僕達",position:$R[21645]={start:$R[21646]={line:1,column:1,offset:0},end:$R[21647]={line:1,column:13,offset:12}},type:"heading"},toc:$R[21648]=[$R[21649]={children:$R[21650]=[],id:"はじめに",plain:"はじめに",type:"toc"},$R[21651]={children:$R[21652]=[$R[21653]={children:$R[21654]=[],id:"web-プラットフォームの未来",plain:"Web プラットフォームの未来",type:"toc"},$R[21655]={children:$R[21656]=[],id:"llm-の登場と-web",plain:"LLM の登場と web",type:"toc"},$R[21657]={children:$R[21658]=[],id:"web-を軸に置いたキャリア",plain:"web を軸に置いたキャリア",type:"toc"}],id:"web-の未来",plain:"Web の未来",type:"toc"},$R[21659]={children:$R[21660]=[],id:"まとめ",plain:"まとめ",type:"toc"}],type:"article"}},$R[21661]={content:"# styled-components の歴史、現在、これから\n\n## はじめに\n\n先日、1つの時代が終わりを迎えた。\n\nhttps://opencollective.com/styled-components/updates/thank-you\n\nstyled-components のメンテナンスモードへの移行が発表された。\nこれは、CSS in JS 並びに styling library の歴史において、1つの節目となる出来事である。\n\n社内のプロダクトでは styled-components が使用されており、年末に私が v6 へのアップデートを行ったばかりだった。\nそのため、この発表は私にとっても大きな影響を与えるものであった。\n\nそこで、今回は styled-components の歴史を振り返り、現在の状況を整理し、これからの展望を考える。\n\n## styled-components とは\n\nstyled-components は 2016 年に Glen Maddern 氏によって作成された[^1]、CSS in JS ライブラリである。\nReact コンポーネントシステムのスタイリングをどのように強化できるかという疑問から生まれたものであり、その後、多くの開発者によって利用されるようになった。\nstyled-components は開発者にとってより良い開発体験を提供することに加えて、以下の利点を提供する。\n\n[^1]: https://github.com/styled-components/styled-components/commit/d2561d4928ff252eb79e5e3a3749c13930b6f062\n\n- Critical CSS を自動的に生成する\n - これはほんまか?って気持ちがあったが、レンダリングされたコンポーネントのスタイルのみを注入するのだから、Critical CSS と言っても過言ではないかもしれない。\n- シンプルに動的なスタイルを適用できる\n- スタイルのコロケーション\n\nこれらはドキュメント[^2]から引用してきたものであるが、私の認識とほとんど変わらない。\n\n[^2]: [https://styled-components.com/docs/basics#motivation](https://styled-components.com/docs/basics#motivation)\n\n## styled-components の歴史\n\n### CSS in JS の登場\n\nCSS in JS は、2014 年に Facebook の Christopher \"vjeux\" Chedeau 氏によって提唱された[^3]。\n彼は CSS の問題点として、グローバル変数の汚染や使用されなくなった CSS の削除が困難であることを挙げた。\n\n[^3]: [https://speakerdeck.com/vjeux/react-css-in-js](https://speakerdeck.com/vjeux/react-css-in-js)\n\nFacebook 社内ではこれらの問題に対処するため、 JavaScript を用いてインラインスタイルをオブジェクト化するという手法が講じられた。\n\n```jsx:sample.jsx\nconst style = {\n text: {\n backgroundColor: '#000000',\n color: 'white'\n }\n}\n\n\x3Cdiv style={style.text} />\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[21662]=["styled-components","CSS in JS","React"],title:"styled-components の歴史、現在、これから",updatedAt:"2025-04-02T00:04:33.74+09:00[Asia/Tokyo]",_meta:$R[21663]={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[21664]={children:$R[21665]=[$R[21666]={children:$R[21667]=[$R[21668]={children:$R[21669]=[$R[21670]={position:$R[21671]={start:$R[21672]={line:3,column:4,offset:36},end:$R[21673]={line:3,column:8,offset:40}},type:"text",value:"はじめに"}],id:"はじめに",level:2,plain:"はじめに",position:$R[21674]={start:$R[21675]={line:3,column:1,offset:33},end:$R[21676]={line:3,column:8,offset:40}},type:"heading"},$R[21677]={children:$R[21678]=[$R[21679]={position:$R[21680]={start:$R[21681]={line:5,column:1,offset:42},end:$R[21682]={line:5,column:18,offset:59}},type:"text",value:"先日、1つの時代が終わりを迎えた。"}],position:$R[21683]={start:$R[21684]={line:5,column:1,offset:42},end:$R[21685]={line:5,column:18,offset:59}},type:"paragraph"},$R[21686]={meta:$R[21687]={title:"Thank you - Open Collective",twitter_card:$R[21688]={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[21689]=[$R[21690]={url:"https://images.opencollective.com/styled-components/dedfe2f/logo.png"}]},open_graph:$R[21691]={images:$R[21692]=[$R[21693]={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[21694]={start:$R[21695]={line:7,column:1,offset:61},end:$R[21696]={line:7,column:63,offset:123}},src:"https://opencollective.com/styled-components/updates/thank-you",type:"embed"},$R[21697]={children:$R[21698]=[$R[21699]={position:$R[21700]={start:$R[21701]={line:9,column:1,offset:125},end:$R[21702]={line:10,column:58,offset:222}},type:"text",value:"styled-components のメンテナンスモードへの移行が発表された。\nこれは、CSS in JS 並びに styling library の歴史において、1つの節目となる出来事である。"}],position:$R[21703]={start:$R[21704]={line:9,column:1,offset:125},end:$R[21705]={line:10,column:58,offset:222}},type:"paragraph"},$R[21706]={children:$R[21707]=[$R[21708]={position:$R[21709]={start:$R[21710]={line:12,column:1,offset:224},end:$R[21711]={line:13,column:33,offset:323}},type:"text",value:"社内のプロダクトでは styled-components が使用されており、年末に私が v6 へのアップデートを行ったばかりだった。\nそのため、この発表は私にとっても大きな影響を与えるものであった。"}],position:$R[21712]={start:$R[21713]={line:12,column:1,offset:224},end:$R[21714]={line:13,column:33,offset:323}},type:"paragraph"},$R[21715]={children:$R[21716]=[$R[21717]={position:$R[21718]={start:$R[21719]={line:15,column:1,offset:325},end:$R[21720]={line:15,column:58,offset:382}},type:"text",value:"そこで、今回は styled-components の歴史を振り返り、現在の状況を整理し、これからの展望を考える。"}],position:$R[21721]={start:$R[21722]={line:15,column:1,offset:325},end:$R[21723]={line:15,column:58,offset:382}},type:"paragraph"}],position:$R[21724]={end:$R[21725]={line:15,column:58,offset:382},start:$R[21726]={line:3,column:1,offset:33}},type:"section"},$R[21727]={children:$R[21728]=[$R[21729]={children:$R[21730]=[$R[21731]={position:$R[21732]={start:$R[21733]={line:17,column:4,offset:387},end:$R[21734]={line:17,column:24,offset:407}},type:"text",value:"styled-components とは"}],id:"styled-components-とは",level:2,plain:"styled-components とは",position:$R[21735]={start:$R[21736]={line:17,column:1,offset:384},end:$R[21737]={line:17,column:24,offset:407}},type:"heading"},$R[21738]={children:$R[21739]=[$R[21740]={position:$R[21741]={start:$R[21742]={line:19,column:1,offset:409},end:$R[21743]={line:19,column:52,offset:460}},type:"text",value:"styled-components は 2016 年に Glen Maddern 氏によって作成された"},$R[21744]={footnoteIndex:0,position:$R[21745]={start:$R[21746]={line:19,column:52,offset:460},end:$R[21747]={line:19,column:56,offset:464}},referenceIndex:1,type:"footnoteReference"},$R[21748]={position:$R[21749]={start:$R[21750]={line:19,column:56,offset:464},end:$R[21751]={line:21,column:58,offset:622}},type:"text",value:"、CSS in JS ライブラリである。\nReact コンポーネントシステムのスタイリングをどのように強化できるかという疑問から生まれたものであり、その後、多くの開発者によって利用されるようになった。\nstyled-components は開発者にとってより良い開発体験を提供することに加えて、以下の利点を提供する。"}],position:$R[21752]={start:$R[21753]={line:19,column:1,offset:409},end:$R[21754]={line:21,column:58,offset:622}},type:"paragraph"},$R[21755]={children:$R[21756]=[$R[21757]={children:$R[21758]=[$R[21759]={children:$R[21760]=[$R[21761]={position:$R[21762]={start:$R[21763]={line:25,column:3,offset:736},end:$R[21764]={line:25,column:25,offset:758}},type:"text",value:"Critical CSS を自動的に生成する"}],position:$R[21765]={start:$R[21766]={line:25,column:3,offset:736},end:$R[21767]={line:25,column:25,offset:758}},type:"paragraph"},$R[21768]={children:$R[21769]=[$R[21770]={children:$R[21771]=[$R[21772]={children:$R[21773]=[$R[21774]={position:$R[21775]={start:$R[21776]={line:26,column:5,offset:763},end:$R[21777]={line:26,column:88,offset:846}},type:"text",value:"これはほんまか?って気持ちがあったが、レンダリングされたコンポーネントのスタイルのみを注入するのだから、Critical CSS と言っても過言ではないかもしれない。"}],position:$R[21778]={start:$R[21779]={line:26,column:5,offset:763},end:$R[21780]={line:26,column:88,offset:846}},type:"paragraph"}],position:$R[21781]={start:$R[21782]={line:26,column:3,offset:761},end:$R[21783]={line:26,column:88,offset:846}},type:"listItem"}],position:$R[21784]={start:$R[21785]={line:26,column:3,offset:761},end:$R[21786]={line:26,column:88,offset:846}},type:"unorderedList"}],position:$R[21787]={start:$R[21788]={line:25,column:1,offset:734},end:$R[21789]={line:26,column:88,offset:846}},type:"listItem"},$R[21790]={children:$R[21791]=[$R[21792]={children:$R[21793]=[$R[21794]={position:$R[21795]={start:$R[21796]={line:27,column:3,offset:849},end:$R[21797]={line:27,column:21,offset:867}},type:"text",value:"シンプルに動的なスタイルを適用できる"}],position:$R[21798]={start:$R[21799]={line:27,column:3,offset:849},end:$R[21800]={line:27,column:21,offset:867}},type:"paragraph"}],position:$R[21801]={start:$R[21802]={line:27,column:1,offset:847},end:$R[21803]={line:27,column:21,offset:867}},type:"listItem"},$R[21804]={children:$R[21805]=[$R[21806]={children:$R[21807]=[$R[21808]={position:$R[21809]={start:$R[21810]={line:28,column:3,offset:870},end:$R[21811]={line:28,column:15,offset:882}},type:"text",value:"スタイルのコロケーション"}],position:$R[21812]={start:$R[21813]={line:28,column:3,offset:870},end:$R[21814]={line:28,column:15,offset:882}},type:"paragraph"}],position:$R[21815]={start:$R[21816]={line:28,column:1,offset:868},end:$R[21817]={line:28,column:15,offset:882}},type:"listItem"}],position:$R[21818]={start:$R[21819]={line:25,column:1,offset:734},end:$R[21820]={line:28,column:15,offset:882}},type:"unorderedList"},$R[21821]={children:$R[21822]=[$R[21823]={position:$R[21824]={start:$R[21825]={line:30,column:1,offset:884},end:$R[21826]={line:30,column:11,offset:894}},type:"text",value:"これらはドキュメント"},$R[21827]={footnoteIndex:1,position:$R[21828]={start:$R[21829]={line:30,column:11,offset:894},end:$R[21830]={line:30,column:15,offset:898}},referenceIndex:1,type:"footnoteReference"},$R[21831]={position:$R[21832]={start:$R[21833]={line:30,column:15,offset:898},end:$R[21834]={line:30,column:45,offset:928}},type:"text",value:"から引用してきたものであるが、私の認識とほとんど変わらない。"}],position:$R[21835]={start:$R[21836]={line:30,column:1,offset:884},end:$R[21837]={line:30,column:45,offset:928}},type:"paragraph"}],position:$R[21838]={end:$R[21839]={line:30,column:45,offset:928},start:$R[21840]={line:17,column:1,offset:384}},type:"section"},$R[21841]={children:$R[21842]=[$R[21843]={children:$R[21844]=[$R[21845]={position:$R[21846]={start:$R[21847]={line:34,column:4,offset:1049},end:$R[21848]={line:34,column:25,offset:1070}},type:"text",value:"styled-components の歴史"}],id:"styled-components-の歴史",level:2,plain:"styled-components の歴史",position:$R[21849]={start:$R[21850]={line:34,column:1,offset:1046},end:$R[21851]={line:34,column:25,offset:1070}},type:"heading"},$R[21852]={children:$R[21853]=[$R[21854]={children:$R[21855]=[$R[21856]={position:$R[21857]={start:$R[21858]={line:36,column:5,offset:1076},end:$R[21859]={line:36,column:18,offset:1089}},type:"text",value:"CSS in JS の登場"}],id:"css-in-js-の登場",level:3,plain:"CSS in JS の登場",position:$R[21860]={start:$R[21861]={line:36,column:1,offset:1072},end:$R[21862]={line:36,column:18,offset:1089}},type:"heading"},$R[21863]={children:$R[21864]=[$R[21865]={position:$R[21866]={start:$R[21867]={line:38,column:1,offset:1091},end:$R[21868]={line:38,column:70,offset:1160}},type:"text",value:"CSS in JS は、2014 年に Facebook の Christopher \"vjeux\" Chedeau 氏によって提唱された"},$R[21869]={footnoteIndex:2,position:$R[21870]={start:$R[21871]={line:38,column:70,offset:1160},end:$R[21872]={line:38,column:74,offset:1164}},referenceIndex:1,type:"footnoteReference"},$R[21873]={position:$R[21874]={start:$R[21875]={line:38,column:74,offset:1164},end:$R[21876]={line:39,column:57,offset:1222}},type:"text",value:"。\n彼は CSS の問題点として、グローバル変数の汚染や使用されなくなった CSS の削除が困難であることを挙げた。"}],position:$R[21877]={start:$R[21878]={line:38,column:1,offset:1091},end:$R[21879]={line:39,column:57,offset:1222}},type:"paragraph"},$R[21880]={children:$R[21881]=[$R[21882]={position:$R[21883]={start:$R[21884]={line:43,column:1,offset:1326},end:$R[21885]={line:43,column:75,offset:1400}},type:"text",value:"Facebook 社内ではこれらの問題に対処するため、 JavaScript を用いてインラインスタイルをオブジェクト化するという手法が講じられた。"}],position:$R[21886]={start:$R[21887]={line:43,column:1,offset:1326},end:$R[21888]={line:43,column:75,offset:1400}},type:"paragraph"},$R[21889]={filename:"sample.jsx jsx",lang:"jsx",position:$R[21890]={start:$R[21891]={line:45,column:1,offset:1402},end:$R[21892]={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[21893]={type:"root",children:$R[21894]=[$R[21895]={type:"element",tagName:"pre",properties:$R[21896]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[21897]=[$R[21898]={type:"element",tagName:"code",properties:$R[21899]={},children:$R[21900]=[$R[21901]={type:"element",tagName:"span",properties:$R[21902]={class:"line"},children:$R[21903]=[$R[21904]={type:"element",tagName:"span",properties:$R[21905]={style:"color:#CB7676"},children:$R[21906]=[$R[21907]={type:"text",value:"const"}]},$R[21908]={type:"element",tagName:"span",properties:$R[21909]={style:"color:#BD976A"},children:$R[21910]=[$R[21911]={type:"text",value:" style"}]},$R[21912]={type:"element",tagName:"span",properties:$R[21913]={style:"color:#666666"},children:$R[21914]=[$R[21915]={type:"text",value:" ="}]},$R[21916]={type:"element",tagName:"span",properties:$R[21917]={style:"color:#666666"},children:$R[21918]=[$R[21919]={type:"text",value:" {"}]}]},$R[21920]={type:"text",value:"\n"},$R[21921]={type:"element",tagName:"span",properties:$R[21922]={class:"line"},children:$R[21923]=[$R[21924]={type:"element",tagName:"span",properties:$R[21925]={style:"color:#B8A965"},children:$R[21926]=[$R[21927]={type:"text",value:" text"}]},$R[21928]={type:"element",tagName:"span",properties:$R[21929]={style:"color:#666666"},children:$R[21930]=[$R[21931]={type:"text",value:":"}]},$R[21932]={type:"element",tagName:"span",properties:$R[21933]={style:"color:#666666"},children:$R[21934]=[$R[21935]={type:"text",value:" {"}]}]},$R[21936]={type:"text",value:"\n"},$R[21937]={type:"element",tagName:"span",properties:$R[21938]={class:"line"},children:$R[21939]=[$R[21940]={type:"element",tagName:"span",properties:$R[21941]={style:"color:#B8A965"},children:$R[21942]=[$R[21943]={type:"text",value:" backgroundColor"}]},$R[21944]={type:"element",tagName:"span",properties:$R[21945]={style:"color:#666666"},children:$R[21946]=[$R[21947]={type:"text",value:":"}]},$R[21948]={type:"element",tagName:"span",properties:$R[21949]={style:"color:#C98A7D77"},children:$R[21950]=[$R[21951]={type:"text",value:" '"}]},$R[21952]={type:"element",tagName:"span",properties:$R[21953]={style:"color:#C98A7D"},children:$R[21954]=[$R[21955]={type:"text",value:"#000000"}]},$R[21956]={type:"element",tagName:"span",properties:$R[21957]={style:"color:#C98A7D77"},children:$R[21958]=[$R[21959]={type:"text",value:"'"}]},$R[21960]={type:"element",tagName:"span",properties:$R[21961]={style:"color:#666666"},children:$R[21962]=[$R[21963]={type:"text",value:","}]}]},$R[21964]={type:"text",value:"\n"},$R[21965]={type:"element",tagName:"span",properties:$R[21966]={class:"line"},children:$R[21967]=[$R[21968]={type:"element",tagName:"span",properties:$R[21969]={style:"color:#B8A965"},children:$R[21970]=[$R[21971]={type:"text",value:" color"}]},$R[21972]={type:"element",tagName:"span",properties:$R[21973]={style:"color:#666666"},children:$R[21974]=[$R[21975]={type:"text",value:":"}]},$R[21976]={type:"element",tagName:"span",properties:$R[21977]={style:"color:#C98A7D77"},children:$R[21978]=[$R[21979]={type:"text",value:" '"}]},$R[21980]={type:"element",tagName:"span",properties:$R[21981]={style:"color:#C98A7D"},children:$R[21982]=[$R[21983]={type:"text",value:"white"}]},$R[21984]={type:"element",tagName:"span",properties:$R[21985]={style:"color:#C98A7D77"},children:$R[21986]=[$R[21987]={type:"text",value:"'"}]}]},$R[21988]={type:"text",value:"\n"},$R[21989]={type:"element",tagName:"span",properties:$R[21990]={class:"line"},children:$R[21991]=[$R[21992]={type:"element",tagName:"span",properties:$R[21993]={style:"color:#666666"},children:$R[21994]=[$R[21995]={type:"text",value:" }"}]}]},$R[21996]={type:"text",value:"\n"},$R[21997]={type:"element",tagName:"span",properties:$R[21998]={class:"line"},children:$R[21999]=[$R[22000]={type:"element",tagName:"span",properties:$R[22001]={style:"color:#666666"},children:$R[22002]=[$R[22003]={type:"text",value:"}"}]}]},$R[22004]={type:"text",value:"\n"},$R[22005]={type:"element",tagName:"span",properties:$R[22006]={class:"line"},children:$R[22007]=[]},$R[22008]={type:"text",value:"\n"},$R[22009]={type:"element",tagName:"span",properties:$R[22010]={class:"line"},children:$R[22011]=[$R[22012]={type:"element",tagName:"span",properties:$R[22013]={style:"color:#666666"},children:$R[22014]=[$R[22015]={type:"text",value:"\x3C"}]},$R[22016]={type:"element",tagName:"span",properties:$R[22017]={style:"color:#4D9375"},children:$R[22018]=[$R[22019]={type:"text",value:"div"}]},$R[22020]={type:"element",tagName:"span",properties:$R[22021]={style:"color:#BD976A"},children:$R[22022]=[$R[22023]={type:"text",value:" style"}]},$R[22024]={type:"element",tagName:"span",properties:$R[22025]={style:"color:#666666"},children:$R[22026]=[$R[22027]={type:"text",value:"={"}]},$R[22028]={type:"element",tagName:"span",properties:$R[22029]={style:"color:#BD976A"},children:$R[22030]=[$R[22031]={type:"text",value:"style"}]},$R[22032]={type:"element",tagName:"span",properties:$R[22033]={style:"color:#666666"},children:$R[22034]=[$R[22035]={type:"text",value:"."}]},$R[22036]={type:"element",tagName:"span",properties:$R[22037]={style:"color:#BD976A"},children:$R[22038]=[$R[22039]={type:"text",value:"text"}]},$R[22040]={type:"element",tagName:"span",properties:$R[22041]={style:"color:#666666"},children:$R[22042]=[$R[22043]={type:"text",value:"}"}]},$R[22044]={type:"element",tagName:"span",properties:$R[22045]={style:"color:#666666"},children:$R[22046]=[$R[22047]={type:"text",value:" />"}]}]}]}]}]}},$R[22048]={children:$R[22049]=[$R[22050]={position:$R[22051]={start:$R[22052]={line:56,column:1,offset:1536},end:$R[22053]={line:57,column:60,offset:1676}},type:"text",value:"スタイルオブジェクトはプレーンな JavaScript のため、スタイルの条件分岐することや props から新たにスタイルをオーバーライドする事が容易となる。\n上記の手法に、擬似クラスや擬似要素、メディアクエリがサポートするためコミュニティによって様々なライブラリが作成された。"}],position:$R[22054]={start:$R[22055]={line:56,column:1,offset:1536},end:$R[22056]={line:57,column:60,offset:1676}},type:"paragraph"}],position:$R[22057]={end:$R[22058]={line:57,column:60,offset:1676},start:$R[22059]={line:36,column:1,offset:1072}},type:"section"},$R[22060]={children:$R[22061]=[$R[22062]={children:$R[22063]=[$R[22064]={position:$R[22065]={start:$R[22066]={line:59,column:5,offset:1682},end:$R[22067]={line:59,column:28,offset:1705}},type:"text",value:"styled-components という選択"}],id:"styled-components-という選択",level:3,plain:"styled-components という選択",position:$R[22068]={start:$R[22069]={line:59,column:1,offset:1678},end:$R[22070]={line:59,column:28,offset:1705}},type:"heading"},$R[22071]={children:$R[22072]=[$R[22073]={position:$R[22074]={start:$R[22075]={line:61,column:1,offset:1707},end:$R[22076]={line:62,column:67,offset:1826}},type:"text",value:"様々なライブラリが登場した中で、styled-components はある種パイオニア的な存在であった。\n同じ時期に登場したライブラリと比較して、styled-components は以下の特徴を持っていて、開発者にとって魅力的であった。"}],position:$R[22077]={start:$R[22078]={line:61,column:1,offset:1707},end:$R[22079]={line:62,column:67,offset:1826}},type:"paragraph"},$R[22080]={children:$R[22081]=[$R[22082]={children:$R[22083]=[$R[22084]={children:$R[22085]=[$R[22086]={position:$R[22087]={start:$R[22088]={line:64,column:3,offset:1830},end:$R[22089]={line:64,column:18,offset:1845}},type:"text",value:"依存 package が少ない"}],position:$R[22090]={start:$R[22091]={line:64,column:3,offset:1830},end:$R[22092]={line:64,column:18,offset:1845}},type:"paragraph"}],position:$R[22093]={start:$R[22094]={line:64,column:1,offset:1828},end:$R[22095]={line:64,column:18,offset:1845}},type:"listItem"},$R[22096]={children:$R[22097]=[$R[22098]={children:$R[22099]=[$R[22100]={position:$R[22101]={start:$R[22102]={line:65,column:3,offset:1848},end:$R[22103]={line:65,column:49,offset:1894}},type:"text",value:"template literal の中に今までの CSS とほぼ同じような書き味で記述できる"}],position:$R[22104]={start:$R[22105]={line:65,column:3,offset:1848},end:$R[22106]={line:65,column:49,offset:1894}},type:"paragraph"}],position:$R[22107]={start:$R[22108]={line:65,column:1,offset:1846},end:$R[22109]={line:65,column:49,offset:1894}},type:"listItem"}],position:$R[22110]={start:$R[22111]={line:64,column:1,offset:1828},end:$R[22112]={line:65,column:49,offset:1894}},type:"unorderedList"},$R[22113]={children:$R[22114]=[$R[22115]={position:$R[22116]={start:$R[22117]={line:67,column:1,offset:1896},end:$R[22118]={line:67,column:47,offset:1942}},type:"text",value:"これらの特徴は、styled-components は多くの開発者に支持される理由となった。"}],position:$R[22119]={start:$R[22120]={line:67,column:1,offset:1896},end:$R[22121]={line:67,column:47,offset:1942}},type:"paragraph"},$R[22122]={children:$R[22123]=[$R[22124]={position:$R[22125]={start:$R[22126]={line:69,column:1,offset:1944},end:$R[22127]={line:69,column:30,offset:1973}},type:"text",value:"2020 年の頃の記事を参照してしまい大変恐縮ではあるが、"},$R[22128]={children:$R[22129]=[$R[22130]={position:$R[22131]={start:$R[22132]={line:69,column:31,offset:1974},end:$R[22133]={line:69,column:40,offset:1983}},type:"text",value:"@takepepe"}],position:$R[22134]={start:$R[22135]={line:69,column:30,offset:1973},end:$R[22136]={line:69,column:71,offset:2014}},title:void 0,type:"link",url:"https://twitter.com/takepepe"},$R[22137]={position:$R[22138]={start:$R[22139]={line:69,column:71,offset:2014},end:$R[22140]={line:69,column:111,offset:2054}},type:"text",value:" さんが書いている、「経年劣化に耐える React Component の書き方"},$R[22141]={footnoteIndex:3,position:$R[22142]={start:$R[22143]={line:69,column:111,offset:2054},end:$R[22144]={line:69,column:115,offset:2058}},referenceIndex:1,type:"footnoteReference"},$R[22145]={position:$R[22146]={start:$R[22147]={line:69,column:115,offset:2058},end:$R[22148]={line:70,column:73,offset:2155}},type:"text",value:"」という記事は、とても筋が良いなと個人的に思う。\nDOM 層として実装した Component を styled-components でスタイリングするという技法は、今でも有効であると感じる。"}],position:$R[22149]={start:$R[22150]={line:69,column:1,offset:1944},end:$R[22151]={line:70,column:73,offset:2155}},type:"paragraph"},$R[22152]={children:$R[22153]=[$R[22154]={position:$R[22155]={start:$R[22156]={line:74,column:1,offset:2275},end:$R[22157]={line:75,column:78,offset:2461}},type:"text",value:"styled-components の大胆にスタイルできる利点が少々失われてしまうが、今までの BEM 記法や CSS Modules へのフォールバックが容易であり、それでいてスタイルのコロケーションが可能である。\nこういった選択に自由度がありつつ、プロダクトごとに規約を持たせることで開発体験を上げることができるのは、styled-components の魅力である。"}],position:$R[22158]={start:$R[22159]={line:74,column:1,offset:2275},end:$R[22160]={line:75,column:78,offset:2461}},type:"paragraph"}],position:$R[22161]={end:$R[22162]={line:75,column:78,offset:2461},start:$R[22163]={line:59,column:1,offset:1678}},type:"section"}],position:$R[22164]={end:$R[22165]={line:75,column:78,offset:2461},start:$R[22166]={line:34,column:1,offset:1046}},type:"section"},$R[22167]={children:$R[22168]=[$R[22169]={children:$R[22170]=[$R[22171]={position:$R[22172]={start:$R[22173]={line:77,column:4,offset:2466},end:$R[22174]={line:77,column:25,offset:2487}},type:"text",value:"styled-components の現在"}],id:"styled-components-の現在",level:2,plain:"styled-components の現在",position:$R[22175]={start:$R[22176]={line:77,column:1,offset:2463},end:$R[22177]={line:77,column:25,offset:2487}},type:"heading"},$R[22178]={children:$R[22179]=[$R[22180]={children:$R[22181]=[$R[22182]={position:$R[22183]={start:$R[22184]={line:79,column:5,offset:2493},end:$R[22185]={line:79,column:32,offset:2520}},type:"text",value:"React Server Components の登場"}],id:"react-server-components-の登場",level:3,plain:"React Server Components の登場",position:$R[22186]={start:$R[22187]={line:79,column:1,offset:2489},end:$R[22188]={line:79,column:32,offset:2520}},type:"heading"},$R[22189]={children:$R[22190]=[$R[22191]={position:$R[22192]={start:$R[22193]={line:81,column:1,offset:2522},end:$R[22194]={line:81,column:86,offset:2607}},type:"text",value:"2023 年の 5 月、Vercel は Next.js 13.4 を発表し、React Server Components の上で動作する最初のフレームワークとなった。"},$R[22195]={footnoteIndex:4,position:$R[22196]={start:$R[22197]={line:81,column:86,offset:2607},end:$R[22198]={line:81,column:90,offset:2611}},referenceIndex:1,type:"footnoteReference"},$R[22199]={position:$R[22200]={start:$R[22201]={line:81,column:90,offset:2611},end:$R[22202]={line:82,column:101,offset:2712}},type:"text",value:"\nまた同じ月に React Core team は React Labs からの発表として React Server Components をよりプリミティブな形で提供することを目指していると発表した。"},$R[22203]={footnoteIndex:5,position:$R[22204]={start:$R[22205]={line:82,column:101,offset:2712},end:$R[22206]={line:82,column:105,offset:2716}},referenceIndex:1,type:"footnoteReference"}],position:$R[22207]={start:$R[22208]={line:81,column:1,offset:2522},end:$R[22209]={line:82,column:105,offset:2716}},type:"paragraph"},$R[22210]={children:$R[22211]=[$R[22212]={position:$R[22213]={start:$R[22214]={line:88,column:1,offset:3024},end:$R[22215]={line:88,column:30,offset:3053}},type:"text",value:"React Server Components の RFC"},$R[22216]={footnoteIndex:6,position:$R[22217]={start:$R[22218]={line:88,column:30,offset:3053},end:$R[22219]={line:88,column:34,offset:3057}},referenceIndex:1,type:"footnoteReference"},$R[22220]={position:$R[22221]={start:$R[22222]={line:88,column:34,offset:3057},end:$R[22223]={line:88,column:89,offset:3112}},type:"text",value:" では、React がよりサーバーを活用することでパフォーマンスやバンドルサイズを改善することを目指している。"}],position:$R[22224]={start:$R[22225]={line:88,column:1,offset:3024},end:$R[22226]={line:88,column:89,offset:3112}},type:"paragraph"},$R[22227]={children:$R[22228]=[$R[22229]={position:$R[22230]={start:$R[22231]={line:90,column:1,offset:3114},end:$R[22232]={line:92,column:30,offset:3266}},type:"text",value:"まだまだ発展途上な概念ではあるが、React を使って開発をする人や、React を使って作られたアプリケーションのユーザーにとって、画期的な機能であることは間違いない。\nだが、この概念の登場によって頭を抱え、存続の危機に陥るライブラリもある。\nstyled-components もその 1 つである。"}],position:$R[22233]={start:$R[22234]={line:90,column:1,offset:3114},end:$R[22235]={line:92,column:30,offset:3266}},type:"paragraph"},$R[22236]={children:$R[22237]=[$R[22238]={children:$R[22239]=[$R[22240]={position:$R[22241]={start:$R[22242]={line:96,column:6,offset:3501},end:$R[22243]={line:96,column:29,offset:3524}},type:"text",value:"styled-components の動作原理"}],id:"styled-components-の動作原理",level:4,plain:"styled-components の動作原理",position:$R[22244]={start:$R[22245]={line:96,column:1,offset:3496},end:$R[22246]={line:96,column:29,offset:3524}},type:"heading"},$R[22247]={children:$R[22248]=[$R[22249]={position:$R[22250]={start:$R[22251]={line:98,column:1,offset:3526},end:$R[22252]={line:99,column:42,offset:3661}},type:"text",value:"ランタイム CSS in JS という集合に分けられる、 styled-components や emotion などのライブラリは、JavaScript の実行時にスタイルを生成する。\n生成されたスタイルは DOM API を介して、style タグとして挿入される。"}],position:$R[22253]={start:$R[22254]={line:98,column:1,offset:3526},end:$R[22255]={line:99,column:42,offset:3661}},type:"paragraph"},$R[22256]={filename:"dom.ts ts",lang:"ts",position:$R[22257]={start:$R[22258]={line:101,column:1,offset:3663},end:$R[22259]={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[22260]={type:"root",children:$R[22261]=[$R[22262]={type:"element",tagName:"pre",properties:$R[22263]={class:"shiki vitesse-dark",style:"color: #dbd7cacc;",tabindex:"0"},children:$R[22264]=[$R[22265]={type:"element",tagName:"code",properties:$R[22266]={},children:$R[22267]=[$R[22268]={type:"element",tagName:"span",properties:$R[22269]={class:"line"},children:$R[22270]=[$R[22271]={type:"element",tagName:"span",properties:$R[22272]={style:"color:#758575DD"},children:$R[22273]=[$R[22274]={type:"text",value:"/** Create a style element inside `target` or \x3Chead> after the last */"}]}]},$R[22275]={type:"text",value:"\n"},$R[22276]={type:"element",tagName:"span",properties:$R[22277]={class:"line"},children:$R[22278]=[$R[22279]={type:"element",tagName:"span",properties:$R[22280]={style:"color:#4D9375"},children:$R[22281]=[$R[22282]={type:"text",value:"export"}]},$R[22283]={type:"element",tagName:"span",properties:$R[22284]={style:"color:#CB7676"},children:$R[22285]=[$R[22286]={type:"text",value:" const "}]},$R[22287]={type:"element",tagName:"span",properties:$R[22288]={style:"color:#80A665"},children:$R[22289]=[$R[22290]={type:"text",value:"makeStyleTag"}]},$R[22291]={type:"element",tagName:"span",properties:$R[22292]={style:"color:#666666"},children:$R[22293]=[$R[22294]={type:"text",value:" ="}]},$R[22295]={type:"element",tagName:"span",properties:$R[22296]={style:"color:#666666"},children:$R[22297]=[$R[22298]={type:"text",value:" ("}]},$R[22299]={type:"element",tagName:"span",properties:$R[22300]={style:"color:#BD976A"},children:$R[22301]=[$R[22302]={type:"text",value:"target"}]},$R[22303]={type:"element",tagName:"span",properties:$R[22304]={style:"color:#CB7676"},children:$R[22305]=[$R[22306]={type:"text",value:"?"}]},$R[22307]={type:"element",tagName:"span",properties:$R[22308]={style:"color:#666666"},children:$R[22309]=[$R[22310]={type:"text",value:": "}]},$R[22311]={type:"element",tagName:"span",properties:$R[22312]={style:"color:#5DA994"},children:$R[22313]=[$R[22314]={type:"text",value:"InsertionTarget"}]},$R[22315]={type:"element",tagName:"span",properties:$R[22316]={style:"color:#666666"},children:$R[22317]=[$R[22318]={type:"text",value:" | "}]},$R[22319]={type:"element",tagName:"span",properties:$R[22320]={style:"color:#CB7676"},children:$R[22321]=[$R[22322]={type:"text",value:"undefined"}]},$R[22323]={type:"element",tagName:"span",properties:$R[22324]={style:"color:#666666"},children:$R[22325]=[$R[22326]={type:"text",value:"):"}]},$R[22327]={type:"element",tagName:"span",properties:$R[22328]={style:"color:#5DA994"},children:$R[22329]=[$R[22330]={type:"text",value:" HTMLStyleElement"}]},$R[22331]={type:"element",tagName:"span",properties:$R[22332]={style:"color:#666666"},children:$R[22333]=[$R[22334]={type:"text",value:" =>"}]},$R[22335]={type:"element",tagName:"span",properties:$R[22336]={style:"color:#666666"},children:$R[22337]=[$R[22338]={type:"text",value:" {"}]}]},$R[22339]={type:"text",value:"\n"},$R[22340]={type:"element",tagName:"span",properties:$R[22341]={class:"line"},children:$R[22342]=[$R[22343]={type:"element",tagName:"span",properties:$R[22344]={style:"color:#CB7676"},children:$R[22345]=[$R[22346]={type:"text",value:" const "}]},$R[22347]={type:"element",tagName:"span",properties:$R[22348]={style:"color:#BD976A"},children:$R[22349]=[$R[22350]={type:"text",value:"head"}]},$R[22351]={type:"element",tagName:"span",properties:$R[22352]={style:"color:#666666"},children:$R[22353]=[$R[22354]={type:"text",value:" ="}]},$R[22355]={type:"element",tagName:"span",properties:$R[22356]={style:"color:#BD976A"},children:$R[22357]=[$R[22358]={type:"text",value:" document"}]},$R[22359]={type:"element",tagName:"span",properties:$R[22360]={style:"color:#666666"},children:$R[22361]=[$R[22362]={type:"text",value:"."}]},$R[22363]={type:"element",tagName:"span",properties:$R[22364]={style:"color:#BD976A"},children:$R[22365]=[$R[22366]={type:"text",value:"head"}]},$R[22367]={type:"element",tagName:"span",properties:$R[22368]={style:"color:#666666"},children:$R[22369]=[$R[22370]={type:"text",value:";"}]}]},$R[22371]={type:"text",value:"\n"},$R[22372]={type:"element",tagName:"span",properties:$R[22373]={class:"line"},children:$R[22374]=[$R[22375]={type:"element",tagName:"span",properties:$R[22376]={style:"color:#CB7676"},children:$R[22377]=[$R[22378]={type:"text",value:" const "}]},$R[22379]={type:"element",tagName:"span",properties:$R[22380]={style:"color:#BD976A"},children:$R[22381]=[$R[22382]={type:"text",value:"parent"}]},$R[22383]={type:"element",tagName:"span",properties:$R[22384]={style:"color:#666666"},children:$R[22385]=[$R[22386]={type:"text",value:" ="}]},$R[22387]={type:"element",tagName:"span",properties:$R[22388]={style:"color:#BD976A"},children:$R[22389]=[$R[22390]={type:"text",value:" target"}]},$R[22391]={type:"element",tagName:"span",properties:$R[22392]={style:"color:#CB7676"},children:$R[22393]=[$R[22394]={type:"text",value:" || "}]},$R[22395]={type:"element",tagName:"span",properties:$R[22396]={style:"color:#BD976A"},children:$R[22397]=[$R[22398]={type:"text",value:"head"}]},$R[22399]={type:"element",tagName:"span",properties:$R[22400]={style:"color:#666666"},children:$R[22401]=[$R[22402]={type:"text",value:";"}]}]},$R[22403]={type:"text",value:"\n"},$R[22404]={type:"element",tagName:"span",properties:$R[22405]={class:"line"},children:$R[22406]=[$R[22407]={type:"element",tagName:"span",properties:$R[22408]={style:"color:#CB7676"},children:$R[22409]=[$R[22410]={type:"text",value:" const "}]},$R[22411]={type:"element",tagName:"span",properties:$R[22412]={style:"color:#BD976A"},children:$R[22413]=[$R[22414]={type:"text",value:"style"}]},$R[22415]={type:"element",tagName:"span",properties:$R[22416]={style:"color:#666666"},children:$R[22417]=[$R[22418]={type:"text",value:" ="}]},$R[22419]={type:"element",tagName:"span",properties:$R[22420]={style:"color:#BD976A"},children:$R[22421]=[$R[22422]={type:"text",value:" document"}]},$R[22423]={type:"element",tagName:"span",properties:$R[22424]={style:"color:#666666"},children:$R[22425]=[$R[22426]={type:"text",value:"."}]},$R[22427]={type:"element",tagName:"span",properties:$R[22428]={style:"color:#80A665"},children:$R[22429]=[$R[22430]={type:"text",value:"createElement"}]},$R[22431]={type:"element",tagName:"span",properties:$R[22432]={style:"color:#666666"},children:$R[22433]=[$R[22434]={type:"text",value:"("}]},$R[22435]={type:"element",tagName:"span",properties:$R[22436]={style:"color:#C98A7D77"},children:$R[22437]=[$R[22438]={type:"text",value:"'"}]},$R[22439]={type:"element",tagName:"span",properties:$R[22440]={style:"color:#C98A7D"},children:$R[22441]=[$R[22442]={type:"text",value:"style"}]},$R[22443]={type:"element",tagName:"span",properties:$R[22444]={style:"color:#C98A7D77"},children:$R[22445]=[$R[22446]={type:"text",value:"'"}]},$R[22447]={type:"element",tagName:"span",properties:$R[22448]={style:"color:#666666"},children:$R[22449]=[$R[22450]={type:"text",value:");"}]}]},$R[22451]={type:"text",value:"\n"},$R[22452]={type:"element",tagName:"span",properties:$R[22453]={class:"line"},children:$R[22454]=[$R[22455]={type:"element",tagName:"span",properties:$R[22456]={style:"color:#CB7676"},children:$R[22457]=[$R[22458]={type:"text",value:" const "}]},$R[22459]={type:"element",tagName:"span",properties:$R[22460]={style:"color:#BD976A"},children:$R[22461]=[$R[22462]={type:"text",value:"prevStyle"}]},$R[22463]={type:"element",tagName:"span",properties:$R[22464]={style:"color:#666666"},children:$R[22465]=[$R[22466]={type:"text",value:" ="}]},$R[22467]={type:"element",tagName:"span",properties:$R[22468]={style:"color:#80A665"},children:$R[22469]=[$R[22470]={type:"text",value:" findLastStyleTag"}]},$R[22471]={type:"element",tagName:"span",properties:$R[22472]={style:"color:#666666"},children:$R[22473]=[$R[22474]={type:"text",value:"("}]},$R[22475]={type:"element",tagName:"span",properties:$R[22476]={style:"color:#BD976A"},children:$R[22477]=[$R[22478]={type:"text",value:"parent"}]},$R[22479]={type:"element",tagName:"span",properties:$R[22480]={style:"color:#666666"},children:$R[22481]=[$R[22482]={type:"text",value:");"}]}]},$R[22483]={type:"text",value:"\n"},$R[22484]={type:"element",tagName:"span",properties:$R[22485]={class:"line"},children:$R[22486]=[$R[22487]={type:"element",tagName:"span",properties:$R[22488]={style:"color:#CB7676"},children:$R[22489]=[$R[22490]={type:"text",value:" const "}]},$R[22491]={type:"element",tagName:"span",properties:$R[22492]={style:"color:#BD976A"},children:$R[22493]=[$R[22494]={type:"text",value:"nextSibling"}]},$R[22495]={type:"element",tagName:"span",properties:$R[22496]={style:"color:#666666"},children:$R[22497]=[$R[22498]={type:"text",value:" ="}]},$R[22499]={type:"element",tagName:"span",properties:$R[22500]={style:"color:#BD976A"},children:$R[22501]=[$R[22502]={type:"text",value:" prevStyle"}]},$R[22503]={type:"element",tagName:"span",properties:$R[22504]={style:"color:#CB7676"},children:$R[22505]=[$R[22506]={type:"text",value:" !== undefined ? "}]},$R[22507]={type:"element",tagName:"span",properties:$R[22508]={style:"color:#BD976A"},children:$R[22509]=[$R[22510]={type:"text",value:"prevStyle"}]},$R[22511]={type:"element",tagName:"span",properties:$R[22512]={style:"color:#666666"},children:$R[22513]=[$R[22514]={type:"text",value:"."}]},$R[22515]={type:"element",tagName:"span",properties:$R[22516]={style:"color:#BD976A"},children:$R[22517]=[$R[22518]={type:"text",value:"nextSibling"}]},$R[22519]={type:"element",tagName:"span",properties:$R[22520]={style:"color:#CB7676"},children:$R[22521]=[$R[22522]={type:"text",value:" : null"}]},$R[22523]={type:"element",tagName:"span",properties:$R[22524]={style:"color:#666666"},children:$R[22525]=[$R[22526]={type:"text",value:";"}]}]},$R[22527]={type:"text",value:"\n"},$R[22528]={type:"element",tagName:"span",properties:$R[22529]={class:"line"},children:$R[22530]=[]},$R[22531]={type:"text",value:"\n"},$R[22532]={type:"element",tagName:"span",properties:$R[22533]={class:"line"},children:$R[22534]=[$R[22535]={type:"element",tagName:"span",properties:$R[22536]={style:"color:#BD976A"},children:$R[22537]=[$R[22538]={type:"text",value:" style"}]},$R[22539]={type:"element",tagName:"span",properties:$R[22540]={style:"color:#666666"},children:$R[22541]=[$R[22542]={type:"text",value:"."}]},$R[22543]={type:"element",tagName:"span",properties:$R[22544]={style:"color:#80A665"},children:$R[22545]=[$R[22546]={type:"text",value:"setAttribute"}]},$R[22547]={type:"element",tagName:"span",properties:$R[22548]={style:"color:#666666"},children:$R[22549]=[$R[22550]={type:"text",value:"("}]},$R[22551]={type:"element",tagName:"span",properties:$R[22552]={style:"color:#BD976A"},children:$R[22553]=[$R[22554]={type:"text",value:"SC_ATTR"}]},$R[22555]={type:"element",tagName:"span",properties:$R[22556]={style:"color:#666666"},children:$R[22557]=[$R[22558]={type:"text",value:","}]},$R[22559]={type:"element",tagName:"span",properties:$R[22560]={style:"color:#BD976A"},children:$R[22561]=[$R[22562]={type:"text",value:" SC_ATTR_ACTIVE"}]},$R[22563]={type:"element",tagName:"span",properties:$R[22564]={style:"color:#666666"},children:$R[22565]=[$R[22566]={type:"text",value:");"}]}]},$R[22567]={type:"text",value:"\n"},$R[22568]={type:"element",tagName:"span",properties:$R[22569]={class:"line"},children:$R[22570]=[$R[22571]={type:"element",tagName:"span",properties:$R[22572]={style:"color:#BD976A"},children:$R[22573]=[$R[22574]={type:"text",value:" style"}]},$R[22575]={type:"element",tagName:"span",properties:$R[22576]={style:"color:#666666"},children:$R[22577]=[$R[22578]={type:"text",value:"."}]},$R[22579]={type:"element",tagName:"span",properties:$R[22580]={style:"color:#80A665"},children:$R[22581]=[$R[22582]={type:"text",value:"setAttribute"}]},$R[22583]={type:"element",tagName:"span",properties:$R[22584]={style:"color:#666666"},children:$R[22585]=[$R[22586]={type:"text",value:"("}]},$R[22587]={type:"element",tagName:"span",properties:$R[22588]={style:"color:#BD976A"},children:$R[22589]=[$R[22590]={type:"text",value:"SC_ATTR_VERSION"}]},$R[22591]={type:"element",tagName:"span",properties:$R[22592]={style:"color:#666666"},children:$R[22593]=[$R[22594]={type:"text",value:","}]},$R[22595]={type:"element",tagName:"span",properties:$R[22596]={style:"color:#BD976A"},children:$R[22597]=[$R[22598]={type:"text",value:" SC_VERSION"}]},$R[22599]={type:"element",tagName:"span",properties:$R[22600]={style:"color:#666666"},children:$R[22601]=[$R[22602]={type:"text",value:");"}]}]},$R[22603]={type:"text",value:"\n"},$R[22604]={type:"element",tagName:"span",properties:$R[22605]={class:"line"},children:$R[22606]=[]},$R[22607]={type:"text",value:"\n"},$R[22608]={type:"element",tagName:"span",properties:$R[22609]={class:"line"},children:$R[22610]=[$R[22611]={type:"element",tagName:"span",properties:$R[22612]={style:"color:#CB7676"},children:$R[22613]=[$R[22614]={type:"text",value:" const "}]},$R[22615]={type:"element",tagName:"span",properties:$R[22616]={style:"color:#BD976A"},children:$R[22617]=[$R[22618]={type:"text",value:"nonce"}]},$R[22619]={type:"element",tagName:"span",properties:$R[22620]={style:"color:#666666"},children:$R[22621]=[$R[22622]={type:"text",value:" ="}]},$R[22623]={type:"element",tagName:"span",properties:$R[22624]={style:"color:#80A665"},children:$R[22625]=[$R[22626]={type:"text",value:" getNonce"}]},$R[22627]={type:"element",tagName:"span",properties:$R[22628]={style:"color:#666666"},children:$R[22629]=[$R[22630]={type:"text",value:"();"}]}]},$R[22631]={type:"text",value:"\n"},$R[22632]={type:"element",tagName:"span",properties:$R[22633]={class:"line"},children:$R[22634]=[]},$R[22635]={type:"text",value:"\n"},$R[22636]={type:"element",tagName:"span",properties:$R[22637]={class:"line"},children:$R[22638]=[$R[22639]={type:"element",tagName:"span",properties:$R[22640]={style:"color:#4D9375"},children:$R[22641]=[$R[22642]={type:"text",value:" if"}]},$R[22643]={type:"element",tagName:"span",properties:$R[22644]={style:"color:#666666"},children:$R[22645]=[$R[22646]={type:"text",value:" ("}]},$R[22647]={type:"element",tagName:"span",properties:$R[22648]={style:"color:#BD976A"},children:$R[22649]=[$R[22650]={type:"text",value:"nonce"}]},$R[22651]={type:"element",tagName:"span",properties:$R[22652]={style:"color:#666666"},children:$R[22653]=[$R[22654]={type:"text",value:")"}]},$R[22655]={type:"element",tagName:"span",properties:$R[22656]={style:"color:#BD976A"},children:$R[22657]=[$R[22658]={type:"text",value:" style"}]},$R[22659]={type:"element",tagName:"span",properties:$R[22660]={style:"color:#666666"},children:$R[22661]=[$R[22662]={type:"text",value:"."}]},$R[22663]={type:"element",tagName:"span",properties:$R[22664]={style:"color:#80A665"},children:$R[22665]=[$R[22666]={type:"text",value:"setAttribute"}]},$R[22667]={type:"element",tagName:"span",properties:$R[22668]={style:"color:#666666"},children:$R[22669]=[$R[22670]={type:"text",value:"("}]},$R[22671]={type:"element",tagName:"span",properties:$R[22672]={style:"color:#C98A7D77"},children:$R[22673]=[$R[22674]={type:"text",value:"'"}]},$R[22675]={type:"element",tagName:"span",properties:$R[22676]={style:"color:#C98A7D"},children:$R[22677]=[$R[22678]={type:"text",value:"nonce"}]},$R[22679]={type:"element",tagName:"span",properties:$R[22680]={style:"color:#C98A7D77"},children:$R[22681]=[$R[22682]={type:"text",value:"'"}]},$R[22683]={type:"element",tagName:"span",properties:$R[22684]={style:"color:#666666"},children:$R[22685]=[$R[22686]={type:"text",value:","}]},$R[22687]={type:"element",tagName:"span",properties:$R[22688]={style:"color:#BD976A"},children:$R[22689]=[$R[22690]={type:"text",value:" nonce"}]},$R[22691]={type:"element",tagName:"span",properties:$R[22692]={style:"color:#666666"},children:$R[22693]=[$R[22694]={type:"text",value:");"}]}]},$R[22695]={type:"text",value:"\n"},$R[22696]={type:"element",tagName:"span",properties:$R[22697]={class:"line"},children:$R[22698]=[]},$R[22699]={type:"text",value:"\n"},$R[22700]={type:"element",tagName:"span",properties:$R[22701]={class:"line"},children:$R[22702]=[$R[22703]={type:"element",tagName:"span",properties:$R[22704]={style:"color:#BD976A"},children:$R[22705]=[$R[22706]={type:"text",value:" parent"}]},$R[22707]={type:"element",tagName:"span",properties:$R[22708]={style:"color:#666666"},children:$R[22709]=[$R[22710]={type:"text",value:"."}]},$R[22711]={type:"element",tagName:"span",properties:$R[22712]={style:"color:#80A665"},children:$R[22713]=[$R[22714]={type:"text",value:"insertBefore"}]},$R[22715]={type:"element",tagName:"span",properties:$R[22716]={style:"color:#666666"},children:$R[22717]=[$R[22718]={type:"text",value:"("}]},$R[22719]={type:"element",tagName:"span",properties:$R[22720]={style:"color:#BD976A"},children:$R[22721]=[$R[22722]={type:"text",value:"style"}]},$R[22723]={type:"element",tagName:"span",properties:$R[22724]={style:"color:#666666"},children:$R[22725]=[$R[22726]={type:"text",value:","}]},$R[22727]={type:"element",tagName:"span",properties:$R[22728]={style:"color:#BD976A"},children:$R[22729]=[$R[22730]={type:"text",value:" nextSibling"}]},$R[22731]={type:"element",tagName:"span",properties:$R[22732]={style:"color:#666666"},children:$R[22733]=[$R[22734]={type:"text",value:");"}]}]},$R[22735]={type:"text",value:"\n"},$R[22736]={type:"element",tagName:"span",properties:$R[22737]={class:"line"},children:$R[22738]=[]},$R[22739]={type:"text",value:"\n"},$R[22740]={type:"element",tagName:"span",properties:$R[22741]={class:"line"},children:$R[22742]=[$R[22743]={type:"element",tagName:"span",properties:$R[22744]={style:"color:#4D9375"},children:$R[22745]=[$R[22746]={type:"text",value:" return"}]},$R[22747]={type:"element",tagName:"span",properties:$R[22748]={style:"color:#BD976A"},children:$R[22749]=[$R[22750]={type:"text",value:" style"}]},$R[22751]={type:"element",tagName:"span",properties:$R[22752]={style:"color:#666666"},children:$R[22753]=[$R[22754]={type:"text",value:";"}]}]},$R[22755]={type:"text",value:"\n"},$R[22756]={type:"element",tagName:"span",properties:$R[22757]={class:"line"},children:$R[22758]=[$R[22759]={type:"element",tagName:"span",properties:$R[22760]={style:"color:#666666"},children:$R[22761]=[$R[22762]={type:"text",value:"};"}]}]}]}]}]}},$R[22763]={meta:$R[22764]={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[22765]={images:$R[22766]=[$R[22767]={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[22768]={images:$R[22769]=[$R[22770]={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[22771]={start:$R[22772]={line:123,column:1,offset:4320},end:$R[22773]={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[22774]={children:$R[22775]=[$R[22776]={position:$R[22777]={start:$R[22778]={line:125,column:1,offset:4474},end:$R[22779]={line:125,column:127,offset:4600}},type:"text",value:"しかし、React Server Components では DOM API を使用できないため、styled-components のようなランタイム CSS in JS ライブラリは、React Server Components 上で動作しない。"}],position:$R[22780]={start:$R[22781]={line:125,column:1,offset:4474},end:$R[22782]={line:125,column:127,offset:4600}},type:"paragraph"}],position:$R[22783]={end:$R[22784]={line:125,column:127,offset:4600},start:$R[22785]={line:96,column:1,offset:3496}},type:"section"}],position:$R[22786]={end:$R[22787]={line:125,column:127,offset:4600},start:$R[22788]={line:79,column:1,offset:2489}},type:"section"},$R[22789]={children:$R[22790]=[$R[22791]={children:$R[22792]=[$R[22793]={position:$R[22794]={start:$R[22795]={line:127,column:5,offset:4606},end:$R[22796]={line:127,column:33,offset:4634}},type:"text",value:"React Server Components への対応"}],id:"react-server-components-への対応",level:3,plain:"React Server Components への対応",position:$R[22797]={start:$R[22798]={line:127,column:1,offset:4602},end:$R[22799]={line:127,column:33,offset:4634}},type:"heading"},$R[22800]={children:$R[22801]=[$R[22802]={position:$R[22803]={start:$R[22804]={line:129,column:1,offset:4636},end:$R[22805]={line:129,column:22,offset:4657}},type:"text",value:"これに対し、React は v19 では "},$R[22806]={position:$R[22807]={start:$R[22808]={line:129,column:22,offset:4657},end:$R[22809]={line:129,column:30,offset:4665}},type:"inlineCode",value:"\x3Cbody>"},$R[22810]={position:$R[22811]={start:$R[22812]={line:129,column:30,offset:4665},end:$R[22813]={line:129,column:37,offset:4672}},type:"text",value:" の中にある "},$R[22814]={position:$R[22815]={start:$R[22816]={line:129,column:37,offset:4672},end:$R[22817]={line:129,column:46,offset:4681}},type:"inlineCode",value:"\x3Cstyle>"},$R[22818]={position:$R[22819]={start:$R[22820]={line:129,column:46,offset:4681},end:$R[22821]={line:129,column:52,offset:4687}},type:"text",value:" を自動で "},$R[22822]={position:$R[22823]={start:$R[22824]={line:129,column:52,offset:4687},end:$R[22825]={line:129,column:60,offset:4695}},type:"inlineCode",value:"\x3Chead>"},$R[22826]={position:$R[22827]={start:$R[22828]={line:129,column:60,offset:4695},end:$R[22829]={line:129,column:74,offset:4709}},type:"text",value:" に巻き上げる機能を追加した"},$R[22830]={footnoteIndex:7,position:$R[22831]={start:$R[22832]={line:129,column:74,offset:4709},end:$R[22833]={line:129,column:78,offset:4713}},referenceIndex:1,type:"footnoteReference"},$R[22834]={position:$R[22835]={start:$R[22836]={line:129,column:78,offset:4713},end:$R[22837]={line:130,column:58,offset:4772}},type:"text",value:"。\n詳しい挙動のイメージはブログを参照してほしいが、この機能を使った新しい世代の CSS in JS ライブラリがある"},$R[22838]={footnoteIndex:8,position:$R[22839]={start:$R[22840]={line:130,column:58,offset:4772},end:$R[22841]={line:130,column:62,offset:4776}},referenceIndex:1,type:"footnoteReference"},$R[22842]={position:$R[22843]={start:$R[22844]={line:130,column:62,offset:4776},end:$R[22845]={line:131,column:57,offset:4834}},type:"text",value:"。\nstyle tag hoisting は DOM API を使用せず、React のレンダリングの流れに乗って、"},$R[22846]={position:$R[22847]={start:$R[22848]={line:131,column:57,offset:4834},end:$R[22849]={line:131,column:66,offset:4843}},type:"inlineCode",value:"\x3Cstyle>"},$R[22850]={position:$R[22851]={start:$R[22852]={line:131,column:66,offset:4843},end:$R[22853]={line:131,column:71,offset:4848}},type:"text",value:" タグを "},$R[22854]={position:$R[22855]={start:$R[22856]={line:131,column:71,offset:4848},end:$R[22857]={line:131,column:79,offset:4856}},type:"inlineCode",value:"\x3Chead>"},$R[22858]={position:$R[22859]={start:$R[22860]={line:131,column:79,offset:4856},end:$R[22861]={line:132,column:71,offset:4935}},type:"text",value:" に挿入できる。\nこの機能は、React Server Components の上で動作する CSS in JS ライブラリにとって、非常に重要な機能である。"}],position:$R[22862]={start:$R[22863]={line:129,column:1,offset:4636},end:$R[22864]={line:132,column:71,offset:4935}},type:"paragraph"}],position:$R[22865]={end:$R[22866]={line:132,column:71,offset:4935},start:$R[22867]={line:127,column:1,offset:4602}},type:"section"},$R[22868]={children:$R[22869]=[$R[22870]={children:$R[22871]=[$R[22872]={position:$R[22873]={start:$R[22874]={line:138,column:5,offset:5221},end:$R[22875]={line:138,column:26,offset:5242}},type:"text",value:"styled-components の選択"}],id:"styled-components-の選択",level:3,plain:"styled-components の選択",position:$R[22876]={start:$R[22877]={line:138,column:1,offset:5217},end:$R[22878]={line:138,column:26,offset:5242}},type:"heading"},$R[22879]={children:$R[22880]=[$R[22881]={position:$R[22882]={start:$R[22883]={line:140,column:1,offset:5244},end:$R[22884]={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[22885]={start:$R[22886]={line:140,column:1,offset:5244},end:$R[22887]={line:142,column:53,offset:5450}},type:"paragraph"},$R[22888]={children:$R[22889]=[$R[22890]={position:$R[22891]={start:$R[22892]={line:144,column:1,offset:5452},end:$R[22893]={line:147,column:45,offset:5647}},type:"text",value:"私達は、この選択を決して責めることはできないし、責めるべきではない。\nstyled-components は長い間、CSS in JS のパイオニアとして多くの開発者に支持されてきた。\nそして、新機能を追加しないと判断した今もなお、UX を損なわない程度にバグ修正などはしばらく行うとも発表している。\n私達は、styled-components の選択を尊重し、感謝の意を表するべきである。"}],position:$R[22894]={start:$R[22895]={line:144,column:1,offset:5452},end:$R[22896]={line:147,column:45,offset:5647}},type:"paragraph"},$R[22897]={children:$R[22898]=[$R[22899]={position:$R[22900]={start:$R[22901]={line:149,column:1,offset:5649},end:$R[22902]={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[22903]={start:$R[22904]={line:149,column:1,offset:5649},end:$R[22905]={line:152,column:70,offset:6012}},type:"paragraph"}],position:$R[22906]={end:$R[22907]={line:152,column:70,offset:6012},start:$R[22908]={line:138,column:1,offset:5217}},type:"section"}],position:$R[22909]={end:$R[22910]={line:152,column:70,offset:6012},start:$R[22911]={line:77,column:1,offset:2463}},type:"section"},$R[22912]={children:$R[22913]=[$R[22914]={children:$R[22915]=[$R[22916]={position:$R[22917]={start:$R[22918]={line:154,column:4,offset:6017},end:$R[22919]={line:154,column:27,offset:6040}},type:"text",value:"styled-components とこれから"}],id:"styled-components-とこれから",level:2,plain:"styled-components とこれから",position:$R[22920]={start:$R[22921]={line:154,column:1,offset:6014},end:$R[22922]={line:154,column:27,offset:6040}},type:"heading"},$R[22923]={children:$R[22924]=[$R[22925]={children:$R[22926]=[$R[22927]={position:$R[22928]={start:$R[22929]={line:156,column:5,offset:6046},end:$R[22930]={line:156,column:9,offset:6050}},type:"text",value:"移行先?"}],id:"移行先",level:3,plain:"移行先?",position:$R[22931]={start:$R[22932]={line:156,column:1,offset:6042},end:$R[22933]={line:156,column:9,offset:6050}},type:"heading"},$R[22934]={children:$R[22935]=[$R[22936]={position:$R[22937]={start:$R[22938]={line:158,column:1,offset:6052},end:$R[22939]={line:159,column:23,offset:6129}},type:"text",value:"styled-components のメンテナンスモードに対して、私達はどのように対応すれば良いのだろうか。\n対応を検討するときに、次の観点が重要である。"}],position:$R[22940]={start:$R[22941]={line:158,column:1,offset:6052},end:$R[22942]={line:159,column:23,offset:6129}},type:"paragraph"},$R[22943]={children:$R[22944]=[$R[22945]={children:$R[22946]=[$R[22947]={children:$R[22948]=[$R[22949]={position:$R[22950]={start:$R[22951]={line:161,column:3,offset:6133},end:$R[22952]={line:161,column:25,offset:6155}},type:"text",value:"CSS in JS ライブラリを使用するのか"}],position:$R[22953]={start:$R[22954]={line:161,column:3,offset:6133},end:$R[22955]={line:161,column:25,offset:6155}},type:"paragraph"},$R[22956]={children:$R[22957]=[$R[22958]={children:$R[22959]=[$R[22960]={children:$R[22961]=[$R[22962]={position:$R[22963]={start:$R[22964]={line:162,column:5,offset:6160},end:$R[22965]={line:162,column:61,offset:6216}},type:"text",value:"runtime CSS in JS を使用するのか zero-runtime CSS in JS を使用するのか"}],position:$R[22966]={start:$R[22967]={line:162,column:5,offset:6160},end:$R[22968]={line:162,column:61,offset:6216}},type:"paragraph"}],position:$R[22969]={start:$R[22970]={line:162,column:3,offset:6158},end:$R[22971]={line:162,column:61,offset:6216}},type:"listItem"},$R[22972]={children:$R[22973]=[$R[22974]={children:$R[22975]=[$R[22976]={position:$R[22977]={start:$R[22978]={line:163,column:5,offset:6221},end:$R[22979]={line:163,column:36,offset:6252}},type:"text",value:"使用するなら template literal を使用するのか"}],position:$R[22980]={start:$R[22981]={line:163,column:5,offset:6221},end:$R[22982]={line:163,column:36,offset:6252}},type:"paragraph"},$R[22983]={children:$R[22984]=[$R[22985]={children:$R[22986]=[$R[22987]={children:$R[22988]=[$R[22989]={position:$R[22990]={start:$R[22991]={line:164,column:7,offset:6259},end:$R[22992]={line:164,column:58,offset:6310}},type:"text",value:"object literal を使用する場合、stylelint などの資産が使えなくなることへの考慮"}],position:$R[22993]={start:$R[22994]={line:164,column:7,offset:6259},end:$R[22995]={line:164,column:58,offset:6310}},type:"paragraph"}],position:$R[22996]={start:$R[22997]={line:164,column:5,offset:6257},end:$R[22998]={line:164,column:58,offset:6310}},type:"listItem"}],position:$R[22999]={start:$R[23000]={line:164,column:5,offset:6257},end:$R[23001]={line:164,column:58,offset:6310}},type:"unorderedList"}],position:$R[23002]={start:$R[23003]={line:163,column:3,offset:6219},end:$R[23004]={line:164,column:58,offset:6310}},type:"listItem"},$R[23005]={children:$R[23006]=[$R[23007]={children:$R[23008]=[$R[23009]={position:$R[23010]={start:$R[23011]={line:165,column:5,offset:6315},end:$R[23012]={line:165,column:40,offset:6350}},type:"text",value:"使用しないなら、CSS Modules や BEM 記法を使用するのか"}],position:$R[23013]={start:$R[23014]={line:165,column:5,offset:6315},end:$R[23015]={line:165,column:40,offset:6350}},type:"paragraph"}],position:$R[23016]={start:$R[23017]={line:165,column:3,offset:6313},end:$R[23018]={line:165,column:40,offset:6350}},type:"listItem"}],position:$R[23019]={start:$R[23020]={line:162,column:3,offset:6158},end:$R[23021]={line:165,column:40,offset:6350}},type:"unorderedList"}],position:$R[23022]={start:$R[23023]={line:161,column:1,offset:6131},end:$R[23024]={line:165,column:40,offset:6350}},type:"listItem"},$R[23025]={children:$R[23026]=[$R[23027]={children:$R[23028]=[$R[23029]={position:$R[23030]={start:$R[23031]={line:166,column:3,offset:6353},end:$R[23032]={line:166,column:49,offset:6399}},type:"text",value:"移行する場合に、必ずプロダクトに複数の styling library が混在することになる"}],position:$R[23033]={start:$R[23034]={line:166,column:3,offset:6353},end:$R[23035]={line:166,column:49,offset:6399}},type:"paragraph"},$R[23036]={children:$R[23037]=[$R[23038]={children:$R[23039]=[$R[23040]={children:$R[23041]=[$R[23042]={position:$R[23043]={start:$R[23044]={line:167,column:5,offset:6404},end:$R[23045]={line:167,column:21,offset:6420}},type:"text",value:"その場合、どのように移行するのか"}],position:$R[23046]={start:$R[23047]={line:167,column:5,offset:6404},end:$R[23048]={line:167,column:21,offset:6420}},type:"paragraph"},$R[23049]={children:$R[23050]=[$R[23051]={children:$R[23052]=[$R[23053]={children:$R[23054]=[$R[23055]={position:$R[23056]={start:$R[23057]={line:168,column:7,offset:6427},end:$R[23058]={line:168,column:22,offset:6442}},type:"text",value:"AST 走査による機械的な移行"}],position:$R[23059]={start:$R[23060]={line:168,column:7,offset:6427},end:$R[23061]={line:168,column:22,offset:6442}},type:"paragraph"}],position:$R[23062]={start:$R[23063]={line:168,column:5,offset:6425},end:$R[23064]={line:168,column:22,offset:6442}},type:"listItem"},$R[23065]={children:$R[23066]=[$R[23067]={children:$R[23068]=[$R[23069]={position:$R[23070]={start:$R[23071]={line:169,column:7,offset:6449},end:$R[23072]={line:169,column:36,offset:6478}},type:"text",value:"Cursor や Cline などの AI を使用した移行"}],position:$R[23073]={start:$R[23074]={line:169,column:7,offset:6449},end:$R[23075]={line:169,column:36,offset:6478}},type:"paragraph"}],position:$R[23076]={start:$R[23077]={line:169,column:5,offset:6447},end:$R[23078]={line:169,column:36,offset:6478}},type:"listItem"},$R[23079]={children:$R[23080]=[$R[23081]={children:$R[23082]=[$R[23083]={position:$R[23084]={start:$R[23085]={line:170,column:7,offset:6485},end:$R[23086]={line:170,column:13,offset:6491}},type:"text",value:"手動での移行"}],position:$R[23087]={start:$R[23088]={line:170,column:7,offset:6485},end:$R[23089]={line:170,column:13,offset:6491}},type:"paragraph"}],position:$R[23090]={start:$R[23091]={line:170,column:5,offset:6483},end:$R[23092]={line:170,column:13,offset:6491}},type:"listItem"}],position:$R[23093]={start:$R[23094]={line:168,column:5,offset:6425},end:$R[23095]={line:170,column:13,offset:6491}},type:"unorderedList"}],position:$R[23096]={start:$R[23097]={line:167,column:3,offset:6402},end:$R[23098]={line:170,column:13,offset:6491}},type:"listItem"},$R[23099]={children:$R[23100]=[$R[23101]={children:$R[23102]=[$R[23103]={position:$R[23104]={start:$R[23105]={line:171,column:5,offset:6496},end:$R[23106]={line:171,column:18,offset:6509}},type:"text",value:"どのように運用していくのか"}],position:$R[23107]={start:$R[23108]={line:171,column:5,offset:6496},end:$R[23109]={line:171,column:18,offset:6509}},type:"paragraph"}],position:$R[23110]={start:$R[23111]={line:171,column:3,offset:6494},end:$R[23112]={line:171,column:18,offset:6509}},type:"listItem"}],position:$R[23113]={start:$R[23114]={line:167,column:3,offset:6402},end:$R[23115]={line:171,column:18,offset:6509}},type:"unorderedList"}],position:$R[23116]={start:$R[23117]={line:166,column:1,offset:6351},end:$R[23118]={line:171,column:18,offset:6509}},type:"listItem"},$R[23119]={children:$R[23120]=[$R[23121]={children:$R[23122]=[$R[23123]={position:$R[23124]={start:$R[23125]={line:172,column:3,offset:6512},end:$R[23126]={line:172,column:14,offset:6523}},type:"text",value:"そもそも移行するのか?"}],position:$R[23127]={start:$R[23128]={line:172,column:3,offset:6512},end:$R[23129]={line:172,column:14,offset:6523}},type:"paragraph"},$R[23130]={children:$R[23131]=[$R[23132]={children:$R[23133]=[$R[23134]={children:$R[23135]=[$R[23136]={position:$R[23137]={start:$R[23138]={line:173,column:5,offset:6528},end:$R[23139]={line:173,column:42,offset:6565}},type:"text",value:"現状 React Server Components を使用していない場合"}],position:$R[23140]={start:$R[23141]={line:173,column:5,offset:6528},end:$R[23142]={line:173,column:42,offset:6565}},type:"paragraph"}],position:$R[23143]={start:$R[23144]={line:173,column:3,offset:6526},end:$R[23145]={line:173,column:42,offset:6565}},type:"listItem"},$R[23146]={children:$R[23147]=[$R[23148]={children:$R[23149]=[$R[23150]={position:$R[23151]={start:$R[23152]={line:174,column:5,offset:6570},end:$R[23153]={line:174,column:51,offset:6616}},type:"text",value:"styled-components 起因で React などのバージョンアップができない場合"}],position:$R[23154]={start:$R[23155]={line:174,column:5,offset:6570},end:$R[23156]={line:174,column:51,offset:6616}},type:"paragraph"}],position:$R[23157]={start:$R[23158]={line:174,column:3,offset:6568},end:$R[23159]={line:174,column:51,offset:6616}},type:"listItem"},$R[23160]={children:$R[23161]=[$R[23162]={children:$R[23163]=[$R[23164]={position:$R[23165]={start:$R[23166]={line:175,column:5,offset:6621},end:$R[23167]={line:175,column:36,offset:6652}},type:"text",value:"styled-components のバグに悩まされている場合"}],position:$R[23168]={start:$R[23169]={line:175,column:5,offset:6621},end:$R[23170]={line:175,column:36,offset:6652}},type:"paragraph"}],position:$R[23171]={start:$R[23172]={line:175,column:3,offset:6619},end:$R[23173]={line:175,column:36,offset:6652}},type:"listItem"}],position:$R[23174]={start:$R[23175]={line:173,column:3,offset:6526},end:$R[23176]={line:175,column:36,offset:6652}},type:"unorderedList"}],position:$R[23177]={start:$R[23178]={line:172,column:1,offset:6510},end:$R[23179]={line:175,column:36,offset:6652}},type:"listItem"}],position:$R[23180]={start:$R[23181]={line:161,column:1,offset:6131},end:$R[23182]={line:175,column:36,offset:6652}},type:"unorderedList"},$R[23183]={children:$R[23184]=[$R[23185]={position:$R[23186]={start:$R[23187]={line:177,column:1,offset:6654},end:$R[23188]={line:178,column:147,offset:6829}},type:"text",value:"これらの観点を考慮しながら、移行先を検討する必要がある。\n私の個人的な感想としては、React Server Components や Streaming SSR を使用する場合、あとは React の major version を上げる際に、styled-components の存在が障壁になったタイミングで移行するのが良いのではないかと思う。"}],position:$R[23189]={start:$R[23190]={line:177,column:1,offset:6654},end:$R[23191]={line:178,column:147,offset:6829}},type:"paragraph"}],position:$R[23192]={end:$R[23193]={line:178,column:147,offset:6829},start:$R[23194]={line:156,column:1,offset:6042}},type:"section"}],position:$R[23195]={end:$R[23196]={line:178,column:147,offset:6829},start:$R[23197]={line:154,column:1,offset:6014}},type:"section"},$R[23198]={children:$R[23199]=[$R[23200]={children:$R[23201]=[$R[23202]={position:$R[23203]={start:$R[23204]={line:180,column:4,offset:6834},end:$R[23205]={line:180,column:8,offset:6838}},type:"text",value:"おわりに"}],id:"おわりに",level:2,plain:"おわりに",position:$R[23206]={start:$R[23207]={line:180,column:1,offset:6831},end:$R[23208]={line:180,column:8,offset:6838}},type:"heading"},$R[23209]={children:$R[23210]=[$R[23211]={position:$R[23212]={start:$R[23213]={line:182,column:1,offset:6840},end:$R[23214]={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[23215]={start:$R[23216]={line:182,column:1,offset:6840},end:$R[23217]={line:185,column:33,offset:7058}},type:"paragraph"}],position:$R[23218]={end:$R[23219]={line:185,column:33,offset:7058},start:$R[23220]={line:180,column:1,offset:6831}},type:"section"}],footnotes:$R[23221]=[$R[23222]={children:$R[23223]=[$R[23224]={children:$R[23225]=[$R[23226]={children:$R[23227]=[$R[23228]={position:$R[23229]={start:$R[23230]={line:23,column:7,offset:630},end:$R[23231]={line:23,column:109,offset:732}},type:"text",value:"https://github.com/styled-components/styled-components/commit/d2561d4928ff252eb79e5e3a3749c13930b6f062"}],position:$R[23232]={start:$R[23233]={line:23,column:7,offset:630},end:$R[23234]={line:23,column:109,offset:732}},title:void 0,type:"link",url:"https://github.com/styled-components/styled-components/commit/d2561d4928ff252eb79e5e3a3749c13930b6f062"}],position:$R[23235]={start:$R[23236]={line:23,column:7,offset:630},end:$R[23237]={line:23,column:109,offset:732}},type:"paragraph"}],count:1,index:0,position:$R[23238]={start:$R[23239]={line:23,column:1,offset:624},end:$R[23240]={line:23,column:109,offset:732}},type:"footnoteDefinition"},$R[23241]={children:$R[23242]=[$R[23243]={children:$R[23244]=[$R[23245]={children:$R[23246]=[$R[23247]={position:$R[23248]={start:$R[23249]={line:32,column:8,offset:937},end:$R[23250]={line:32,column:60,offset:989}},type:"text",value:"https://styled-components.com/docs/basics#motivation"}],position:$R[23251]={start:$R[23252]={line:32,column:7,offset:936},end:$R[23253]={line:32,column:115,offset:1044}},title:void 0,type:"link",url:"https://styled-components.com/docs/basics#motivation"}],position:$R[23254]={start:$R[23255]={line:32,column:7,offset:936},end:$R[23256]={line:32,column:115,offset:1044}},type:"paragraph"}],count:1,index:1,position:$R[23257]={start:$R[23258]={line:32,column:1,offset:930},end:$R[23259]={line:32,column:115,offset:1044}},type:"footnoteDefinition"},$R[23260]={children:$R[23261]=[$R[23262]={children:$R[23263]=[$R[23264]={children:$R[23265]=[$R[23266]={position:$R[23267]={start:$R[23268]={line:41,column:8,offset:1231},end:$R[23269]={line:41,column:53,offset:1276}},type:"text",value:"https://speakerdeck.com/vjeux/react-css-in-js"}],position:$R[23270]={start:$R[23271]={line:41,column:7,offset:1230},end:$R[23272]={line:41,column:101,offset:1324}},title:void 0,type:"link",url:"https://speakerdeck.com/vjeux/react-css-in-js"}],position:$R[23273]={start:$R[23274]={line:41,column:7,offset:1230},end:$R[23275]={line:41,column:101,offset:1324}},type:"paragraph"}],count:1,index:2,position:$R[23276]={start:$R[23277]={line:41,column:1,offset:1224},end:$R[23278]={line:41,column:101,offset:1324}},type:"footnoteDefinition"},$R[23279]={children:$R[23280]=[$R[23281]={children:$R[23282]=[$R[23283]={children:$R[23284]=[$R[23285]={position:$R[23286]={start:$R[23287]={line:72,column:8,offset:2164},end:$R[23288]={line:72,column:61,offset:2217}},type:"text",value:"https://qiita.com/Takepepe/items/41e3e7a2f612d7eb094a"}],position:$R[23289]={start:$R[23290]={line:72,column:7,offset:2163},end:$R[23291]={line:72,column:117,offset:2273}},title:void 0,type:"link",url:"https://qiita.com/Takepepe/items/41e3e7a2f612d7eb094a"}],position:$R[23292]={start:$R[23293]={line:72,column:7,offset:2163},end:$R[23294]={line:72,column:117,offset:2273}},type:"paragraph"}],count:1,index:3,position:$R[23295]={start:$R[23296]={line:72,column:1,offset:2157},end:$R[23297]={line:72,column:117,offset:2273}},type:"footnoteDefinition"},$R[23298]={children:$R[23299]=[$R[23300]={children:$R[23301]=[$R[23302]={children:$R[23303]=[$R[23304]={position:$R[23305]={start:$R[23306]={line:84,column:8,offset:2725},end:$R[23307]={line:84,column:41,offset:2758}},type:"text",value:"https://nextjs.org/blog/next-13-4"}],position:$R[23308]={start:$R[23309]={line:84,column:7,offset:2724},end:$R[23310]={line:84,column:77,offset:2794}},title:void 0,type:"link",url:"https://nextjs.org/blog/next-13-4"}],position:$R[23311]={start:$R[23312]={line:84,column:7,offset:2724},end:$R[23313]={line:84,column:77,offset:2794}},type:"paragraph"}],count:1,index:4,position:$R[23314]={start:$R[23315]={line:84,column:1,offset:2718},end:$R[23316]={line:84,column:77,offset:2794}},type:"footnoteDefinition"},$R[23317]={children:$R[23318]=[$R[23319]={children:$R[23320]=[$R[23321]={children:$R[23322]=[$R[23323]={position:$R[23324]={start:$R[23325]={line:86,column:8,offset:2803},end:$R[23326]={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[23327]={start:$R[23328]={line:86,column:7,offset:2802},end:$R[23329]={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[23330]={start:$R[23331]={line:86,column:7,offset:2802},end:$R[23332]={line:86,column:227,offset:3022}},type:"paragraph"}],count:1,index:5,position:$R[23333]={start:$R[23334]={line:86,column:1,offset:2796},end:$R[23335]={line:86,column:227,offset:3022}},type:"footnoteDefinition"},$R[23336]={children:$R[23337]=[$R[23338]={children:$R[23339]=[$R[23340]={children:$R[23341]=[$R[23342]={position:$R[23343]={start:$R[23344]={line:94,column:8,offset:3275},end:$R[23345]={line:94,column:116,offset:3383}},type:"text",value:"https://github.com/reactjs/rfcs/blob/7f8492f6a177fc33fe807d242319f2f96353bf68/text/0188-server-components.md"}],position:$R[23346]={start:$R[23347]={line:94,column:7,offset:3274},end:$R[23348]={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[23349]={start:$R[23350]={line:94,column:7,offset:3274},end:$R[23351]={line:94,column:227,offset:3494}},type:"paragraph"}],count:1,index:6,position:$R[23352]={start:$R[23353]={line:94,column:1,offset:3268},end:$R[23354]={line:94,column:227,offset:3494}},type:"footnoteDefinition"},$R[23355]={children:$R[23356]=[$R[23357]={children:$R[23358]=[$R[23359]={children:$R[23360]=[$R[23361]={position:$R[23362]={start:$R[23363]={line:134,column:8,offset:4944},end:$R[23364]={line:134,column:74,offset:5010}},type:"text",value:"https://react.dev/blog/2024/12/05/react-19#support-for-stylesheets"}],position:$R[23365]={start:$R[23366]={line:134,column:7,offset:4943},end:$R[23367]={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[23368]={start:$R[23369]={line:134,column:7,offset:4943},end:$R[23370]={line:134,column:143,offset:5079}},type:"paragraph"}],count:1,index:7,position:$R[23371]={start:$R[23372]={line:134,column:1,offset:4937},end:$R[23373]={line:134,column:143,offset:5079}},type:"footnoteDefinition"},$R[23374]={children:$R[23375]=[$R[23376]={children:$R[23377]=[$R[23378]={children:$R[23379]=[$R[23380]={position:$R[23381]={start:$R[23382]={line:136,column:8,offset:5088},end:$R[23383]={line:136,column:92,offset:5172}},type:"text",value:"souporserious/restyle - The simplest way to add CSS styles to your React components."}],position:$R[23384]={start:$R[23385]={line:136,column:7,offset:5087},end:$R[23386]={line:136,column:135,offset:5215}},title:void 0,type:"link",url:"https://github.com/souporserious/restyle"}],position:$R[23387]={start:$R[23388]={line:136,column:7,offset:5087},end:$R[23389]={line:136,column:135,offset:5215}},type:"paragraph"}],count:1,index:8,position:$R[23390]={start:$R[23391]={line:136,column:1,offset:5081},end:$R[23392]={line:136,column:135,offset:5215}},type:"footnoteDefinition"}],title:$R[23393]={children:$R[23394]=[$R[23395]={position:$R[23396]={start:$R[23397]={line:1,column:3,offset:2},end:$R[23398]={line:1,column:32,offset:31}},type:"text",value:"styled-components の歴史、現在、これから"}],id:"styled-components-の歴史現在これから",level:1,plain:"styled-components の歴史、現在、これから",position:$R[23399]={start:$R[23400]={line:1,column:1,offset:0},end:$R[23401]={line:1,column:32,offset:31}},type:"heading"},toc:$R[23402]=[$R[23403]={children:$R[23404]=[],id:"はじめに",plain:"はじめに",type:"toc"},$R[23405]={children:$R[23406]=[],id:"styled-components-とは",plain:"styled-components とは",type:"toc"},$R[23407]={children:$R[23408]=[$R[23409]={children:$R[23410]=[],id:"css-in-js-の登場",plain:"CSS in JS の登場",type:"toc"},$R[23411]={children:$R[23412]=[],id:"styled-components-という選択",plain:"styled-components という選択",type:"toc"}],id:"styled-components-の歴史",plain:"styled-components の歴史",type:"toc"},$R[23413]={children:$R[23414]=[$R[23415]={children:$R[23416]=[$R[23417]={children:$R[23418]=[],id:"styled-components-の動作原理",plain:"styled-components の動作原理",type:"toc"}],id:"react-server-components-の登場",plain:"React Server Components の登場",type:"toc"},$R[23419]={children:$R[23420]=[],id:"react-server-components-への対応",plain:"React Server Components への対応",type:"toc"},$R[23421]={children:$R[23422]=[],id:"styled-components-の選択",plain:"styled-components の選択",type:"toc"}],id:"styled-components-の現在",plain:"styled-components の現在",type:"toc"},$R[23423]={children:$R[23424]=[$R[23425]={children:$R[23426]=[],id:"移行先",plain:"移行先?",type:"toc"}],id:"styled-components-とこれから",plain:"styled-components とこれから",type:"toc"},$R[23427]={children:$R[23428]=[],id:"おわりに",plain:"おわりに",type:"toc"}],type:"article"}}]);$R[5]($R[3],$R[6]);$R[5]($R[4],!0);
blog.re-taro.devArchive
styled-components の歴史、現在、これからはじめに先日、1つの時代が終わりを迎えた。https://opencollective.com/styled-components/updates/thank-youstyled-components のメンテナンスモード...
Web の未来と僕達はじめに今月のはじめに「フロントエンドチョットデキル 2025」というイベントがあった。
このイベントではデザインシステムからエディタなどの複雑 UI、果てはブラウザへのコントリビュートの話まで、web プラットフォームに対して様々な切り口から議論を広げる良い...
pnpm とセキュアな依存管理はじめにpnpm v10 から、依存するパッケージのライフサイクルスクリプトをデフォルトで実行しないようになる。ライフサイクルスクリプトが必要なパッケージとは昨今、swc や esbuild など異なる言語で書かれたパッケージを npm でインストー...
Cf pages と Hydration ErrorはじめにCloudflare Pages で custom domains を割り当てたところ、hydration error が発生するようになった。この記事ではその解決方法を記す。解決の糸口となった記事https://med...
@cloudflare/workers-types の Compatibility dates を知っているかはじめにCloudflare Workers で TypeScript を使う際に、@cloudflare/workers-types という型定義パッケージを使う。Co...
Life Cycle Scripts を理解するはじめにnpm scripts には、pre と post というプレフィックスのついたスクリプトがある。これは、スクリプトの前後に実行されるスクリプトを指定するものである。その中でも、特定の状況下で実行されるスクリプトがある。それ...
EventListener のオプションメモはじめにaddEventListener は DOM イベントを登録するためのメソッドである。このメソッドにはオプションを指定できる。このオプションについて調べてみた。オプションaddEventListener には以下のオプションを指...
React Compiler の opt-in と opt-out を整理するはじめに先日に引き続き React Compiler のコードを読んでいる中で、opt-in と opt-out についての挙動がややこしいと感じたので整理してみた。この記事で参照するコードの comm...
eslintSuppressionRules を考察してみるはじめに先日 React Compiler が OSS になった。React のベータ版を使うことで今すぐ使うことができる。React Compiler is a new experimental compiler th...
bunshiを理解するはじめにbunshi というライブラリがある。状態管理ライブラリの DI を行うものだ。jotai を使う機会があり、調べを進める中で当時名前を聞いた jotai-molecule が bunshi という名前で良い感じに開発されていて気になったので調べてみ...
initialはじめにブログを再構築した。これは、そのテスト用のポストである。テスト以降は、本サイトのマークアップやスタイルをテストするためのセクションである。対応している記法を列挙し、挙動を確認する。heading section 3ここは <h3> セクションである。head...