webpack实现ssr服务端渲染

正常情况下CSR

在这里插入图片描述
直接在客户端用render渲染出来即可。
在这里插入图片描述
可以看出,所有的渲染逻辑都是由打包出来的js文件完成,页面的整体框架是没有内容的,所以才说不以利SEO。(页面都没有东西啊,搜索引擎咋知道你页面是干嘛的)

SSR逻辑

  1. 将组组件输出成字符串
  2. 将字符串输出到模板里面
  3. 服务端返回模板

项目结构

在这里插入图片描述

SSR代码实现

创建一个server端,写入配置

/server/index.js

if(typeof window === 'undefined'){
  global.window = {}
}

const express = require('express');
const ReactDOMServer  = require('react-dom/server')
//需要ssr的js文件
const SSR = require('../ssr/dist/app-server.js')


function server(port){
  const app = express();
  app.use(express.static('dist'))
  app.get('/',(req,res)=>{
  // 使用renderToString 将组件格式化成字符串
  //使用 renderMarkup() 将字符串插入进模板中
    const html = renderMarkup(ReactDOMServer.renderToString(SSR))
    
    res.status(200).send(html)
  })
  app.listen(port,()=>{
    console.log('Server is running on prot',port);
    
  })
}
server(process.env.PORT || 3000)

const renderMarkup = (str) =>{
  return  (
    `<!DOCTYPE html>
  <html lang="en">
  <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
  </head>
  <body>
    <div id='app-container'>${str} </div>
  </body>
  </html>`
  )
}


//模板渲染
const renderMarkup = (str) =>{
  return  (
    `<!DOCTYPE html>
  <html lang="en">
  <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
  </head>
  <body>
    <div id='search'>${str} </div>
  </body>
  </html>`
  )
}

客户端

//因为导出要用服务端渲染  服务端是node.js
//所以import服务端不认识,要换成require
const React  =  require("react") ;
const App  =  require("./App.js") ;

class Index extends React.Component{
  render() {
      return (
        <div>
        <App></App>
      </div>
      )
  }
}

//注意这里不能用ReactDOM.render() ,因为服务端压根不认识这个东西
module.exports = <Index/>

webpack.ssr.js
ssr打包不需要HtmlWebpackPlugin
在这里插入图片描述
出口处要加umd规范

ssr构建完成之后,页面是有骨架,有内容的。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值