mirror of
https://github.com/zhigang1992/create-react-app.git
synced 2026-06-13 08:31:03 +08:00
76 lines
2.0 KiB
JavaScript
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();
|
|
});
|