原文来自:https://blog.lichter.io/posts/the-guide-to-write-universal-ssr-ready-vue-compon?utm_campaign=Vue.js%20News&utm_medium=email&utm_source=Revue%20newsletter

介绍

作为Vue开发人员,你可能听说过服务器端渲染(SSR)。 即使你没有使用像Nuxt.js或SSR-plugin这样的框架,你也要知道如何编写在服务器端和客户端都支持的通用组件。
如果你想找到基于SSR的方法或与人共享你的组件,这些知识肯定会让你更轻松!如果作为一个库/插件作者,我认为这些知识是必须掌握的。
猜猜看,它甚至都不难!

常见的陷阱

在编写通用组件时,开发人员应该考虑三个非常常见的警告。

1.window, document, and friends - platform-specific APIs

在服务器端处理组件时,不会发生动态更新。 这就是为什么在服务器上只执行两个生命周期钩子:beforeCreate和created。 这也意味着,这两个钩子将被调用两次, 一次在服务器上,一次在客户端。但是在服务器端,没有window,document,也没有其他特定于浏览器的API,如fetch。如果你试图在这两个钩子中调用它们,服务器上会抛出一个错误,组件就不能在服务器端渲染了!
这只是服务器端环境下“普通”组件或第三方库的最常见问题。

经验法则:不要在created或beforeCreate中调用特定于浏览器的API。 如果必须这样做,那么至少要执行可用性检查:

export default {
  created() {
    if(typeof window !== 'undefined'){
        window.scroll(/*...*/)
    }
  }
}

但在大多数情况下,在beforeMount或mount中调用它们是完全没问题的。 如果必须在服务器和客户端上使用API,比如要发送AJAX请求,请确保双方都可以使用(例如使用isomorphic-fetch或axios)。此外,你有时需要在组件中用到this.$el($el是组件本身的DOM元素)。在绑定事件侦听器或进行查询选择时,这可以派上用场。

2.Lifecycle hooks and side effects

说到生命周期钩子!你应该考虑另一件事:副作用。函数或表达式在修改本地环境之外的某些状态时具有副作用。比如API调用,I/O操作,设置计时器,添加侦听器等。

为了避免内存泄漏,你不希望在创建和beforeCreate挂钩中产生副作用,因为当这些钩子也从服务器端调用时,你无法关闭那里的连接。相反,这些对象将永远存在并加起来,导致内存泄漏!

经验法则:不要在created或beforeCreate中使用带副作用的代码。

3.No data reactivity(数据隔离性)

这通常不是什么大问题,但你需要知道。服务器端和客户端的值之间数据互不影响。如果你在服务器端操作data,则根本不会在客户端看到这些变更。

指令(Directives)

自定义Vue指令经常用于操纵DOM(例如,在滚动时显示元素或使元素固定到特定位置)。我们知道这在服务器端不起作用。那有什么解决办法呢?

嗯,最简单的方法是:不要使用Directives,使用component。我使用VueNextLevelScroll或vue-if-bot等组件做到了这一点,因为它更容易使它们普遍可用,并且它们也可以进行代码分割!使用components抽离,你不会失去任何东西。

如果你确实想使用指令,则可以在服务器端添加相同效果的一个指令。在Nuxt中,可以通过在nuxt.config.js中的this.options.render.bundleRenderer对象中设置指令对象来实现。一个好的(但很复杂的)例子是官方的v-model ssr指令。

注意:请注意以kebab-case(如:make-red而不是makeRed)传递你的指令。否则,他们将无法被识别!这是vue-server-renderer中的错误(有关详细信息,请看官方文档)。

总结

使用特定平台的API时要特别小心,尤其是window和document。
请记住,created和beforeCreate是在服务器端和客户端都会执行的。确保写的时候没有副作用,没有window,服务器端数据变更不会表现在客服端。使用指令并不总是最好的抽离方法。但是如果你确实使用它们,请提供服务器端指令
如果你想进一步阅读,我建议你阅读官方的vue-ssr-docs!

【译】编写支持SSR的通用组件指南的更多相关文章

  1. 编写支持SSR的通用组件指南

    原文来自:https://blog.lichter.io/posts/the-guide-to-write-universal-ssr-ready-vue-compon? utmcampaign=Vu ...

  2. OAuth2 通用组件源码下载(支持新浪微博、QQ、淘宝)(转载)

    转载地址:http://www.cyqdata.com/download/article-detail-54302 OAuth2 社区通用组件说明:   源码为C#(.NET)写成,目前支持新浪微博. ...

  3. 饿了么基于Vue2.0的通用组件开发之路(分享会记录)

    Element:一套通用组件库的开发之路 Element 是由饿了么UED设计.饿了么大前端开发的一套基于 Vue 2.0 的桌面端组件库.今天我们要分享的就是开发 Element 的一些心得. 官网 ...

  4. Vue2.0的通用组件

    饿了么基于Vue2.0的通用组件开发之路(分享会记录)   Element:一套通用组件库的开发之路 Element 是由饿了么UED设计.饿了么大前端开发的一套基于 Vue 2.0 的桌面端组件库. ...

  5. vue2升级vue3:Vue Demij打通vue2与vue3壁垒,构建通用组件

    如果你的vue2代码之前是使用vue-class-component 类组件模式写的.选择可以使用 https://github.com/facing-dev/vue-facing-decorator ...

  6. 尝试用React写几个通用组件 - 带搜索功能的下拉列表,开关切换按钮,弹出框

    尝试用React写几个通用组件 - 带搜索功能的下拉列表,开关切换按钮,弹出框 近期正在逐步摸索学习React的用法,尝试着写几个通用型的组件,整体项目还是根据webpack+react+css-me ...

  7. 编写antd配置表单组件

    编写antd配置表单组件 整体思路 抽取formitem的配置数组:包含组件类型.名称.label名称,相关的opts和扩展的opts,传递进入组件 组件通过Form.create()进行表单创建,能 ...

  8. 支持DISTINCT的通用分页存储过程(SQL2005)

    /****** 对象: StoredProcedure [dbo].[P_CommonPagination] 脚本日期: 07/22/2009 10:22:01 ******/ SET ANSI_NU ...

  9. 【干货】.NET开发通用组件发布(一) 介绍

    组件介绍 集合个人和团都开发中遇到的一些通用组件,邮件发送组件.内容采集.CSV数据文件导入工具.日志记录组件.MVC验证登陆组件.MVC分页组件.短信发送组件和强大的Repeate和Repeater ...

随机推荐

  1. java gui 2

    1,编写程序,随机生成两个数,用户输入两个数的和,并进行评判.程序的初始界面如下: 点击“获取题目”,随机生成两个100以内的int类型的数,界面如下: 提示: (1)使用java.util.Rand ...

  2. 从Jensen不等式到Minkowski不等式

    整理即证 参考资料: [1].琴生不等式及其加权形式的证明.Balbooa.https://blog.csdn.net/balbooa/article/details/79357839.2018.2 ...

  3. sql server实现简繁转换

    /*--调用示例 gb_to_big和big_to_gb表存放着常用的简繁字 --可以百度到常用的简体汉字,然后用excel转换成繁体  再导入数据库. --转换为繁体 select dbo.f_GB ...

  4. .Net Core小技巧 - Swagger适配虚拟目录及二级目录

    前言 随着前后端分离模式与微服务架构的出现,Web API变得越来越重要及普遍.而后出现的网关技术,使开发者更倾向于使用二级/多级目录来暴露Web API,一是暴露的端口更少,方便管理:二是在网关中可 ...

  5. net core EF 链接mysql 数据库

    这个主要是一个demo.就在一个工程里面写的 安装MySql.Data.EntityFrameworkCore 增加DbContext 相当于程序与数据库的中间层 public class Ident ...

  6. HEX SDUT 3896 17年山东省赛D题

    HEX SDUT 3896 17年山东省赛D题这个题是从矩形的左下角走到右上角的方案数的变形题,看来我对以前做过的题理解还不是太深,或者是忘了.对于这种题目,直接分析它的性质就完事了.从(1,1)走到 ...

  7. LOJ.6435.[PKUSC2018]星际穿越(倍增)

    LOJ BZOJ 参考这儿qwq. 首先询问都是求,向左走的最短路. \(f[i][j]\)表示从\(i\)走到\(j\)最少需要多少步.表示这样只会\(O(n^2\log n)\)的= =但是感觉能 ...

  8. Logstash 6.4.3 导入 csv 数据到 ElasticSearch 6.4.3

    本文实践最新版的Logstash从csv文件导入数据到ElasticSearch. 本文目录: 1.初始化ES.Kibana.Logstash 2.安装logstash文件导入.过滤器等插件 3.配置 ...

  9. ctf密码学习题总结

    1.变异凯撒 加密密文:afZ_r9VYfScOeO_UL^RWUc格式:flag{ }   一看题中说的是凯撒加密,我就赶快使用工具列出了所有的组合,然而发现没有一个是我想要的. 于是乎,又重新审题 ...

  10. textarea--去掉空格的办法

    我在初次用到textarea多行文本框时,遇到的问题是:默认出现了两行空格,如图: 代码是(错误的写法): 最后才发现,原来是: textarea标签是需要写在同一行,不能换行,正确的写法: