国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

從零開(kāi)始最小實(shí)現(xiàn)react服務(wù)器渲染詳解

2019-11-19 14:28:23
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言

最近在寫(xiě) koa 的時(shí)候想到,如果我部分代碼提供api,部分代碼支持ssr,那我應(yīng)該如何寫(xiě)呢?(不想拆成 2個(gè)服務(wù)的情況下)
而且最近寫(xiě)的項(xiàng)目里面也用過(guò)一些服務(wù)端渲染,如nuxt,自己也搭過(guò)next的項(xiàng)目,確實(shí)開(kāi)發(fā)體驗(yàn)都非常友好,但是友好歸友好,具體又是如何實(shí)現(xiàn)的呢,諸位有沒(méi)有考慮過(guò)?

本著求真務(wù)實(shí)的折騰態(tài)度,選了react作為研究對(duì)象(主要是vue寫(xiě)的有點(diǎn)多,惡心了),那下面就簡(jiǎn)單就以最小成本寫(xiě)一個(gè)react的服務(wù)端渲染 demo

用到的技術(shù)棧

react 16 + webpack3 + koa2

看看它是如何實(shí)現(xiàn)服務(wù)端渲染的,here we go!

為什么要用服務(wù)端渲染

優(yōu)點(diǎn)

無(wú)非就是兩點(diǎn)

  1. SEO 友好
  2. 加快首屏渲染,減少白屏?xí)r間

那么問(wèn)題來(lái)了什么是SEO

一句話(huà)介紹就是,現(xiàn)在我們做的大多是SPA網(wǎng)站,所有頁(yè)面啊數(shù)據(jù)啊都是ajax來(lái)的,搜索引擎的spider來(lái)收錄網(wǎng)頁(yè)的時(shí)候,發(fā)現(xiàn)全空?那么你覺(jué)得你的網(wǎng)站收錄的權(quán)重跟效果是好還是不好?

而我們對(duì)SEO優(yōu)化,也是下面內(nèi)容所描述的核心就是:

下面是重點(diǎn)!

讓服務(wù)器把有內(nèi)容的HTML返回給我們,事件的話(huà)瀏覽器再渲染一次來(lái)進(jìn)行掛載

搭建 koa 環(huán)境

新建一個(gè) ssr 項(xiàng)目,并在項(xiàng)目中初始化 npm

mkdir ssr && cd ssrnpm init

下面的代碼我們用到了 import jsx 等語(yǔ)法,node環(huán)境是不支持的,所以需要配置babel

在當(dāng)前項(xiàng)目中新建文件 app.js跟index.js,然后

babel的入口, index.js代碼如下

require('babel-core/register')()require('babel-polyfill')require('./app')

我們項(xiàng)目的入口, app.js代碼如下

import Koa from 'koa'const app = new Koa()// responseapp.use((ctx) => { ctx.body = 'Hello Koa'})app.listen(3000)console.log("系統(tǒng)啟動(dòng),端口:3000")

根目錄下新建一個(gè).babelrc文件

內(nèi)容是:

{ "presets": ["react", "env"]}

安裝上面所需要的依賴(lài)

npm install babel-core babel-polyfill babel-preset-env babel-preset-react nodemon --save-devnpm i koa --save

配置啟動(dòng)腳本

package.json

"scripts": { "dev": "nodemon index.js",}

到這里你運(yùn)行 npm run dev 打開(kāi)localhost:3000

你就會(huì)看到 hello Koa了

是不是很簡(jiǎn)單就起了一個(gè)服務(wù)

安裝React

cnpm install react react-dom --save

在根目錄下新建一個(gè)app文件夾,并在文件夾中個(gè)新建一個(gè)main.js

main.js代碼如下

import React from 'react'export default class Home extends React.Component { render () {  return <div>hello world</div> }}

修改之前server.js

import Koa from 'koa'import React from 'react'import { renderToString } from 'react-dom/server'import App from './app/main'const app = new Koa()// responseapp.use(ctx => { let str = renderToString(<App />) ctx.body = str})app.listen(3000)console.log('系統(tǒng)啟動(dòng),端口:8080')

這個(gè)時(shí)候再 npm run dev

你就會(huì)看到屏幕上出現(xiàn)hello world

再打開(kāi)chrome 開(kāi)發(fā)者工具查看我們的請(qǐng)求:

我們的最簡(jiǎn)單的react組件變成str傳了進(jìn)來(lái)

這里我們用到了一個(gè)方法:

renderToString

主站蜘蛛池模板: 普定县| 宕昌县| 太湖县| 上林县| 景东| 临澧县| 宣恩县| 阳东县| 屯昌县| 望城县| 屏东市| 常熟市| 高碑店市| 昌乐县| 揭西县| 垣曲县| 通山县| 淮滨县| 安达市| 偏关县| 横山县| 潍坊市| 望江县| 慈利县| 巴中市| 揭阳市| 台东县| 土默特右旗| 延寿县| 平定县| 班戈县| 福泉市| 阆中市| 霞浦县| 连云港市| 临邑县| 昭通市| 晋宁县| 阳西县| 怀集县| 富裕县|