在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:Bigerfe/koa-react-ssr开源软件地址:https://github.com/Bigerfe/koa-react-ssr开源编程语言:JavaScript 96.9%开源软件介绍:zz.js v2.0 (koa2 + react16 + ssr) 服务端渲染应用开发骨架
最清凉(轻量)的 react ssr 应用开发骨架
快速上手从这里开始你将了解到怎样让 环境准备首先你需要安装 node ,并且确保 node 版本是10.0或以上。mac 下推荐使用 nvm 来管理 node 版本) $ node -v
10.0x 脚手架安装为了方便我们创建应用和页面,这里提供了一个配套的 先全局安装脚手架。 $ npm i zzjs-cli -g 创建应用
启动脚本可通过不同的命令开启不同的渲染模式。 $ npm run dev //开启本地开发 可修改配置内的属性 __IS_SSR__ 来支持两种渲染模式
$ //更多..... 目录结构
约定页面入口 关于 路由约定 每个页面的路由配置的方式不再是集中式配置,而是分治配置,每个页面对应一个路由配置,请按照下面的格式进行配置 举个栗子 // /src/pages/index 页面目录
// /src/pages/index/config/route.js 路由配置
//路由代码,可以方便的设置路由是否按需加载
import React from 'react';
import BaseBundle from '../../../routes/route-base-bundle';
//import LazyPageCom from '../index'; //静态组件模式
//动态组件配置
const LazyPageCom = (props) => (
<BaseBundle {..props} load={() => import(/*webpackChunkName:"chunk-index"*/'../index')}>
{(CompIndex) => <CompIndex {...props} />}
</BaseBundle>
);
//一个页面组件可配置多个路由入口
export default [
{
path:'/',
component: LazyPageCom,
exact:true
},{
path: '/index',
component: LazyPageCom
}
] 你只需要修改 webpackChunkName 的名称和 export 导出的数据即可,当然也可以对当前页面配置多个路由. 创建页面可通过脚手架快速的创建页面 $ cd <Your Project Name>
//初始化项目
$ zzjs -p
$ <Your pageName>
$ open http://<Your local ip>:8808/<Your pageName> 路由分治管理为了方便维护和扩展, 请参考路由约定 数据预取同构数据预取的目的是在 为了方便的实现同构我们在页面组件内约定了一个数据预取的静态方法 //基础参数的带入
//opt={query:{},params:{}}
static async getInitialProps(zzOpt){//数据预取
if(__SERVER__){
//如果是服务端渲染的话 可以做的处理
}
//接口 a
const fetch1= fetch.postForm('/fe_api/a', {
data: { a: 4000 }
});
//接口 b
const fecth2= fetch.postForm('/fe_api/b', {
data: { c: 2000 }
});
const resArr =await fetch.multipleFetch(fetch1, fecth2);
//返回数据固定格式 page 代表页面信息,支持 seo 的设置
//fetchData是接口返回的数据
return {
page:{
tdk: {
title: 'ksr 框架',
keyword: 'ssr react',
description: '我是描述'
}
},
fetchData: resArr
}
} 页面 SEO在 数据预取同构 已经看到了
//此处代码已略
return {
page:{
tdk: {
title: 'ksr 框架',
keyword: 'ssr react',
description: '我是描述'
}
},
fetchData: resArr
} 页面渲染一个page 的渲染
参考完整代码 import React,{useContext} from 'react';
import { Link } from 'react-router-dom';
import RootContext from '../../app/route-context';//自定义 context
import ZzPageBase from '../../zz-base/common/components/zz-page-base';//基础组件 页面组件都需要继承
import fetch from '../../common/fetch';//内置的 fech 模块
export default class Index extends ZzPageBase{
constructor(props,context){
super(props,context);
}
enableSpaDataCache=true;//开启 伪 pwa 数据缓存
//得到 context 对象
static contextType = RootContext;
//基础参数的带入
//opt={query:{},params:{}}
static async getInitialProps(zzOpt){//数据预取
if(__SERVER__){
//如果是服务端渲染的话 可以做的处理
}
const fetch1= fetch.postForm('/fe_api/a', {
data: { a: 4000 }
});
const fecth2= fetch.postForm('/fe_api/b', {
data: { c: 2000 }
});
const resArr =await fetch.multipleFetch(fetch1, fecth2);
//返回数据固定格式 page 代表页面信息,支持 seo 的设置
//fetchData是接口返回的数据
return {
page:{
tdk: {
title: 'ksr 框架',
keyword: 'ssr react',
description: '我是描述'
}
},
fetchData: resArr
}
}
componentDidMount(){
//数据更新 参考
//this.isSSR 标识当前页面是否是 ssr 输出
//this.hasSpaCacheData标识是否有伪 pwa 的缓存数据
if (!this.isSSR && !this.hasSpaCacheData){// 页面如果是客户端的需要重新获取数据
Index.getInitialProps(this.props.zzOpt).then(data=>{
this.setState({
...data
},()=>{
document.title=this.state.page.tdk.title;
});
});
}
}
render(){
const {page,fetchData}=this.state;//获得数据
//参考代码,需要对数据做边界容错处理
return <div className="detailBox">
<div>
{
page && <div><span>title:{page.tdk.title}</span>
<span>ky:{page.tdk.keyword}</span>
</div>
}
</div>
{
res && res.data.map(item=>{
return <div key={item.id}>{item.keyId}:{item.keyName}---{item.setContent}</div>
})
}
</div>
}
} 特殊字段
更多 待续....Demo 演示(有点丑,别介意)社区交流可以加作者微信: 作者笔 名: 前端双月 (zz_jesse) 公众号: 前端技术江湖 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论