nuxt.js服务端渲染实践,从开发到部署

wmui      2022-02-14     209

关键词:

感悟

经过几个周六周日的尝试,终于解决了服务端渲染中的常见问题,也成功说服了公司新项目采用前后端分离的解决方案,当SEO不在是问题的时候,或许才是我们搞前端的真正的春天,其中也遇到了一些小坑,Nuxt.js官方还是很给力的,提issue后很积极的给予帮助,再次感谢Nuxt.js的开发团队。

解决的问题

路由鉴权

第一个拦路虎就是登陆时候的鉴权问题,如何把token保存到本地。官方使用express-session解决这个问题,但是这样做后端也需要使用nodejs,而我们公司使用的PHP。转念一想或许cookie可以一试,于是我是这样做的:

app.post(‘/api/login‘, function (req, res) {
  // 后台验证用户信息,并返回token
  async function login () {
    const { data } = await axiosServer.post(‘/login‘, req.body)
    return data
  }

  login().then(function (data) {
    // 把token存储到cookie中
    const { token } = data
    if (token) {
      res.cookie(‘token‘, token, {
        maxAge: 60000 * 60 * 24
      })
    }
    // 原封不动返回
    return res.json(data)
  })
})

我把登录请求用nodejs做了一次转发,把用户提交的数据传给后端,后端返回的token设置到cookie里,然后把数据返会给前端,前端再用vuex保存token状态,这样token同时存在于cookie和内存里,刷新页面也是正常的
前端存储token:

  async nuxtServerInit ({ dispatch, commit }, { req, res }) {
    if (req.cookies && req.cookies.token) {
      // 存储token
      commit(‘SET_USER‘, req.cookies.token)
    }
  },
  // SET_USER
  SET_USER (state, token) {
    state.token = token
  },

于是这个问题就这样解决了,所有需要存储到本地的数据都可以这样做来解决

渲染组件内的数据

另一个小问题是components里数据如何渲染。在Nuxt.js中只有page里的组件有fetchasyncData方法,所以当我们使用layout布局页面时如果组件需要请求数据,就无法渲染了,解决方法是在nuxtServerInit方法里初始化组件内的数据,如下:

  async nuxtServerInit ({ dispatch, commit }, { req, res }) {
    // 初始化组件内的数据
    await dispatch(‘ADMIN_INFO‘)
    await dispatch(‘TAGS‘)
    await dispatch(‘ARCHIVES‘)
  }

这样组件内的数据也可渲染成功了

过滤器的使用

Nuxt.js的plugins设计的个人感觉还是很人性化的,用起来简直是不能再简单。在plugins新建一个filters.js,过滤器可以这样玩:

import Vue from ‘vue‘
// 时间格式化
export function formatDate (date, fmt) {
  let newDate = new Date(date)
  if (/(y+)/.test(fmt)) {
    fmt = fmt.replace(RegExp.$1, (newDate.getFullYear() + ‘‘).substr(4 - RegExp.$1.length))
  }
  let o = {
    ‘M+‘: newDate.getMonth() + 1,
    ‘d+‘: newDate.getDate(),
    ‘h+‘: newDate.getHours(),
    ‘m+‘: newDate.getMinutes(),
    ‘s+‘: newDate.getSeconds()
  }
  for (let k in o) {
    if (new RegExp(`(${k})`).test(fmt)) {
      let str = o[k] + ‘‘
      fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? str : padLeftZero(str))
    }
  }
  return fmt
}
let filters = {
  formatDate
}

Object.keys(filters).forEach(key => {
  Vue.filter(key, filters[key])
})
export default filters

然后在nuxt.config.js中注册一下:

  plugins: [
    ‘~plugins/filters.js‘
  ]

在组件中就可以这样happy的用起来了:

<!-- 时间格式化 -->
<div>
 <span>{{date | formatDate(‘yyyy-MM-dd‘)}}</span>
</div>

还有很过好玩的就不说了,文章太长了估计都不想看了

项目部署

大概在8月份时候,写了几篇关于如何部署nodejs项目的文章:
nodejs服务器部署教程一
nodejs服务器部署教程二,把vue项目部署到线上
nodejs服务器部署教程三,部署基于node+vue+mongodb的项目
nodejs服务器部署教程四,部署ssl证书,升级为https
随着时间推移,修复了一些错误,发现了一些错误,整体写的太乱。于是抽了一天时间,在新的服务器上一边实践一边记录,把上面几篇文章用gitbook汇总了一下

结语

不放个demo就走显得就不厚道了,基于Nuxt.js的开源项目确实不太多,以下是我耗时一个月业余时间做的小项目,之前是基于vuejs开发的,现在用Nuxt.js进行了重构,解决了服务端渲染的常见问题
GitHub
GitBook









nuxt与vue部署到服务器的区别(代码片段)

nuxt.js项目怎么部署到服务器?今天我们来讲一下怎么部署一个基于nuxt制作的网站,我们用nuxt制作的网站有什么好处?答:采用nuxt.js开发,一般都是为了实现SSR。让搜索引擎更好的抓取网页内容,就是利... 查看详情

打包微服务前后端分离项目并部署到服务器---分布式springcloud+页面渲染nuxt.js(代码片段)

前言SpringCloud项目属于微服务项目,也就是含有多个SpingBoot模块集合而成的项目Nuxt.js项目属于前端基于Vue的服务端渲染项目最近在服务器部署上线了一个基于SpringCloud+服务端渲染技术Nuxt.js的项目,在这里记录一下一、... 查看详情

nuxt部署上线

参考技术A参考文章链接:next.js、nuxt.js等服务端渲染框架构建的项目部署到服务器,并用PM2守护程序-每天一探-SegmentFault思否1.安装NGINX2.node3.npm4.pm25.将完成好的nuxt项目打包(npmrunbuild)       .nuxt ... 查看详情

首页白屏优化实践

...题和思考SSR想到白屏问题,首先想到的解决方案一般都是服务端渲染,在服务端将渲染逻辑处理好,然后将处理好的HTML直接返回给前端展示,这样就可以解决白屏的问题,也可以解决seo的问题,因为不需要动态获取数据了,但... 查看详情

获取浏览器cookie,并将其传递给nuxt js上的服务器端渲染

】获取浏览器cookie,并将其传递给nuxtjs上的服务器端渲染【英文标题】:Getabrowsercookie,andpassittotheserversiderenderingonnuxtjs【发布时间】:2018-09-2307:01:05【问题描述】:我用nuxtjs开发了一个项目。我在下面遇到这样的问题。我通过异... 查看详情

nuxt实践

利用手脚架搭起来的服务端渲染实例目录结构.nuxtassets未编译的静态资源如LESS、SASS或JavaScriptcomponents用于组织应用的Vue.js组件middleware目录用于存放应用的中间件pages用于组织应用的路由及视图。Nuxt.js框架读取该目录下所有的.vue... 查看详情

在 Nuxt.js 中检测服务器端渲染

】在Nuxt.js中检测服务器端渲染【英文标题】:DetectingServerSideRenderinginNuxt.js【发布时间】:2020-09-0720:59:10【问题描述】:我有一个使用服务器端渲染的Nuxt.js应用程序。但是,在我的一个页面中,我需要检测它是否是用于切换其中... 查看详情

nuxt.js服务端渲染中如何实现路由的跳转

一、nuxt.js路由跳转1、nuxt-link标签跳转在html标签内使用nuxt-link跳转,相应于超链接a标签,使用方式如下:<nuxt-linkto="/">首页</nuxt-link>2、编程式导航-JS代码内部跳转实际项目中,很多时候都是通过在JS代码内部进行导航的... 查看详情

Nuxt.js 服务器端渲染:启动服务器后数据未更新

】Nuxt.js服务器端渲染:启动服务器后数据未更新【英文标题】:Nuxt.jsServerSideRendering:Datadoesn\'tgetupdatedafterstartingtheserver【发布时间】:2021-06-2007:54:04【问题描述】:我遇到了一个问题,Nuxt.js和Apollo没有使用我的API源中的最新内... 查看详情

nuxt.js知识点(代码片段)

...没法抓取到SPA的内容页面,所以我们必须把我们的应用在服务端渲染成适合搜索引擎抓取的页面,再下载到客户端。Nuxt.js是Vue.js的通用框架,最常用的就是用来作SSR(服务器端渲染)。再直白点说,就是Vue.js原来是开发SPA(单... 查看详情

快来用nuxt开发静态网站

...来看一下Nuxt官网的一张图,阐述了Nuxt.js应用一个完整的服务器请求到渲染(或用户通<nuxt-link>切换路由渲染页面)的流程可以看到,在SSR中,服务端会执行asyncData()和fetch(),用来访问接口生成数据,从而在服务端就渲染出... 查看详情

nuxtjs实现服务端渲染和静态化站点(代码片段)

...Nuxt.js是一个基于Vue的通用框架,主要用于解决Vue项目的服务端渲染(SSR)。它本质上是一个Vue框架,增加一层node服务,通过对客户端/服务端的抽象封装,使用Nuxt各种资源配置,处理服务端渲染。除了服务端渲染以外,Nuxtjs还提供... 查看详情

Nuxt.js 中的组件可以与 Next.js 类似的客户端渲染和服务器渲染混合使用吗?

】Nuxt.js中的组件可以与Next.js类似的客户端渲染和服务器渲染混合使用吗?【英文标题】:CanyoumixupClientrenderingandServerrenderingforcomponentsinNuxt.jssimilartoNext.js?【发布时间】:2021-08-2707:47:41【问题描述】:在Next.js中,您可以在同一页... 查看详情

nuxt的介绍以及入门(代码片段)

1.Nuxt.js服务器端渲染学习目标了解Nuxt.js的作用掌握Nuxt.js中的路由掌握layouts、pages以及components的区别能够在Nuxt.js项目中使用element-ui掌握Nuxt.js中异步获取数据的方式完成豆瓣电影小案例掌握SEO的优化1.1Nuxt.js入门1.1.1什么是Nuxt.jsVu... 查看详情

网页开发方式-从静态页面到服务端渲染

...就是一个个静态页面,例如我们写了一个html文件,放在服务器上就可以供用户访问了。而后网站变得需要展示更多的内容,让内容更加动态,因此需要接入数据库,配合数据库的内容做展示,于是诞生了html模板引擎,用于把动... 查看详情

部署 Laravel 和 Nuxt.js 应用程序。将它们结合起来,还是单独部署?

...,在前端使用Nuxt.js(v2)。这个想法是让laravel充当api和oauth2服务器, 查看详情

部署到 GCP App Engine,但不提供服务器端渲染页面

】部署到GCPAppEngine,但不提供服务器端渲染页面【英文标题】:DeploymenttoGCPAppEngine,butnotservingServerSideRenderedpages【发布时间】:2019-11-0200:11:41【问题描述】:我正在尝试将Angular7Universal应用程序部署到GoogleCloudPlatformAppEngine。部署... 查看详情

如何使用 Nuxt.js 将数据存储到本地存储

...时间】:2018-05-0602:26:05【问题描述】:如您所知,nuxtjs是服务器端渲染,没有很好的示例如何将数据存储到客户端的本地存储中。我的工作是需要建立登录表单,用户可以将用户名和密码放入表单中,然后将其发送到服务器(通... 查看详情