ホームページ ウェブフロントエンド jsチュートリアル React サーバー レンダリングの実装に関連する問題を詳しく説明する

React サーバー レンダリングの実装に関連する問題を詳しく説明する

Jun 09, 2018 pm 02:14 PM
react

この記事では主に、React Server Rendering の最小限の実装をゼロから詳しく説明し、参考として共有します。

まえがき

最近、koa を書いているときに、コードの一部が API を提供し、コードの一部が SSR をサポートしている場合、どのように書けばよいのかと考えました。 (2 つのサービスに分割したくない場合)
そして、最近書いた nuxt などのプロジェクトでもサーバーサイド レンダリングを使用しており、次のプロジェクトにも取り組んでいることは事実です。開発経験は非常にフレンドリーですが、フレンドリーは具体的にどのように達成されるのか考えたことがありますか?

真実を追求し実用的な姿勢に従って、私は調査対象として React を選択しました (主な理由は、Vue が少し書きすぎていてうんざりするためです)。その後、単純に React サーバー側のレンダリング デモを作成します。最小コスト

使用 私たちがたどり着いたテクノロジースタックは

react 16 + webpack3 + koa2

で、サーバーサイドレンダリングがどのように実装されているかを確認してください。

サーバーサイドレンダリングを使用する理由

利点

は2つの点にすぎません

  1. SEOに優しい

  2. 最初の画面レンダリングを高速化し、白画面時間を短縮します

それで、何が問題なのでしょうか?それは SEO です

一言で言えば、私たちが現在構築しているほとんどの Web サイトは、すべてのページとデータが Ajax から来て Web ページを収集します。全部空っぽだったかな?では、あなたの Web サイトを含めることの重要性と効果は良いと思いますか、それとも悪いと思いますか?

SEO 最適化の核心は次のコンテンツでも説明されています:

以下が重要なポイントです。

サーバーにコンテンツを含む HTML を返してもらいます。イベントが発生すると、ブラウザはそれを再度レンダリングしてマウントします

新しい ssr プロジェクトを作成し、プロジェクト内の npm を初期化します

以下のコード import jsxなどの構文を使用しましたが、ノード環境ではサポートされていないため、babelの設定が必要です

現在のプロジェクトに新しいファイルapp.jsとindex.jsを作成し、

babelの入り口、index.js コードは次のとおりです

mkdir ssr && cd ssr
npm init
ログイン後にコピー

プロジェクトの入り口、app.js コードは次のとおりです

require('babel-core/register')()

require('babel-polyfill')
require('./app')
ログイン後にコピー

ルート ディレクトリに新しい .babelrc ファイルを作成します

内容は次のとおりです:

import Koa from 'koa'
const app = new Koa()

// response
app.use((ctx) => {
 ctx.body = 'Hello Koa'
})

app.listen(3000)
console.log("系统启动,端口:3000")
ログイン後にコピー

上記で必要な依存関係をインストールします

{
 "presets": ["react", "env"]
}
ログイン後にコピー

起動スクリプトを設定します

package.json

npm install babel-core babel-polyfill babel-preset-env babel-preset-react nodemon --save-dev
npm i koa --save
ログイン後にコピー

ここで npm run dev を実行し、localhost:3000 を開きます

Hello Koa が表示されます

サービスを開始するのは非常に簡単です

Reactをインストールします

"scripts": {
 "dev": "nodemon index.js",
}
ログイン後にコピー
ルートディレクトリに新しいアプリフォルダを作成し、そのフォルダ内に新しいmain.jsを作成します

main.jsのコードは以下の通りです

cnpm install react react-dom --save
ログイン後にコピー

以前のserver.jsを修正します

import React from 'react'

export default class Home extends React.Component {
 render () {
  return <p>hello world</p>
 }
}
ログイン後にコピー

At今回は、npm run dev

画面に hello world が表示されます

Chrome 開発者ツールを開いてリクエストを表示します:

最も単純な React コンポーネントが str になり、渡されます

ここではメソッドを使用します:

renderToString – 実際には、コンポーネントを文字列にレンダリングします

これまでのところ、コンポーネントにイベントやその他のインタラクティブな動作を追加していません。次に試してみましょう

main.js

import Koa from &#39;koa&#39;
import React from &#39;react&#39;
import { renderToString } from &#39;react-dom/server&#39;
import App from &#39;./app/main&#39;

const app = new Koa()

// response
app.use(ctx => {
 let str = renderToString(<App />)

 ctx.body = str
})

app.listen(3000)

console.log(&#39;系统启动,端口:8080&#39;)
ログイン後にコピー

のコードを変更します。もう一度ページを見てみましょう。えっ、何もありませんか?

を使用してください。これは、バックエンドがコンポーネントを HTML の文字列にレンダリングすることしかできず、イベントのバインディングやその他の処理はブラウザ側で実行する必要があるためです

では、イベントをバインドするにはどうすればよいですか? ?


その後、サーバーは HTML の文字列をレンダリングするため、イベントをマウントする方法は、ブラウザーで一度再レンダリングすることであると間違いなく推測されるでしょう

それを実行してください

Webpack を構成します

新しい Webpack を作成しますルート ディレクトリの下の .config.js

以下は webpack.config.js の内容です:

import React from &#39;react&#39;

export default class Home extends React.Component {
 render () {
  return <p onClick={() => window.alert(123)}>hello world</p>
 }
}
ログイン後にコピー

上記の設定は、エントリを app/index.js ファイルに設定します

次に、ファイルを作成します

以下app/index.js:

var path = require(&#39;path&#39;)
var webpack = require(&#39;webpack&#39;)

module.exports = {
 entry: {
  main: &#39;./app/index.js&#39;
 },
 output: {
  filename: &#39;[name].js&#39;,
  path: path.join(__dirname, &#39;public&#39;),
  publicPath: &#39;/&#39;
 },
 resolve: {
  extensions: [&#39;.js&#39;, &#39;.jsx&#39;]
 },
 module: {
  loaders: [
   {test: /\.jsx?$/,
    loaders: [&#39;babel-loader&#39;],
   }
  ]
 }
}
ログイン後にコピー
のコードです

​​ブラウザのレンダリングではルートコンポーネントをDOMノードにマウントする必要があるため、反応コードの入り口を設定します

この時点で問題があります。ノード環境にドキュメントオブジェクトが存在しないのですが、どうすれば解決できますか?

存在しないのですか?存在しない場合は、必要ありません。SSR の核心は、要求された URL 内の特定の HTML コンテンツを返すことです。イベントは気にしません。その後、ルート コンポーネントを renderToString

に直接返します。

以下を変更します サービスコードにより、コードがサーバーレンダリングをサポートできるようになります

さらにいくつかの依存関係を追加します

import Demo from &#39;./main&#39;
import ReactDOM from &#39;react-dom&#39;
import React from &#39;react&#39;
ReactDOM.render(<Demo />, document.getElementById(&#39;root&#39;))
ログイン後にコピー

    koa-static: 静的ファイルを処理するためのミドルウェア
  1. koa-views: テンプレートを構成するためのミドルウェア
  2. ejs: テンプレートエンジン
  3. server.jsのコードを変更します
cnpm i --save koa-static koa-views ejs
ログイン後にコピー

以下のレンダリングテンプレートを作成します

viewsフォルダを作成します

その中に新しいindex.htmlを作成します:

import Koa from &#39;koa&#39;
import React from &#39;react&#39;
import { renderToString } from &#39;react-dom/server&#39;
import views from &#39;koa-views&#39;
import path from &#39;path&#39;

import Demo from &#39;./app/main&#39;
const app = new Koa()
// 将/public文件夹设置为静态路径
app.use(require(&#39;koa-static&#39;)(__dirname + &#39;/public&#39;))
// 将ejs设置为我们的模板引擎
app.use(views(path.resolve(__dirname, &#39;./views&#39;), { map: { html: &#39;ejs&#39; } }))

// response
app.use(async ctx => {
 let str = renderToString(<Demo />)
 await ctx.render(&#39;index&#39;, {
  root: str
 })
})

app.listen(3000)

console.log(&#39;系统启动,端口:8080&#39;)
ログイン後にコピー

この HTML 内の変数 (次のような)。これは、renderToString の結果が配置される場所です。 1. パッケージ内でコードを直接テストしてみましょう。 .json の内部

新增:

 "scripts": {
  "dev": "nodemon index.js",
  "build": "webpack"
 },
ログイン後にコピー

2. 运行 npm run build, 构建出我们的react代码

3. npm run dev

点击一下代码,是不是会 alert(123)

 tada 撒花,恭喜你,一个最简单服务器渲染就已经完成

到这里核心的思想就都已经讲完了,总结来说就下面三点:

  1. 起一个node服务

  2. 把react 根组件 renderToString渲染成字符串一起返回前端

  3. 前端再重新render一次

原理就是这么简单

但是具体开发的时候还会有各种各样的需求,比如:

  1. 不可能我每次改完代码都重新构建看效果吧 => 需要 实时构建

  2. create-react-app 都是热更新,你还要刷新是不是太蠢了 => 需要支持热更新

  3. 其他一些配套的周边,如: react-router, redux 或者mobx怎么支持呢 => 需要完善的生态

.etc

这些问题都是用完 官方脚手架之后就回不去了的,所以更多的配置可以参考下面的repo(是一个工具链完善的最小实现),欢迎提PR

GitHub - ws456999/koa-react-ssr-starter: to understand && to explain how react ssr works

目前你可以在里面找到 react + react-router + mobx + postcss + 热更新的配置,除了react-router的配置有些差别,其他都跟client端差别不大

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

在vue中如何实现页面跳转后返回原页面初始位置

使用vue-router如何设置每个页面的title方法

如何解决Vue.js显示数据的时,页面闪现

以上がReact サーバー レンダリングの実装に関連する問題を詳しく説明するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

React と WebSocket を使用してリアルタイム チャット アプリを構築する方法 React と WebSocket を使用してリアルタイム チャット アプリを構築する方法 Sep 26, 2023 pm 07:46 PM

React と WebSocket を使用してリアルタイム チャット アプリケーションを構築する方法 はじめに: インターネットの急速な発展に伴い、リアルタイム コミュニケーションがますます注目を集めています。ライブチャット アプリは、現代の社会生活や仕事生活に不可欠な部分になっています。この記事では、React と WebSocket を使用して簡単なリアルタイム チャット アプリケーションを構築する方法と、具体的なコード例を紹介します。 1. 技術的な準備 リアルタイム チャット アプリケーションの構築を開始する前に、次のテクノロジとツールを準備する必要があります。 React: 構築用の 1 つ

React フロントエンドとバックエンドの分離ガイド: フロントエンドとバックエンドの分離と独立したデプロイメントを実現する方法 React フロントエンドとバックエンドの分離ガイド: フロントエンドとバックエンドの分離と独立したデプロイメントを実現する方法 Sep 28, 2023 am 10:48 AM

React フロントエンドとバックエンドの分離ガイド: フロントエンドとバックエンドの分離と独立したデプロイメントを実現する方法、特定のコード例が必要です 今日の Web 開発環境では、フロントエンドとバックエンドの分離がトレンドになっています。フロントエンド コードとバックエンド コードを分離することで、開発作業がより柔軟かつ効率的になり、チームのコラボレーションが促進されます。この記事では、React を使用してフロントエンドとバックエンドの分離を実現し、それによって分離と独立したデプロイの目標を達成する方法を紹介します。まず、フロントエンドとバックエンドの分離とは何かを理解する必要があります。従来の Web 開発モデルでは、フロントエンドとバックエンドが結合されています。

React と Flask を使用してシンプルで使いやすい Web アプリケーションを構築する方法 React と Flask を使用してシンプルで使いやすい Web アプリケーションを構築する方法 Sep 27, 2023 am 11:09 AM

React と Flask を使用してシンプルで使いやすい Web アプリケーションを構築する方法 はじめに: インターネットの発展に伴い、Web アプリケーションのニーズはますます多様化および複雑化しています。使いやすさとパフォーマンスに対するユーザーの要件を満たすために、最新のテクノロジー スタックを使用してネットワーク アプリケーションを構築することがますます重要になっています。 React と Flask は、フロントエンドおよびバックエンド開発用の 2 つの非常に人気のあるフレームワークであり、うまく連携してシンプルで使いやすい Web アプリケーションを構築します。この記事では、React と Flask を活用する方法について詳しく説明します。

React と RabbitMQ を使用して信頼性の高いメッセージング アプリを構築する方法 React と RabbitMQ を使用して信頼性の高いメッセージング アプリを構築する方法 Sep 28, 2023 pm 08:24 PM

React と RabbitMQ を使用して信頼性の高いメッセージング アプリケーションを構築する方法 はじめに: 最新のアプリケーションは、リアルタイム更新やデータ同期などの機能を実現するために、信頼性の高いメッセージングをサポートする必要があります。 React はユーザー インターフェイスを構築するための人気のある JavaScript ライブラリであり、RabbitMQ は信頼性の高いメッセージング ミドルウェアです。この記事では、React と RabbitMQ を組み合わせて信頼性の高いメッセージング アプリケーションを構築する方法を紹介し、具体的なコード例を示します。 RabbitMQ の概要:

React コード デバッグ ガイド: フロントエンドのバグをすばやく見つけて解決する方法 React コード デバッグ ガイド: フロントエンドのバグをすばやく見つけて解決する方法 Sep 26, 2023 pm 02:25 PM

React コード デバッグ ガイド: フロントエンドのバグをすばやく見つけて解決する方法 はじめに: React アプリケーションを開発するとき、アプリケーションをクラッシュさせたり、不正な動作を引き起こしたりする可能性のあるさまざまなバグに遭遇することがよくあります。したがって、デバッグ スキルを習得することは、すべての React 開発者にとって不可欠な能力です。この記事では、フロントエンドのバグを見つけて解決するための実践的なテクニックをいくつか紹介し、読者が React アプリケーションのバグをすばやく見つけて解決できるようにする具体的なコード例を示します。 1. デバッグツールの選択: In Re

React Router ユーザーガイド: フロントエンドルーティング制御の実装方法 React Router ユーザーガイド: フロントエンドルーティング制御の実装方法 Sep 29, 2023 pm 05:45 PM

ReactRouter ユーザーガイド: フロントエンドルーティング制御の実装方法 シングルページアプリケーションの人気に伴い、フロントエンドルーティングは無視できない重要な部分になりました。 React エコシステムで最も人気のあるルーティング ライブラリとして、ReactRouter は豊富な機能と使いやすい API を提供し、フロントエンド ルーティングの実装を非常にシンプルかつ柔軟にします。この記事では、ReactRouter の使用方法と具体的なコード例を紹介します。 ReactRouter を最初にインストールするには、次のものが必要です

React と Google BigQuery を使用して高速データ分析アプリケーションを構築する方法 React と Google BigQuery を使用して高速データ分析アプリケーションを構築する方法 Sep 26, 2023 pm 06:12 PM

React と Google BigQuery を使用して高速データ分析アプリケーションを構築する方法 はじめに: 今日の情報爆発の時代において、データ分析はさまざまな業界で不可欠なリンクとなっています。中でも、高速かつ効率的なデータ分析アプリケーションを構築することは、多くの企業や個人が追求する目標となっています。この記事では、React と Google BigQuery を使用して高速データ分析アプリケーションを構築する方法を紹介し、詳細なコード例を示します。 1. 概要 React はビルドするためのツールです

React と Docker を使用してフロントエンド アプリケーションをパッケージ化してデプロイする方法 React と Docker を使用してフロントエンド アプリケーションをパッケージ化してデプロイする方法 Sep 26, 2023 pm 03:14 PM

React と Docker を使用してフロントエンド アプリケーションをパッケージ化およびデプロイする方法 フロントエンド アプリケーションのパッケージ化とデプロイは、プロジェクト開発の非常に重要な部分です。最新のフロントエンド フレームワークの急速な発展により、React は多くのフロントエンド開発者にとって最初の選択肢となっています。コンテナ化ソリューションとして、Docker はアプリケーションのデプロイメントプロセスを大幅に簡素化できます。この記事では、React と Docker を使用してフロントエンド アプリケーションをパッケージ化してデプロイする方法を紹介し、具体的なコード例を示します。 1. 準備 始める前に、インストールする必要があります

See all articles