UmiJS 作为一个企业级前端应用框架,不满足于只做于客户端渲染,它也支持服务器端渲染和预渲染。
首先介绍一下三者的区别:
此功能默认关闭,需要通过配置开启,可以修改项目根目录中的 .umirc.ts 增加 ssr 配置项:
export default { ssr: {}, }
执行 umi dev 访问的页面即是服务器端渲染后的。可以查看网页源代码,如果 <div id="root"> DOM 里的元素不为空,则是 SSR。
此时是借助于 devServer 实现的服务器端渲染,如果配合后端开发框架一起使用时,可以配置关闭 umi dev 下的服务器端渲染行为:
export default { ssr: { // 默认为 true devServerRender: false, }, }
在上个步骤我们了解了如何关闭默认的服务器端渲染行为,如果我们想借助于其他框架实现服务器端渲染呢?
Umi 服务器端的渲染不耦合某个服务器端框架,你可以使用熟悉的框架来实现这个过程,例如 Express, Koa 等。
以 Koa 为例
app.use(async (ctx) => { const { request: req, response: res } = ctx; // 或者从 CDN 上下载到 server 端 // const serverPath = await downloadServerBundle('http://cdn.com/bar/umi.server.js'); const render = require('./dist/umi.server'); res.set('Content-Type', 'text/html'); const context = {}; const { html, error, rootContainer } = await render({ // 有需要可带上 query path: req.url, context, // 可自定义 html 模板 // htmlTemplate: defaultHtml, // 启用流式渲染 // mode: 'stream', // html 片段静态标记(适用于静态站点生成) // staticMarkup: false, // 扩展 getInitialProps 在服务端渲染中的参数 // getInitialPropsCtx: {}, // manifest,正常情况下不需要 }); ctx.body = html });
在上述的代码中,Umi 的渲染功能会返回一个拼接完成后的 HTML 字符串(没有报错的理想情况下),然后交由 Koa 提供给浏览器端。
小提示:配合其他开发框架使用时,如果在浏览器中渲染时遇到 js 等静态资源文件加载失败时,请检查资源所在端口或域名是否正确,可以指定 publicPath 配置项。
既然是服务器端渲染,那么获取数据是必不可少的一个步骤。例如我们想从一个 API 服务器查询获取数据,然后展示在页面中。
在 Umi 中有两种方式:
假设我们的 API 地址是 `https://jsonplaceholder.typicode.com/todos/1`,它的内容如下:
{ "userId": 1, "id": 1, "title": "delectus aut autem", "completed": false }
首先来看第一种方式,Umi 支持页面级数据预获取,这点非常方便。
每个页面可能有单独的数据预获取逻辑,它会获取页面组件上的 getInitialProps 静态方法,执行后将结果注入到该页面组件的 props 中,例如:
function IndexPage(props) { const { todoData: { title = '' } } = props; return ( <div> <h1 className={styles.title}>{title}</h1> </div> ); } IndexPage.getInitialProps = async (ctx) => { // 发起 API 请求查询 const result = await fetch(`https://jsonplaceholder.typicode.com/todos/1`).then(res => res.json()); return { todoData: result } }; export default IndexPage;
接下来我们看看第二种方式,继续以 Koa 为例,修改上述代码:
app.use(async (ctx) => { const { request: req, response: res } = ctx; // 或者从 CDN 上下载到 server 端 // const serverPath = await downloadServerBundle('http://cdn.com/bar/umi.server.js'); const render = require('./dist/umi.server'); res.set('Content-Type', 'text/html'); const context = {}; // 发起 API 请求查询 const result = await fetch(`https://jsonplaceholder.typicode.com/todos/1`).then(res => res.json()); const { html, error, rootContainer } = await render({ // 有需要可带上 query path: req.url, context, // 可自定义 html 模板 // htmlTemplate: defaultHtml, // 启用流式渲染 // mode: 'stream', // html 片段静态标记(适用于静态站点生成) // staticMarkup: false, // 扩展 getInitialProps 在服务端渲染中的参数 getInitialPropsCtx: { todoData: result }, // manifest,正常情况下不需要 }); ctx.body = html });
上述代码首先发起查询,获得数据后使用 getInitialPropsCtx 把查询到的数据扩展到 ctx 中。
在使用的时候,在页面组件的 getInitialProps 中即可使用这个参数了,注意只有在服务器端执行时才有此函数:
function IndexPage(props) { const { todoData: { title = '' } } = props; return ( <div> <h1 className={styles.title}>{title}</h1> </div> ); } IndexPage.getInitialProps = async (ctx) => { const { isServer, todoData } = ctx; if (isServer) { return { todoData } } return {}; };
这两种方式各有其使用场景,对于多个页面公共的数据可以采用第二种方式;对于各个页面单独的数据通过第一种方式更灵活。
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
接口测试概述:在软件进行测试时,为了验证软件对外的接口服务是否可以正常提供服务及软件在不同场景中执行路径的安全性和可操作性,需要对接口进行测试。接口测试(interfacetesting)的目的是测试与系统相关联的外部接口,测试的重点是检查数据的交互,传递和控制管理过程,提供测试质量和测试覆盖,更好地重新软件缺陷和定位错误。接口测试主要考虑的问题是模块接口和系统接口。1.模块接口的测试模块接口测试
Umi内置了测试功能,在一个UmiJS项目的package.json的scripts部分可以看到:{"scripts":{"test":"umi-test"}}这里看到的umi-test命令是在@umijs/test这个包中定义的,内部用了jest作为其测试框架。UmiJS还提供了一个名为@umijs/test-utils的包,它在内部使用了ReactTestingLibrary。不过这个包貌使用
Umi应用都是单页面应用,页面地址的跳转都是在浏览器端完成的,不会发起网络请求从服务器端获取HTML。HTML只在应用初始化时加载一次,后续路由的变化都是利用了浏览器的API实现。所有的页面由不同的React组件构成,页面的切换其实是不同React组件的切换,只需要在配置中把不同的路由路径和对应的组件关联上。提示:Umi同时支持配置式路由和约定式路由。目前配置式路由是主流,本文主要介绍配置式路由。
C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效率高而且可移植性好,可以用来开发应用软件、驱动、操作系统等。C语言也是其它众多高级语言的鼻祖语言,所以说学习C语言是进入编程世界的必修课。HelloWorld#includeintmain(){/*在双引号中间输入HelloWorld*/printf("HelloWorld"
1.字符串letsingleQuotes:string='single';letdoubleQuotes:string="double";lettemplateString:string=`Iam${singleQuotes}`;console.log(singleQuotes);console.log(doubleQuotes);console.log(templateString);2.数字c
函数是应用程序的基本组成部分,在TypeScript中声明函数和JavaScript类似:functionname(parameter:type,parameter:type,...):returnType{//dosomething}和JavaScript不同的是它允许你为参数和返回值设置类型声明。例如:functionadd(a:number,b:number):number{returna+
扫一扫关注公众号
添加我为好友,拉您入交流群!
请使用微信扫一扫!