Чому не вдається розгорнути Puppeteer на Vercel (і як це виправити)
Запуск інструмента веб-скопіювання або знімка екрана в локальній установці зазвичай проходить гладко, доки не настане час розгортання. Нещодавно я зіткнувся саме з цією проблемою, коли намагався запустити свій Ляльковод сценарій включено Версель. 🚀 Хоча на моїй локальній машині все працювало ідеально, розгортання Vercel постійно повертало помилку: «Не вдалося знайти Chrome (версія. 130.0.6723 116)».
Ця помилка може бути неприємною, особливо тому, що вона не відображається під час локального тестування. Проблема зазвичай пов’язана з відсутністю версії браузера в розгорнутому середовищі або неправильною конфігурацією шлях до кешу який Puppeteer використовує на Vercel.
Vercel за замовчуванням не завжди включає певний виконуваний файл Chrome, який вимагає Puppeteer, а це означає, що ваш сценарій може не знайти його під час виконання. У цьому посібнику ви дізнаєтесь, чому виникає ця помилка, і розповімо про деякі стратегії її вирішення.
Незалежно від того, чи ви новачок у Puppeteer, чи просто вирішуєте проблеми з розгортанням, розуміння цих нюансів може заощадити вам години налагодження. 🛠️ Давайте зануримося в рішення та забезпечимо безперебійну роботу ваших установок Puppeteer на Vercel.
Команда | Приклад використання та детальний опис |
---|---|
puppeteer.launch({ ... }) | Ця команда запускає екземпляр Puppeteer із певними параметрами конфігурації, такими як ignoreHTTPSErrors і executablePath. Ці параметри допомагають усунути помилки з версіями Chrome на платформах розгортання, як-от Vercel, встановлюючи точне розташування виконуваного файлу Chrome і керуючи налаштуваннями безпеки. |
executablePath | Використовується в puppeteer.launch, executablePath визначає шлях до двійкового файлу Chrome. Встановлення цього шляху гарантує, що Puppeteer використовує правильну версію Chrome на віддалених серверах, що важливо в безсерверних середовищах, таких як Vercel, де Chrome може не бути встановлено за замовчуванням. |
args: ['--no-sandbox', '--disable-setuid-sandbox'] | Ці позначки вимикають функцію ізольованого програмного середовища Chrome, яка необхідна для роботи Puppeteer у багатьох постачальників хмарного хостингу. Пісочниця зазвичай вимкнена, щоб уникнути помилок дозволів на спільних серверах, але її слід робити обережно через наслідки для безпеки. |
cacheDirectory | У конфігураційному файлі Puppeteer cacheDirectory встановлює спеціальний каталог для кешування браузера. Це особливо корисно для Vercel, оскільки дозволяє контролювати, де Puppeteer зберігає завантажені двійкові файли Chrome, запобігаючи помилкам, пов’язаним із кешуванням. |
await page.goto(url, { waitUntil: 'networkidle2' }) | Ця команда завантажує URL-адресу та чекає, доки буде не більше двох мережевих з’єднань, щоб сторінка вважалася повністю завантаженою. Параметр networkidle2 забезпечує завантаження всіх ресурсів перед створенням знімка екрана, що робить його ідеальним для захоплення складних сторінок. |
page.setViewport({ width: 1920, height: 1080 }) | Встановлює розміри вікна перегляду примірника Chrome, імітуючи екран указаного розміру. Це важливо для скріншотів і візуального тестування, оскільки контролює зовнішній вигляд зробленої веб-сторінки. |
path.join(__dirname, '..', 'public', fileName) | Ця команда створює шлях до файлу, об’єднуючи поточний каталог із загальнодоступною папкою, створюючи окремий каталог для зберігання знімків екрана. Це важливо для впорядкування вихідних файлів, особливо під час повернення скріншотів до клієнта. |
uuid() | Генерує унікальний ідентифікатор для кожного знімка екрана, гарантуючи унікальність імені кожного файлу та уникаючи перезаписів. Ця функція особливо корисна для програм, які зберігають декілька зображень або файлів даних одночасно. |
chai.request(app) | Ця команда, яка є частиною HTTP-модуля Chai, надсилає запит на сервер додатків (визначений як додаток) для перевірки відповідей кінцевої точки. Це корисно для автоматизованого тестування, дозволяючи розробникам перевірити, чи API знімка екрана працює належним чином. |
describe() and it() | Ці функції тестування Mocha визначають набори тестів (describe()) та окремі тести (it()) для перевірки функціональності. Вони використовуються для підтвердження того, що кожен аспект API знімка екрана Puppeteer поводиться правильно за різних умов, від відсутніх параметрів до дійсних URL-адрес. |
Подолання помилки Puppeteer Chrome під час розгортання Vercel
Основний наданий сценарій є серверною функцією, яка використовує Ляльковод щоб зробити знімок екрана URL-адреси, наданої користувачем. Це завдання особливо корисне для динамічного створення попередніх переглядів або для цілей веб-скопіювання. Однак розгортання на платформах, як Версель може призвести до помилок, наприклад Chrome не знайти в середовищі. Це відбувається тому, що Vercel не постачається з Chrome, попередньо встановленим у очікуваному місці, тобто Puppeteer потрібно налаштувати, щоб знайти або встановити правильну версію. У нашому прикладі ми реалізували параметри, щоб указати шлях до виконуваного файлу Puppeteer до користувацького двійкового файлу Chrome і вирішити проблеми SSL за допомогою прапора ignoreHTTPSErrors, щоб переконатися, що налаштування працює в різних середовищах.
Сценарій починається з визначення функції знімка екрана, яка бере URL із запиту. Якщо URL-адреса відсутня, вона надсилає відповідь про помилку JSON, але якщо надається, Puppeteer ініціалізує необхідні конфігурації, наприклад executablePath і арг параметри. The executablePath тут дуже важливий, оскільки він спрямовує Puppeteer до точного розташування Chrome, вирішуючи помилку «Не вдалося знайти Chrome» на Vercel. Крім того, арг варіанти, зокрема без пісочниці і disable-setuid-пісочниця, вимкніть функцію ізольованого програмного середовища Chrome, вимогу для певних безсерверних середовищ. Ці налаштування гарантують, що сценарій може виконуватися без проблем із дозволом на керовану інфраструктуру Vercel.
Після запуску Puppeteer сценарій відкриває нову сторінку браузера та використовує goto з networkidle2 варіант. Це вказує Puppeteer чекати, доки сторінка повністю завантажиться, з не більше ніж двома поточними мережевими запитами, гарантуючи, що навіть складні сторінки відображаються повністю, перш ніж робити знімок екрана. Цей крок має вирішальне значення для створення надійного та точного знімка екрана, особливо під час обробки сучасних веб-сторінок, які часто залежать від асинхронного завантаження. Потім розмір вікна перегляду встановлюється на 1920x1080, що імітує екран Full HD, що гарантує, що знятий вміст відображає макет, який більшість користувачів бачать на настільному пристрої.
Нарешті, сценарій генерує унікальне ім’я файлу за допомогою uuid бібліотека, яка зберігає знімок екрана в загальнодоступному каталозі, де до нього можна отримати доступ і повернути користувачеві як відповідь JSON. Ретельно структуруючи шляхи до файлів за допомогою Node path.join метод сценарію дозволяє уникнути проблем із шляхом до файлу, які можуть виникнути через відмінності в налаштуваннях середовища. Наприклад, незважаючи на те, що ця структура безперебійно працює на локальній машині, ті самі шляхи можуть не працювати на Vercel, тому вкрай важливо визначати шлях до кожного файлу модульним і адаптованим способом. Зрештою, це налаштування гарантує безперебійну роботу функції Puppeteer як у локальному середовищі, так і в безсерверному середовищі, обробляючи всі ключові аспекти, такі як завантаження сторінки, обробка помилок і обмеження середовища. 🖥️
Рішення 1: Налаштування Puppeteer для правильного встановлення Chrome на Vercel
Це базове рішення на основі 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: спеціальна конфігурація Puppeteer для Vercel із файлом .puppeteerrc.cjs
Це рішення налаштовує файл конфігурації 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: Реалізація змінних середовища та сценаріїв у package.json для Puppeteer
Такий підхід змінює package.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 перевіряє здатність Puppeteer робити знімок екрана з URL-адреси в різних середовищах.
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, не завжди доступні. Фактично, Puppeteer’s launch метод може виявитися невдалим, якщо необхідну версію Chrome не встановлено на сервері, що призведе до помилок на зразок «Не вдалося знайти Chrome». Хорошою практикою є вказувати шлях до виконуваного файлу Chrome за допомогою executablePath, оскільки це гарантує, що Puppeteer може знаходити та ефективно запускати Chrome у будь-якому середовищі.
Окрім цього, додавання необхідних аргументів запуску є вирішальним для сумісності. Прапори, такі як --no-sandbox і --disable-setuid-sandbox особливо корисні. Хоча ці прапорці вимикають деякі функції безпеки Chrome, вони часто необхідні для безсерверних установок, де не підтримується пісочниця Chrome. Крім того, вказавши спеціальний каталог кешу за допомогою Puppeteer cacheDirectory опція допомагає запобігти потенційним проблемам з кеш-пам’яттю, особливо якщо задіяно кілька версій браузера. Наприклад, налаштування cacheDirectory у відомий каталог гарантує, що всі залежності доступні під час виконання.
Нарешті, оптимізація goto метод може значно підвищити продуктивність. За допомогою waitUntil: 'networkidle2' сценарій очікує завершення завантаження сторінки, що є ключовим для середовищ, де швидкість Інтернету або завантаження ресурсів змінюється. Це особливо корисно для створення точних скріншотів динамічних сторінок або програм, де вміст завантажується асинхронно. Поєднання цих методів дозволяє Puppeteer безперебійно працювати на хмарних платформах, пропонуючи потужне рішення для автоматизованих завдань у виробництві. 🚀
Поширені запитання про розгортання Puppeteer і Cloud
- Чому я отримую повідомлення про помилку «Не вдалося знайти Chrome» на хмарних платформах?
- Ці помилки часто виникають через те, що хмарні платформи за замовчуванням не включають повний двійковий файл Chrome. Ви можете виправити це, вказавши executablePath у налаштуваннях Puppeteer.
- Як переконатися, що Puppeteer працює як у локальному, так і в хмарному середовищі?
- Використання executablePath і args із зручними для хмари прапорами, як --no-sandbox може зробити вашу установку достатньо гнучкою для обох середовищ.
- Що означає --no-sandbox прапор робити в Puppeteer?
- The --no-sandbox прапорець вимикає безпеку пісочниці Chrome, що дозволяє Puppeteer працювати в хмарних службах, які не підтримують пісочницю, але її слід використовувати з обережністю.
- Навіщо мені звичай cacheDirectory для Ляльковода?
- Встановлення настроюваного cacheDirectory гарантує, що Puppeteer завантажує двійкові файли Chrome у відоме місце, що може запобігти помилкам під час розгортання, особливо в безсерверних середовищах.
- Яка мета networkidle2 варіант в goto метод?
- The networkidle2 опція чекає, доки не залишиться більше двох активних мережевих підключень. Це корисно для захоплення повністю завантаженої сторінки та обробки динамічного вмісту.
- Чи може Puppeteer працювати без зазначеної версії Chrome?
- Так, але рекомендується вказати executablePath і переконайтеся, що сумісна версія Chrome доступна для стабільних результатів у хмарних налаштуваннях.
- Як мені керувати кеш-пам’яттю Puppeteer у різних середовищах?
- Можна вказати універсальний cacheDirectory в .puppeteerrc.cjs файл, що дозволяє Puppeteer знаходити двійкові файли Chrome на таких платформах, як Vercel і Heroku.
- Є puppeteer-core відрізняється від puppeteer?
- так puppeteer-core виключає включений Chrome, щоб зменшити розмір, тому вам потрібно буде вказати двійковий файл Chrome. Повний puppeteer пакет включає Chrome автоматично.
- Що робити, якщо Puppeteer повільно працює в хмарних середовищах?
- Оптимізація viewport налаштувань і відключення непотрібних параметрів, як-от devtools може покращити продуктивність у середовищах з обмеженими ресурсами.
- Чи Puppeteer сумісний з усіма хмарними провайдерами?
- Загалом так, але кожен постачальник може мати унікальні вимоги. Використання хмарних налаштувань, наприклад --no-sandbox забезпечує кращу сумісність.
Останні думки про те, як змусити Puppeteer працювати на Vercel
Успішне розгортання Puppeteer на Vercel вимагає розуміння конкретних потреб налаштування Chrome. Конкретизуючи параметри запуску і правильне налаштування шляхів кешу Puppeteer допомагає запобігти неприємній помилці «Не вдалося знайти Chrome». Ці налаштування забезпечують надійну роботу Puppeteer у локальному та хмарному середовищах. 🚀
Щойно ви адаптуєте ці рішення до свого проекту, знімки екрана з URL-адрес, наданих користувачем, стає безперебійним, що дозволяє створювати більш динамічні веб-додатки. За належного налаштування Puppeteer залишається безцінним інструментом для автоматизації та веб-збирання навіть на безсерверних платформах, таких як Vercel.
Джерела та посилання для усунення несправностей Puppeteer
- Ця стаття посилається на офіційний посібник із конфігурації Puppeteer із детальними параметрами налаштування та кроками з усунення несправностей, особливо щодо обробки шляхів до кешу Chrome і вказівки шляхів до виконуваних файлів. Посібник з налаштування Puppeteer
- Документація Vercel містить уявлення про те, як безсерверні середовища обробляють залежності та унікальні вимоги до розгортання програм, які покладаються на безголовні браузери. Документація Vercel
- Обговорення Stack Overflow пропонують керовані спільнотою рішення та практичні приклади обробки помилок, що охоплюють конкретні проблеми Puppeteer і Chrome, які виникають під час розгортання. Переповнення стека