vue spa项目转服务器渲染

Vue SPA + Nodejs项目实战 Vue SPA + Nodejs项目实战文章链接:http://blog.csdn.net/i348018533/article/details/73605176本文主要阐述的是使用了vue spa单页应用的后台管理系统配合nodejs接口代理,并使用webpack打包编译的项目架构分享。 面向对象是有一定前端开发基础对vue nodejs webpack有一定认识的开发。Vue简介介绍 自底向上 阅读详情

最近有个项目本来是单页面的,但是现在的需求要做SEO,因为是动态数据所以确定做服务端渲染,不用客户端渲染。技术采用vue+nuxt.js+iview.js

配置vue全局组件:

在plugins/ 下新建global-components.js文件

// 引入vue 及 lodash
import Vue from 'vue'
import upperFirst from 'lodash/upperFirst'  // 首字线大写
import camelCase from 'lodash/camelCase'  // 驼峰命名大法

// 把 /component/base/ 下的所有 vue 组件 require 进来
// path: 要引入的组件所在相对路径(相对于当前文件)
// deep: 是否检索子文件夹
// matchFile: 匹配的文件名称
// require.context(path, deep, matchFile)
const requireComponent = require.context('../components/global/', false, /_base-[\w-]+\.vue$/)
// 遍历 require 进来的组件并注册
requireComponent.keys().forEach((fileName) => {
  const componentConfig = requireComponent(fileName)
  const componentName = upperFirst( camelCase( fileName.replace(/^\.\/_/, '').replace(/\.\w+$/, '') ) )
  // 全局注册组件
  Vue.component(componentName, componentConfig.default || componentConfig)
})

nuxt.config.js里:

  plugins: [
    {src: '@/plugins/global-components'} //定义全局组件
  ],

页面调用还跟之前一样。

引入全局stylus变量文件

安装style-resources-module

npm i @nuxtjs/style-resources --save

nuxt.config.js配置:

modules: [
    '@nuxtjs/style-resources'
  ],
build: {
    // 包地址:https://github.com/nuxt/nuxt.js/tree/dev/examples/style-resources
    // 只能用绝对路径
    styleResources: {
      stylus: './assets/styles/variable.styl'
    },
    /*
    ** You can extend webpack config here
    */
    extend(config, ctx) {}
  },

这样页面就可以使用stylus的全局变量了。

服务器请求在自定义接口文件里直接引入axios,并使用相对路径报错,而绝对路径可以,后发现在asyncData里使用this.$axios可以使用相对地址并代理访问。

//store/home.js
import buyCar from '../service/ssr/buycar'
  async setIndexPageData({commit, state}) {
    const buyCarAxios = buyCar(this)

    await buyCarAxios.getCarList('').then(res => {
      //your code
    }).catch(err => {
      console.log(err)
    })
})

//service/ssr/buyCar.js内容
export default ({$axios}) => {
  return {
    getCarList: (url) => {
      let data = }
      return $axios.post(url, data)
    }
  }
}

将this作为一个对象传给了模块接受里的$axios方法并使用在本地可以访问,但是打包部署之后路径请求错误,如果知道怎么解决的大佬 欢迎留言。最后还是服务器请求接口采用了绝对路径来访问。

部署

https://segmentfault.com/a/1190000014450967借用这篇。

meta标签配置
nuxt.config.js中:

  head: {
    title: process.env.npm_package_name || '',
    meta: [
      {charset: 'utf-8'},
      {name: 'viewport', content: 'width=device-width, initial-scale=1'},
      {hid: 'description', name: 'description', content: process.env.npm_package_description || ''},
      {hid: 'description1', name: 'description', content: ''},
      {hid: 'keywords', name: 'keywords', content: ''},
    ],
    script: [
      {src: ''}
    ],
    link: [
      {rel: 'icon', type: 'image/x-icon', href: '/favicon.ico'},
      {rel: 'stylesheet', href:''}
    ]
  },

页面中配置:

data() {
   return {
     dataList: {},
    title: '标题'
   };
},
 head() {
   return {
     title: this.title,
     meta: [
       { hid: 'description', name: 'description', content: '这里是关键词描述' }
     ]
   }
},

这个项目全局注册的组件 静态化不生效,转为组件引用,静态化可以实现。然后不走服务器请求的全局处理参数后重启一下竟然好了又。。。 可能缓存问题。建议删除 .nuxt 文件

我们这个项目静态化数据是vuex管理的,之前是直接请求的,所以现在修改数据不能直接修改,要用mutations更改

 

我的中心里有菜单,路由生成的接口和没有nuxt静态化时一样,但是点击速度快以后路由切换会丢失父级菜单,解决是将左侧菜单静态化。

因为左侧菜单是需要静态化,所以需要token,点击登录直接跳转我的中心可能token没有存储 导致菜单请求不到。估登录成功以后将token当做url参数传给我的中心页面。

额 后来发现静态化的左侧菜单总是出现问题,不一定从哪里进我的中心左侧菜单就会加载不出来,又改回了客户端渲染,探索发现之前左侧丢失的问题还不知道是为什么但是新建组件里的数据不会丢失,所以就将左侧菜单又封装了一个组件引入解决丢失数据的问题

[Vue warn]: The client-side rendered virtual DOM tree is not matching server-rendered content....Bailing hydration and performing full client-side render.页面一直有一个这个报错。出现的这个原因呢就是服务端渲染的数据和客户端渲染的不一致,所以有前端动态判断的或者要加no-ssr标签 只在客户端渲染就好了

顺带贴一个大佬的博客地址:

https://juejin.im/post/5907fc6da0bb9f00650d59a1

 

warning:Mismatching childNodes vs. VNodes: 子节点与VNode不匹配
原因是用了 不知道为毛会这样 待考证

现在页面里有二级路由,本来pages下的页面层级是这样的:

pages-|
        -|myPur.vue
        -|myPur
            -|myPurDetail.vue

但是点击左侧菜单返回当前页面的时候详情页是隐藏了 但是只有myPur.vue没有执行生命周期,他的父元素default执行了created方法,后来猜想可能是因为把muPur.vue就当成了一个架子,改成了这样的结构:

-|page
    -|myPur
        -|myPurDetail.vue
        -|index.vue

点击会跳的时候就执行了ceated方法,现在没有时间看源码,所以还是知其然不知其所以然。

nuxt建立目录的时候pages下的myCenter编译后会成为router下的一级目录,而新建文件夹myCenter下新建文件index.vue也会编译为router下的myCenter指向,如果他们同时存在呢,localhost:3000/myCenter会指向pages下的myCenter文件,也就是说pages下的权限高。

他两个区别就是myCenter下的index.vue和myOrder是平级关系,pages下的myCenter和myCenter下的myOrder是包含关系

大部分的奇怪问题都跟服务端或者客户端渲染了有关系

 

部署环境变量问题;

更改package.json:

"start": "cross-env ENV_NAME=test POST=3002 nuxt start",

package.json

"scripts": {
    "lint": "eslint --ext .js,.vue --ignore-path .gitignore .",
    "precommit": "npm run lint",
    "dev": "cross-env NODE_ENV=development nodemon server/index.js --watch server --exec babel-node",
    "build": "cross-env ENV_NAME=test nuxt build",
    "start:dev": "cross-env NODE_ENV=production node server/index.js --exec  babel-node",
    "start": "cross-env ENV_NAME=test POST=3002 nuxt start",
    "generate": "nuxt generate"
  },

nuxt.config.js

nuxt.config.js
module.exports = {
  mode: 'universal',
  env: {
    ENV_NAME: process.env.ENV_NAME
  },
}

如果没有配置nuxt.config.js的话会出现服务器端和客户端返回的process.env.ENV_NAME值不相同 客户端找不到这个值。

记录一下知识点:

项目打包中直接run build和generate的区别:
run build是会根据服务端数据相应在node中间层动态渲染相关html文件,所以每次访问页面的时候会先请求node服务,node服务请求java后端api获得数据,根据数据渲染出document文档返回给前端。
generate是打包的时候会直接请求api拿到数据生成静态文件,相当于vue里现有的预渲染

更新ing 未整理

Vue 项目 SEO 优化实战:从 SPA 到 SSR 服务端渲染(Server-Side Rendering,简称 SSR)是在服务器生成完整 HTML 页面,并将其发送到浏览器。提高搜索引擎爬取效率。加快首屏加载速度。对于简单项目,优化 Vue SPA 的 Meta 信息和加载速度即可满足 SEO 基础需求。对于需要强 SEO 支持的项目,使用 Nuxt.js 实现 SSR 是高效的选择。不断监控网站的性能和爬虫抓取情况,调整策略。 阅读详情

相关推荐

vue3使用预渲染prerender-spa-plugin达到SEO优化

实现SEO优化有四种方法: 1.SSR服务器渲染; 2.静态化; 3.预渲染prerender-spa-plugin; 4.使用Phantomjs针对爬虫做处理 此处只介绍第三种预渲染的方法,各种方法的利弊也不过多描述 如果只是用来改善少数营销页面(例如 /, /about, /contact 等)的 SEO,那么你可能需要预渲染。无需使用 web 服务器实时动态编译 HTML,而是使用预渲染方式,在构建时 (build time) 简单地生成针对特定路由的静态 HTML 文件。优点是设置预渲染更简单,并可

这里是简介 4286

nuxt和php,vue.js [警告]:客户端呈现的虚拟DOM树与服务器呈现的内容不匹配(Nuxt - 糯米PHP...

我正在尝试运行一个基本的Nuxt应用程序,并使用在lerna monorepo内部使用vue-cli构建的外部Vue组件。该页面简要显示了组件内容(服务器渲染),然后消失并抛出以下错误。"export 'default' (imported as 'Header') was not found in 'a2b-header'其次是Mismatching childNodes vs. VNodes:...

weixin_32430445的博客 644

VUE预渲染 webpack prerender-spa-plugin

预渲染就是在构建阶段(npm run build)生成特定路由的html静态页面,利用webpack的prerender-spa-plugin 插件。 参考:https://www.npmjs.com/package/prerender-spa-plugin 安装 prerender-spa-plugin npm install prerender-spa-plugin --save-dev 配...

转角遇到爱 1610

ChildNodes VS Children

虽然我们可以通过node.childNodes以及node.Children来访问元素node的子节点,但是node.childNodes与node.Children还是有些许不同

red_heel的博客 417

Nuxt - 创建 “新项目“ 时,选择 element 组件库框架后,运行测试引入组件后控制台全是报错(一刷新页面,还会伴随闪一下没有样式的问题)Parent Mismatching childNo

nuxt.js新创建的项目引入组件后控制台报错了,NUXT全新的项目,一运行就报错了,nuxt2新项目引入饿了么Element组件库后,直接控制台一片红,nuxt.js新项目引入element框架组件后,刷新页面样式丢失了,刷新页面组件闪烁一下就恢复正常了,但是控制台有报错,nuxt中组件element-ui引用报错,nuxt项目中使用element组件时报错:didyouregisterthe,在nuxt引入element插件,报错,Theclient-siderendered

🏆 前端领域优质创作者 1900

薅“刷宝”羊毛的autojs脚本教程,简单粗暴好用!!!

本教程旨在帮助大家实现用手机或闲置手机来进行“刷宝”平台的收益,能薅多少米就看你的本事了,作者教你的是如何用autojs来进行脚本的挂机教程,掌握了这个思路后,你可以根据自己的实际需要来改进脚本或者撸别的平台:) 适用系统,**android4.0以上,苹果机暂不适用**(大多数android系统手机都是7.0以上,要查看自己手机是android几,见文件夹“视频教程-基础”>1.查看android版本的方法)

rousseaou8的博客 8万+

Nuxt.js打包后报错DOMException: Failed to execute appendChild on Node

报错问题 Nuxt.js打包后报错 DOMException: Failed to execute 'appendChild' on 'Node': This node type does not support this method. 开发环境下报错 Mismatching childNodes vs. VNodes: 解决 1、template中可以限制只在客户端渲染 // version >= 2.9.0 <client-only></client-only>

彭世瑜的博客 1万+

FAST-LIVO2 源码精读(十六):接入自定义传感器——多雷达适配与内外参标定

本文是「FAST-LIVO2 激光-惯性-视觉里程计源码精读」专栏第十六篇。上一篇拆解了中每个关键参数的物理含义与调参路径,并反复强调外参RclPcl与时间偏移配错即全局失效;本篇承接这一悬念,回答更前置的工程问题——如何把 FAST-LIVO2 接到一套全新硬件上:新雷达如何通过的类型分支适配、相机内参与畸变模型如何配置、两组外参与时间偏移如何标定出来并填入 YAML,最后给出一份落地检查清单。

PX4-SLAM-PNC 198

Vue-SSR 客服端混合失败(Vue hydration fails)

Lynne,一个能哭爱笑永远少女心的前端开发工程师。身处互联网浪潮之中,热爱生活与技术。 前言 前一阵遇到了一个Bug… Error: [nuxt] Error while mounting app: HierarchyRequestError: Failed to execute 'appendChild' on 'Node': This node type does not support this method. at some-file.js:1 整整排查了2个多小时,如果要追究其根本原因,找.

weixin_42118522的博客 4958

别再无脑调打码平台了!聊聊 ddddocr 在爬虫验证码识别中的真实边界

ddddocr是国产开源社区的优秀成果,它大幅降低了验证码识别的入门门槛。工具的自由不等于工程的自由。真正的能力不在于“会不会调库”,而在于能否准确判断工具的适用边界、构建鲁棒的容错机制、并在成本与效果之间做出理性权衡。下次当你准备在爬虫中加入验证码识别时,不妨先问自己:这个站点的验证码类型是否在ddddocr的能力圈内?我的预处理是否针对该站点做过专项调试?我的失败重试和监控机制是否完备?如果三个问题都能肯定回答,那么ddddocr就是你的利器;如果有任何一个犹豫,请先补齐短板再上路。评论区交流:你用。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1279

基于STM32设计的校园智慧路灯系统(华为云IOT)(212)

当前设计并研发了基于STM32的智慧路灯系统,本系统的目的是打造一个高效节能、智能化管理的校园照明环境。通过集成STM32F103RCT6高性能微控制器为核心,结合多种传感器模块如BH1750光敏传感器、热释电人体感应模块以及中科微电子GPS模块等,实现了对校园路灯的精准控制与实时监控。

5133

vue 项目预渲染(prerender-spa-plugin)

服务器端渲染 vs 预渲染 (SSR vs Prerendering) 如果你调研服务器端渲染 (SSR) 只是用来改善少数营销页面(例如/,/about,/contact等)的 SEO,那么你可能需要预渲染。无需使用 web 服务器实时动态编译 HTML,而是使用预渲染方式,在构建时 (build time) 简单地生成针对特定路由的静态 HTML 文件。优点是设置预渲染更简单,并可以...

吾日三省吾身:高否?富否?帅否? 否!否!否! 安心上班吧…… 1万+

[网络安全自学篇] 六十八.WannaCry勒索病毒复现及分析(二)MS17-010利用及病毒解析

这是作者的网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您们喜欢,一起进步。前文分享了通过Python利用永恒之蓝漏洞加载WannaCry勒索病毒,并实现对Win7文件加密的过程,但过程较为复杂,为什么不直接利用永恒之蓝呢?所以,这篇文章将直接分享MSF利用MS17-010漏洞进行反弹Shell,再上传勒索病毒进行实验复现,并详细讲解WannaCry勒索病毒的原理。基础性文章,希望对您有所帮助。

杨秀璋的专栏 1万+

vue使用prerender-spa-plugin预渲染达到SEO优化

传统页面和框架开发的区别 传统html是通过a标签跳转来作为切换的,每一个页面都是一个html,这样百度很容易抓取到的,也能顺着a链接到你的子级页面。 像vue、react、angular开发的都是spa应用,他只有一个页面index,他们都是内加载,动态加载切换路由的,所以你再多页面百度蜘蛛只能爬到首页,这就是spa的一大痛点 解决方案 说完了区别说下怎么解决这个问题,目前我所了解的两种: vue.js官网提供的SSR(服务端渲染)这种方案呢学习成本高,对于刚开始的新手来说可能有点难度(也包括我..

观千剑而后识器,操千曲而后晓声。 3935

EfficientNet 改进:StripCGLU模块的创新与应用

本文提出了一种改进的EfficientNet-b0模型,核心创新是通过引入StripCGLU模块来提升网络性能。StripCGLU结合了水平/垂直条带卷积和GLU激活机制,具有参数效率高、计算量少的优点。改进策略包括选择性替换部分MBConv为StripCGLU模块(每隔3个块插入),同时保留早期层结构。测试表明该模型适用于移动端视觉任务,在保持效率的同时提升性能。代码实现包含模块定义、模型构建及测试部分,展示了如何通过精心设计的模块改进现有网络架构。

Henry的博客 241

电商行业分析爬虫:抓取行业数据,进行行业分析

电商行业数据分析对于市场研究、竞争分析和商业决策至关重要。通过爬取电商平台的数据,我们可以深入了解市场动态、消费者行为和商品销售情况。本文将介绍如何构建一个电商行业分析爬虫,抓取商品信息、销售数据和用户评价等,并进行数据分析。

u014481728的博客 1627

vuejs 预渲染插件 prerender-spa-plugin 生成多页面 -- SEO

prerender-spa-plugin 与 vue-meta-info 前端vue等框架打包的项目一般为SPA应用,而单页面是不利于SEO的,现在的解决方案有两种: 1、SSR服务器渲染   了解服务器渲染请进,这里不做记录。 2、预渲染模式 这比服务端渲染要简单很多,而且可以配合 vue-meta-info 来生成title和meta标签,基本可以满足SEO的需求 TIPS: 使用预渲染vue-router必须使用history模式 安装prerender-spa-plugin // 安装 npm

qq_26282869的博客 1390

YOLOv12改进策略【卷积层】| SPD-Conv 针对小目标和低分辨率图像的检测任务

SPD-Conv是一种新的 CNN 构建模块,用于替代传统 CNN 架构中使用的步长卷积(strided convolution)和池化(pooling)层,它由空间到深度(Space-to-depth,SPD)层和非步长卷积(non - strided convolution)层组成。

Limiiiing的博客 1775

SSR和SPA渲染模式

SSR(Server-Side Rendering)和SPA(Single Page Application)是前端开发中常见的两种渲染模式,它们各自有独特的优缺点以及适用场景。

weixin_45663702的博客 3035

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

vue利用prerender-spa-plugin预渲染

前端时间写一个vue官网,开发很顺利,但是发布之后,发现对于SPA项目seo优化很不友好,于是用到预渲染,顺便利用vue-meta-info编写每个页面的name、content等等。 一、安装 npm i prerender-spa-plugin --save -dev npm i vue-meta-info 二、具体步骤: 1、修改router下index.js:hash模式改为histo...

一只路过的小码农 1554

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

浅析SSR(服务端渲染)和SPA(客户端渲染)

一、前言 C端项目重构成首屏服务端渲染(SSR:serve side render),对于重构成SSR,redux不是必须的。本文以vue为栗子的项目。 二、什么是服务端渲染 将组件或页面通过服务器生成html字符串,再发送到浏览器,最后将静态标记"混合"为客户端上完全交互的应用程序。 我以weekly周报的登陆页面为例 登陆页没有使用服务端渲染,请求到login页面,返回的b...

saucxs 9791

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Vue CLI 插件:预渲染 SPA 项目教程

Vue CLI 插件:预渲染 SPA 项目教程 1. 项目介绍 vue-cli-plugin-prerender-spa 是一个 Vue CLI 插件,旨在为你的 Vue 应用程序添加预渲染功能。预渲染是一种优化技术,通过在构建时生成静态 HTML 文件,从而提高单页应用(SPA)的 SEO 性能和首次加载速度。 该插件基于 prerender-spa-plugin,并提供了零配置的预渲染功能。它...

gitblog_00456的博客 519

vue项目改造服务端渲染

服务端渲染

gcyaozuodashen的博客 2092

vue预渲染--prerender-spa-plugin插件的使用

预渲染 我们按照vue-cli脚手架开发的vue项目,打包后是一个空的html和一些js、css,在浏览器拿到这些资源后就会根据js去请求数据、生成dom然后再插入html,这种就浏览器渲染,由于这种方式无法解决seo,而且白屏时间偏长导致对应的体验不佳,便有了预渲染和服务器渲染。 demo 三种不同渲染方式的区别: 客户端渲染:用户访问 url,请求 html 文件,前...

MIR_zhang的博客 5020

vue3.x使用prerender-spa-plugin预渲染达到SEO优化

prerender-spa-plugin它所做的预渲染就是当vue-cli构建的项目进行npm run build 的时候,会按照路由的层级进行动态渲染出对应的html文件,这样爬虫在爬取页面的时候就不会再是一个简简单单的 index.html 入口文件了。

富朝阳的博客 6088

八、SPA单页面实现SEO优化之预渲染prerender-spa-plugin

六、什么是SEO优化(搜索引擎优化)?SPA单页面应用如何实现SEO优化?通过上一篇文章我们介绍了服务端渲染的方式来实现单页面应用的SEO优化。但是,服务端渲染的方式对开发并不友好,它需要约定各种规范,比较适合开发大型网站。对于一些微型网站,比如个人博客,或者公司的小型应用网站,路由数量,页面数量并不多,我们可以使用prerender-spa-plugin预渲染来实现SPA单页面的SEO优化。它的优点是简单方便,不需要改动太多原来的项目内容。

qq_44849312的博客 1562
上一篇: vue 配置axios,增加被挤下线以后中断后续请求
下一篇: 前端使用oss上传
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值