本文主要介绍 UmiJS 的预渲染功能。
服务端渲染(Server-Side Rendering),是指由 服务端 完成页面的 HTML 结构拼接的页面处理技术,发送到浏览器,然后为其绑定状态与事件,成为完全可交互页面的过程。
服务端渲染,首先得有后端服务器(一般是 Node.js)才可以使用,而没有后端服务器的情况下,可以使用 预渲染 。
预渲染与服务端渲染唯一的不同点在于 渲染时机 ,服务端渲染的时机是在用户访问时执行渲染(即实时渲染,数据一般是最新的),预渲染的时机是在项目构建时,当用户访问时,数据不一定是最新的( 如果数据没有实时性,可以直接考虑预渲染 )。
预渲染在构建时执行渲染,将渲染后的 HTML 片段生成静态 HTML 文件。无需使用 web 服务器实时动态编译 HTML,适用于 静态站点生成 。
Umi3 在 SSR 上做了大量优化及开发体验的提升,具有以下特性:
默认情况下,服务端渲染时关闭的,可通过配置开启:
服务端渲染的数据获取方式与 SPA(单页应用) 有所不同,为了让客户端和服务端都能获取到同一份数据,Umi 提供了页面级数据的预获取。
每个页面可能有单独的数据预获取逻辑,这里我们会获取页面组件上的 getInitialProps 静态方法,执行后将结果注入到该页面组件的 props 中,如:
getInitialProps 有几个固定参数:
为了结合数据流框架,我们提供了 modifyGetInitialPropsCtx 方法,由插件或应用来扩展 ctx 参数,以 dva 为例:
然后在页面中,可以获取到 store :
同时也可以在自身应用中进行扩展:
同时可以使用 getInitialPropsCtx 将服务端参数扩展到 ctx 中,例如:
在使用的时候,就有 req 对象,不过需要注意的是,只在服务端执行时才有此参数:
则在执行 getInitialProps 方法时,除了以上两个固定参数外,还会获取到 title 和 store 参数。
关于 getInitialProps 执行逻辑和时机,需要注意:
执行 umi build ,除了正常的 umi.js 外,会多一个服务端文件: umi.server.js (相当于服务端入口文件)。然后在后端框架中,引用该文件:
render 方法参数和返回值如下:
完美兼容客户端动态加载,配置如下:
@umijs/preset-react 插件集中已内置对标题的渲染,通过以下步骤使用:
@umijs/preset-react 插件集中已内置 dva
这时候 getInitialProps(ctx) 中的 ctx 就会有 store 属性,可执行 dispatch ,并返回初始化数据。
Umi 同时支持对服务端和客户端包大小的分析
特点:
测试
初始化项目
通过初始化命令将生成package.json文件,它是 NodeJS 约定的用来存放项目的信息和配置等信息的文件。
通过umi命令创建index.js文件
可以看到在pages下创建好了index.js和index.css文件
将下面内存拷贝到index.js文件中进行测试
通过命令行启动umi的后台服务,用于本地开发
antd-pro升级以后发现他们使用了umi,所以就玩玩它是个什么东西。umi是什么就不赘述,直接参照官网 umi
官方建议node版本是8.10或更高版本。
我的node版本是v8.9.3,正常使用。
1、按照下列命令执行
2、然后,选择需要的功能,要选择的按空格即可,我选择的是 antd dva
3、确定后,将根据选择自动创建目录和文件。
4、然后手动安装依赖项
5、最后,启动本地开发服务器
如果顺利,请在浏览器中打开 http:// localhost:8000 ,您将看到以下ui。
按照官方执行的包路径并不是这这样,我对其进行了添加和修改
其中 .umirc.js 按照官网生成应该是和 package 同级的一个配置文件,入下图,存在即合理,我们使用 config/config.js
上图‘项目查看’有package.json的截图,查看一下其中的配置,我们使用 cross-env 进行跨平台地设置及使用环境变量,简单区分一下有mock和无mock的启动区别,至于修改端口这个事儿看公司使用在端口上有没有要求,如果有要求就按照公司要求配置,没有要求个人建议自己维护一套端口规则,即便是不维护也不要用默认端口。
其他的使用跟 dva 时代没有多少区别,关于数据还是 redux-saga 那一套东西