vue的服务端渲染

检验方法:打开页面,查看源码

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

单页面缺点(主要有两个):

首屏渲染性能:必须得等到js加载完毕,才能渲染出首屏

seo:爬虫只能拿到一个id为app的div,会认为页面是空的,不利于div

为了解决上面的两个问题,于是出现了SSR

?ssr

后端渲染出完整的首屏的dom结构返回,前端拿到的内容带上首屏,后续的页面操作,再用单页的路由跳转和渲染,称之为服务端渲染(server side render)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意:

ssr一般只做首屏的!

ssr是在传统的web和spa之间取了折中!

ssr体验(nuxt.js)知识点


?Nuxt.js是一个基于Vue.js的通用型框架。

通过对客户端/服务端基础架构的抽象组织,Nuxt.js主要关注的是应用的UI渲染

结论:

nuxt.js不仅仅用于服务端渲染也可用于spa应用开发

利用nuxt提供的基础项目结构,异步数据加载,中间件支持,布局等特性可大幅提高开发效率

nuxt可用以网站静态化(nuxt有命令可以打包成静态文件,一般用于访问次数最多的页面,技巧:数据更新触发打包命令

?nuxt.js特性

基于vue.js

自动代码分层

服务端渲染

强大的路由功能,支持异步数据

静态文件服务

es6/es7语法支持

打包和压缩js和css

html头部标签管理

本地开发支持热加载

集成ESlint

支持各种样式预处理器:sass,less,stylus

支持http/2推送

?nuxt渲染流程

一个完整的服务器请求到渲染流程

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

?nuxt安装

运行 npx create-nuxt-app 项目名

运行项目:npm run dev

目录结构:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

约定于优先配置


pages目录下所有的*.vue文件生成应用的路由配置(自动生成路由配置),新建pages/users.vue

用户列表

会在.nuxt目录下自动配置router

打开页面: http://localhost:3000/users

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

路由

?导航

虽说和vue的router-link差不多,但是如果我们使用了nuxt,那么为了后期的一些优化我们推荐使用nuxt-link

index.vue里写

跳转到用户列表

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

?子路由和路由导航

修改pages目录结构

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

效果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

自动生成目录.nuxt下仔细查看router.js的内容:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结论:

name的命名:文件所在目录-文件名

改造主页的index.vue

跳转到用户列表

<el-button @click=“$router.push(‘/users’)”>用户列表

<el-button @click=“$router.push({name:‘users-detail’})”>用户详情

而我们是安装选项时集成了elementUI的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结果点击按钮可以正常跳转

?动态路由

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

根据上面的方法可以自动配置一个动态路由

再来改在首页的index.vue和_id.vue 以及detail.vue

//首页index.vue

跳转到用户列表

<el-button @click=“$router.push(‘/users’)”>用户列表

<el-button @click=“$router.push({name:‘users-detail’,query:{id:2}})”>用户详情

<el-button @click=“$router.push({name:‘users-id’,params:{id:1}})”>用户详情

//_id.vue

用户id:{{ $route.params.id }}

//detail.vue

用户id:{{ $route.query.id }}

页面参数的效果(query)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

路由参数的效果(params)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

?嵌套路由

构造的目录结构要如下才会生成嵌套路由

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在pages根目录下建立users.vue

目录结构如下

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

生成的路由配置如下

export const routerOptions = {

mode: ‘history’,

base: decodeURI(‘/’),

linkActiveClass: ‘nuxt-link-active’,

linkExactActiveClass: ‘nuxt-link-exact-active’,

scrollBehavior,

routes: [{

path: “/users”,

component: _c8a52a2e,

children: [{

path: “”,

component: _228b8179,

name: “users”

}, {

path: “detail”,

component: _7190858c,

name: “users-detail”

}, {

path: “:id”,

component: _a064e3be,

name: “users-id”

}]

}, {

path: “/”,

component: _564390b3,

name: “index”

}],

fallback: false

}

users.vue里要写路由展示区域nuxt.child

如此就可以正常使用了!

?路由守卫

plugin目录下建立router.js

export default ({app}) => {

app.router.beforeEach((to,from,next)=>{

console.log(我要去${to.path})

next()

})

}

nuxt.config.js里注册这个方法

plugins: [

‘@/plugins/element-ui’,

‘@/plugins/router’

],

自定义布局


default.vue是会匹配所有的页面,在上面添加内容会增加到所有页面,所以如果有一个所有页面都要共享的组件就写在default.vue里

layout目录下建立users.vue,注意必须有 否则会替换掉整个页面

用户页面自定义布局

再去pages下的users指定一下使用哪个自定义布局,通过layout:‘自定义布局的组件名’

错误页面


其实nuxt本身自带错误页面的(优点丑,而且错了就啥都看不见),所以我们自定义一个

在layout里新建error.vue

页面找不到

应用发生错误异常

首页

在pages下的users.vue里加上{{ foot.bar }},注意,这是不存在的,为了让程序出错

{{ foot.bar }}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

样式有点丑,可以自己修改的

页面(涵盖异步数据获取)


例如定义data数据啥的,和vue是一模一样的!!,不多说

值得注意的是,我们可以设置一些其他的信息,例如页面标题

效果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以覆盖掉全局的seo信息

?异步数据的获取

asyncData方法使得我们可以在设置组件的数据之前就能异步获取或处理数据

asyncData//这个会在beforeCreate生命周期钩子之前执行

注意他会在客户端和服务端两端执行

在pages下的users.vue里写

    • {{ user.name }}
    • 注意事项:

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      ?上下文对象的使用:

      在pages下的users下的detail.vue中

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      不传入id就爆了我们需要的错误

      ?整合axios

      如何安装nuxt是没选择axios,那么我们就要整合一下了!

      npm install @nuxtjs/axios -S

      再在nuxt.config.js里配置,用来解决跨域的问题

      modules: [

      // Doc: https://axios.nuxtjs.org/usage

      ‘@nuxtjs/axios’,

      ],

      /*

      ** Axios module configuration

      ** See https://axios.nuxtjs.org/options

      */

      axios: {

      proxy: true

      },

      proxy:{

      “/api”: “http://localhost:3001/”

      },

      当然如果所有页面都启用了ssr那么自然也就不需要跨域了,但通常大家都是首屏启用了ssr,其他页面仍是单页面,所有应当配置跨域

      server目录下建立api.js,定义我们的后端接口,需要安装koa,koa-router,全局安装nodemon,装了就不需要

      const koa = require(“koa”)

      const app =new koa()

      const Router = require(“koa-router”)

      const router = new Router({prefix:‘/api/users’}) //请求地址

      const users = [{name:‘tom’,id:1},{name:‘jey’,id:2}]

      router.get(‘/:id’,ctx => {//带个参数id

      const user = users.find(u => u.id == ctx.params.id)

      if(user){

      ctx.body = {ok:1,user}

      }else{

      ctx.body = {ok:0}

      }

      })

      app.use(router.routes())

      app.listen(3001)

      nodemon api.js来启动这个服务

      _id.vue中

      用户id:{{ $route.params.id }}

      {{ user.name }}

      注意我注释掉的东西,效果如下

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      ?拦截器实现

      nuxt.config.js里配置

      plugins: [

      ‘~/plugins/axios’

      ],

      在plugins目录下建立axios.js

      //前端请求自动加上token

      export default function({ $axios }){

      //onRequest为请求拦截器帮助方法

      $axios.onRequest(config => {

      if(!process.server){

      // config.headers.token = localStorage.getItem(‘token’)//将来是这个操作

      config.headers.token = ‘jiba’

      }

      })

      }

      这样就完成了一个拦截器,效果看下图network的token

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      vuex


      应用根目录下如果存在store目录,Nuxt.js将启用vuex状态树。

      定义各状态树时具名导出state,mutations,getters,actions即可

      注意:也是直接用的,不需要去配置什么,详情看下面教程

      在store目录下建立index.js

      //因为是具名导出,所以state必须是state,mutations必须是…

      export const state = () => ({

      count: 0

      })

      export const mutations = {

      increment(state) {

      state.count ++

      }

      }

      在store目录下建立users.js

      export const state = () => ({

      list: []

      })

      export const mutations = {

      set(state,list) {

      state.list = list;

      },

      add(state,name) {

      state.list.push({name})

      }

      }

      自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

      深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

      因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

      img

      既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

      由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

      如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

      最后:

      总结来说,面试成功=基础知识+项目经验+表达技巧+运气。我们无法控制运气,但是我们可以在别的地方花更多时间,每个环节都提前做好准备。

      面试一方面是为了找到工作,升职加薪,另一方面也是对于自我能力的考察。能够面试成功不仅仅是来自面试前的临时抱佛脚,更重要的是在平时学习和工作中不断积累和坚持,把每个知识点、每一次项目开发、每次遇到的难点知识,做好积累,实践和总结。

      点击这里领取Web前端开发经典面试题

      state = () => ({

      count: 0

      })

      export const mutations = {

      increment(state) {

      state.count ++

      }

      }

      在store目录下建立users.js

      export const state = () => ({

      list: []

      })

      export const mutations = {

      set(state,list) {

      state.list = list;

      },

      add(state,name) {

      state.list.push({name})

      }

      }

      自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

      深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

      因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

      [外链图片转存中…(img-uwWZotX5-1712540720916)]

      [外链图片转存中…(img-FETDOrDM-1712540720917)]

      既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

      [外链图片转存中…(img-iAPwp0rI-1712540720917)]

      由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

      如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

      最后:

      总结来说,面试成功=基础知识+项目经验+表达技巧+运气。我们无法控制运气,但是我们可以在别的地方花更多时间,每个环节都提前做好准备。

      面试一方面是为了找到工作,升职加薪,另一方面也是对于自我能力的考察。能够面试成功不仅仅是来自面试前的临时抱佛脚,更重要的是在平时学习和工作中不断积累和坚持,把每个知识点、每一次项目开发、每次遇到的难点知识,做好积累,实践和总结。

      点击这里领取Web前端开发经典面试题

    • 11
      点赞
    • 29
      收藏
      觉得还不错? 一键收藏
    • 0
      评论
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值