Skip to content

Commit

Permalink
feat: add stateless render test
Browse files Browse the repository at this point in the history
  • Loading branch information
hubcarl committed Nov 6, 2019
1 parent a28ddbb commit f7ee597
Show file tree
Hide file tree
Showing 7 changed files with 95 additions and 37 deletions.
10 changes: 10 additions & 0 deletions app/controller/home.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,16 @@ module.exports = app => {
await ctx.render('list.js', Model.getPage(1, 10));
}

async stateless() {
const { ctx } = this;
await ctx.render('stateless.js', Model.getPage(1, 10));
}

async promise() {
const { ctx } = this;
await ctx.render('promise.js', { message: 'React Promise Hook Test' });
}

async client() {
const { ctx } = this;
await ctx.renderClient('list.js', Model.getPage(1, 10));
Expand Down
2 changes: 2 additions & 0 deletions app/router.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,7 @@ module.exports = app => {
app.get('/', app.controller.home.index);
app.get('/about', app.controller.home.index);
app.get('/list', app.controller.home.list);
app.get('/stateless', app.controller.home.stateless);
app.get('/promise', app.controller.home.promise);
app.get('/api/article/list', app.controller.home.pager);
};
59 changes: 28 additions & 31 deletions app/web/page/app/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,38 +30,35 @@ const clientRender = () => {
module.hot.accept();
}
render(Entry);
import('service-worker-register').then(sw =>{
sw.default.register('service-worker.js');
});

};

const serverRender = (context, options)=> {
const url = context.state.url;
console.log('>>>>url', url);
const branch = matchRoutes(routes, url);
const promises = branch.map(({route}) => {
const fetch = route.component.fetch;
return fetch instanceof Function ? fetch() : Promise.resolve(null)
});
return Promise.all(promises).then(data => {
const initState = context.state;
data.forEach(item => {
Object.assign(initState, item);
const serverRender = ()=> {
return context => {
const url = context.state.url;
const branch = matchRoutes(routes, url);
const promises = branch.map(({route}) => {
const fetch = route.component.fetch;
return fetch instanceof Function ? fetch() : Promise.resolve(null)
});
return Promise.all(promises).then(data => {
const initState = context.state;
data.forEach(item => {
Object.assign(initState, item);
});
context.state = Object.assign({}, context.state, initState);
const store = create(initState);
return () =>(
<Layout>
<div>
<Provider store={store}>
<StaticRouter location={url} context={{}}>
<App url={url}/>
</StaticRouter>
</Provider>
</div>
</Layout>
)
});
context.state = Object.assign({}, context.state, initState);
const store = create(initState);
return () =>(
<Layout>
<div>
<Provider store={store}>
<StaticRouter location={url} context={{}}>
<App url={url}/>
</StaticRouter>
</Provider>
</div>
</Layout>
)
});
}
};
export default EASY_ENV_IS_NODE ? serverRender : clientRender();
export default EASY_ENV_IS_NODE ? serverRender() : clientRender();
36 changes: 36 additions & 0 deletions app/web/page/list/promise.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import React, { Component } from 'react';
import Layout from '../../component/layout.jsx';
import List from './componets/list';
import './index.css';


const Entry = (props) => {
return <Layout>
<div className="main">
<div className="page-container page-component">
<h1>{props.message}</h1>
</div>
</div>
</Layout>;
};


const clientRender = () => {
const state = create(window.__INITIAL_STATE__);
const render = Page =>{
ReactDOM.hydrate(EASY_ENV_IS_DEV ? <AppContainer><Page {...state} /></AppContainer> : <Page />, document.getElementById('app'));
};
if (EASY_ENV_IS_DEV && module.hot) {
module.hot.accept();
}
render(Entry);
};

const serverRender = ()=> {
return context => {
return Promise.resolve( () => {
return <Entry {...context.state} />
});
}
};
export default EASY_ENV_IS_NODE ? serverRender() : clientRender();
14 changes: 14 additions & 0 deletions app/web/page/list/stateless.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import React, { Component } from 'react';
import Layout from '../../component/layout.jsx';
import List from './componets/list';
import './index.css';

export default (props) => {
return <Layout>
<div className="main">
<div className="page-container page-component">
<List list={props.list}></List>
</div>
</div>
</Layout>;
};
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
"egg-scripts": "^2.8.1",
"egg-serviceworker": "^1.0.0",
"egg-validate": "^2.0.2",
"egg-view-react-ssr": "^2.2.6",
"egg-view-react-ssr": "next",
"extend": "~3.0.0",
"history": "^4.7.2",
"lodash": "^4.17.4",
Expand Down
9 changes: 4 additions & 5 deletions webpack.config.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
module.exports = {
entry: {
app: 'app/web/page/app/index.js',
list: 'app/web/page/list/index.jsx'
},
plugins:[
{ serviceworker: true }
]
list: 'app/web/page/list/index.jsx',
stateless: 'app/web/page/list/stateless.js',
promise: 'app/web/page/list/promise.js'
}
};

0 comments on commit f7ee597

Please sign in to comment.