解决SEO(Search Engine Optimization),首屏问题 , 页面较少,且预渲染相对于SSR比较简单,预渲染可以极大的提高网页访问速度。而且配合一些meat插件,完全可以满足SEO需求。
Prerender服务需要有NodeJs环境支持,如果之前服务器环境没有NodeJs需要先进行安装。
安装
1 | npm install --save prerender-spa-plugin |
prerender-spa-plugin中有puppeteer
可能会报错
1 | ERROR: Failed to download Chromium r515411! Set "PUPPETEER_SKIP_CHROMIUM_DOWNLOA |
此时可以试试淘宝镜像安装
1 | cnpm install --save prerender-spa-plugin |
因为在执行安装的过程中需要执行install.js,这里会下载Chromium,官网建议是进行跳过,我们可以执行 —ignore-scripts 忽略这个js执行。也可以通过设置环境变量set PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1阻止下载 Chromium (因为封网,直接下载会失败)
1 | npm i --save puppeteer --ignore-scripts |
然后手动下载Chromium
解压到你当前项目中的node_modules/puppeteer/.local-chromium/mac-571375下就可以了
配置
webpack.base.conf.js
1 | module.exports = { |
webpack.prod.conf.js
开始我这样写
1 | const PrerenderSpaPlugin = require('prerender-spa-plugin') |
结果报错 :building for production…[prerender-spa-plugin] Unable to prerender all routes! UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Navigation Timeout Exceeded: 30000ms exceededrender AfterTime: 5000
偶然看到一个解决的办法 UnhandledPromiseRejectionWarning
1 | const PrerenderSpaPlugin = require('prerender-spa-plugin') |
开发目录main.js
1 | /* eslint-disable no-new */ |
就可以在dist文件夹下生成对应路由的文件夹里面包含页面预渲染信息的html
1 | //比如PrerenderSPAPlugin中的 routes: [ '/','/home/homePage'] |
结合管理头部标签插件vue-meta-info
main.js中加
1 | import MetaInfo from 'vue-meta-info' |
页面的vue中加metaInfo信息
1 | export default { |
就可以将关键字预渲染到html的页面中去
渲染结束遇到的问题
一、Uncaught ReferenceError: webpackJsonp is not defined
发现是config/index.js
1 | assetsPublicPath: '/', //路径是/不是./ |
这里要强调一点如果你的assetsPublicPath设置成’www.xxx.com',生成的html是没有内容的而且插件vue-meta-info的设置的信息也不会加载出来
如果是/找到js文件的话,生成这种带你写的结构的html
二、解决vuex requires a Promise polyfill in this browser问题
添加babel-polyfill插件
webpack.base.conf.js
1 | module.exports = { |