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

utmcampaign=Vue.js%20News&utmmedium=email&utm_source=Revue%20newsletter

翻译作者 | 贺倩倩

介绍

作为Vue开发者。你可能听说过server端渲染(SSR)。 即使你没有使用像Nuxt.js或SSR-plugin这种框架,你也要知道怎样编写在server端和client都支持的通用组件。

假设你想找到基于SSR的方法或与人共享你的组件,这些知识肯定会让你更轻松!假设作为一个库/插件作者。我觉得这些知识是必须掌握的。 猜猜看,它甚至都不难!

常见的陷阱

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

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

在server端处理组件时,不会发生动态更新。 这就是为什么在server上仅仅运行两个生命周期钩子:beforeCreate和created。 这也意味着,这两个钩子将被调用两次, 一次在server上。一次在client。

可是在server端。没有window,document。也没有其它特定于浏览器的API,如fetch。假设你试图在这两个钩子中调用它们,server上会抛出一个错误,组件就不能在server端渲染了。 这仅仅是server端环境下“普通”组件或第三方库的最常见问题。

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


  1. export default {

  2.  created() {

  3.    if(typeof window !== 'undefined'){

  4.        window.scroll(/*...*/)

  5.    }

  6.  }

  7. }

但在大多数情况下。在beforeMount或mount中调用它们是全然没问题的。 假设必须在server和client上使用API,比方要发送AJAX请求,请确保两方都能够使用(比如使用isomorphic-fetch或axios)。此外,你有时须要在组件中用到this.$el($el是组件本身的DOM元素)。

在绑定事件侦听器或进行查询选择时,这能够派上用场。

2.Lifecycle hooks and side effects

说到生命周期钩子。你应该考虑还有一件事:副作用。

函数或表达式在改动本地环境之外的某些状态时具有副作用。比方API调用,I/O操作,设置计时器。加入侦听器等。

为了避免内存泄漏,你不希望在创建和beforeCreate挂钩中产生副作用,由于当这些钩子也从server端调用时,你无法关闭那里的连接。

相反,这些对象将永远存在并加起来,导致内存泄漏。

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

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

这通常不是什么大问题。但你须要知道。server端和client的值之间数据互不影响。假设你在server端操作data。则根本不会在client看到这些变更。

指令(Directives)

自己定义Vue指令经经常使用于操纵DOM(比如。在滚动时显示元素或使元素固定到特定位置)。

我们知道这在server端不起作用。

那有什么解决的方法呢?

嗯,最简单的方法是:不要使用Directives,使用component。我使用VueNextLevelScroll或vue-if-bot等组件做到了这一点。由于它更easy使它们普遍可用,而且它们也能够进行代码切割!使用components抽离。你不会失去不论什么东西。

假设你确实想使用指令,则能够在server端加入同样效果的一个指令。在Nuxt中,能够通过在nuxt.config.js中的this.options.render.bundleRenderer对象中设置指令对象来实现。一个好的(但非常复杂的)样例是官方的v-model ssr指令。

注意:请注意以kebab-case(如:make-red而不是makeRed)传递你的指令。

否则,他们将无法被识别!这是vue-server-renderer中的错误(有关具体信息,请看官方文档)。

总结

使用特定平台的API时要特别小心,尤其是window和document。

请记住,created和beforeCreate是在server端和client都会运行的。

确保写的时候没有副作用,没有window。server端数据变更不会表如今客服端。

使用指令并不总是最好的抽离方法。

可是假设你确实使用它们,请提供server端指令 假设你想进一步阅读。我建议你阅读官方的vue-ssr-docs!

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

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

    原文来自:https://blog.lichter.io/posts/the-guide-to-write-universal-ssr-ready-vue-compon?utm_campaign=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. String类型的转型

    字符串类型的转型在java中常用的方法有标题中的三种. 简单介绍: 1.toString,需要保证调用这个方法的类.方法.变量不为null,否则会报空指针. 2.String.valueOf.这个方法 ...

  2. day 48-css-part1

    CSS(Cascading Style Sheet,层叠样式表 css是前端的优化器,如果说我们的html是把前端的大体骨架搭起来的话,那么我们的css就是在这个骨架的基础上进行修饰,使之更有立体感, ...

  3. 随GCTY

    1.用常数1来取代运行时间中所有加法常数. 2.修改后的运行次数函数中,只保留最高阶项 3.如果最高阶项存在且不是1,则去除与这个项相乘的常数. 如果sum = (1+n)*n/2这条语句再执行10遍 ...

  4. HDU 2426 Interesting Housing Problem (最大权完美匹配)【KM】

    <题目链接> 题目大意: 学校里有n个学生和m个公寓房间,每个学生对一些房间有一些打分,如果分数为正,说明学生喜欢这个房间,若为0,对这个房间保持中立,若为负,则不喜欢这个房间.学生不会住 ...

  5. Sort功能极强!

    Sort功能极强! 可以排string:  sort(a.begin(),a.end()); 普通数组 结合结构体 逆序 而且贼快

  6. vue-cli@3.x初体验之前篇-回顾vue-cli@2.x创建项目的流程

    模拟实际工作中的操作,假如新开启了一个vue项目,可以先看看上篇博文中的git操作,新建空仓库vue-demo,并拉取到本地,创建本地dev分支后 1. 全局安装vue-cli yarn global ...

  7. vue项目的搭建使用

    环境变量的安装 参考  环境变量详解 第一次搭建参考 参考  简单初始项目搭建 配置好环境变量的项目的搭建 新建一个new proproject, 查看工作目录vue是否存在    使用查看指令  v ...

  8. Wannafly Winter Camp 2019.Day 8 div1 E.Souls-like Game(线段树 矩阵快速幂)

    题目链接 \(998244353\)写成\(99824435\)然后调这个线段树模板1.5h= = 以后要注意常量啊啊啊 \(Description\) 每个位置有一个\(3\times3\)的矩阵, ...

  9. 基于CC2530/CC2430 的光强采集系统--ADC实验

    使用光敏电阻,程序通用所有模拟量传感器 参见论坛中实例视频讲解http://bphero.com.cn/forum.php?mod=viewthread&tid=15&extra=pa ...

  10. SW加载标准库时出现failed to create Toolboxlibrary object怎么办?

    友情提示:Windows+r打开  输入smd 注意操作前要关闭solidworks, 重新打开软件. 下面就可以找到很多标准件了.