最近、インターネットで「Build your own React」という記事を見ました。著者は、シンプルなReact風のフレームワークをゼロから実装しました。最適化はあまり行われていませんでしたが、Concurrent ModeやFiber Reconcilerなど、Reactのコアとなるアイデアはすべて実装されていました。読んだ後、Reactの理解に非常に役立ちました。そこで、「Build your own React」に基づいてコードを分割し、独自のフレームワークプロジェクトを構築してから、チュートリアルで完了しなかった他の機能を改善したいと思います。コードはracにあります。 プロジェクト構築技術スタックとしては、開発には TypeScript、パッケージングには Rollup を使用することにしました。これらはあまり使わない技術なので、一緒に練習します。webpack と比較すると、rollup の設定は簡単です。プロジェクトに tsconfig.json と rollup.config.js を作成し、rollup-plugin-typescript2、rollup-plugin-terser などの必要なロールアップ プラグインをインストールします。また、サンプルフォルダを用意し、小さなデモプロジェクトを作成し、tsxを使用して開発します。 jsxをサポートTypeScript で jsx をサポートするには、tsconfig で jsx を有効にする必要があります。TypeScript には、preserve、react、react-native の 3 つのモードがあります。react に設定すると、TypeScript はコード内の jsx を React.createElement に変換します。これが、jsx を使用するときに React をスコープ内に含めなければならない理由です。 しかし、React のようなフレームワークを独自に実装したい場合は、React.createElement の名前を変更するだけです。 Build your own React では、/** @jsx Didact.createElement */ コメントを使用して、コンパイラに jsx の出力関数を Didact.createElement に変更するように指示しています。この方法は、現在のファイルに対してのみ有効です。プロジェクトで使用する場合は、ファイルごとにコメント行を追加するのが面倒になります。 tsconfig の jsxFactory 属性 (ここでは h と呼びます) を通じて指定する別の方法を使用します。React.createEmenent に加えて、特別な要素である Fragment もあります。TypeScript はデフォルトでこれを React.Fragment に変換します。jsxFragmentFactory を通じてこれを直接 Fragment に変更します。 tsconfig.json: { "コンパイラオプション": { "ターゲット": "esnext", "モジュール": "commonjs", "モジュール解像度": "ノード", "jsx": "react", // jsx を有効にする "jsxFactory": "h", // React.createElement => h "jsxFragmentFactory": "Fragment", // React.Fragment => Fragment "ルートディレクトリ": "./src", "lib": ["dom", "es2015"] } } ロールアップ構成Rollup の設定は比較的簡単です。入力と出力に加えて、いくつかのプラグインを追加できます。 定数パス = require('path') 定数typescript = require('rollup-plugin-typescript2') const { terser } = require('rollup-plugin-terser') const eslint = require('@rollup/plugin-eslint') エクスポートデフォルト{ 入力: 'src/index.ts', 出力: [ { ファイル: 'dist/rac.umd.js'、形式: 'umd'、名前: 'rac' } ]、 プラグイン: [ 簡潔(), エスリント({ throwOnError: true、 インクルード: ['src/**/*.ts'] })、 タイプスクリプト({ 詳細度: 0, tsconfig: path.resolve(__dirname, 'tsconfig.json'), useTsconfigDeclarationDir: true }) ] } TypeScript での EslintEslint が TypeScript をサポートできるようにするには、Eslint にいくつかの追加設定が必要です。 モジュール.エクスポート = { パーサー: '@typescript-eslint/parser', 環境: { es6: 本当、 ブラウザ: true }, プラグイン: [ '@typescript-eslint' ]、 拡張: [ 'eslint:推奨', ]、 パーサーオプション: { ソースタイプ: 'モジュール' }, ルール: ... } } プロジェクト構造 Reactの新しいFiberアーキテクチャにはいくつかのコアコンセプトがあります。Build your own Reactでは、著者は次のように説明しています。
これらの手順により、ミニ React が徐々に実装されます。コードの可読性と保守性を向上させるために、これらの関数は異なるファイルに分割されます。 。 ├── README.md ├── examples // デモディレクトリ├── package.json ├── rollup.config.js ├── 出典 │ ├── ドム.ts │ ├── h.ts │ ├── hooks.ts │ ├── index.ts │ ├── reconciler.ts │ ├── スケジューラ.ts │ └── type.ts └── tsconfig.json
この時点で、プロジェクトは構築されています。プロジェクト全体の構造と一部のコード実装は、fre フレームワークに基づいています。 これで、ゼロから書いたReactライクなフレームワークのプロジェクト構築と実装に関するこの記事は終了です。Reactライクな構築に関するより関連性の高いコンテンツについては、123WORDPRESS.COMの過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも123WORDPRESS.COMを応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: nginxのシンプル転送リクエストのサーバーとロケーション設定の詳しい説明
>>: Java で ffmpeg を呼び出してビデオ形式を flv に変換する方法の詳細な説明
コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...
<br />しばらくの間、多くの人が XHTML の使い方を知らないことに気付きました。...
まずmysqlの圧縮バージョンをダウンロードします。公式ダウンロードアドレスは123WORDPRES...
この記事では、MySQL のデータベース テーブルの容量を確認するためのコマンド ステートメントを紹...
# には位置情報が含まれます。デフォルトのアンカーは #top で、これは Web ページの上部です...
目次回避策Vue2.0 で 2 つの配列の変更を監視できないのはなぜですか?ソースコード分析ヴュー3...
K8s k8s はクラスターです。クラスターには複数の名前空間があります。名前空間の下には複数のポッ...
1.ファビコン.cc ico アイコンの Web サイトをオンラインで作成するには、画像をアップロー...
目次1. 概要1.1 querySelector() と querySelectorAll() の使...
目次1. 準備2. 説明計画の概要3. フィールドの詳細な説明4. パーティションクエリにはパーティ...
CSS の適用範囲はグローバルです。プロジェクトがどんどん大きくなり、参加する人が増えるにつれて、命...
Ubuntu 18.04.4 に MySQL をインストールするプロセスを見てみましょう。内容は次の...
Docker の設計では、コンテナは 1 つのアプリケーションのみを実行します。しかし、現在のアプリ...
序文フロントエンド開発では、配列内に要素が存在するかどうかを判断する必要があることがよくあります。実...
Redis クラスターとはRedis クラスターは、Redis が提供する分散データベース ソリ...