Remix 框架是服务端渲染架构,当路由请求时生成 HTML 并返回浏览器。这种 SSR 是如何实现的呢?如果不使用 Remix 这种框架,可以在服务器段启动一个无头浏览器进行页面渲染并返回,代价就是要在服务器上启动一个 Chrome 服务,还要做一些定制,Dom 处理等等。
Remix的做法是直接调用调用 React 渲染函数, 它封装了一个 Handler 来做服务端渲染,React在浏览器中进行渲染时也是生成HTML 片段,并最终添加到 HTML DOM 树中。Remix 这个 Handler 做了同样的处理,只是上下文变成 NodeJS,NodeJS 不能提供做浏览器内置的功能,因此,并不是所有的组件都可以转换,如果要依赖 Dom 上某些状态才能渲染出来,NodeJS 上下文文中没有这些对象的,例如 document 这样的对象,那就是无法渲染的,只能在浏览器中进行渲染。
所以,Remix 并不是简单的将组件渲染成 HTML 并返回,Remix中将组件分成 Server 和 Client,Server 是服务端处理,例如数据库操作等,Client 是在浏览器中进行渲染的部分,同时 Remix 对于 Client 也做了很多优化的处理,例如并发,这是为什么 Remix 的应用运行会比较快,从开始设计的时候,它就考虑了弱网的情况。对于那些比较依赖浏览器环境的组件,服务器端不渲染而是交给客户端进行渲染。
下面我来看一下,Remix 的编译是如何工作,Remix 通过 npx remix vite:build进行编译,并在 build 目录下生成 Client 和 Server相关文件。