やかんです。

reactを心底理解したくなったので、リポジトリを読んでいこうと思います。

reactのディレクトリ構成

ルートのディレクトリ構成は、以下の通り。

  • /.codesandbox
  • /.github
  • /compiler
  • /fixtures
  • /packages
  • /scripts
  • .editorconfig
  • .eslintignore
  • .islintrc.js
  • .git-blame-ignore-revs
  • .gitattributes
  • .gitignore
  • .mailmap
  • .nvmrc
  • .prettierignore
  • .prettierrc.js
  • .watchmanconfig
  • CHANGELOG-canary.md
  • CHANGELOG.md
  • CODE_OF_CONDUCT.md
  • CONTRIBUTING.md
  • LICENSE
  • MAINTAINERS
  • README.md
  • ReactVersions.js
  • SECURITY.md
  • bable.config.js
  • dangerfile.js
  • netlify.toml
  • package.json
  • react.code-workspace
  • yarn.lock

GPTくん曰く、packagesディレクトリから読み始めるのがおすすめだそうです。従います。

packagesディレクトリには何があるのか。

  • dom-event-testing-library
  • eslint-plugin-react-hooks
  • internal-test-utils
  • jest-react
  • react-art
  • react-cache
  • react-client
  • react-debug-tools
  • react-devtools-core
  • react-devtools-extensions
  • react-devtools-fusebox
  • react-devtools-inline
  • react-devtools-shared
  • react-devtools-shell
  • react-devtools-timeline
  • react-devtools
  • react-dom-bindings
  • react-dom
  • react-js
  • react-markup
  • react-native-renderer
  • react-noop-renderer
  • react-reconciler
  • react-refresh
  • react-server-dom-esm
  • react-server-dom-fb
  • react-server-dom-parcel
  • react-server-dom-turbopack
  • react-server-dom-webpack
  • react-server
  • react-suspense-test-utils
  • react-test-renderer
  • react
  • scheduler
  • shared
  • use-subscription
  • use-sync-external-store

めっっちゃありますね。メモとして、まず読みたいやつを太字にしてみました。

  • react-dom
  • react-js
  • react-server
  • react

この4つですね。

現状、reactについてもっと理解したいこと(現状の理解を添えて)。

refとは何か。

  • reactは直接にdomを操作しない思想で作られている。「直接にdomを操作しない」というのは、要するに関心の分離だと理解している。
  • これが、有名な仮想domという考え方。発想としては、「仮想domというものをreactで作る!ブラウザは、これを元にdomを構築してくれるはずだ!と、信じることにする!」みたいな発想だろう。
  • reactは、仮想domを使って、ブラウザにおけるUIがどうあるべきかを記述する。
    • 仮想domがメモリ的に重かったら、ブラウザが描画するためのdomツリーと合わせて本来必要なdomの情報量の2倍を保持する必要が出てきてしまう。
    • だから、domはこの点を解消するために、独自のデータ構造を持って、軽量なものとして存在している。
  • reactは、「状態が更新されたらUIを更新する」という戦略をとっている。
    • その際、有名な「差分のみの更新」が実行される。

仮想DOMについて

gptによれば、

function App() {
  return <div>Hello, React!</div>;
}

というコードからは、

{
  type: 'div',
  props: {
    children: 'Hello, React!'
  }
}

という仮想domが生成されるらしい。

このような仮想domを元に実際のdomを生成する過程は、レンダラーが担っている。その際、レンダラーはブラウザが提供するAPIを通じて、ブラウザの描画にアプローチする。

レンダラーとして代表的なものは、react-dom。

今日のところは、終了!最後までお読みいただき、ありがとうございます。