React サーバーサイド レンダリングの使用方法
今回は、React サーバーサイド レンダリングの使い方と、React サーバーサイド レンダリングを使用する際の 注意事項 を説明します。実際の事例を見てみましょう。
React は、コンポーネント (仮想 DOM) を HTML ブラウザ環境への依存を解決することに加えて、サーバーサイドレンダリングでは次の 2 つの問題も解決する必要があります:- フロントエンドとバックエンドはコードを共有できる
- フロントエンドとバックエンドエンドルーティングは均一に処理できます
Redux
Redux は、Flux と同様の一方向のデータ フローのセットを提供し、アプリケーション全体で 1 つのストアのみを維持し、その機能指向の機能によりサーバー側のレンダリングのサポートが容易になります。Redux の仕組みを学ぶには 2 分
ストアについて:- アプリケーション全体には 1 つだけのストアがあります
- ストアの対応する状態ツリー (State) はリデューサーによって呼び出されます関数 (ルート リデューサー) が生成します
- ステート ツリーの各フィールドは、さまざまなリデューサー関数によってさらに生成できます
- Store には、データ フローを処理するためのディスパッチ、getState などのいくつかのメソッドが含まれています
- ストアのステート ツリーのみ
- actionは{type, payload}を含むオブジェクトです
- reducer関数はstore.dispatch(action)によってトリガーされます
- reducer 関数は 2 つのパラメーター (状態、アクション) を受け取り、新しい状態を返します
- reducer 関数は action.type を決定し、対応する action.payload データを処理して アプリケーション全体 たとえば、ストアは UI スナップショットに対応し、サーバー側のレンダリングは、サーバー側でストアを初期化し、ストアをアプリケーションのルート コンポーネントに渡し、ルート コンポーネントで renderToString を呼び出して、アプリケーション全体を初期化データを含む HTML に変換します。
react-routerreact-router は、宣言的な方法でさまざまなルーティング決定を照合して、ページ上にさまざまなコンポーネントを表示し、props を介してコンポーネントにルーティング情報を渡します。そのため、ルーティングが変更される限り、propsこれによりコンポーネントが変更され、コンポーネントの再レンダリングがトリガーされます。
リスト ページ /list と詳細ページ /item/:id の 2 ページだけを持つ非常に単純なアプリケーションがあるとします。リスト上の項目をクリックして詳細ページに入ります。
次のようなルートを定義できます
、./routes.jsimport React from 'react'; import { Route } from 'react-router'; import { List, Item } from './components'; // 无状态(stateless)组件,一个简单的容器,react-router 会根据 route // 规则匹配到的组件作为 `props.children` 传入 const Container = (props) => { return ( <p>{props.children}</p> ); }; // route 规则: // - `/list` 显示 `List` 组件 // - `/item/:id` 显示 `Item` 组件 const routes = ( <Route path="/" component={Container} > <Route path="list" component={List} /> <Route path="item/:id" component={Item} /> </Route> ); export default routes;
StoreはReducerによって生成されるため、Reducerは実際にはStoreの状態ツリー構造を反映します
./reducers/index.jsimport listReducer from './list'; import itemReducer from './item'; export default function rootReducer(state = {}, action) { return { list: listReducer(state.list, action), item: itemReducer(state.item, action) }; }
const initialState = []; export default function listReducer(state = initialState, action) { switch(action.type) { case 'FETCH_LIST_SUCCESS': return [...action.payload]; default: return state; } }
const initialState = {}; export default function listReducer(state = initialState, action) { switch(action.type) { case 'FETCH_ITEM_SUCCESS': return [...action.payload]; default: return state; } }
对应的应该要有两个 action 来获取 list 和 item,触发 reducer 更改 Store,这里我们定义 fetchList 和 fetchItem 两个 action。 ./actions/index.js isomorphic-fetch 是一个前后端通用的 Ajax 实现,前后端要共享代码这点很重要。 另外因为涉及到异步请求,这里的 action 用到了 thunk,也就是函数,redux 通过 thunk-middleware 来处理这类 action,把函数当作普通的 action dispatch 就好了,比如 dispatch(fetchList()) Store 我们用一个独立的 ./store.js,配置(比如 Apply Middleware)生成 Store react-redux 接下来实现 ./app.js 至此,客户端部分结束。 Server Rendering 接下来的服务器端就比较简单了,获取数据可以调用 action,routes 在服务器端的处理参考 react-router server rendering,在服务器端用一个 match 方法将拿到的 request url 匹配到我们之前定义的 routes,解析成和客户端一致的 props 对象传递给组件。 ./server.js 服务器端渲染部分可以直接通过共用客户端 store.dispatch(action) 来统一获取 Store 数据。另外注意 renderFullPage 生成的页面 HTML 在 React 组件 mount 的部分( ),前后端的 HTML 结构应该是一致的。然后要把 store 的状态树写入一个全局变量(INITIAL_STATE),这样客户端初始化 render 的时候能够校验服务器生成的 HTML 结构,并且同步到初始化状态,然后整个页面被客户端接管。 最后关于页面内链接跳转如何处理? react-router 提供了一个 组件用来替代 标签,它负责管理浏览器 history,从而不是每次点击链接都去请求服务器,然后可以通过绑定 onClick 事件来作其他处理。 比如在 /list 页面,对于每一个 item 都会用 绑定一个 route url:/item/:id,并且绑定 onClick 去触发 dispatch(fetchItem(id)) 获取数据,显示详情页内容。 相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章! 推荐阅读:import fetch from 'isomorphic-fetch';
export function fetchList() {
return (dispatch) => {
return fetch('/api/list')
.then(res => res.json())
.then(json => dispatch({ type: 'FETCH_LIST_SUCCESS', payload: json }));
}
}
export function fetchItem(id) {
return (dispatch) => {
if (!id) return Promise.resolve();
return fetch(`/api/item/${id}`)
.then(res => res.json())
.then(json => dispatch({ type: 'FETCH_ITEM_SUCCESS', payload: json }));
}
}
import { createStore } from 'redux';
import rootReducer from './reducers';
// Apply middleware here
// ...
export default function configureStore(initialState) {
const store = createStore(rootReducer, initialState);
return store;
}
,
import React from 'react';
import { render } from 'react-dom';
import { Router } from 'react-router';
import createBrowserHistory from 'history/lib/createBrowserHistory';
import { Provider } from 'react-redux';
import routes from './routes';
import configureStore from './store';
// `INITIAL_STATE` 来自服务器端渲染,下一部分细说
const initialState = window.INITIAL_STATE;
const store = configureStore(initialState);
const Root = (props) => {
return (
<p>
<Provider store={store}>
<Router history={createBrowserHistory()}>
{routes}
</Router>
</Provider>
</p>
);
}
render(<Root />, document.getElementById('root'));
import express from 'express';
import React from 'react';
import { renderToString } from 'react-dom/server';
import { RoutingContext, match } from 'react-router';
import { Provider } from 'react-redux';
import routes from './routes';
import configureStore from './store';
const app = express();
function renderFullPage(html, initialState) {
return `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body>
<p id="root">
<p>
${html}
</p>
</p>
<script>
window.INITIAL_STATE = ${JSON.stringify(initialState)};
</script>
<script src="/static/bundle.js"></script>
</body>
</html>
`;
}
app.use((req, res) => {
match({ routes, location: req.url }, (err, redirectLocation, renderProps) => {
if (err) {
res.status(500).end(`Internal Server Error ${err}`);
} else if (redirectLocation) {
res.redirect(redirectLocation.pathname + redirectLocation.search);
} else if (renderProps) {
const store = configureStore();
const state = store.getState();
Promise.all([
store.dispatch(fetchList()),
store.dispatch(fetchItem(renderProps.params.id))
])
.then(() => {
const html = renderToString(
<Provider store={store}>
<RoutingContext {...renderProps} />
</Provider>
);
res.end(renderFullPage(html, store.getState()));
});
} else {
res.status(404).end('Not found');
}
});
});
以上がReact サーバーサイド レンダリングの使用方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











解決策: 1. eMule の設定をチェックして、正しいサーバー アドレスとポート番号が入力されていることを確認します; 2. ネットワーク接続を確認し、コンピューターがインターネットに接続されていることを確認し、ルーターをリセットします; 3. サーバーが正常に動作しているかどうかを確認します。ネットワーク接続に問題がない場合は、サーバーがオンラインであるかどうかを確認する必要があります; 4. eMule のバージョンを更新し、eMule 公式 Web サイトにアクセスし、eMule ソフトウェアの最新バージョンをダウンロードします。 5.助けを求めてください。

LINUX ユーザーとして、CentOS にさまざまなソフトウェアやサーバーをインストールする必要があることがよくありますが、この記事では、CentOS に Fuse をインストールしてサーバーをセットアップする方法を詳しく紹介し、関連する作業をスムーズに完了できるようにします。 CentOS のインストールfusionFuse は、権限のないユーザーがカスタマイズされたファイル システムを通じてファイル システムにアクセスして操作できるようにするユーザー スペース ファイル システム フレームワークです。CentOS への Fuse のインストールは非常に簡単で、次の手順に従うだけです: 1. ターミナルを開き、次のようにログインします。ルートユーザー。 2. 次のコマンドを使用して、fuse パッケージをインストールします: ```yuminstallfuse3。インストール プロセス中のプロンプトを確認し、「y」を入力して続行します。 4. インストール完了

RPC サーバーが利用できず、デスクトップからアクセスできない場合はどうすればよいですか? 近年、コンピューターとインターネットが私たちの生活の隅々に浸透しています。集中コンピューティングとリソース共有のテクノロジーとして、リモート プロシージャ コール (RPC) はネットワーク通信において重要な役割を果たします。ただし、場合によっては、RPC サーバーが利用できなくなり、デスクトップにアクセスできなくなる状況が発生することがあります。この記事では、この問題の考えられる原因のいくつかについて説明し、解決策を提供します。まず、RPC サーバーが使用できない理由を理解する必要があります。 RPCサーバーは、

DHCP リレーの役割は、2 つのサーバーが異なるサブネット上にある場合でも、受信した DHCP パケットをネットワーク上の別の DHCP サーバーに転送することです。 DHCP リレーを使用すると、ネットワーク センターに集中 DHCP サーバーを展開し、それを使用してすべてのネットワーク サブネット/VLAN に IP アドレスを動的に割り当てることができます。 Dnsmasq は、一般的に使用される DNS および DHCP プロトコル サーバーであり、ネットワーク内の動的ホスト構成の管理を支援する DHCP リレー サーバーとして構成できます。この記事では、dnsmasq を DHCP リレー サーバーとして構成する方法を説明します。コンテンツ トピック: ネットワーク トポロジ DHCP リレー上の静的 IP アドレスの構成 集中型 DHCP サーバー上の DHCP リレー D

ネットワーク データ転送において、IP プロキシ サーバーは重要な役割を果たし、ユーザーが実際の IP アドレスを隠し、プライバシーを保護し、アクセス速度を向上させるのに役立ちます。この記事では、PHP を使用して IP プロキシ サーバーを構築する方法に関するベスト プラクティス ガイドを紹介し、具体的なコード例を示します。 IPプロキシサーバーとは何ですか? IP プロキシ サーバーは、ユーザーとターゲット サーバーの間にある中間サーバーであり、ユーザーとターゲット サーバー間の転送ステーションとして機能し、ユーザーのリクエストと応答を転送します。 IPプロキシサーバーを使用する場合

1. まず、Kijiale でレンダリングするデザインプランを開きます。 2. 次に、レンダリング メニューでトップ ビュー レンダリングを開きます。 3. 次に、トップ ビュー レンダリング インターフェイスのパラメーター設定で [直交] をクリックします。 4. 最後に、モデルの角度を調整した後、[今すぐレンダリング]をクリックして直交上面ビューをレンダリングします。

Epic サーバーがオフラインのときにゲームに参加できない場合はどうすればよいですか?この問題は多くの友人が経験しているはずです。このプロンプトが表示されると、正規のゲームが起動できなくなります。この問題は通常、ネットワークやセキュリティ ソフトウェアからの干渉によって引き起こされます。では、どのように解決すればよいでしょうか?今回の編集者が説明します。解決策を皆さんと共有したいと思います。今日のソフトウェア チュートリアルが問題の解決に役立つことを願っています。オフライン時に epic サーバーがゲームに参加できない場合の対処方法: 1. セキュリティ ソフトウェアによって妨害されている可能性があります。ゲーム プラットフォームとセキュリティ ソフトウェアを閉じて、再起動します。 2. 2 つ目は、ネットワークの変動が大きすぎることです。ルーターを再起動して機能するかどうかを確認してください。状態に問題がない場合は、5G モバイル ネットワークを使用して動作を試みることができます。 3. それならもっとあるかもしれない

Java フレームワークと React フレームワークの統合: 手順: バックエンド Java フレームワークをセットアップします。プロジェクト構造を作成します。ビルドツールを設定します。 React アプリケーションを作成します。 REST API エンドポイントを作成します。通信メカニズムを構成します。実際のケース (SpringBoot+React): Java コード: RESTfulAPI コントローラーを定義します。 React コード: API によって返されたデータを取得して表示します。
