最近、インターネットで「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 に変換する方法の詳細な説明
目次1. ElementUIで基本的なスタイルを構築する2. [送信]ボタンをクリックして、アカウン...
もちろん、ページ パフォーマンスの最適化に関する個人的な経験も含まれています。ここでいくつかの点につ...
序文:多くのビジネス テーブルでは、歴史的またはパフォーマンス上の理由により、最初のパラダイムに違反...
目次1. ページレイアウト2. 画像のアップロードと表示3. キャンバスを初期化する4. テンプレー...
1. ユーザーを作成して承認するMySQL 8.0 では、ユーザーの作成と認証が以前とは異なります...
この点呼装置は簡易版であり、自動停止の必要性を考慮していないため、点呼を開始した後、停止ボタンをクリ...
データが変更されても、DOM ビューはすぐには更新されません。変更直後にノードまたはその値を取得しよ...
導入1.<iframe> タグ: iframe は、ページ内に内部フレームを生成するイン...
概要Linux 用のオープン ソース ネットワーク監視ツールは数多くあります。たとえば、帯域幅の使用...
Reactのdiffアルゴリズムの理解diffアルゴリズムは、 Virtual DOMの変更された部...
1. 絶対位置とマージンを使用するこの方法の原則は、左側と右側をドキュメントの流れから外れるように配...
1. 800*600 未満の場合、Web ページの幅が 778 以内であれば、水平スクロール バーは...
ここでは主に、WeChat アプレットでラッキーホイール ゲームを開発する方法を紹介します。主に J...
前のセクションでは、コンテンツ、サーバー、JavaScript、CSS など、Web サイトのパフォ...
大規模なシステムに取り組んだことがある人なら誰でも、ログの役割を過小評価してはならないことを知ってい...