Хорошо, нашел кусочки кода, чтобы вы начали. Код привязан к моей пользовательской базе кода, но функции, которые я использую, могут быть легко заменены вашими собственными.
Итак, во-первых, я пишу файл простого узла, который создает экземпляр Chromium и сохраняет ссылку на wsEndpoint
, который мы затем можем использовать для подключения.
файл: chromiumLauncher.js
const writeText = require("mylib/core.io.file/write-text");
const puppeteer = require("puppeteer");
const path = require("path");
const common = require("./common");
(async () => {
const launch_options = {
args: ['--disable-features=site-per-process'],
headless: false,
devtools: false,
defaultViewport: {width: 1200, height: 1000},
userDataDir: common.userDataDir
};
const browser = await puppeteer.launch(launch_options);
const wsEndpoint = browser.wsEndpoint();
await writeText(common.fnSettings, JSON.stringify({wsEndpoint}, null, " "));
})();
В вышеупомянутом common.js я просто храню некоторые простые настройки конфигурации, вы можете заменить их своими, он просто хранит некоторые пути, он просто хранит, где pupperteer размещает свои файлы данных и где сохранять wsEndpoint
значение. А write-text
- это просто простая функция, основанная на обещаниях для записи текстовых файлов, в основном fs.writeFile
с кодировкой, установленной на utf-8
.
Затем мы просто создадим еще один js-файл с именем connect
,
const puppeteer = require("puppeteer");
const cp = require('child_process');
const delay = require("mylib/promise/delay");
let browser = null;
const readText = require("mylib/core.io.file/read-text");
const common = require("./common");
async function launch () {
cp.spawn('node', ['chromiumLauncher.js'], {
detached: true,
shell: true,
cwd: __dirname
});
await delay(5000); //lets wait 5 seconds
}
async function getSettings() {
try {
const settingsTxt = await readText(common.fnSettings);
return JSON.parse(settingsTxt);
} catch (e) {
if (e.code !== 'ENOENT') throw e;
return null;
}
}
async function connect () {
if (browser) return browser;
let settings = await getSettings();
if (!settings) {
await launch();
settings = await getSettings();
}
try {
browser = await puppeteer.connect({browserWSEndpoint: settings.wsEndpoint});
} catch (e) {
const err = e.error || e;
if (err.code === "ECONNREFUSED") {
console.log("con ref");
await launch();
settings = await getSettings();
browser = await puppeteer.connect({browserWSEndpoint: settings.wsEndpoint});
}
}
return browser;
}
module.exports = connect;
Снова пара пользовательских библиотечных функций, описанных выше, но их легко заменить. read-text
, прямо противоположное тексту записи, а delay
просто задержка на основе обещания.
И это все, чтобы использовать ..
const connect = require("path-to/connect");
const browser = await connect();
const page = await browser.newPage();
И поскольку мы запускаем Chromium отделенным, когда процессы закрываются / соединяются, он остается открытым между ними. У меня было около 7 процессов, связанных с 70 веб-страницами, открытыми в Chromium без каких-либо проблем. Следует отметить одну вещь: поскольку я запускаю хром внутри отдельного спавна, вам остается вручную закрыть хром, если вам это тоже нужно. Другой вариант - просто запустить chromiumLauncher.js
в каком-нибудь диспетчере процессов, например PM2 https://www.npmjs.com/package/pm2,