浅谈next.js,关于ssr你不需要知道的

1,600 阅读4分钟

next.js是什么?

且听我唱首周截棍的双杰伦。说白了就是一款基于react的ssr框架。ssr又是什么?小问号,你怎么这么多朋友?完成一款ssr框架,难度可高可低,说低是因为ssr要做的事情就是打包出两份代码,一份是服务端,一份是客户端,然后起服务器,用户第一次访问经过服务器时,我们解析请求,返回服务器对应的页面,服务器渲染好的页面,到达客户端之后,客户端进行一次水合,后面的路由管理被客户端的路由监听事件接管,拉取对应的组件进行重新渲染。但是,在面对企业级开发时,我们需要更多的规范、性能优化以及稳定性。这时候就是next.js出场的时候了。

next.js特殊吗?

并不,它其实完成的功能跟上面常见ssr框架要完成的事情都差不多,但是它更进了很多步。next.js的使用很简单,用cli初始化一个项目之后,我们就按照约定在pages目录写页面,public目录放置资源文件等,这样在编译的时候,next会扫描这些约定的目录生成路由,当然路由会优先匹配资源文件,再到pages页面,但是我们最好不要让资源的路径跟页面冲突。next.js中的路由,这里要说一下,next自建路由体系,并没有使用业界的react-router,next会扫描目录后会生成路由表,pages目录都会当成webpack中的entry,这样打包生成之后,客户端和服务端也能轻松找到对应的文件进行路由加载,其中客户端的page页面的entry进行了优化,会先用内建的webpack loader加载过一次再到出来使用,为什么要这样做呢?当然是为了缓存,把客户端加载过的路由缓存到内存里面,下次路由事件触发的时候,就可以直接从内存里面读取就好了,连http缓存那层都省了。路由的性能不止提现在这,内建的link组件走的更远,鼠标hover会触发prefetch或者进入可视区域也会触发prefetch,这样在我们真的点击触发路由跳转的时候,因为js已经提前拉取缓存了,体验可以说一级棒~

next还做了什么?

next内建的组件像app和document打了很多辅助,同时内建了了webpack配置、插件、loader等,举几个例子来说,内置webpack插件会在打包完毕之后清除require.cache缓存,这样服务端就不会加载到旧代码了,还有会把当次生成的页面保存下来,下次打包完毕的时候,发现没有生成这个页面了,还会帮你把这个页面删除掉之类的等等。对于使用者来说,无需关心这些,因为next都在内部帮你完成这些了。

对了,next.js在客户端entry会unshift一个clien目录下的client,这个文件就是客户端主加载的入口,负责渲染、拉取路由等,客户端的路由还使用发布订阅的方式,你路由要加载,可以,先帮你把依赖的js和css等加载回来,然后等路由加载完毕之后,再通知页面去render,对于预加载路由,next做的很体贴,如果你是2g网络或者savedata模式(查了一下mdn,就是the user has set a reduced data usage option on the user agent.),就不预加载了,如果可以预加载,还会侦测你浏览器支持preload还是prefetch。next还修复了webpack中导致ssr文件多次加载导致实例化的问题,解决方案就是给webpack的require加个缓存,如果发现加载过,就从缓存里面拿。还有什么呢?想到再加啦

结语

没有具体谈里面的细节,但是关于next.js主要流程就是这么多,如果要想了解类似next.js的路由机制、如何去监听变化重新编译等,这里不做细致的展开,主要原因是因为我懒的打字。