# 编写通用代码

# 数据响应

每个请求应该都是全新的、独立的应用程序实例,以便不会有交叉请求造成的状态污染。

将数据进行响应式的过程在服务器上是多余的,所以默认禁用,可以避免将数据转换为响应式对象的性能开销。

# 组件生命周期

由于没有动态更新,所有的生命周期钩子函数中,只有beforeCreatecreated会在服务端渲染过程中被调用,其他钩子函数只会在客户端执行。

应该避免在beforeCreatecreated生命周期中产生全局副作用的代码,例如在其中使用setInterval

# 特定平台API

通用代码不可接受特定平台的API,比如windowdocument,这种仅浏览器可用的全局变量在 Node.js 中执行会抛出错误。反之也是如此。

对于共享于服务器和客户端,但用于不同平台API的任务,建议将平台特定实现包含在通用API中。例如 axios。

对于仅浏览器可用的 API,通常方式是在生命周期钩子函数中惰性访问它们。

如果第三方library不是以上面的通用用法编写,则将其集成到服务器渲染的应用程序中,可能会很棘手。你可能要通过模拟 (mock) 一些全局变量来使其正常运行,但这只是 hack 的做法,并且可能会干扰到其他 library 的环境检测代码。

# 自定义指令

大多数自定义指令直接操作 DOM,因此会在服务器端渲染 (SSR) 过程中导致错误。有两种方法可以解决这个问题:

  1. 推荐使用组件作为抽象机制,并运行在「虚拟 DOM 层级(Virtual-DOM level)」(例如,使用渲染函数(render function))。

  2. 如果你有一个自定义指令,但是不是很容易替换为组件,则可以在创建服务器 renderer 时,使用 directives 选项所提供"服务器端版本"。

上次更新时间: 9/12/2021, 10:30:35 PM