Решение, предложенное Мени Ройтенбурдом, является правильным.Если вам не нравится тот факт, что каждая функция должна быть представлена браузеру отдельно, единственная идея, которая приходит на ум, - сначала перенести ваш проект в один файл JavaScript, а затем вставить его в виде тега <script>
- точно так же, каквы бы в реальной жизни.
Первым шагом было бы создать один файл JavaScript с вашим пакетом.Иногда это может быть достигнуто только с помощью компилятора TypeScript, но можно использовать и такой инструмент, как Webpack.
Как только это будет сделано, вы можете переместить свой пакет на клиент из Puppeteer:
await page.addScriptTag({ path: 'path/to/the/bundle' });
Имейте в виду, что это все еще может открыть ваши функции для глобальной области видимости, следовательно, доступ к ним через window
.
let size = await page.evaluate(() => {
const canvas = window.createHdpiCanvas();
return [canvas.width, canvas.height];
});
console.log(size); // [ 300, 150 ]
Еще один недостаток этого подхода к необходимости иметь дело с предупреждениями, генерируемыми TypeScript -на данный момент он не знает, что createHdpiCanvas
существует на window
, поэтому доступ к window.createHdpiCanvas
вызовет ошибку.