今回は、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> <route></route> <route></route> </route> ); export default routes;ここから始めて、この非常に単純なアプリケーションを使用して、サーバー側のフロントエンドとバックエンドのレンダリングの実装に関連する詳細のいくつかを説明します。 Reducer
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) }; }rootReducerのstateパラメータはStore全体の状態ツリーです状態ツリーの下の各フィールドは独自のリデューサーを持つこともできるため、ここでは listReducer と itemReducer が導入されています。これら 2 つのリデューサーの状態パラメーターは、状態ツリー全体の対応するリスト フィールドと項目フィールドにすぎないことがわかります。 ./reducers/list.js に固有の
const initialState = []; export default function listReducer(state = initialState, action) { switch(action.type) { case 'FETCH_LIST_SUCCESS': return [...action.payload]; default: return state; } }list は項目を含む単純な配列で、次の構造に似ています: [{ id: 0, name: 'first item'}, {id: 1, name : '2 番目の項目'}]、'FETCH_LIST_SUCCESS' の action.payload から取得されます。 次に、./reducers/item.jsで取得したアイテムデータを処理します
const initialState = {}; export default function listReducer(state = initialState, action) { switch(action.type) { case 'FETCH_ITEM_SUCCESS': return [...action.payload]; default: return state; } }Action
对应的应该要有两个 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.jsimport 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>
<router>
{routes}
</router>
</provider>
</p>
);
}
render(<root></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 `
nbsp;html>
<meta>
<p>
</p><p>
${html}
</p>
服务器端渲染部分可以直接通过共用客户端 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中文网其它相关文章!
推荐阅读:
以上がReact サーバーサイド レンダリングの使用方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します

JavaScriptは、現代のWeb開発のコア言語であり、その多様性と柔軟性に広く使用されています。 1)フロントエンド開発:DOM操作と最新のフレームワーク(React、Vue.JS、Angularなど)を通じて、動的なWebページとシングルページアプリケーションを構築します。 2)サーバー側の開発:node.jsは、非ブロッキングI/Oモデルを使用して、高い並行性とリアルタイムアプリケーションを処理します。 3)モバイルおよびデスクトップアプリケーション開発:クロスプラットフォーム開発は、反応および電子を通じて実現され、開発効率を向上させます。

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

Pythonはデータサイエンスや機械学習により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、簡潔な構文とリッチライブラリエコシステムで知られており、データ分析とWeb開発に適しています。 2。JavaScriptは、フロントエンド開発の中核です。 node.jsはサーバー側のプログラミングをサポートしており、フルスタック開発に適しています。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

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

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

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

WebStorm Mac版
便利なJavaScript開発ツール
