(精華2020年5月31日更新) react基礎篇 手寫ssr服務端渲染
共用部分
import React ,{useState} from 'react'
import {connect} from 'react-redux'
import {getIndexList} from '../store/index'
const Index = (props) => {
let [count,setCount] = useState(1)
return (
<div>
<h1>服務端渲染</h1>
<h1>{count}</h1>
<button onClick={()=>{props.getIndexList()}}>載入</button>
<button onClick={()=>{setCount(count+1)}}>增加</button>
{
props.list.map(item=><li key={item.id}>{item.name}</li>)
}
</div>
)
}
Index.load = (store) => {
return store.dispatch(getIndexList())
}
export default connect(
state => ({list:state.index.list}),
{getIndexList}
)(Index)
客戶端
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 (
<Provider store={store}>
<BrowserRouter>
<div>
<Link to="/">首頁</Link>
<Link to="/login">登入</Link>
</div>
{routers.map(route=><Route {...route}/>)}
</BrowserRouter>
</Provider>
)
}
ReactDOM.hydrate(
<App/>
,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(
<Provider store={store}>
<StaticRouter>
<div>
<Link to="/">首頁</Link>
<Link to="/login">登入</Link>
</div>
{routers.map(route=><Route {...route}/>)}
</StaticRouter>
</Provider>
)
const html = `
<html>
<head>
<title>軟謀教育</title>
</head>
<body>
<div id="root">${content}</div>
<script>
window._context = ${JSON.stringify(store.getState())}
</script>
<script src="/main.js"></script>
</body>
</html>
`
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"
},
目錄store
import axios from 'axios'
const GET_LIST = 'INDEX/GET_LIST'
// action
const changeList = list => ({
type:GET_LIST,
list
})
// 有一個請求 可以改變reducer
export 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
}
}
相關文章
- React + Koa 實現服務端渲染(SSR)React服務端
- React + Koa 實現服務端渲染(SSR) Part IIReact服務端
- React16.x中的服務端渲染(SSR)React服務端
- Vue 服務端渲染(SSR)Vue服務端
- 服務端渲染基礎服務端
- 實現SSR服務端渲染服務端
- Vue/React 元件 PHP 服務端渲染(SSR)可行性分析VueReact元件PHP服務端
- 實現ssr服務端渲染demo服務端
- react 服務端渲染React服務端
- React服務端渲染實現(基於Dva)React服務端
- (精華2020年5月22日更新) react基礎篇 元件的使用React元件
- react基礎學習和react服務端渲染框架next.js踩坑React服務端框架JS
- docsify 4.0 釋出,支援服務端渲染(SSR)服務端
- (精華2020年5月25日更新) react基礎篇 react-hooks的useContext用法ReactHookContext
- (精華2020年5月25日更新) react基礎篇 react-hooks的useState用法ReactHook
- Vue SSR服務端渲染之資料快取Vue服務端快取
- 對比分析--淺析SSR(服務端渲染)和SPA(客戶端渲染)服務端客戶端
- 我很懶,什麼都沒留下系列 之 教你上手React服務端渲染(React SSR)&& HMRReact服務端
- 用 TypeScript 編寫一個 React 服務端渲染庫(1)TypeScriptReact服務端
- React + React-Loadable 實現服務端渲染React服務端
- [譯]揭祕 React 服務端渲染React服務端
- typescript版的react服務端渲染TypeScriptReact服務端
- 如何用 React 做服務端渲染React服務端
- React服務端渲染(專案搭建)React服務端
- 【長文慎入】一文吃透 React SSR 服務端渲染和同構原理React服務端
- React 服務端渲染原理及過程React服務端
- TypeScript + Webpack + Koa 搭建 React 服務端渲染TypeScriptWebReact服務端
- 使用 Nuxt.js 快速搭建服務端渲染(SSR) 應用UXJS服務端
- 服務端渲染到前端渲染,再到“服務端渲染”服務端前端
- React SSR(伺服器端渲染) 細微探究React伺服器
- React服務端渲染(前後端路由同構)React服務端後端路由
- [譯]利用React Router4實現的服務端直出渲染(SSR)React服務端
- 仿掘金前臺 vue 服務端渲染(ssr)後臺 react (spa) 後臺服務是 koa 的一個專案Vue服務端React
- 服務端渲染的React手腳架。完美使用 React, Redux, and React-Router!最好用的腳手架服務端ReactRedux
- 普通vue-cli初始專案轉為服務端渲染SSRVue服務端
- Inertia.js SSR | 讓 Laravel x Vue 實現服務端渲染JSLaravelVue服務端
- React 服務端渲染從入門到精通React服務端
- React 服務端渲染完美的解決方案React服務端