遇到问题:
1.项目路由设置了 base 后prerender-spa-plugin打包生成的静态文件是白页
原因是:Prerender-spa-plugin在dist目录中启动了一个服务。 资源的引用路径不对 导致无头浏览器 抓取不到页面
网上资料都是一些简单例子,所以整理下我的配置处理
所有配置如下
一. vue-router 设置
1 2 3 4 5 6 7
| new Router({ mode: 'history', base:'/seo/', ... }) mode 设置 history base 基路径
|
二. vue.config.js vue基本设置 设置打包文件路径
1 2 3 4 5 6 7 8
| module.exports = { publicPath: process.env.NODE_ENV === 'production' ? '/seo/' : '/', outputDir:'dist/seo', ... } outputDir 默认 是'dist'
|
More info: vue cli 配置
三. prerender-spa-plugin相关配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| const PrerenderSPAPlugin = require('prerender-spa-plugin') const Renderer = PrerenderSPAPlugin.PuppeteerRenderer const path = require('path') module.exports = { publicPath: process.env.NODE_ENV === 'production' ? '/seo/' : '/', outputDir:'dist/seo', chainWebpack: config => { config.plugin('PrerenderSPAPlugin').use(PrerenderSPAPlugin, [ { staticDir: path.join(__dirname, 'dist'), outputDir: path.join(__dirname, 'dist/seo'), //打包生成问文件 indexPath: path.join(__dirname, 'dist', '/seo/index.html'), //首页访问路径 routes: ['/','/about'], //要预渲染的路由 renderer: new Renderer({ inject: { foo: 'bar' }, renderAfterTime: 5000, //renderAfterTime与 renderAfterDocumentEvent 同时起作用 哪个快执行哪个 headless: false, // 在 main.js 中 document.dispatchEvent(new Event('render-event')),两者的事件名称要对应上。 // renderAfterDocumentEvent: 'render-event' }) } ]) } ... }
|
More info: vue cli 链式操作
四. 打包后静态文件 nginx 相关配置
打包后文件目录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| dist └── seo ├── about │ └── index.html ├── css │ └── app.cdd9559b.css ├── favicon.ico ├── img │ ├── card1.d9965849.png │ ├── icons │ └── logo.82b9c7a5.png ├── index.html ├── js │ ├── app.1f058936.js │ ├── app.1f058936.js.map │ ├── chunk-vendors.5d7c9b8d.js │ └── chunk-vendors.5d7c9b8d.js.map ├── manifest.json ├── precache-manifest.5dafe8fe95e326b40f63cb53925f6a27.js ├── robots.txt └── service-worker.js
|
nginx相关配置 把 seo文件夹放到nginx 根目录
1 2 3 4 5 6 7 8
| server { listen 8080; server_name localhost; location /seo/{ try_files $uri $uri/ /seo/index.html; index index.html index.htm; } }
|
感谢鼓励