Vue-cli使用prerender-spa-plugin插件预渲染和配置cdn
参考: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相关推荐
- Vue-cli使用prerender-spa-plugin插件预渲染的问题
网上已经有很完整的如何使用vue-cli 与 prerender-spa-plugin插件预渲染,这里就不做记录了 需要记录的是: 预渲染出来的页面是静态的,所以不要动不动就把'/'路径 ...
- prerender html5,HTML5 VUE单页应用 SEO 优化之 预渲染(prerender-spa-plugin)
前言:当前 SPA 架构流行的趋势如日中天,前后端分离的业务模式已经成为互联网开发的主流方式,但是 单页面 应用始终存在一个痛点,那就是 SEO, 对于那些需要推广,希望能在百度搜索时排名靠前的网站而 ...
- vue项目seo优化-预渲染prerender-spa-plugin配置
文章目录 前言 一.prerender-spa-plugin是什么? 1.优点 2.缺点 二.使用步骤 1.安装 prerender-spa-plugin 2.配置 prerender-spa-plu ...
- 使用Prerender.io进行网站预渲染
文章目录 前言 目标 运行流程图 安装中间件 安装Prerender服务 安装Chrome 启动Prerender.io服务 测试 If you use html5 push state (recom ...
- vue cli 4 多环境_Vue 前端uni-app多环境配置部署服务器的问题
转载请标明出处: https://dujinyang.blog.csdn.net/article/details/100831712/ 本文出自:[奥特曼超人的博客] 前端Vue Vue 经过这一年的 ...
- Vue-cli使用prerender-spa-plugin插件预渲染
众所周知单页面应用程序不利于SEO,为了解决这个问题 官方 给出的2种解决方案 1.服务器端渲染 2.预渲染 如果你调研服务器端渲染 (SSR) 只是用来改善少数营销页面(例如 /, /about, ...
- Vue-Cli3.0怎么使用预渲染怎么配置prerender-spa-plugin
利用vue cli3 搭建项目,需要使用vue-meta-info 和 prerender-spa-plugin 来优化seo,但是在prerender-spa-plugin好像出了点问题,解决后总结 ...
- vue cli 解决跨域 线上 nginx 反向代理配置
前后分离 axios 接 api 跨域问题如图: 解决办法: 1. npm start 本地开发环境解决: 在webpack配置文件 /config/index.js 里找到 proxyTable 开 ...
- vue使用prerender预渲染配合vue-meta实现单页面实现SEO优化
公司项目在已在开发完成的情况下通知需要做SEO优化.因为项目使用的是vue做的单页面应用,顿时人都不好了,只好网上搜罗出来一些配置(其实是另一个带我的老大哥他做的,但是他要走了,工作交接给我, 我需要 ...
- Vue CLI 插件 Plugins
插件Plugins VUE CLI 是使用是基于插件的体系结构的. 如果检查新创建的项目的 package.json ,我们将发现以 @vue/cli-plugin- 开头的依赖项.插件可以修改内部w ...
最新文章
- 鲲鹏应用创新大赛山西区域赛圆满落幕,鲲鹏生态助力信创变革
- springboot项目不输出nohup.out日志
- VTK:几何对象之ColoredLines
- linux nginx安启动_linux下nginx编译安装启动
- 实训09.11:java重点内容介绍
- 2场直播丨MySQL 数据库最常见的 6 类故障的排除方法、2020数据技术嘉年华·金融峰会暨数据库大咖讲坛(第4期)...
- Python工作笔记002---PYTHON之DEF函数
- 解读absolute与relative(转载)
- linux socket 104 错误,linux socket连接中 ERRNO错误
- python代码混淆工具_Intensio-Obfuscator:一款专业Python代码混淆处理工具
- java 多语言_JAVA实现多语言
- 2021电赛F题智能送药小车程序代码
- 他们联手造了个抢票节”
- numpy部份函数或命令用法(不定时更新)
- tp5欢迎页 (获取系统信息)
- 微圈社群助手到底是什么?怎么用?
- 简单易懂的关键词挖掘方法
- Kali与编程:小白黑客是如何安装Centos8的?(下节更精彩)
- 华为海康大华摄像头编译RTSP转RTMP和HTTPFLV
- 系列 | 数仓实践第三篇NO.3『拉链表』
热门文章
- 思科6509的详细配置---加注释
- [Java] ActionEvent 事件处理
- “流量注入”***模式的探讨
- 三层交换及DHCP中继配置
- java系统时间获取,存储,及获取时间戳,格式化显示
- Spring请求参数测试
- yolo系列外文翻译_测评:英文文献、论文的翻译软件对比
- dell笔记本驱动安装失败_声卡驱动安装失败的解决方法
- wordpress 通过域名无法访问_使用WordPress搭建自己的内容发布平台
- 【渝粤教育】国家开放大学2018年春季 7392-21FMatlab语言及其应用 参考试题