この記事では主に、React Server Rendering の最小限の実装をゼロから詳しく説明し、参考として共有します。
まえがき
最近、koa を書いているときに、コードの一部が API を提供し、コードの一部が SSR をサポートしている場合、どのように書けばよいのかと考えました。 (2 つのサービスに分割したくない場合)
そして、最近書いた nuxt などのプロジェクトでもサーバーサイド レンダリングを使用しており、次のプロジェクトにも取り組んでいることは事実です。開発経験は非常にフレンドリーですが、フレンドリーは具体的にどのように達成されるのか考えたことがありますか?
真実を追求し実用的な姿勢に従って、私は調査対象として React を選択しました (主な理由は、Vue が少し書きすぎていてうんざりするためです)。その後、単純に React サーバー側のレンダリング デモを作成します。最小コスト
使用 私たちがたどり着いたテクノロジースタックは
react 16 + webpack3 + koa2
で、サーバーサイドレンダリングがどのように実装されているかを確認してください。
サーバーサイドレンダリングを使用する理由
利点
は2つの点にすぎません
SEOに優しい
最初の画面レンダリングを高速化し、白画面時間を短縮します
それで、何が問題なのでしょうか?それは 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 'koa' import React from 'react' import { renderToString } from 'react-dom/server' import App from './app/main' const app = new Koa() // response app.use(ctx => { let str = renderToString(<App />) ctx.body = str }) app.listen(3000) console.log('系统启动,端口:8080')
のコードを変更します。もう一度ページを見てみましょう。えっ、何もありませんか?
を使用してください。これは、バックエンドがコンポーネントを HTML の文字列にレンダリングすることしかできず、イベントのバインディングやその他の処理はブラウザ側で実行する必要があるためです
では、イベントをバインドするにはどうすればよいですか? ?
その後、サーバーは HTML の文字列をレンダリングするため、イベントをマウントする方法は、ブラウザーで一度再レンダリングすることであると間違いなく推測されるでしょう
それを実行してください
Webpack を構成します新しい Webpack を作成しますルート ディレクトリの下の .config.js
以下は webpack.config.js の内容です:
import React from 'react' 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('path') var webpack = require('webpack') module.exports = { entry: { main: './app/index.js' }, output: { filename: '[name].js', path: path.join(__dirname, 'public'), publicPath: '/' }, resolve: { extensions: ['.js', '.jsx'] }, module: { loaders: [ {test: /\.jsx?$/, loaders: ['babel-loader'], } ] } }のコードです
ブラウザのレンダリングではルートコンポーネントをDOMノードにマウントする必要があるため、反応コードの入り口を設定します
この時点で問題があります。ノード環境にドキュメントオブジェクトが存在しないのですが、どうすれば解決できますか?
存在しないのですか?存在しない場合は、必要ありません。SSR の核心は、要求された URL 内の特定の HTML コンテンツを返すことです。イベントは気にしません。その後、ルート コンポーネントを renderToString
に直接返します。以下を変更します サービスコードにより、コードがサーバーレンダリングをサポートできるようになります
さらにいくつかの依存関係を追加します
import Demo from './main' import ReactDOM from 'react-dom' import React from 'react' ReactDOM.render(<Demo />, document.getElementById('root'))
- koa-static: 静的ファイルを処理するためのミドルウェア
- koa-views: テンプレートを構成するためのミドルウェア
- server.jsのコードを変更します
cnpm i --save koa-static koa-views ejs
以下のレンダリングテンプレートを作成します
viewsフォルダを作成します
その中に新しいindex.htmlを作成します:
import Koa from 'koa' import React from 'react' import { renderToString } from 'react-dom/server' import views from 'koa-views' import path from 'path' import Demo from './app/main' const app = new Koa() // 将/public文件夹设置为静态路径 app.use(require('koa-static')(__dirname + '/public')) // 将ejs设置为我们的模板引擎 app.use(views(path.resolve(__dirname, './views'), { map: { html: 'ejs' } })) // response app.use(async ctx => { let str = renderToString(<Demo />) await ctx.render('index', { root: str }) }) app.listen(3000) console.log('系统启动,端口:8080')
この HTML 内の変数 (次のような)。これは、renderToString の結果が配置される場所です。 1. パッケージ内でコードを直接テストしてみましょう。 .json の内部
新增:
"scripts": { "dev": "nodemon index.js", "build": "webpack" },
2. 运行 npm run build, 构建出我们的react代码
3. npm run dev
点击一下代码,是不是会 alert(123)
tada 撒花,恭喜你,一个最简单服务器渲染就已经完成
到这里核心的思想就都已经讲完了,总结来说就下面三点:
起一个node服务
把react 根组件 renderToString渲染成字符串一起返回前端
前端再重新render一次
原理就是这么简单
但是具体开发的时候还会有各种各样的需求,比如:
不可能我每次改完代码都重新构建看效果吧 => 需要 实时构建
create-react-app 都是热更新,你还要刷新是不是太蠢了 => 需要支持热更新
其他一些配套的周边,如: 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端差别不大
上面是我整理给大家的,希望今后会对大家有帮助。
相关文章:
以上がReact サーバー レンダリングの実装に関連する問題を詳しく説明するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

さまざまな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コンピューティングの可能性をカバーしています。


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

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

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