js初化加载页面时ajax会调用两次的原因_聊聊Nuxt.js

首先我们来了解两个概念——客户端渲染和服务端渲染。

一、客户端渲染 VS 服务端渲染 1. 客户端渲染

简单理解就是,在服务端放一个html 页面,客户端发起请求,服务端把页面发送过去。客户端从上到下依次解析,如果发现ajax请求就再发送新的请求,拿到ajax 响应结果以后渲染模板引擎。整个过程至少要发起两次请求。如图:

10d520238b4ead6c6a5827077204fa92.png

但是,这种渲染方式存在的弊端也是不容忽视的,比如请求量大时首屏渲染慢,不利于seo等问题。服务端渲染恰好弥补了这些不足。

2. 服务端渲染

也称SSR,即server side render的缩写。在服务端渲染出完整的首屏dom结构,直接发送到浏览器;前端拿到的内容包括首屏及完整spa结构,应用激活后依然按照spa方式运行。整个过程只向服务端发起一次请求。如图:

c0b8667352af8f6c750acf8d636e91f5.png

服务端渲染有两大优点: 一是更利于SEO。因为爬虫只会爬取源码,不会执行脚本。使用了MVVM框架之后,页面的大多数DOM元素是在客户端根据js动态生成的,可供爬虫抓取分析的内容很少。而且浏览器爬虫不会等数据加载完成之后再去抓取。服务端渲染返回已经获取了异步数据并执行js脚本的最终HTML,爬虫就可以抓取完整的页面信息。

二是更利于首屏渲染。对服务端渲染而言,首屏渲染是node发送过来的html字符串,不依赖于js文件,这样用户就能更快地看到页面内容。尤其是大型单页应用,资源请求量大,造成首屏渲染加载缓慢,使用服务端渲染就可以在很大程度上解决首页的白屏等待问题。

Nuxt.js作为Vue.js的通用框架,就常被用来作SSR。

二、nuxt.js nuxt是一个专注于ui渲染的应用框架,可以快速搭建项目,还提供了服务端渲染的功能。

1. 安装

直接用vue-cli安装
vue init nuxt-community/starter-template 

2. nuxt推荐的项目结构

  • assets——资源文件

  • components——组件

  • layouts——布局,默认default。所有页面都会加载在布局页面中的标签中。如果要在普通页面中使用下级路由,则要在页面中添加

  • middleware——中间件:每个页面加载前调用,在页面中调用的方法是middleware: 'middlewareName'。

  • node_modules——依赖包

  • nuxt.config.js——个性化配置

  • package.json——

  • pages——页面。根页面是index.vue,二级页面只要添加文件夹。动态路由页面的名称格式是:_变量.vue

  • plugins——插件

  • static——静态文件(不需要webpack打包的)。

  • store——状态管理

  • yarn.lock

3. 生命周期

Nuxt在vue的基础上对生命周期做了扩展:
export defualt {  middleware(){ }, // 服务端  validate(){ },  // 服务端  asyncData(){ },  // 服务端  fetch(){ },  // store数据加载  beforeCreate(){ },  // 服务端和客户端都会执行  created(){ },  //  服务端和客户端都会执行  beforeMount(){ },   mounted(){ } // 客户端}
4. asyncData 如果需要服务端渲染,首次渲染时一定要使用这个方法。它可以在渲染组件前异步获取数据。asyncData传入context参数,可以获取一些信息,如:
export default {  asyncData(ctx){    ctx.app   // 根实例    ctx.route   // 路由实例    ctx.params   // 路由参数    ctx.query   // 路由问号后的参数    ctx.error   // 错误处理方法  }}
使用这个方法时要注意,如果由于服务器或api错误导致无法渲染,就要做好容错机制,可以使用context.error方法。我们可以这样做:
async asyncData(ctx){  try {    throw new Error()  } catch {    ctx.error( {statusCode: 500, message: '服务器开小差了~'} ) // 这里的statusCode参数必须是http状态码  }}

此时,错误页可以通过/layout/error.vue自定义。

注意:该方法在服务端执行,返回的数据与data()返回的数据合并。该方法在组件初始化前被调用,所以不能通过this引用实例对象。

5. 使用axios请求数据

(1)nuxt项目默认安装axios,所以只要安装proxy即可

npm install @nuxtjs/proxy

(2)在nuxt.config.js中加上:
export default {  modules: [    '@nuxtjs/axios',    '@nuxtjs/proxy'  ],  proxy: {    './api': {      target: 'http://www.xxx.com',      changeOrigin: true,      pathRewrite: {        '^/api': ''      }    }  }}

(3)页面中使用:

import axios from 'axios'export default {    data () {        return {          page: 0        }    },    async asyncData () {        let data = await axios.get('http://localhost:3000/api/admin/list')        return {          page: data.data.page        }  },}

采用 `import axios from 'axios'` 方式引入axios时,接口参数前须加baseURL。

6. 使用scss

(1)安装sass
npm i node-sass sass-loader scss-loader --save-dev

(2)如果要全局使用某个scss文件,要借助sass-resources-loader,还需要在nuxt.config.js的build配置中调整导出的loader配置:

export default {  build: {    extend(config, { isDev, isClient }){      const sassResourcesLoader = {        loader: 'sass-resources-loader',        options: {          resources: [            // 填写需要全局注入scss的文件            'assets/styles/mixins.scss'          ]        }      }      // 修改 scss sass 引用的 loader。      config.module.rules.forEach((rule) => {          if (rule.test.toString() === '/\\.vue$/') {            rule.options.loaders.sass.push(sassResourcesLoader)            rule.options.loaders.scss.push(sassResourcesLoader)          }          if (['/\\.sass$/', '/\\.scss$/'].indexOf(rule.test.toString()) !== -1) {            rule.use.push(sassResourcesLoader)          }        })      }  }}

7. 编译过程

(1)加载nuxt.config.js;

(2)初始化nuxt,builder,开始执行构建;

(3)准备模板使用的参数,然后根据模板生成真正的webpack编译的js;

(4)分别执行客户端编译和服务端编译,生成最终的js脚本;

(5)编译成功后,就需要启动服务,监听端口,这个是在npm run start中实现的。

8. nuxt和vue的区别
Nuxt.jsVue.js
路由按pages 文件夹目录结构自动生成在 src/router/index.js 手动配置
入口文件 layouts/default.vuesrc/App.vue
webpack配置内置webpack,允许根据服务端需求,在 nuxt.config.js 中的build属性自定义构建webpack的配置,覆盖默认配置存放在build文件夹下


关于nuxt.js先写这些了,更多内容还是要去看一遍文档哦~

weixin_39621975
关注 关注
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解决nuxt页面中mounted、created、watch执行两遍的问题
01-21
言: 在开发中偶然检查Network请求的候发现,在页面created钩子函数中请求了一个接口,但是页面这个页面加载候,接口连续请求两边,然后我就排查是否有其他地方调用了同样的接口,检查了好几遍后发现并没有,WTF,然后我在created中打印了一下,惊奇的发现。。。created执行两次打印。。。 WTF、WTF、WTF,小朋友你是否有很多问号???,然后试了下,不光created执行两遍,mounted也行,就连watch里面监听的也,握草(草是一种植物),此处省略我咔咔排查了一个小各种删除各种排查的步骤。。。 得出以下结论: 第一种: 页面布局不合理,导致执行两遍,
Nuxt3:useFetch在服务端及客户端重复请求问题
最新发布
q1003675852的博客
03-04 1471
本文针对Nuxt3 使用useFetch过程中发现不仅在服务端发送了接口请求,而且在客户端也重新发送了一遍接口请求的问题,给出了问题产生的原因和解决方案。
vue的根文件main.js里的created和mounted执行两次(vue-wechat-title 动态设置网页标题造成加载两次
fendoudemayi159的博客
06-19 3306
项目需要设置标题,要是不设置的话展示的是访问的地址。 未改: 最近的一个项目搭建的候由于需要去监听路由并存储到本地。发现每次切换、刷新页面候都出现加载三次的情况。 bug处理: 既然出现了问题,那么怎么解决呢?首先百度、google了一下vue多次加载mainjs和如何加载的问题。发现没有什么实际性作用。项目打包后在服务器预览也是没有任何问题。另外将谷歌开发者模式关闭手机模式后,通过网页预览,点击也是没有任何问题。在确保mainjs中的内容无误的情况下,去查看了app.vue,如下图:
nuxt.js框架中的mounted、created、watch执行两遍
qq_42449963的博客
11-21 1811
如果你在上述方法中使用console.log(“XXX”)输出信息,你可以在控制栏中发现这条数据输出两次,这个是真的恶心,毕竟有些候我要进行一些浏览量增加的操作,这样导致浏览器量增加两次,太恶心了,我在网上搜索之后没有找到好的办法,部分网友说页面布局不合理、v-if和v-else的结合、swiper组件没有包裹div等等说法,然后我只在template标签下面放置一个div标签,div标签中什么都不放,然后上述方法还是执行两边,我能说啥???,所以以后别用这框架就是了 至于我上述所说的增加浏览量问题
nuxt——nuxt页面中mounted、created、watch执行两遍的问题
朕的博客
07-06 5127
言: 在开发中偶然检查Network请求的候发现,在页面created钩子函数中请求了一个接口,但是页面这个页面加载候,接口连续请求两边,然后我就排查是否有其他地方调用了同样的接口,检查了好几遍后发现并没有,WTF,然后我在created中打印了一下,惊奇的发现。。。created执行两次打印。。。WTF、WTF、WTF,小朋友你是否有很多问号???,然后试了下,不光created执行两遍,mounted也行,就连watch里面监听的也,握草(草是一种植物),此处省略我咔咔排查了一个小
nuxt-three:基于nuxt.js和three.js构建的Web应用启动器
05-07
三三基于和构建的Web应用程序启动器,它包括 , ,平滑滚动,, 和其他一些有用的东西。构建设置# install dependencies$ npm install# serve with hot reload at localhost:3000$ npm run dev# build for ...
Vue在 Nuxt.js 中重定向 404 页面方法
10-17
主要介绍了Vue在 Nuxt.js 中重定向 404 页面方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
date-fns-module:现代JavaScript日期实用程序库-Nuxt.js的date-fns
04-29
@ nuxtjs / date-fns 现代JavaScript日期实用程序库-Nuxt.js的date-fns 设置将@nuxtjs/date-fns依赖项添加到您的项目中yarn add --dev @nuxtjs/date-fns # or npm install --save-dev @nuxtjs/date-fns 添加@nuxtjs/...
Nuxt.js的路由跳转操作(页面跳转nuxt-link)
01-21
<li><nuxt to={name:>HOME page</nuxt> <li><nuxt to={name:>NEWS page</nuxt> <li><nuxt to={name:>PLAY page</nuxt> 注意说明: to 面有冒号“ : ” to 后面跟的是路径比如“/page/index”(可以跟字符串或...
vue nuxt 借助第三方页面实现两次路由跳转 刷新页面
lq099526的专栏
07-06 942
1、页面 组件点击事件:跳转第三方页面 并传递当路由 // 借助第三方页面实现两次路由跳转 刷新页面病人信息 this.$router.push({ path: '/empty', query: { url: this.$route.path } }); 2、在空白页面created 的生命周期中接受参数,并执行页面跳转,此页面显示任何内容就开始进行跳转,所以速度的问题不用担心,视觉上的效果就是点击当路由后,页面刷新请求数据。实际路由已经跳转了两次。 <t
vue和nuxt的整合项目报错【Vue warn】: The client-side rendered virtual DOM tree is....并且页面的生命周期函数执行两次,彻底解决方案!
qq_42458992的博客
02-11 3806
问题描述:       当我在做一个查询课程详情的功能候,想随便在后台修改课程的浏览量,即让它加1,但发现每次刷新页面,数值竟然增加两次!       于是我在这个页面的生命周期函数里面打印东西,发现每次打印的都是两次,也就是说,不知道为什么生命周期函数执行两次,而且一直让我在意的是,浏览器控制台总是莫名其妙的打印出警告信息: vue.runtime.esm.js?2b0e:619 【
Nuxt 学习笔记
qq_49487356的博客
10-22 1055
nuxt学习笔记
vue 所有生命周期函数都执行了两遍的问题
no pains,no gains
06-16 5697
在原有项目新增功能需求模块开发的过程中,发现无论哪一个模板中的created函数都被执行两次,遂非常熟练的打开了百度… 网络上的解决办法有: 解决方案1:检查main.js 中是否重复声明vue实例 (没有, pass) 解决方案2:据说使用了mixin的调用两次 (尝试用一个干净的vue项目,使用一个简单的mixin文件,发现并没有执行两遍,把本项目的app文件其他内容全都注释,只留纯净的初始版本,发现也调用两次。pass) 解决方案3:说什么路由配置问题(直接注掉路由的引用,还是调用了两遍,.
vue的mounted和created方法执行
weixin_43626356的博客
04-09 2924
Vue的created 和 mouted的执行顺序 今天在数据可视化的项目中,用了echarts和vue来进行展示。按照我的理解,先执行created中调用后台数据的接口,然后再进行echarts的展现。很遗憾一直失败,而且每次打印都有数据,但是始终无法给echarts绑定。 <template> <div class="map"> <dv-border-box-8 class="map-chart-border"> &lt
vue生命周期执行两次的debug之路
qq_36545095的博客
12-28 5071
版本:vue3.2 说明:本文仅代表其中一种可能的情况,仅作为参考 1.bug最初的地方(使用了setup语法糖) 网上查找资料,v-if可能导致onMounted执行两次。 计划方案: a.v-if替换为v-show,未解决; b.onMounted换成其他生命周期,比如created,仍未解决。 2.偶然发现整个setup语法糖内都执行两次,如下: 查看编译后源码发现,setup语法糖编译为setup(),即setup()执行两次。 3.考虑可能父组件中存在v-if..
vue.js服务器端渲染的两种方式之 Nuxt.js 使用
蒲公英芽的博客
04-16 3558
vue.js服务器端渲染的两种方式: vue-server-renderer Nuxt.js 1. vue-server-renderer vue-server-renderer插件,使用 Node.js server 的服务器端单页面应用程序渲染。将 Vue 服务器端渲染 (SSR) 与其他后端设置进行混合使用。 用法:安装 ==> 渲染一个 Vue 实例 ==> 与服务器集成 ...
vue created,mounted多次执行
qq_46126127的博客
02-26 1737
原因是tab里for循环渲染 解决方式 不是当标签不渲染
Vue项目中created生命周期重复执行,未缓存下来
qq_38948398的博客
08-31 5094
Vue项目中created生命周期重复执行,未缓存下来,原因是什么呢?
nuxt.js页面加载优化
10-09
5. 资源预加载:使用Nuxt.js提供的组件或者@nuxtjs/prerender-spa-plugin插件来实现资源的预加载,可以在首次访问加载页面所需的资源,加快后续页面加载速度。 6. 缓存策略:使用合适的缓存策略,将一些不...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • grid on在matlab功能,matlab中的grid on语句什么意思?如何使用,谢谢。 25027
  • matlab 小数点取前两位_matlab里面如何保留小数特定位数 11490
  • 为硬件保留的内存怎么释放_实际内存不够大,可用内存更加小,这样解决 7664
  • cdrx8如何批量导出jpg_CDR怎么批量导出图片 5758
  • 手机能打开的表白代码_不是程序员都能学会的5个表白代码,一学就会,附源码... 5472

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 软件系统保修服务器,软件维保服务解决方案2018.doc
  • 远程ntp服务器响应模式6查询,NTP的工作模式 - S2750, S5700, S6720 V200R008C00 配置指南-设备管理 - 华为...
  • easyui ajax表单验证,jquery easyUI中ajax异步校验用户名
2021年160篇
2020年223篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司怒江网站建设设计哪家好黔南网站推广工具推荐太原网站推广多少钱许昌网站seo优化推荐泰安外贸网站建设公司随州优秀网站设计哪家好清徐网站制作推荐榆林网站优化按天扣费推荐果洛百度标王哪家好楚雄优秀网站设计价格潮州SEO按天计费舟山设计公司网站推荐清徐网站改版福田百度seo泰州建站推荐海南网站推广价格阳江营销型网站建设推荐北海高端网站设计多少钱安顺seo优化推荐邢台网站推广厦门建网站价格丽江百度关键词包年推广哪家好防城港百度爱采购推荐惠州如何制作网站价格铜陵seo排名宿迁网站优化排名多少钱驻马店网站设计价格深圳设计网站价格衡阳百姓网标王推广公司揭阳网站设计价格歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化