Reactプロジェクトの新規作成からデプロイまでの実装例

Reactプロジェクトの新規作成からデプロイまでの実装例

新しいプロジェクトを始める

この記事では主に、新規プロジェクトを0から1まで取り組むプロセスを記録し、選択、実行、起動という3つのノードを主に記録します。

プロジェクトの選択

React のスキャフォールディングの初期化では、コミュニティでより人気があるのは cra (create-react-app) と umi です。以下の点を比較した後、最終的にプロジェクトにより適した umi を選択しました。

  1. 箱から出してすぐに使える使いやすさ。 Umi は組み込み機能が豊富ですが、制約も多くあります。例えば、プロジェクト構造の要件や独自のエコシステム用のプラグインには学習コストがかかります。Cra の初期化はテンプレートを選択して起動するだけなので、追加の学習コストはかかりません (Vue プレイヤーが来ても負担はありません)。
  2. スケーラビリティ、Webpack 構成の変更。 cra は完全に露出して自分で制御する eject (不可逆な操作) を提供するため、最初にシンプルな構成を求めるという当初の意図が失われます。また、ここに示すように react-app-rewired と customize-cra を使用することもできます。 umi が webpack 設定を変更する必要がある場合、(webpack-chain に基づいて) ファイルを直接書き込むことができ、実行中の構成も提供します。
  3. エコシステム、umi は Alibaba のオープンソースであり、人気の antd や qiankun など、オープンソースに関連する多くのプラグインが含まれています。公式 Web サイトには多くの実用的なガイダンスが提供されており、中国語のドキュメントになっています (一部の人はこれを好む)。CRA は簡潔で、スキャフォールディング作業のみを担当します (内部実装を理解しやすく、問題をすばやく特定して解決できます)。

最終的に、プロジェクトを迅速に構築する必要があり、多くの成熟したプラグインのサポートが必要であることを考慮して、umi が採用されました。 antdはとても良いです! ! ! @umijs/plugin-model、このプラグインをお勧めします。内部のプラクティスを理解すれば、基本的にデータ管理をマスターできます。

ランタイム

Umi は、ランタイムの機能を拡張できるランタイム構成ファイルである app.ts を提供します。簡単に言えば、ページをレンダリングするためのすべての事前操作をここに配置できます。この概念は次のように分類できる。

storybook (preview.js) と比較すると、自分で実装したい場合は、対応する HTML にスクリプトを挿入することができます。ここにはプロジェクト関連のコンテンツがいくつか含まれます。プロジェクトは既存のプロジェクトに埋め込む必要があるため、iframe アプローチを採用します。必然的に、コミュニケーションと iframe サイズの調整が必要になります。

iframe 通信の場合、ドメインが異なるため、window.postmessage が使用されます。データの可読性を維持するために、後のメンテナンスの難易度が増すことを避けるために、対応するイベント送信コンテンツを定義することをお勧めします。頻繁な通信が必要な場合は、マイクロフロントエンドソリューションを採用することをお勧めします。

iframe の適応については、iframe-resizer プラグインが解決に役立ちます。埋め込みと埋め込みの両方をインストールする必要があることに注意してください。そうしないと、通信と適応ができなくなります。ここで問題があります。ページが埋め込まれている場合、bodyノードを内部から展開することはできないため、iframe-resizerが提供するカスタム計算方法を使用して、子ページに該当する方法を提供する必要があります。コードは次のとおりです。

サブシステム

'iframe-resizer/js/iframeResizer.contentWindow.js' をインポートします。
// 埋め込まれている場合は、実行時にリスナーを開きます const iframeInit = () => {
 if (親 !== ウィンドウ) {
  (ウィンドウは任意)iFrameResizer = {
   高さ計算方法: () => {
    document.body.children[0].clientHeightを返します。
   },
  };
  window.onmessage = (イベント: 任意) => {
   Array.isArray(event.data) の場合 {
    if (event.data[0] === 'イベント名') {
     console.log(event.data[1]) // イベントパラメータ}
   }
  };
  parent.postMessage({ msg: 'MessageFromIframePage' }, '*');
 }
};

iframeInit();

ライブ配信

梱包作業を経て、ようやく発売されます。ここでは主に、リクエストを転送するように nginx を構成する方法について説明します。

開発中に、複数の異なるドメインへのインターフェースが必要な場合、フロントエンドの最初の反応はプロキシを構成することです。オンラインになったとき、少し混乱しました。

 プロキシ: {
  '/api': {
   ターゲット: 'http://aaa.com',
   変更元: true、
   パス書き換え: { '^/api': '' },
  },
  '/b-api': {
   ターゲット: 'http://bbb.com/',
   変更元: true、
   パス書き換え: { '^/b-api': '' },
  },
 },

nginxの設定は次のとおりです

サーバー{
  聞く 80;
  server_name アクセス アドレス;
  $rooturi を "xxxx/dist" に設定します。
  場所 ~ .*\.(jpg|jpeg|gif|png|webp|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|svg|proto)$ {
   有効期限は365日です。
   ルート $rooturi;
  }
  場所 ^~/api/ {

   ^/api/(.*)$ /$1 を書き換えて、break;
   proxy_pass http://aaa.com;
  }
  
  場所 ^~/b-api/ {

   ^/b-api/(.*)$ /$1 を書き換えて、break;
   proxy_pass http://bbb.com;
  }
  
  位置 / {
   ルート $rooturi;
   try_files $uri $uri/ /index.html =404;
   add_header Cache-Control "no-cache";
   アクセス制御許可オリジン * のヘッダーを追加します。
  }

 
}

これで、React プロジェクトの作成からデプロイまでの実装例に関するこの記事は終了です。React プロジェクトの作成からデプロイまでのより関連性の高い記事については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • React と Threejs を使用して VR パノラマ プロジェクトを作成する詳細なプロセス
  • VSCode のデバッグ react-native android プロジェクトのエラー問題を解決する
  • webpack5 を使用して 0 から 1 までの React プロジェクトを構築する方法
  • Reactプロジェクトのパッケージ化に基づくCSS参照パスエラーの解決策
  • Reactプロジェクトでantdのフォームコンポーネントを使用して、入力ボックスの値を動的に設定する
  • Vue または React プロジェクトの運用環境から console.log を削除する
  • Reactフロントエンドプロジェクトのパッケージを最適化する方法
  • npx create-react-app xxx を使用してプロジェクトを作成するときに報告されるエラーの解決策
  • WeChat公式アカウントでReactプロジェクトを実行する方法

<<:  Windows および Linux で tomcat9 を介して war パッケージを手動で展開する方法

>>:  MySQL データベースの Binlog 使用法の概要 (必読)

推薦する

CSSを使用してすべての子要素を選択する方法の詳細な説明

CSS を使用してすべての子要素を再帰的に選択するにはどうすればよいですか?以下の記事では、CSS ...

Vue2 と Vue3 でウォッチ リスナーを使用する方法

watch : データの変更を監視する(特定の値の変更イベント) vue2.x データ(){ 戻る ...

Vueデータ割り当て問題の解決

私が長い間遭遇してきた問題を要約してみましょう。プロジェクトでは、フロントエンドをレンダリングするた...

CSS3はシームレスなスクロールと手ぶれ防止を実現します

質問画像とテキストのシームレスなスクロールは、一般的に携帯電話では良い効果をもたらしますが、一部のモ...

Vue router-viewとrouter-linkの実装原理

使用 <div id="アプリ"> <router-link ...

MySQL シリーズ II マルチインスタンス構成

チュートリアルシリーズMySQL シリーズ: MySQL リレーショナル データベースの基本概念My...

CSS3 マウスホバー遷移ズーム効果

以下は、純粋な CSS で記述された画像マウスホバーズーム効果です。実際、基本原理は非常に単純です。...

Vue.js スタイルレイアウト Flutter ビジネス開発共通スキル

シャドウスタイルにおけるフラッターとCSSの対応UIによって指定されたCSSスタイル 幅: 75px...

nginx と keepalived を組み合わせて高可用性を実現するための手順を完了する

序文システムの高可用性を満たすためには、通常、クラスターを構築する必要があります。ホストがクラッシュ...

写真とテキストによる MySQL 8.0.21 インストール チュートリアル

1. ダウンロードリンクをダウンロードするダウンロードをクリックします。Oracle アカウントにロ...

JavaScript デザインパターンの学習 アダプタパターン

目次概要コードの実装要約する概要アダプタ パターンは、デザイン パターンの動作パターンのパターンです...

MySQLの複合インデックス方式の詳細な説明

どの DBMS でも、インデックスは最適化にとって最も重要な要素です。データ量が少ない場合、適切なイ...

docker createコマンドの使用方法

docker create コマンドは、イメージに基づいてコンテナを作成できます。このコマンドの効果...

Navicat for MySql ビジュアルインポート CSV ファイル

この記事では、参考までに、Navicat for MySql の CSV ファイルのビジュアルインポ...