Skip to content

Commit

Permalink
[更新] 优化Puppeteer性能与提升执行速度
Browse files Browse the repository at this point in the history
  • Loading branch information
839128 committed Jun 15, 2020
1 parent 7011d36 commit 0879b75
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 21 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
"crypto-js": "^3.1.8",
"joi": "^11.1.1",
"lodash": "^4.17.4",
"puppeteer": "^2.0.0"
"puppeteer": "^2.1.1"
},
"devDependencies": {
"gulp": "^3.9.1",
Expand Down
4 changes: 4 additions & 0 deletions src/app/feature/config/clazz/default.config.class.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ export default class DefaultConfig {
this.setPathConfig();
this.setEnvConfig();
this.setServerConfig();
this.setBrowserConfig();
}

setPathConfig() {
Expand All @@ -35,6 +36,9 @@ export default class DefaultConfig {

setServerConfig() {
this.Port = this.objConfig.port;
}

setBrowserConfig() {
this.size = this.objConfig.size;
this.ignore = this.objConfig.ignore;
}
Expand Down
49 changes: 29 additions & 20 deletions src/app/shared/utils/render.utils.class.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
import puppeteer from 'puppeteer';
import _ from 'lodash';
import _C from '../../shared/term/criteria.term.class';
import puppeteer from 'puppeteer';
import _ from 'lodash';
import _C from '../../shared/term/criteria.term.class';

export default class Render {

static async init() {
const browser = await puppeteer.launch({
headless: config.debug,
ignoreHTTPSErrors: config.ignore,
devtools: false,
args: [
'--disable-gpu',
'--disable-dev-shm-usage',
Expand Down Expand Up @@ -41,7 +42,7 @@ export default class Render {
height: 1200
},
goto: {
waitUntil: 'networkidle2'
waitUntil: 'networkidle0'
},
output: _C.FOTMAT_TYPE_PDF,
pdf: {
Expand All @@ -52,30 +53,30 @@ export default class Render {
type: 'png',
fullPage: true
},
failEarly: false
failEarly: false,
waitFor: 6000
}, _opts);

if (_.get(_opts, 'pdf.width') && _.get(_opts, 'pdf.height')) {
// pdf.format 会覆盖宽度和高度,所以我们必须删除它
opts.pdf.format = undefined;
}

logger.trace('RENDER => ' + JSON.stringify({
opts
}));
this.logOpts(opts);

let browserWSEndpoint = browser[Math.floor(Math.random() * config.size)];
const chrome = await puppeteer.connect({browserWSEndpoint});
const chrome = await puppeteer.connect({browserWSEndpoint,ping_interval:'None',ping_timeout:'None'});
logger.trace('RENDER => browserWSEndpoint connect ...'+ Math.floor(Math.random() * config.size));
const page = await chrome.newPage();

await page.setCacheEnabled(true);

page.on('error', (err) => {
logger.error(`RENDER => Error event emitted: ${err}`);
logger.error(err.stack);
page.close();
});


this.failedResponses = [];
page.on('requestfailed', (request) => {
this.failedResponses.push(request);
Expand All @@ -96,7 +97,7 @@ export default class Render {

let data;
try {
logger.trace('RENDER => Set chrome viewport ..');
logger.trace('RENDER => Set browser viewport ..');
await page.setViewport(opts.viewport);
if (opts.emulateScreenMedia) {
logger.trace('RENDER => Emulate @media screen ..');
Expand All @@ -112,7 +113,7 @@ export default class Render {
await client.send('Network.setCookies', {cookies: opts.cookies});
}

if (opts.html) {
if (_.isString(opts.html)) {
logger.trace('RENDER => Set HTML ..');
await page.setContent(opts.html, opts.goto);
} else {
Expand All @@ -124,7 +125,7 @@ export default class Render {

if (_.isNumber(opts.waitFor) || _.isString(opts.waitFor)) {
logger.trace(`RENDER => Wait for ${opts.waitFor} ..`);
await page.waitFor(parseInt(opts.waitFor));
await page.waitFor(~~opts.waitFor);
}

if (opts.scrollPage) {
Expand Down Expand Up @@ -157,6 +158,8 @@ export default class Render {

if (opts.output === _C.FOTMAT_TYPE_PDF) {
data = await page.pdf(opts.pdf);
}else if (opts.output === _C.FOTMAT_TYPE_HTML) {
data = await page.evaluate(() => document.body.innerHTML);
} else {
const screenshotOpts = _.cloneDeep(_.omit(opts.screenshot, ['clip']));
const clipContainsSomething = _.some(opts.screenshot.clip, val => !_.isUndefined(val));
Expand All @@ -165,7 +168,6 @@ export default class Render {
}
data = await page.screenshot(screenshotOpts);
}
data.title = opts.attachmentName;
} catch (err) {
logger.trace(`RENDER <= Error when rendering page: ${err}`);
logger.error(err.stack);
Expand All @@ -177,11 +179,6 @@ export default class Render {
return data;
}

/**
* 滚动到页面末尾以触发延迟加载所有元素
*
* @param {page} Page.
*/
static async scrollPage(page) {
await page.evaluate(() => {
const scrollInterval = 100;
Expand Down Expand Up @@ -220,6 +217,8 @@ export default class Render {
static getMimeType(opts) {
if (opts.output === _C.FOTMAT_TYPE_PDF) {
return 'application/pdf';
}else if (opts.output === _C.FOTMAT_TYPE_HTML) {
return 'text/html';
}
const type = _.get(opts, 'screenshot.type');
switch (type) {
Expand All @@ -232,6 +231,16 @@ export default class Render {
}
}

static logOpts(opts) {
const supressedOpts = _.cloneDeep(opts);
if (opts.html) {
supressedOpts.html = '...';
}
logger.trace('RENDER => ' + JSON.stringify({
opts
}));
}

/**
* 获取提交参数信息
*
Expand All @@ -245,7 +254,7 @@ export default class Render {
emulateScreenMedia: query.emulateScreenMedia,
ignoreHttpsErrors: query.ignoreHttpsErrors,
waitFor: ~~query.waitFor,
output: query.output || _C.FOTMAT_TYPE_PDF,
output: query.output || _C.FOTMAT_TYPE_PDF || _C.FOTMAT_TYPE_HTML,
viewport: {
width: query['viewport.width'],
height: query['viewport.height'],
Expand Down

0 comments on commit 0879b75

Please sign in to comment.