React Compilerで出力されるc(number)について
Intro
React Compilerの出力結果を見ると、const $ = _c(1);
というコードを見たことがあると思います。
このブログでは、この_c<number>
がReact Compiler側でどのように作られているのかをみていきます。
内容
↑ まず実装はこんな感じです。引数に受け取ったnumberの値分の配列をnew Array
で作って、それを$
という変数に代入しています。そしてその$
をreturnしています。
returnする前にfor分で$[ii]
に対して$empty
を代入していますが、$[ii]
に代入しているのはSymbol.for("react.memo_cache_sentinel")
になっていて、キャッシュ済みかどうかを判定できるようにしています。
if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
t0 = <div>Hello World</div>;
$[0] = t0;
} else {
t0 = $[0];
}
↑ 最初は$[ii]
はSymbol.for("react.memo_cache_sentinel")
になっているのでtrueになります。そしてこのタイミングで$[ii] = t0;
というように上書きしています。そのため次回以降はキャッシュされた値が出力されます。
_
がつく理由
出力コードを見ると、cは_c
のようになっていると思います。これはprogram.scope.generateUidIdentifier
を使用しているためです。https://github.com/jamiebuilds/babel-handbook/blob/master/translations/en/plugin-handbook.md#generating-a-uid
例えば以下のようにuidをb
に変更してみるとどうなるでしょうか👀
code
const useMemoCacheIdentifier = program.scope.generateUidIdentifier("b");
この状態でyarn testを実行してみます。
log
useMemoCacheIdentifier: { type: 'Identifier', name: '_b' }
- import { c as _c } from "react/compiler-runtime";
+ import { c as _b } from "react/compiler-runtime";
function foo(props) {
- const $ = _c(4);
+ const $ = _b(4);
ちゃんとcがbになって出力されているようです。
まとめ
なんとなく_c<number>
について理解できたのではないでしょうか。
具体的にcがどのようにコンパイル時に使われているのかまではそのうち書きます!🤞
Discussion