概述

最近研究了一下服务端渲染,有一些心得,记录下来供以后开发时参考,相信对其他人也有用。

参考资料:

Vue SSR指南

nuxt.js官网

服务端渲染介绍

服务端渲染简单来说,就是分别对项目用webpack打包2次,一次生成vue-ssr-server-bundle.json,一次生成vue-ssr-client-manifest.json和其它静态文件,最后用node搭一个服务器接收这2个json文件进行组装,并发送给用户。其中有以下几点需要注意:

1.工厂函数

我们需要对vue, vue-router, vuex用一个工厂函数包裹起来,进行延迟执行。原因是node server每次会接受很多http请求,而vue却只有一个示例,如果在打包前把实例先初始化的话,以后的每次请求就会发送同一个实例,造成交叉请求状态污染 (cross-request state pollution)。示例如下:

// app.js
const Vue = require('vue') module.exports = function createApp (context) {
return new Vue({
data: {
url: context.url
},
template: `<div>访问的 URL 是: {{ url }}</div>`
})
}

2.服务端渲染的生命周期

在所有vue的生命周期钩子函数中,beforeCreate 和 created 会在服务端渲染的时候被调用,其它生命周期会在客户端执行。

所以我们在 beforeCreate 和 created 这2个生命周期内不能访问this,也不能访问window,更不能访问组件实例等。一般我们在 beforeCreate 和 created 中会做的事情有:发送http请求事先填充store,鉴权,发送http请求初始化组件data等。我们在客户端进行初始化的http请求都需要移动到 mounted 或者 beforeMount 生命周期中。

3.axios

我们发送http请求的库推荐使用axios。又因为axios不仅会用在客户端发送http请求,还会用在服务端发送http请求,所以在给axios设置拦截器的时候需要小心使用和window或者dom相关的方法。

4.HTML结构

因为vue的服务端渲染主要是由vue-server-renderer库完成的,它在解析html标签的时候会有一些坑,就是html结构需要很严格的书写,至少要做到以下2点:

  1. 不要漏写结束标签。
  2. p标签里面不能使用块级标签,如果非要使用的话,需要把p标签换成div标签。

5.缓存

我们一般给node server使用 micro-caching 缓存策略:让 node server 把动态内容储存1秒,也就是说无论这一秒有多少请求,node server 只会生成一次动态内容。这个是通过LRU库来实现的。另外还有组件级别的缓存,这里就不多说了。

nuxt.js

1.yarn

虽然nuxt项目可以用npm运行,但是仍然推荐使用yarn来运行此项目,步骤如下:

先检查电脑中是否有homebrew:

$ brew -v

如果有homebrew的话跳过此步,没有的话使用以下命令安装:

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

最后使用homebrew安装yarn:

$ brew install yarn

这里是npm和yarn的对照:

  • npm install === yarn
  • npm run dev === yarn run dev
  • npm init === yarn init
  • npm install <package> === yarn add <package>
  • npm uninstall <package> === yarn remove <package>
  • npm update <package> === yarn upgrade <package>

2.指令

# 安装所有依赖包
$ yarn # 安装某个依赖包
$ yarn add <package> # 打开开发环境
$ yarn dev # 正式环境
$ yarn build
$ yarn start # 开发环境下重启服务(很重要)
$ 输入rs 再按回车键 # 自动修复eslint错误
$ yarn lint # 生成可视化依赖图(相当于vue-cli3的vue inspect指令)
$ yarn analyze

3.在开发的时候需要注意如下几点:

  1. eslint在一些方面比其它项目更加严格,按报错提示修改就可以了。(这些方面我没有改成和其它项目一样是因为我觉得这些习惯很好)
  2. 静态资源放在static文件夹里面,svg雪碧图放在assets/sprite/文件夹里面。
  3. 文件夹名字不能改。(nuxt.js本身要求)
  4. 其它比如pages文件夹里面每个文件就是一个路由,可以看nuxt.js官方文档。

服务端渲染和nuxt简单介绍的更多相关文章

  1. 服务端渲染技术NUXT

    什么是服务端渲染 ​ 服务端渲染又称SSR (Server Side Render),是在服务端完成页面的内容,而不是在客户端通过AJAX获取数据. 服务器端渲染(SSR)的优势主要在于:更好的 SE ...

  2. 实例PK(Vue服务端渲染 VS Vue浏览器端渲染)

    Vue 2.0 开始支持服务端渲染的功能,所以本文章也是基于vue 2.0以上版本.网上对于服务端渲染的资料还是比较少,最经典的莫过于Vue作者尤雨溪大神的 vue-hacker-news.本人在公司 ...

  3. Vue服务端渲染和Vue浏览器端渲染的性能对比

    Vue 2.0 开始支持服务端渲染的功能,所以本文章也是基于vue 2.0以上版本.网上对于服务端渲染的资料还是比较少,最经典的莫过于Vue作者尤雨溪大神的 vue-hacker-news.本人在公司 ...

  4. Vue服务端渲染 VS Vue浏览器端渲染)

    Vue 2.0 开始支持服务端渲染的功能,所以本文章也是基于vue 2.0以上版本.网上对于服务端渲染的资料还是比较少,最经典的莫过于Vue作者尤雨溪大神的 vue-hacker-news.本人在公司 ...

  5. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十五║初探SSR服务端渲染(个人博客二)

    缘起 时间真快,现在已经是这个系列教程的下半部 Vue 第 12 篇了,昨天我也简单思考了下,可能明天再来一篇,Vue 就基本告一段落了,因为什么呢,这里给大家说个题外话,当时写博文的时候,只是想给大 ...

  6. next.js、nuxt.js等服务端渲染框架构建的项目部署到服务器,并用PM2守护程序

    前端渲染:vue.react等单页面项目应该这样子部署到服务器 貌似从前几年,前后端分离逐渐就开始流行起来,把一些渲染计算的工作抛向前端以便减轻服务端的压力,但为啥现在又开始流行在服务端渲染了呢?如v ...

  7. 解析Nuxt.js Vue服务端渲染摸索

    本篇文章主要介绍了详解Nuxt.js Vue服务端渲染摸索,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下.如有不足之处,欢迎批评指正. Nuxt.js 十分简单易用.一个简单 ...

  8. Nuxt.js vue服务端渲染

    一.为什么要用Nuxt.js 原因其实不用多说,就是利用Nuxt.js的服务端渲染能力来解决Vue项目的SEO问题. 二.Nuxt.js和纯Vue项目的简单对比 1. build后目标产物不同 vue ...

  9. Vue 爬坑之路(十一)—— 基于 Nuxt.js 实现服务端渲染(SSR)

    直接使用 Vue 构建前端单页面应用,页面源码时只有简单的几行 html,这并不利于网站的 SEO,这时候就需要服务端渲染 2016 年 10 月 25 日,zeit.co 背后的团队对外发布了一个 ...

随机推荐

  1. Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十五)阶段总结

    作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 一 每个阶段在结尾时都会有一个阶段总结,在<SSM整合基础篇& ...

  2. requests+selenium==requestium模块介绍

    有时,你可能会在网上实现一些自动化操作.比如抓取网站,进行应用测试,或在网上填表,但又不想使用API,这时自动化就变得很必要.Python提供了非常优秀的Requests库可以辅助进行这些操作.可惜, ...

  3. Python爬虫-尝试使用人工和OCR处理验证码模拟登入

    刚开始在网上看别人一直在说知乎登入首页有有倒立的汉字验证码,我打开自己的知乎登入页面,发现只有账号和密码,他们说的倒立的验证码去哪了,后面仔细一想我之前登入过知乎,应该在本地存在cookies,然后我 ...

  4. ASP.NET Core Identity Hands On(2)——注册、登录、Claim

    上一篇文章(ASP.NET Core Identity Hands On(1)--Identity 初次体验)中,我们初识了Identity,并且详细分析了AspNetUsers用户存储表,这篇我们将 ...

  5. BZOJ_2435_[Noi2011]道路修建_dfs

    BZOJ_2435_[Noi2011]道路修建_dfs 题意: http://www.lydsy.com/JudgeOnline/problem.php?id=2435 分析: dfs搞定. 我怕爆栈 ...

  6. appium 【已解决】Android,每次启动手机中都会安装Appium settings和Unclock的方法

    环境介绍: 1.appium版本:1.4.16.1 2.真机运行 实现结果: 运行appium第一次运行则安装Appium settings和Unclock的apk,再次之后的运行则无需手动卸载,再次 ...

  7. Mysql存储过程 —— SEQUENCE的实现

    http://blog.csdn.net/crazylaa/article/details/5368447 创建sql语句: DROP TABLE IF EXISTS sequence; -- 建se ...

  8. JAVA基础第三章-类与对象、抽象类、接口

    业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地! 我将会持续更新java基础知识,欢迎关注. 往期章节: JAVA基础第一 ...

  9. 跟我一起学opencv 第四课之图像的基本操作

    1.图像是由像素组成的,所以修改了像素就可以实现图像的改变. 2先看灰度图像(单通道): *****2.获取灰度图像的像素值使用:  int gray = gray_src.at<uchar&g ...

  10. OpenResty 在又拍云容器平台中的应用

    大家好,我是又拍云叶靖,今天主要分享 OpenResty 在又拍云容器平台中的应用.目前又拍云有很多产品,其中很多都使用了 OpenResty 技术,比如又拍云的 CDN .网关都是基于 OpenRe ...