参考:https://www.jianshu.com/p/6a4c0b281e7f

使用vue-cli打包项目一般为spa项目,众所周知单页面应用不利于SEO,有ssr和预渲染两种解决方案,这里我们只讨论预渲染。

此教程使用的prerender-spa-plugin版本和vue版本

vue-cli有2.0和3.0版本,解决方法是不一样的,这里我们要分开讨论。

vue-cli3.0版本

3.0的cli看上去简洁多了,去掉了2.0 build和config等目录,那我们怎么去修改webpack的配置呢?
在根目录下创建vue.config.js,进行你的配置。

1.安装

 cnpm install prerender-spa-plugin --save

2.vue-config.js中增加

const PrerenderSPAPlugin = require('prerender-spa-plugin');
const Renderer = PrerenderSPAPlugin.PuppeteerRenderer; const path = require('path'); module.exports = { configureWebpack: config => { if (process.env.NODE_ENV !== 'production') return; return { plugins: [ new PrerenderSPAPlugin({ // 生成文件的路径,也可以与webpakc打包的一致。 // 下面这句话非常重要!!! // 这个目录只能有一级,如果目录层次大于一级,在生成的时候不会有任何错误提示,在预渲染的时候只会卡着不动。 staticDir: path.join(__dirname,'dist'), // 对应自己的路由文件,比如a有参数,就需要写成 /a/param1。 routes: ['/', '/product','/about'], // 这个很重要,如果没有配置这段,也不会进行预编译 renderer: new Renderer({ inject: { foo: 'bar' }, headless: false, // 在 main.js 中 document.dispatchEvent(new Event('render-event')),两者的事件名称要对应上。 renderAfterDocumentEvent: 'render-event' }) }), ], }; } } 

3.在main.js中增加

new Vue({router,store,render: h => h(App), mounted () { document.dispatchEvent(new Event('render-event')) } }).$mount('#app') 

4.router.js 中设置mode: “history”

5.运行npm run build,看一下生成的 dist 的目录里是不是有每个路由名称对应的文件夹。然后找个 目录里 的 index.html 用IDE打开,看文件内容里是否有该文件应该有的内容。有的话,就设置成功了,如果没成功,照着上面的步骤再来一次!!!

vue-cli2.0版本
1.安装

 cnpm install prerender-spa-plugin --save

2.webpack.prod.conf.js增加部分代码

const path = require('path')
const PrerenderSPAPlugin = require('prerender-spa-plugin') //引用插件 const Renderer = PrerenderSPAPlugin.PuppeteerRenderer const webpackConfig = merge(baseWebpackConfig, { plugins: [ // vue-cli生成的配置中就已有这个了,不要动 new HtmlWebpackPlugin({ filename: config.build.index, template: 'index.html', inject: true, minify: { removeComments: true, collapseWhitespace: true, removeAttributeQuotes: true }, chunksSortMode: 'dependency' }), // 配置PrerenderSPAPlugin new PrerenderSPAPlugin({ // 生成文件的路径,也可以与webpakc打包的一致。 staticDir: path.join(__dirname, '../dist'), // 对应自己的路由文件,比如index有参数,就需要写成 /index/param1。 routes: ['/', '/product','/about','/contact','/join','/jzjh'], // 这个很重要,如果没有配置这段,也不会进行预编译 renderer: new Renderer({ inject: { foo: 'bar' }, headless: false, // 在 main.js 中 document.dispatchEvent(new Event('render-event')),两者的事件名称要对应上。 renderAfterDocumentEvent: 'render-event' }) }) ] }) 

3.在main.js中增加

new Vue({el: '#app', router, render: h => h(App), mounted () { document.dispatchEvent(new Event('render-event')) } }) 

4.router.js 中设置mode: “history”

5.运行npm run build,看一下生成的 dist 的目录里是不是有每个路由名称对应的文件夹。然后找个 目录里 的 index.html 用IDE打开,看文件内容里是否有该文件应该有的内容。有的话,就设置成功了,如果没成功,照着上面的步骤再来一次!!!

特别提醒

1.vue-cli2.0和3.0的设置大致一致,但有一个很不同
在3.0中,设置staticDir: path.join(__dirname,'dist'),
在2.0中,设置staticDir: path.join(__dirname,'../dist'),
如果你把3.0的staticDir设置为path.join(__dirname,'../dist')或者把2.0的staticDir设置为path.join(__dirname,'dist'),运行npm run build 都会报错,这要特别注意!!!

2.细心的小伙伴会发现,不管2.0还是3.0都需要设置 history 模式,那这一步是否是必须的呢?经过测试,如果不设置history模式,其实也能运行和生成文件的,但查看每个index.html文件的内容都会是一样的。所以这一步是必须的

如果你想修改每个页面的meta 信息,这里推荐使用 vue-meta

如何再静态生成的如:indexl.html的html文件图片等使用我们配置的cdn环境呢?

1.src目录下增加文件public-path.js

/*** CDN*/const isPrerender = window.__PRERENDER_INJECTED__ === 'prerender'__webpack_public_path__ = isPrerender ? '' : process.env.CDN_PATH

2.main.js引入public-path.js,注意要在最开头的地方添加

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import './public-path'
import Vue from 'vue'
import App from './App'
import router from './router'
import VueMeta from 'vue-meta'
import $ from 'jquery'
import 'babel-polyfill'
import 'bootstrap/dist/css/bootstrap.min.css'
import 'bootstrap/dist/js/bootstrap.min.js'
import 'swiper/dist/css/swiper.css';
Vue.config.productionTip = false
Vue.use(VueMeta)
new Vue({el: '#app',router,render: h => h(App),mounted() {document.dispatchEvent(new Event('render-event'))}
})

3.修改webpack.pro.conf.js文件

// 配置PrerenderSPAPluginnew PrerenderSPAPlugin({staticDir: config.build.assetsRoot,routes: [ '/' ],outputDir: path.join(config.build.assetsRoot, config.build.assetsPublicPath),indexPath: path.join(config.build.assetsRoot, 'index.html'),postProcess (renderedRoute) {// add CDNlet cdnPath = JSON.parse(env.CDN_PATH);renderedRoute.html = renderedRoute.html.replace(/(<script[^<>]*src=\")((?!http|https)[^<>\"]*)(\"[^<>]*>[^<>]*<\/script>)/ig,`$1${cdnPath}$2$3`).replace(/(<link[^<>]*href=\")((?!http|https)[^<>\"]*)(\"[^<>]*>)/ig,`$1${cdnPath}$2$3`).replace(/(<img[^<>]*src=\")((?!http|https|data:image)[^<>\"]*)(\"[^<>]*>)/ig,`$1${cdnPath}$2$3`)return renderedRoute},renderer: new Renderer({injectProperty: '__PRERENDER_INJECTED__',inject: 'prerender',renderAfterDocumentEvent: 'render-event',})}),

注意红色字体的,把相对路径的img和js加上我们的cdn路径

转载于:https://www.cnblogs.com/dehuachenyunfei/p/vue_seo.html

Vue-cli使用prerender-spa-plugin插件预渲染和配置cdn相关推荐

  1. Vue-cli使用prerender-spa-plugin插件预渲染的问题

    网上已经有很完整的如何使用vue-cli 与 prerender-spa-plugin插件预渲染,这里就不做记录了 需要记录的是:        预渲染出来的页面是静态的,所以不要动不动就把'/'路径 ...

  2. prerender html5,HTML5 VUE单页应用 SEO 优化之 预渲染(prerender-spa-plugin)

    前言:当前 SPA 架构流行的趋势如日中天,前后端分离的业务模式已经成为互联网开发的主流方式,但是 单页面 应用始终存在一个痛点,那就是 SEO, 对于那些需要推广,希望能在百度搜索时排名靠前的网站而 ...

  3. vue项目seo优化-预渲染prerender-spa-plugin配置

    文章目录 前言 一.prerender-spa-plugin是什么? 1.优点 2.缺点 二.使用步骤 1.安装 prerender-spa-plugin 2.配置 prerender-spa-plu ...

  4. 使用Prerender.io进行网站预渲染

    文章目录 前言 目标 运行流程图 安装中间件 安装Prerender服务 安装Chrome 启动Prerender.io服务 测试 If you use html5 push state (recom ...

  5. vue cli 4 多环境_Vue 前端uni-app多环境配置部署服务器的问题

    转载请标明出处: https://dujinyang.blog.csdn.net/article/details/100831712/ 本文出自:[奥特曼超人的博客] 前端Vue Vue 经过这一年的 ...

  6. Vue-cli使用prerender-spa-plugin插件预渲染

    众所周知单页面应用程序不利于SEO,为了解决这个问题 官方 给出的2种解决方案 1.服务器端渲染 2.预渲染 如果你调研服务器端渲染 (SSR) 只是用来改善少数营销页面(例如 /, /about, ...

  7. Vue-Cli3.0怎么使用预渲染怎么配置prerender-spa-plugin

    利用vue cli3 搭建项目,需要使用vue-meta-info 和 prerender-spa-plugin 来优化seo,但是在prerender-spa-plugin好像出了点问题,解决后总结 ...

  8. vue cli 解决跨域 线上 nginx 反向代理配置

    前后分离 axios 接 api 跨域问题如图: 解决办法: 1. npm start 本地开发环境解决: 在webpack配置文件 /config/index.js 里找到 proxyTable 开 ...

  9. vue使用prerender预渲染配合vue-meta实现单页面实现SEO优化

    公司项目在已在开发完成的情况下通知需要做SEO优化.因为项目使用的是vue做的单页面应用,顿时人都不好了,只好网上搜罗出来一些配置(其实是另一个带我的老大哥他做的,但是他要走了,工作交接给我, 我需要 ...

  10. Vue CLI 插件 Plugins

    插件Plugins VUE CLI 是使用是基于插件的体系结构的. 如果检查新创建的项目的 package.json ,我们将发现以 @vue/cli-plugin- 开头的依赖项.插件可以修改内部w ...

最新文章

  1. 鲲鹏应用创新大赛山西区域赛圆满落幕,鲲鹏生态助力信创变革
  2. springboot项目不输出nohup.out日志
  3. VTK:几何对象之ColoredLines
  4. linux nginx安启动_linux下nginx编译安装启动
  5. 实训09.11:java重点内容介绍
  6. 2场直播丨MySQL 数据库最常见的 6 类故障的排除方法、2020数据技术嘉年华·金融峰会暨数据库大咖讲坛(第4期)...
  7. Python工作笔记002---PYTHON之DEF函数
  8. 解读absolute与relative(转载)
  9. linux socket 104 错误,linux socket连接中 ERRNO错误
  10. python代码混淆工具_Intensio-Obfuscator:一款专业Python代码混淆处理工具
  11. java 多语言_JAVA实现多语言
  12. 2021电赛F题智能送药小车程序代码
  13. 他们联手造了个抢票节”
  14. numpy部份函数或命令用法(不定时更新)
  15. tp5欢迎页 (获取系统信息)
  16. 微圈社群助手到底是什么?怎么用?
  17. 简单易懂的关键词挖掘方法
  18. Kali与编程:小白黑客是如何安装Centos8的?(下节更精彩)
  19. 华为海康大华摄像头编译RTSP转RTMP和HTTPFLV
  20. 系列 | 数仓实践第三篇NO.3『拉链表』

热门文章

  1. 思科6509的详细配置---加注释
  2. [Java] ActionEvent 事件处理
  3. “流量注入”***模式的探讨
  4. 三层交换及DHCP中继配置
  5. java系统时间获取,存储,及获取时间戳,格式化显示
  6. Spring请求参数测试
  7. yolo系列外文翻译_测评:英文文献、论文的翻译软件对比
  8. dell笔记本驱动安装失败_声卡驱动安装失败的解决方法
  9. wordpress 通过域名无法访问_使用WordPress搭建自己的内容发布平台
  10. 【渝粤教育】国家开放大学2018年春季 7392-21FMatlab语言及其应用 参考试题