Skip to content

Commit 5561504

Browse files
committed
Update
1 parent 5559f12 commit 5561504

File tree

1 file changed

+84
-0
lines changed

1 file changed

+84
-0
lines changed
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
---
2+
title: netlify-lambda で puppeteer を起動する
3+
created: 1592287218672
4+
tags: [netlify, puppeteer]
5+
---
6+
7+
[ローカル環境で netlify lambda のエミュレータを動かす \- mizdev](https://mizchi.dev/202006161259-try-netlify-lambda) を読んでることが前提
8+
9+
## tldr
10+
11+
- netlify-lambda は aws lambda なので、AWS 用にビルドされた chrome が使える
12+
- ローカル開発環境では素の puppeteer にフォールバックする
13+
14+
## コード
15+
16+
```
17+
yarn add puppeteer chrome-aws-lambda
18+
```
19+
20+
webpack.config.js の `externals` でビルドしないように指定。
21+
22+
```js
23+
// webpack.config.js
24+
externals: {
25+
puppeteer: "puppeteer",
26+
"chrome-aws-lambda": "chrome-aws-lambda",
27+
lambdafs: "lambdafs",
28+
},
29+
```
30+
31+
(`functions/api.js` にビルドしていたのを `functions/api/index.js` にビルドを変えて、 `functions/api/package.json` に依存を記述した。)
32+
33+
```ts
34+
// browser.ts
35+
import puppeteer from "puppeteer";
36+
37+
const isProd = process.env.NODE === "production";
38+
39+
let _browser: null | puppeteer.Browser = null;
40+
41+
export async function getBrowser(): Promise<puppeteer.Browser> {
42+
if (_browser) {
43+
return _browser;
44+
}
45+
if (isProd) {
46+
const chromium = require("chrome-aws-lambda");
47+
const browser = await chromium.puppeteer.launch({
48+
args: chromium.args,
49+
defaultViewport: chromium.defaultViewport,
50+
executablePath: await chromium.executablePath,
51+
headless: chromium.headless,
52+
ignoreHTTPSErrors: true,
53+
});
54+
return (_browser = browser);
55+
}
56+
return (_browser = await puppeteer.launch({
57+
headless: true,
58+
executablePath:
59+
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
60+
}));
61+
}
62+
```
63+
64+
このコードを使う例
65+
66+
```ts
67+
router.get("/chrome", async (req, res) => {
68+
let result = null;
69+
let page = null;
70+
try {
71+
const browser = await getBrowser();
72+
page = await browser.newPage();
73+
await page.goto("https://google.com");
74+
result = await page.title();
75+
} catch (error) {
76+
return res.status(400).send(error.message);
77+
} finally {
78+
if (page) {
79+
page.close();
80+
}
81+
}
82+
res.send(result);
83+
});
84+
```

0 commit comments

Comments
 (0)