Puppeteer CentOS 7 安装方案

655 阅读2分钟

背景

在 React 项目做 SSR 时,除了 Next.JS 之外,如果项目只涉及静态展示页面,没有后端服务优化的需求,也可以使用预渲染的方式。目前有一些库都可以实现,比如 vite-plugin-prerenderreact-snapvite-plugin-ssr等。这些类库的一个共同特点是,底层都依赖 Puppeteer

环境 Docker CentOS 7无外网访问能力
相关报错:
Failed to set up Chromium r856583! Set "PUPPETEER_SKIP_DOWNLOAD" env variable to skip download.

解决方案

  1. 手动安装 Puppeteer低版本。低版本是为了规避 CentOS 7 的一个问题,如果不是这个版本可以尝试需要的版本。
npm install puppeteer@1.12.2
// 如果报错安装如下命令跳过安装chrome部分,一会儿我们手动安装
npm install --ignore-scripts puppeteer@1.12.2
  1. 下载对应版本的chromium版本。可以参考这个文档:pptr.dev/supported-b…
  2. 将下载好的chromium放到/node_modules/puppeteer(如果这个是子依赖,需要放到子依赖的下述文件夹中)/.local-chromium/linux-624492/。这里linux-624492是我的版本的 puppeteer 所依赖的版本。这个值可以从puppeteer/package.jsonpuppeteer.chromium_revision获得。
  3. 解压chromium到当前文件夹
  4. 安装Chrome相关依赖。具体可以参考官方trouble shooting pptr.dev/troubleshoo…

问题

Chromium revision is not downloaded. Run "npm install" or "yarn install".

没有安装Chromium。需要正常安装Puppeteer之后手动安装Chromium之后放到对应文件夹下。

Failed to set up Chromium r856583! Set "PUPPETEER_SKIP_DOWNLOAD" env variable to skip download.

这个问题是Docker中访问外网导致的。如果可以设置网络代理,可以快速解决问题;如果不能,需要手动安装Chromium。
注意上面标识的Chromium放置文件夹是需要根据系统内核有所区别。 除了Linux内核,其他的位置可以正常安装时,通过报错找到位置文件夹。
如果安装后仍然报错找不到对应的Chromium版本,可能是Chromium没有放到正确的文件夹,或者版本和 Puppeteer 所寻找的版本不匹配。

Error: Failed to launch the browser process!

高版本 Chrome 在 CentOS 7 上有一个不能解决的系统依赖,对应上方解决方案 - 步骤5中的子依赖 - zygote_host_impl_linux。所以才有降级Puppeteer版本从而降级其对应的Chromium版本的方案。这里当然可以按照puppeteer支持文档所述,逐版本降级找到最高的可用版本。

总结

在我的场景下,当然最好的情况是制作一个docker镜像,内置对应版本Chrome和所有依赖都安装完,不需要在每次pipeline执行的时候都安装环境和拉Chromium