Vercel 導入時の「Chrome が見つかりませんでした (ver. 130.0.6723.116)」という Puppeteer Chrome エラーを修復する

Temp mail SuperHeros
Vercel 導入時の「Chrome が見つかりませんでした (ver. 130.0.6723.116)」という Puppeteer Chrome エラーを修復する
Vercel 導入時の「Chrome が見つかりませんでした (ver. 130.0.6723.116)」という Puppeteer Chrome エラーを修復する

Vercel で Puppeteer のデプロイが失敗する理由 (およびその修正方法)

ローカル設定での Web スクレイピング ツールやスクリーンショット ツールの実行は、通常、展開時までスムーズに進みます。最近、私を起動しようとしたときにまさにこの問題に直面しました 人形遣い スクリプトオン ヴェルセル。 🚀 ローカル マシンではすべてが完璧に実行されましたが、Vercel デプロイメントではエラーが返され続けました。 「Chrome (バージョン 130.0.6723 116) が見つかりませんでした」

このエラーは、特にローカル テスト中に表示されないため、イライラする可能性があります。この問題は通常、展開された環境にブラウザのバージョンが存在しないこと、または環境の設定が間違っていることを示しています。 キャッシュパス PuppeteerがVercelに使用するもの。

Vercel には、デフォルトで、Puppeteer が必要とする特定の Chrome 実行可能ファイルが常に含まれているわけではありません。つまり、スクリプトの実行時にこの実行可能ファイルが見つからない可能性があります。このガイドでは、このエラーが発生する理由と、それを解決するためのいくつかの戦略について説明します。

Puppeteer を初めて使用する開発者であっても、単にデプロイメントのトラブルシューティングを行っているだけであっても、これらのニュアンスを理解することで、デバッグにかかる​​時間を節約できます。 🛠️ ソリューションを詳しく見て、Vercel 上で Puppeteer セットアップをシームレスに実行しましょう。

指示 使用例と詳細説明
puppeteer.launch({ ... }) このコマンドは、ignoreHTTPSErrors や executablePath などの特定の構成オプションを使用して Puppeteer のインスタンスを起動します。これらのオプションは、Chrome 実行可能ファイルの正確な場所を設定し、セキュリティ設定を管理することで、Vercel などの展開プラットフォーム上の Chrome バージョンのエラーを解決するのに役立ちます。
executablePath puppeteer.launch 内で使用される executablePath は、Chrome バイナリへのパスを指定します。このパスを設定すると、Puppeteer がリモート サーバー上で正しい Chrome バージョンを使用するようになります。これは、Chrome がデフォルトでインストールされない可能性がある Vercel のようなサーバーレス環境では不可欠です。
args: ['--no-sandbox', '--disable-setuid-sandbox'] これらのフラグは、多くのクラウド ホスティング プロバイダーで Puppeteer を実行するために必要な Chrome のサンドボックス機能を無効にします。サンドボックスは通常、共有サーバーでの権限エラーを避けるために無効になっていますが、セキュリティ上の影響があるため、慎重に行う必要があります。
cacheDirectory Puppeteer の設定ファイルで、cacheDirectory はブラウザーのキャッシュ用のカスタム ディレクトリを設定します。これは、Puppeteer がダウンロードした Chrome バイナリを保存する場所を制御できるため、Vercel で特に役立ち、キャッシュ関連のエラーを防ぐことができます。
await page.goto(url, { waitUntil: 'networkidle2' }) このコマンドは URL をロードし、ページが完全にロードされたとみなされるネットワーク接続が 2 つ以下になるまで待機します。 networkidle2 オプションを使用すると、スクリーンショットを撮る前にすべてのリソースが確実にロードされるため、複雑なページのキャプチャに最適です。
page.setViewport({ width: 1920, height: 1080 }) Chrome インスタンスのビューポートのサイズを設定し、指定されたサイズの画面をシミュレートします。これは、キャプチャされた Web ページの外観を制御するため、スクリーンショットやビジュアル テストに不可欠です。
path.join(__dirname, '..', 'public', fileName) このコマンドは、現在のディレクトリとパブリック フォルダーを結合してファイル パスを構築し、スクリーンショットを保存するための特定のディレクトリを作成します。これは、特にスクリーンショットのパスをクライアントに提供する場合、出力ファイルを整理するために不可欠です。
uuid() 各スクリーンショットに一意の識別子を生成し、各ファイル名が一意であることを保証し、上書きを回避します。この機能は、複数の画像またはデータ ファイルを同時に保存するアプリケーションに特に役立ちます。
chai.request(app) Chai HTTP モジュールの一部であるこのコマンドは、エンドポイントの応答をテストするためにアプリケーション サーバー (アプリとして定義) にリクエストを送信します。これは自動テストに役立ち、開発者はスクリーンショット API が期待どおりに動作するかどうかを確認できます。
describe() and it() これらの Mocha テスト関数は、機能を検証するためのテスト スイート (describe()) と個別のテスト (it()) を定義します。これらは、パラメータの欠落から有効な URL まで、さまざまな条件下で Puppeteer スクリーンショット API の各側面が正しく動作することを確認するために使用されます。

Vercel 導入時の Puppeteer の Chrome エラーを克服する

提供される主なスクリプトは、次を使用するバックエンド関数です。 人形遣い ユーザーが指定した URL のスクリーンショットをキャプチャします。このタスクは、プレビューを動的に生成したり、Web スクレイピングを行う場合に特に役立ちます。ただし、次のようなプラットフォームへの展開は、 ヴェルセル 環境内で Chrome が見つからないなどのエラーが発生する可能性があります。これは、Vercel には Chrome が予期された場所にプリインストールされていないために発生します。つまり、正しいバージョンを見つけてインストールするように Puppeteer を構成する必要があります。この例では、カスタム Chrome バイナリへの Puppeteer の実行可能パスを指定し、ignoreHTTPSErrors フラグを使用して SSL の問題を処理し、環境間でセットアップが確実に機能するようにするオプションを実装しました。

スクリプトは、リクエストから URL を取得するスクリーンショット関数を定義することから始まります。 URL が欠落している場合は、JSON エラー応答が返されますが、URL が指定されている場合は、次のような必要な設定で Puppeteer を初期化します。 実行可能パス そして 引数 オプション。の 実行可能パス これは、Puppeteer を Chrome の正確な場所に誘導し、Vercel の「Chrome が見つかりません」エラーを解決するため、ここでは不可欠です。さらに、 引数 オプション、特に サンドボックスなし そして setuid サンドボックスを無効にする、特定のサーバーレス環境の要件である Chrome のサンドボックス機能を無効にします。これらの設定により、Vercel の管理されたインフラストラクチャで権限の問題が発生することなくスクリプトを実行できるようになります。

Puppeteer が起動すると、スクリプトは新しいブラウザ ページを開き、 後藤ネットワークアイドル2 オプション。これにより、Puppeteer はページが完全にロードされるまで待機するように指示され、進行中のネットワーク リクエストは 2 つまでとなり、複雑なページでもスクリーンショットを撮る前に完全にレンダリングされるようになります。この手順は、特に非同期読み込みに大きく依存する最新の Web ページを処理する場合に、信頼性が高く正確なスクリーンショットをキャプチャするために重要です。次に、ビューポート サイズが 1920x1080 に設定され、フル HD 画面をシミュレートします。これにより、キャプチャされたコンテンツが、ほとんどのユーザーがデスクトップ デバイスで見るレイアウトを反映することが保証されます。

最後に、スクリプトは、 uuid ライブラリにアクセスし、JSON 応答としてユーザーに返すことができるパブリック ディレクトリにスクリーンショットを保存します。ノードのファイルパスを慎重に構造化することで、 パス.結合 この方法を使用すると、スクリプトは環境設定の違いによって発生する可能性のあるファイル パスの問題を回避します。たとえば、この構造はローカル マシンではシームレスに実行されますが、同じパスが Vercel では機能しない可能性があるため、モジュール式で適応可能な方法で各ファイル パスを定義することが重要になります。最終的に、このセットアップにより、Puppeteer 機能がローカル環境とサーバーレス環境の両方でスムーズに動作し、ページの読み込み、エラー処理、環境制約などの重要な側面をすべて処理できるようになります。 🖥️

解決策 1: Chrome を Vercel に正しくインストールするように Puppeteer を構成する

この Node.js ベースのバックエンド ソリューションは、Puppeteer のキャッシュ パスとインストール コマンドを構成して、Chrome が正しくインストールされるようにします。

const puppeteer = require('puppeteer');
const path = require('path');
const { v4: uuid } = require('uuid');
const fs = require('fs');

// Main screenshot function
const screenshot = async (req, res) => {
    const url = req.query.url;
    if (!url) {
        return res.status(400).json({ message: 'URL is required' });
    }

    let browser;
    try {
        // Launch Puppeteer with specific Chrome executable path and options
        browser = await puppeteer.launch({
            ignoreHTTPSErrors: true,
            executablePath: process.env.CHROME_PATH || '/opt/bin/chromium',
            args: ['--no-sandbox', '--disable-setuid-sandbox']
        });

        const page = await browser.newPage();
        await page.goto(url, { waitUntil: 'networkidle2' });
        await page.setViewport({ width: 1920, height: 1080 });

        const fileName = \`${uuid()}.png\`;
        const screenshotPath = path.join(__dirname, '..', 'public', fileName);
        await page.screenshot({ path: screenshotPath });

        res.json({ screenshotPath: \`/image/\${fileName}\` });
    } catch (err) {
        console.error('Error capturing screenshot:', err);
        res.status(500).json({ error: 'Failed to capture screenshot' });
    } finally {
        if (browser) await browser.close();
    }
};

module.exports = screenshot;

解決策 2: .puppeteerrc.cjs ファイルを使用した Vercel のカスタム Puppeteer 構成

このソリューションは、Puppeteer の設定ファイル (.puppeteerrc.cjs) を調整して Chrome キャッシュ パスを指定し、Vercel のファイル構造との互換性を確保します。

const { join } = require('path');

/
 * @type {import('puppeteer').Configuration}
 */
module.exports = {
    // Specify cache directory for Puppeteer
    cacheDirectory: join(__dirname, '.cache', 'puppeteer'),
    // Specify which Chromium version Puppeteer should install
    executablePath: '/opt/bin/chromium',
    args: ['--no-sandbox', '--disable-setuid-sandbox'],
};

解決策 3: Puppeteer の package.json に環境変数とスクリプトを実装する

このアプローチにより、 パッケージ.json ファイルを使用して、特定の Chrome バイナリをインストールし、展開中に Puppeteer 構成を自動的にセットアップします。

// Add to package.json
"scripts": {
    "postinstall": "npx puppeteer install --path ./.cache/puppeteer",
    "start": "node index.js"
}

// Configure environment variable in Vercel
process.env.CHROME_PATH = "/opt/bin/chromium";

Puppeteer スクリーンショット機能の単体テスト

この Node.js Mocha テスト スクリプトは、さまざまな環境で URL からスクリーンショットをキャプチャする Puppeteer の機能を検証します。

const chai = require('chai');
const chaiHttp = require('chai-http');
const app = require('../app'); // Express app where screenshot endpoint is defined

chai.use(chaiHttp);
const expect = chai.expect;

describe('Screenshot API', () => {
    it('should return an error for missing URL parameter', (done) => {
        chai.request(app)
            .get('/screenshot')
            .end((err, res) => {
                expect(res).to.have.status(400);
                expect(res.body).to.have.property('message').eql('URL is required');
                done();
            });
    });

    it('should capture a screenshot successfully for a valid URL', (done) => {
        chai.request(app)
            .get('/screenshot?url=https://example.com')
            .end((err, res) => {
                expect(res).to.have.status(200);
                expect(res.body).to.have.property('screenshotPath');
                done();
            });
    });
});

クラウド環境向けに Puppeteer を最適化する

Puppeteer ベースのアプリケーションを次のようなクラウド プラットフォームにデプロイする場合 ヴェルセル または Heroku、これらの環境の制限を理解することが不可欠です。ローカル設定とは異なり、クラウド環境は通常、マネージド アーキテクチャまたはサーバーレス アーキテクチャで動作するため、Chrome などの依存関係が常にすぐに利用できるわけではありません。実は、パペッティアは、 launch 必要な Chrome バージョンがサーバーにインストールされていない場合、このメソッドは失敗し、「Chrome が見つかりませんでした」などのエラーが発生することがあります。を使用して Chrome の実行可能パスを指定することをお勧めします。 executablePathこれにより、Puppeteer はどの環境でも Chrome を効果的に見つけて起動できるようになります。

これに加えて、必要な起動引数を追加することが互換性のために重要です。などのフラグ --no-sandbox そして --disable-setuid-sandbox は特に役に立ちます。これらのフラグは Chrome の一部のセキュリティ機能を無効にしますが、Chrome のサンドボックスがサポートされていないサーバーレス セットアップでは多くの場合必要になります。さらに、Puppeteer のコマンドを使用してカスタム キャッシュ ディレクトリを指定すると、 cacheDirectory このオプションは、特に複数のブラウザ バージョンが関係している場合に、潜在的なキャッシュの問題を防ぐのに役立ちます。たとえば、設定 cacheDirectory 既知のディレクトリに追加すると、実行時にすべての依存関係が利用可能になります。

最後に最適化すると、 goto メソッドを使用すると、パフォーマンスを大幅に向上させることができます。を使用することで、 waitUntil: 'networkidle2' オプションを選択すると、スクリプトはページの読み込みが完了するまで待機します。これは、インターネット速度やリソースの読み込みが異なる環境では重要です。これは、コンテンツが非同期で読み込まれる動的ページまたはアプリケーションで正確なスクリーンショットをキャプチャする場合に特に有益です。これらの技術を組み合わせることで、Puppeteer はクラウド プラットフォーム上でシームレスに機能し、実稼働環境での自動タスクのための強力なソリューションを提供できます。 🚀

Puppeteer とクラウドのデプロイメントに関するよくある質問

  1. クラウド プラットフォームで「Chrome が見つかりませんでした」というエラーが表示されるのはなぜですか?
  2. これらのエラーは、クラウド プラットフォームにデフォルトで完全な Chrome バイナリが含まれていないためによく発生します。を指定することでこれを修正できます executablePath Puppeteer セットアップで。
  3. Puppeteer がローカル環境とクラウド環境の両方で動作することを確認するにはどうすればよいですか?
  4. 使用する executablePath そして args 次のようなクラウドフレンドリーなフラグを使用 --no-sandbox 両方の環境に合わせてセットアップを十分に柔軟にすることができます。
  5. は何ですか --no-sandbox Puppeteer でフラグを実行しますか?
  6. --no-sandbox flag は Chrome のサンドボックス セキュリティを無効にし、サンドボックスをサポートしていないクラウド サービス上で Puppeteer を実行できるようにしますが、使用には注意が必要です。
  7. なぜカスタムが必要なのか cacheDirectory パペッティア用?
  8. カスタムの設定 cacheDirectory Puppeteer が Chrome バイナリを既知の場所にダウンロードするようにすることで、特にサーバーレス環境での展開中のエラーを防ぐことができます。
  9. の目的は何ですか networkidle2 のオプション goto 方法?
  10. networkidle2 このオプションは、アクティブなネットワーク接続が 2 つ以下になるまで待機します。これは、完全にロードされたページをキャプチャし、動的コンテンツを処理する場合に役立ちます。
  11. Puppeteer は Chrome のバージョンを指定しなくても動作しますか?
  12. はい、ただし指定することをお勧めします executablePath また、クラウド設定で一貫した結果を得るために、互換性のある Chrome バージョンにアクセスできることを確認します。
  13. 異なる環境間で Puppeteer キャッシュを管理するにはどうすればよいですか?
  14. ユニバーサルを指定できます cacheDirectory.puppeteerrc.cjs ファイルを作成することで、Puppeteer が Vercel や Heroku などのプラットフォーム全体で Chrome バイナリを検索できるようになります。
  15. puppeteer-core とは違う puppeteer?
  16. はい、 puppeteer-core サイズを削減するためにバンドルされた Chrome が除外されるため、Chrome バイナリを指定する必要があります。完全な puppeteer パッケージには Chrome が自動的に含まれます。
  17. クラウド環境で Puppeteer が遅い場合はどうすればよいですか?
  18. 最適化 viewport 設定と不要なオプションの無効化 devtools リソースに制約のある環境でのパフォーマンスを向上させることができます。
  19. Puppeteer はすべてのクラウド プロバイダーと互換性がありますか?
  20. 一般的にはそうですが、各プロバイダーには固有の要件がある場合があります。次のようなクラウドフレンドリーな設定を使用する --no-sandbox より良い互換性が保証されます。

Puppeteer を Vercel 上で実行するための最終的な考え

Vercel に Puppeteer を正常にデプロイするには、Chrome の特定のセットアップのニーズを理解する必要があります。指定する 起動オプション Puppeteer のキャッシュ パスを正しく設定すると、イライラする「Chrome が見つかりません」エラーを防ぐことができます。これらの調整により、ローカル環境とクラウド環境の両方で Puppeteer が確実に機能することが保証されます。 🚀

これらのソリューションをプロジェクトに適応させると、ユーザーが指定した URL からのスクリーンショットのキャプチャがシームレスになり、より動的な Web アプリケーションが可能になります。適切にセットアップすれば、Vercel のようなサーバーレス プラットフォーム上でも、Puppeteer は自動化と Web スクレイピングのための貴重なツールであり続けます。

Puppeteer エラーのトラブルシューティングのためのソースとリファレンス
  1. この記事では、詳細なセットアップ オプションとトラブルシューティング手順、特に Chrome キャッシュ パスの処理と実行可能パスの指定について、公式 Puppeteer 構成ガイドを参照しています。 Puppeteer 構成ガイド
  2. Vercel のドキュメントは、サーバーレス環境が依存関係を処理する方法と、ヘッドレス ブラウザーに依存するアプリケーションを展開するための固有の要件についての洞察を提供します。 Vercel のドキュメント
  3. Stack Overflow のディスカッションでは、コミュニティ主導のソリューションとエラー処理の実践例が提供され、展開中に発生する特定の Puppeteer および Chrome の問題がカバーされます。 スタックオーバーフロー