[Prerenderer - PuppeteerRenderer

2019-05-31  本文已影响0人  傑仔

基于vue cli3.0 搭建的项目,通过prerender-spa-plugin 插件进行预编。
其中配置文件vue.config.js 配置如下:

const path = require('path')
const PrerenderSPAPlugin = require('prerender-spa-plugin')
const Renderer = PrerenderSPAPlugin.PuppeteerRenderer
module.exports = {
  // 配置文件,可以手动配置访问的端口、地址
  devServer: {
    // port: 8085, // 端口号
    // host: '127.0.0.1',
    // https: false // https:{type:Boolean}
    disableHostCheck: true,
    proxy: {
      '/api': {
        target: 'http://192.168.3.62:9095/', // 对应自己的接口
        changeOrigin: true,
        ws: true,
        pathRewrite: {
          '^/api': ''
        }
      }
    }
  },
  configureWebpack: () => {
    if (process.env.NODE_ENV !== 'production') return
    return {
      plugins: [
        new PrerenderSPAPlugin({
          // 生成文件的路径,也可以与webpakc打包的一致。
          // 下面这句话非常重要!!!
          // 这个目录只能有一级,如果目录层次大于一级,在生成的时候不会有任何错误提示,在预渲染的时候只会卡着不动。
          staticDir: path.join(__dirname, 'dist'),

          // 对应自己的路由文件,比如a有参数,就需要写成 /a/param1。
          routes: ['/', '/mall', '/home'],

          // 这个很重要,如果没有配置这段,也不会进行预编译
          renderer: new Renderer({
            inject: {
              foo: 'bar'
            },
            headless: false,
            // 在 main.js 中 document.dispatchEvent(new Event('render-event')),两者的事件名称要对应上。
            renderAfterDocumentEvent: 'render-event'
          })
        })
      ]
    }
 
}

执行build命名进行构建时候,在window、mac环境下正常,唯独centos7环境下就一直报异常。
开始时候报错的异常关键信息

This issue will occur if you are missing the libXss.so.1 library, which is part of the libXScrnSaver package. To resolve this issue, run the command:

sudo yum install libXScrnSaver

按照提示将却是的依赖libXss.so.1安装,

sudo yum install libXss.so.1

如此反复几次,报的却是依赖信息一直变化,最后错误信息一直定格为⠋ Building for production...Error: Failed to launch chrome!

(chrome:27380): Gtk-WARNING **: 01:05:24.595: cannot open display:

[isuwang@sandbox3 ipolymer-web]$ npm run build

> ipolymer-web@0.1.0 build /opt/workSpace/ipolymer-web
> vue-cli-service build


⠋  Building for production...Error: Failed to launch chrome!

(chrome:27380): Gtk-WARNING **: 01:05:24.595: cannot open display:


TROUBLESHOOTING: https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md

    at onClose (/opt/workSpace/ipolymer-web/node_modules/puppeteer/lib/Launcher.js:342:14)
    at ChildProcess.helper.addEventListener (/opt/workSpace/ipolymer-web/node_modules/puppeteer/lib/Launcher.js:332:60)
    at ChildProcess.emit (events.js:187:15)
    at ChildProcess.EventEmitter.emit (domain.js:441:20)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:240:12)
[Prerenderer - PuppeteerRenderer] Unable to start Puppeteer
(node:27345) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'close' of null
    at PuppeteerRenderer.destroy (/opt/workSpace/ipolymer-web/node_modules/@prerenderer/renderer-puppeteer/es6/renderer.js:140:21)
    at Prerenderer.destroy (/opt/workSpace/ipolymer-web/node_modules/@prerenderer/prerenderer/es6/index.js:87:20)
    at PrerendererInstance.initialize.then.then.then.then.then.then.then.then.catch.err (/opt/workSpace/ipolymer-web/node_modules/prerender-spa-plugin/es6/index.js:144:29)
    at process.internalTickCallback (internal/process/next_tick.js:77:7)
(node:27345) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:27345) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

根据错误日志提供的信息,打开https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md 文档,安装其中的要求将需要的依赖全部install了还是不行。安装依赖:

sudo yum install libXcomposite.x86_64 libXcursor.x86_64 libXdamage.x86_64 libXext.x86_64 libXi.x86_64 libXtst.x86_64 cups-libs.x86_64 libXScrnSaver.x86_64 libXrandr.x86_64 GConf2.x86_64 alsa-lib.x86_64 atk.x86_64 gtk3.x86_64 ipa-gothic-fonts xorg-x11-fonts-100dpi xorg-x11-fonts-75dpi xorg-x11-utils xorg-x11-fonts-cyrillic xorg-x11-fonts-Type1 xorg-x11-fonts-misc

另外找了好多的发子都没有效果。

最后偶然在贴吧上看到有人评论说将headless: false语句注释掉就可以了,试了一下,果然ok。这个坑有点儿大呀。浪费了好多的时间
修改后的配置文件如下

const path = require('path')
const PrerenderSPAPlugin = require('prerender-spa-plugin')
const Renderer = PrerenderSPAPlugin.PuppeteerRenderer
module.exports = {
  // 配置文件,可以手动配置访问的端口、地址
  devServer: {
    // port: 8085, // 端口号
    // host: '127.0.0.1',
    // https: false // https:{type:Boolean}
    disableHostCheck: true,
    proxy: {
      '/api': {
        target: 'http://192.168.3.62:9095/', // 对应自己的接口
        changeOrigin: true,
        ws: true,
        pathRewrite: {
          '^/api': ''
        }
      }
    }
  },
  configureWebpack: () => {
    if (process.env.NODE_ENV !== 'production') return
    return {
      plugins: [
        new PrerenderSPAPlugin({
          // 生成文件的路径,也可以与webpakc打包的一致。
          // 下面这句话非常重要!!!
          // 这个目录只能有一级,如果目录层次大于一级,在生成的时候不会有任何错误提示,在预渲染的时候只会卡着不动。
          staticDir: path.join(__dirname, 'dist'),

          // 对应自己的路由文件,比如a有参数,就需要写成 /a/param1。
          routes: ['/', '/mall', '/home'],

          // 这个很重要,如果没有配置这段,也不会进行预编译
          renderer: new Renderer({
            inject: {
              foo: 'bar'
            },
            // headless: false,
            // 在 main.js 中 document.dispatchEvent(new Event('render-event')),两者的事件名称要对应上。
            renderAfterDocumentEvent: 'render-event'
          })
        })
      ]
    }
 
}

上一篇下一篇

猜你喜欢

热点阅读