(精华)2020年7月31日 React 手写ssr服务端渲染
发布日期:2021-06-29 15:08:38 浏览次数:3 分类:技术文章

本文共 3681 字,大约阅读时间需要 12 分钟。

共用部分

import React ,{
useState} from 'react'import {
connect} from 'react-redux'import {
getIndexList} from '../store/index'const Index = (props) => {
let [count,setCount] = useState(1) return (

服务端渲染

{
count}

{
props.list.map(item=>
  • {
    item.name}
  • ) }
    )}Index.load = (store) => {
    return store.dispatch(getIndexList())}export default connect( state => ({
    list:state.index.list}), {
    getIndexList})(Index)
    import axios from 'axios'const GET_LIST = 'INDEX/GET_LIST'// action const changeList = list => ({
    type:GET_LIST, list})// 有一个请求 可以改变reducerexport const getIndexList = ()=>{
    return (dispatch)=>{
    return axios.get('http://xxxxxxxxxxx').then((res)=>{
    const {
    list} = res.data dispatch(changeList(list)) }) }}const initState = {
    list:[]}export default (state = initState,action) => {
    switch(action.type){
    case GET_LIST: const newState = {
    ...state, list:action.list } return newState default: return state }}

    客户端

    import React from 'react'import ReactDOM from 'react-dom'import {
    BrowserRouter} from 'react-router-dom'import {
    Provider} from 'react-redux'import {
    getClientStore} from '../store/store'import {
    Route,Link} from 'react-router-dom'import routers from '../router'const store = getClientStore()const App = ()=>{
    return (
    首页
    登录
    {
    routers.map(route=>
    )}
    )}ReactDOM.hydrate(
    ,document.getElementById('root'))

    服务端

    import express from 'express'import React from 'react'import {
    renderToString} from 'react-dom/server' // 专门在server端使用的import {
    StaticRouter} from 'react-router-dom'import {
    Provider} from 'react-redux'import {
    getStore} from '../store/store'import {
    Route,Link} from 'react-router-dom'import {
    matchRoutes} from 'react-router-config'import routers from '../router'let store = getStore()let app = express()app.use(express.static('public'))app.get('*',function(req,res){
    // 遍历所有的路由 寻找有load方法的 const matchedRoutes = matchRoutes(routers,req.path) let promises = [] matchedRoutes.forEach(item=>{
    let {
    load} = item.route.component if(load){
    const promise = new Promise((resolve,reject)=>{
    load(store).then(resolve).catch(reject) }) promises.push(promise) } }) Promise.all(promises).then(()=>{
    let content = renderToString(
    首页
    登录
    {
    routers.map(route=>
    )}
    ) const html = ` 软谋教育
    ${
    content}
    ` res.send(html) }) })app.listen(1000,()=>{
    console.log('监听1000端口成功');})

    先编译客户端在启动服务端

    "scripts": {
    "dev:server": "webpack --config webpack.server.js --watch", "dev:start": "nodemon --watch build --exec node \"./build/bundle.js\"", "dev:client": "webpack --config webpack.client.js --watch" },

    转载地址:https://codeboy.blog.csdn.net/article/details/107723690 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

    上一篇:(精华)2020年7月31日 Typescript 基本配置
    下一篇:(精华)2020年7月31日 React 虚拟dom的渲染机制和性能调优

    发表评论

    最新留言

    逛到本站,mark一下
    [***.202.152.39]2024年04月17日 02时44分14秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章

    ElasticSearch与Mysql对比(ElasticSearch常用方法大全,持续更新) 2019-04-29
    数字化转型的主干道上,华为云以“三大关键”成企业智能化推手 2019-04-29
    数字化为何不走“捷”“径”? 2019-04-29
    和总裁、专家交朋友,华为云助推政企智能化升级又做到前面去了 2019-04-29
    BCOP章鱼船长,6月22日晚上8点上线薄饼 2019-04-29
    为战疫助力,半导体功不可没 2019-04-29
    了解这些操作,Python中99%的文件操作都将变得游刃有余! 2019-04-29
    知道如何操作还不够!深入了解4大热门机器学习算法 2019-04-29
    只有经历过,才能深刻理解的9个编程道理 2019-04-29
    发现超能力:这些数据科学技能助你更高效专业 2019-04-29
    AI当道,人工智能将如何改变金融业? 2019-04-29
    消除性别成见,技术领域需要更多“乘风破浪的姐姐” 2019-04-29
    7行代码击败整个金融业,这对20多岁的爱尔兰兄弟是如何做到的? 2019-04-29
    2020十大编程博客:私藏的宝藏编程语言博客大放送! 2019-04-29
    编程中的角色选择:哪类工作角色最适合你? 2019-04-29
    10种算法一文打尽!基本图表算法的视觉化阐释 2019-04-29
    未来属于人工智能工程师,但成功转型不容易 2019-04-29
    科技界“挠头”:困扰科技界可持续发展的难题 2019-04-29
    20年后,这5种编码语言可能就消失了…… 2019-04-29
    标准出现问题,人工智能正在走向错误的方向 2019-04-29