如何在vue.js中使用puppeteer

时间:2018-10-16 11:51:26

标签: vue.js puppeteer

我正在尝试将puppeteer集成到vue.js应用程序中以生成屏幕截图和pdf文件。 我编写了一个使用puppeteer生成屏幕截图的功能,效果很好。

export const MyScripts = {
    getMiniature : async function(elementId, key) {
        const puppeteer = require('puppeteer');
        const browser = await puppeteer.launch();
        const page = await browser.newPage();
        // Making a screenshot
    }
}

当尝试集成该功能时,它无法加载人偶。 'require'不会产生错误,但是当我调用puppeteer.launch()时,出现以下消息:

  

TypeError:nodeFunction未定义

我已经读过木偶戏不应该与前端应用程序一起使用,所以我希望我没有选择错误的方向。

那么我该如何运作呢? 如果不可能,我可以使用什么来生成屏幕截图或pdf?

预先感谢

2 个答案:

答案 0 :(得分:2)

Puppeteer与Node一起使用,与Vue无关。 Node.js几乎是服务器上运行的JavaScript,因此与您的前端分离。 Puppeteer使用无头浏览器(因此也是您的实际系统)来生成屏幕截图和PDF文件。

客户端浏览器无法访问您的文件系统,因此您不能在Vue之类的前端框架中使用它来生成屏幕截图并保存。

我不知道有什么工具可以生成当前页面的屏幕截图,这些工具的实验性不是很强,但是我敢肯定,在深入探讨stackoverflow时,您会发现更多信息。

答案 1 :(得分:1)

免责声明:这不会向您展示如何在客户端上运行puppeteer。这只会向您展示如何连接到在其他地方运行的操纵up实例。

现在肯定有可能在puppeteer version 1.9.0 (有点头疼)

下面我列出了puppeteer网站,客户端pdf和图像生成以及外部API。

1。木偶网

您似乎正在尝试捆绑puppeteer以在Web应用程序中使用。树梢Puppeteer更加易于捆绑,并且在package.json中包含了浏览器字段,该字段应有助于捆绑。

您需要了解的一点是,除了REST / WS API之外,前端没有任何其他方式可以访问后端。因此,您必须使用那些API或自己构建一些api。您可以构建一个简单的express API并从vue应用程序中使用它。有很多资源和堆栈溢出问题。

关于这一点,让我们使用闪亮的puppeteer-web捆绑包。 :)

运行Chrome并获取browserWSEndpoint

您需要在某个地方运行chrome来执行此操作。可能是在您托管vue应用程序的服务器上。假设它是chromium,则可以使用以下代码

chromium
--disable-background-networking \
--disable-background-timer-throttling \
--disable-breakpad \
--disable-client-side-phishing-detection \
--disable-default-apps \
--disable-dev-shm-usage \
--disable-extensions \
--disable-features=site-per-process \
--disable-hang-monitor \
--disable-popup-blocking \
--disable-prompt-on-repost \
--disable-sync \
--disable-translate \
--metrics-recording-only \
--no-first-run \
--safebrowsing-disable-auto-update \
--enable-automation \
--password-store=basic \
--use-mock-keychain \
--remote-debugging-port=0

这将导致类似的情况, DevTools正在ws://127.0.0.1:57683/devtools/browser/foo

上监听

制作木偶浏览器版本

克隆人偶仓库,安装所有模块并运行命令以获取可嵌入到UI中的特定Web版本。

git clone https://github.com/GoogleChrome/puppeteer
npm install
npm run bundle

您将看到一个utils/browser/puppeteer-web.js文件。这就是您需要嵌入到vue或网络应用程序中的内容。

需要操纵up的浏览器并连接到端点

<script type="text/javascript" src="puppeteer-web.js"></script>
<script type="text/javascript">
const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.connect({
    browserWSEndpoint: theirBrowserWSEndpoint 
    // the exact same browser WS endpoint that just loaded this page, 
    // example, ws://127.0.0.1:57683/devtools/browser/foo
  });

  const page = await browser.newPage();

  .. a whole bunch of operations to perform to data scraping, etc.
})()
</script>

PS:我将很快写一篇有关各种屏幕截图的文章/答案,敬请期待。

2。将当前页面捕获为屏幕截图和pdf

您可以使用html2canvas来收集当前页面的屏幕截图。就像调用和使用它一样简单。 vue-resume使用它来生成最终图像。如果您试图捕获当前页面或其任何部分,则很有用。

示例用法

var element = document.getElementById('capture');
html2canvas(element).then(canvas => {
    document.body.appendChild(canvas) // do whatever want with the image data
});

与PDF生成相同。您可以使用html2pdf来做到这一点。

var element = document.getElementById('capture');
html2pdf(element); // prompts the user to save the result

3。屏幕截图生成API

如果仍然需要生成屏幕截图,则可以使用可用的服务。以下是其中的一些内容((ps,该列表将来可能不会更新,并且无法正常工作。)