Files
create-react-app/packages/react-scripts/scripts/audit.js
2019-11-16 22:22:52 +02:00

76 lines
2.0 KiB
JavaScript

// @remove-file-on-eject
/**
* Copyright (c) 2015-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
'use strict';
const { createServer } = require('http');
const { writeFileSync } = require('fs');
const { join } = require('path');
const { choosePort } = require('react-dev-utils/WebpackDevServerUtils');
const open = require('open');
const handler = require('serve-handler');
const lighthouse = require('lighthouse');
const chromeLauncher = require('chrome-launcher');
const paths = require('../config/paths');
const DEFAULT_PORT = parseInt(process.env.PORT, 10) || 3000;
const HOST = process.env.HOST || '0.0.0.0';
// https://github.com/GoogleChrome/lighthouse/blob/master/docs/readme.md#using-programmatically
const launchChromeAndRunLighthouse = (url, opts) => {
return chromeLauncher
.launch({ chromeFlags: opts.chromeFlags })
.then(chrome => {
opts.port = chrome.port;
return lighthouse(url, opts).then(results => {
return chrome.kill().then(() => results.report);
});
});
};
const server = createServer((request, response) =>
handler(request, response, {
renderSingle: true,
public: paths.appBuild,
})
);
choosePort(HOST, DEFAULT_PORT)
.then(() => choosePort(HOST, DEFAULT_PORT))
.then(port => {
if (port == null) {
console.log('Unable to find a free port');
process.exit(1);
}
server.listen(port);
console.log('Server started, beginning audit...');
return launchChromeAndRunLighthouse(`http://${HOST}:${port}`, {
output: 'html',
});
})
.then(report => {
console.log('Audit finished, writing report...');
const reportPath = join(paths.appPath, 'lighthouse-audit.html');
writeFileSync(reportPath, report);
console.log('Opening report in browser...');
open(reportPath, { url: true });
console.log('Exiting...');
server.close();
})
.catch(() => {
console.log('Something went wrong, exiting...');
server.close();
});