Vue2 使用 prerender-spa-plugin 报错 [prerender-spa-plugin] Unable to prerender all routes!

环境:
webpack: 5
vue-cli:5.0.6
vue: 2.6.14
prerender-spa-plugin: 3.4.0

main.js

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import VueMetaInfo from 'vue-meta-info'

Vue.use(VueMetaInfo)

Vue.config.productionTip = false

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

router.js

import Vue from 'vue'
import VueRouter from 'vue-router'

Vue.use(VueRouter)

const routes = [
  {
    path: '/home',
    name: 'home',
    component: () =>
      import(/* webpackChunkName: "home" */ '../views/home.vue')
  },
  {
    path: '/about',
    name: 'about',
    component: () =>
      import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
  },
  {
    path: '/business',
    name: 'business',
    component: () =>
      import(/* webpackChunkName: "business" */ '../views/business.vue')
  }
]

const router = new VueRouter({
  mode: 'history',
  routes
})

export default router

vue.config.js 文件中使用如下配置:

const path = require('path')
const PrerenderSPAPlugin = require('prerender-spa-plugin')
const Renderer = PrerenderSPAPlugin.PuppeteerRenderer

module.exports = {
  publicPath: './',
  outputDir: 'dist',
  transpileDependencies: true,
  configureWebpack: {
    plugins: [
      new PrerenderSPAPlugin(
        path.resolve(__dirname, 'dist'),
        ['/about'],
        {
          captureAfterTime: 5000,
          maxAttempts: 10,
          navigationOptions: {
            timeout: 0
          },
          renderer: new Renderer({
            ignoreJSErrors: true,
            inject: {
              prerender: 'domain',
              foo: 'bar'
            },
            headless: false, // fixed
            maxConcurrentRoutes: 5,
            renderAfterTime: 5000
            // renderAfterDocumentEvent: 'render-event'
          })
        }

      )
    ]
  }
}

\node_modules\prerender-spa-plugin\es6\index.js 文件中也做出了如下修改:

img

已经先执行了 npm run build ,一切正常,之后执行 npm run serve
但执行 npm run serve 之后报如下错误:

img

请问这个该怎么解决呢?

以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:

根据报错信息,可以看到是 about 路由无法预渲染成功,同时也看到了以下错误信息:

Error: Evaluation failed: TypeError: Object.entries is not a function

这个错误是因为 Object.entries 方法在 Vue2 中并不支持,需要手动引入 core-js 库来解决。具体做法如下:

  1. 安装 core-js 库:
npm install core-js@3
  1. main.js 中引入:
import 'core-js/stable'
import 'regenerator-runtime/runtime'
  1. vue.config.js 中配置:
const path = require('path')
const PrerenderSPAPlugin = require('prerender-spa-plugin')
const Renderer = PrerenderSPAPlugin.PuppeteerRenderer

module.exports = {
  publicPath: './',
  outputDir: 'dist',
  transpileDependencies: [
    'vue-meta-info',
    'prerender-spa-plugin'
  ],
  configureWebpack: {
    plugins: [
      new PrerenderSPAPlugin(
        path.resolve(__dirname, 'dist'),
        ['/about'],
        {
          captureAfterTime: 5000,
          maxAttempts: 10,
          navigationOptions: {
            timeout: 0
          },
          renderer: new Renderer({
            ignoreJSErrors: true,
            inject: {
              prerender: 'domain',
              foo: 'bar'
            },
            headless: false, // fixed
            maxConcurrentRoutes: 5,
            renderAfterTime: 5000
            // renderAfterDocumentEvent: 'render-event'
          })
        }
      )
    ]
  }
}

需要注意的是,在 transpileDependencies 中需要将 vue-meta-infoprerender-spa-plugin 都加上,才能使 core-js 生效。