typescript版的react服務端渲染

2021-09-13 16:33:36 字數 2016 閱讀 2107

router.tsx 路由

...

function routerconfig()

ssr.tsx 匹配路徑

...

export default (url: string | object, context: any,store: any)=>

renderfullpage.ts 渲染頁面

...

const renderfullpage = (ctx : iroutercontext, newstate:object ) =>

// 得到初始 state 建立新的 redux store 例項

const store = createstore(reducers, newstate);

// 從 redux store 得到初始 state,注入到window

const finalstate = store.getstate()

let initstate = ``;

//根據路由獲取html並注入到

,將 initstate 插到該節點後面

const html = reactdomserver.rendertostring(ssr(ctx.req.url, context, store));

let renderpage = myhtml.replace(/(\)(.|\n|\r)*(\<\/div\>)/i, "$1" + html + "$3" + initstate);

ctx.type = 'html';

ctx.body = renderpage;

}export default renderfullpage;

index.tsx 前端的路由處理

...

const preloadedstate = window.__initial_state__ || {} //

// 使用初始 state 建立 redux store

const store = createstore(reducers, preloadedstate)

render(

,document.getelementbyid('root') as htmlelement

)

1..redux方面,先建立新的 redux store 例項,將我們需要初始的state合併到 store

2.通過 store.getstate() 獲取最終的finalstate

3.通過 staticrouter 可以獲取路徑匹配的頁面元件,並通過 reactdomserver.rendertostring 轉化為html元素

ssr.tsx 主要做了兩件事:

1.將初始的 store 注入redux

2.返回帶有 store 資料的路徑匹配的頁面元件,也就是說這個頁面已經是有初始資料了

4.將讀取的html模板注入資料,在這裡我們需要通過簡單的正則替換一下

在 中插入我們的html元素

在 後面插入

5.將這個頁面傳送出去

6.js載入的時候會讀取window.__initial_state__的資料,合併到 store

export default (html, finalstate)=>(`$

window.__initial_state__ = $

`)

git clone [email protected]:m-ryan/typescript-koa-ssr-react-boilerplate.git

cd typescript-koa-ssr-react-boilerplate

開發環境 npm start

生產環境 npm run build

TypeScript版線段樹

脫離acm隊伍已經一年多了,現在還能手寫的演算法不多,線段樹是其中一種。謹以此文紀念逝去的acm生涯 線段樹是一種二叉搜尋樹,常用於區間求和 區間求極值,其查詢和更新時間複雜度是o logn 線段樹的主要操作包括初始化 更新和查詢 1.初始化 初始化過程是乙個遞迴演算法,從根節點遞迴全樹。作用是設定...

FileInputStream中的read 方法

首先這是我自己寫 的時候遇到的乙個問題,我思來想去,終於想通透了,所以想分享給大家,當然這也是乙個非常簡單的問題,大神勿噴。public class io inputstream public static void main string args 但是列印結果就是 246,隔乙個列印乙個,我感到...

typeScript中的繼承

ts中類的定義 class person run void let p new person 李哥 p.run 李哥 class person getname string setname name string void let p new person 李哥 alert p.getname 李哥...