[Prerenderer - PuppeteerRenderer] Unable to start Puppeteer 異常處理

基于vue cli3.0 搭建的項目,通過prerender-spa-plugin 插件進行預(yù)編。
其中配置文件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/', // 對應(yīng)自己的接口
        changeOrigin: true,
        ws: true,
        pathRewrite: {
          '^/api': ''
        }
      }
    }
  },
  configureWebpack: () => {
    if (process.env.NODE_ENV !== 'production') return
    return {
      plugins: [
        new PrerenderSPAPlugin({
          // 生成文件的路徑,也可以與webpakc打包的一致。
          // 下面這句話非常重要?。。?          // 這個目錄只能有一級,如果目錄層次大于一級,在生成的時候不會有任何錯誤提示,在預(yù)渲染的時候只會卡著不動。
          staticDir: path.join(__dirname, 'dist'),

          // 對應(yīng)自己的路由文件,比如a有參數(shù),就需要寫成 /a/param1。
          routes: ['/', '/mall', '/home'],

          // 這個很重要,如果沒有配置這段,也不會進行預(yù)編譯
          renderer: new Renderer({
            inject: {
              foo: 'bar'
            },
            headless: false,
            // 在 main.js 中 document.dispatchEvent(new Event('render-event')),兩者的事件名稱要對應(yīng)上。
            renderAfterDocumentEvent: 'render-event'
          })
        })
      ]
    }
 
}

執(zhí)行build命名進行構(gòu)建時候,在window、mac環(huán)境下正常,唯獨centos7環(huán)境下就一直報異常。
開始時候報錯的異常關(guān)鍵信息

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

如此反復(fù)幾次,報的卻是依賴信息一直變化,最后錯誤信息一直定格為? 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.

根據(jù)錯誤日志提供的信息,打開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

另外找了好多的發(fā)子都沒有效果。

最后偶然在貼吧上看到有人評論說將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/', // 對應(yīng)自己的接口
        changeOrigin: true,
        ws: true,
        pathRewrite: {
          '^/api': ''
        }
      }
    }
  },
  configureWebpack: () => {
    if (process.env.NODE_ENV !== 'production') return
    return {
      plugins: [
        new PrerenderSPAPlugin({
          // 生成文件的路徑,也可以與webpakc打包的一致。
          // 下面這句話非常重要?。?!
          // 這個目錄只能有一級,如果目錄層次大于一級,在生成的時候不會有任何錯誤提示,在預(yù)渲染的時候只會卡著不動。
          staticDir: path.join(__dirname, 'dist'),

          // 對應(yīng)自己的路由文件,比如a有參數(shù),就需要寫成 /a/param1。
          routes: ['/', '/mall', '/home'],

          // 這個很重要,如果沒有配置這段,也不會進行預(yù)編譯
          renderer: new Renderer({
            inject: {
              foo: 'bar'
            },
            // headless: false,
            // 在 main.js 中 document.dispatchEvent(new Event('render-event')),兩者的事件名稱要對應(yīng)上。
            renderAfterDocumentEvent: 'render-event'
          })
        })
      ]
    }
 
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容