UNPKG

@computerrock/toolchain-react-app

Version:

The Formation Framework template for starting react app project.

118 lines (104 loc) 4.05 kB
'use strict'; // set env process.env.BABEL_ENV = 'production'; process.env.NODE_ENV = 'production'; // exit on unhandled rejections process.on('unhandledRejection', err => { throw err; }); // load env variables require('../config/env'); // @remove-on-eject-begin // Do the pre-flight dependency check (only happens before eject). const verifyPackageTree = require('./utils/verifyPackageTree'); if (process.env.SKIP_PREFLIGHT_CHECK !== 'true') { verifyPackageTree(); } // @remove-on-eject-end const fs = require('fs-extra'); const chalk = require('chalk'); const webpack = require('webpack'); const checkRequiredFiles = require('@computerrock/react-dev-utils/checkRequiredFiles'); const formatWebpackMessages = require('@computerrock/react-dev-utils/formatWebpackMessages'); const FileSizeReporter = require('@computerrock/react-dev-utils/FileSizeReporter'); const printBuildError = require('@computerrock/react-dev-utils/printBuildError'); const paths = require('../config/paths'); const createWebpackConfig = require('../config/webpack.config'); const measureFileSizesBeforeBuild = FileSizeReporter.measureFileSizesBeforeBuild; const printFileSizesAfterBuild = FileSizeReporter.printFileSizesAfterBuild; // set bundle size limits const WARN_AFTER_BUNDLE_GZIP_SIZE = 512 * 1024; const WARN_AFTER_CHUNK_GZIP_SIZE = 1024 * 1024; // warn and exit if required files are missing if (!checkRequiredFiles([paths.appHtml, paths.appIndexJs])) { process.exit(1); } measureFileSizesBeforeBuild(paths.appBuild) .then(previousFileSizes => { fs.emptyDirSync(paths.appBuild); copyPublicFolder(); return build(previousFileSizes); }) .then( ({stats, previousFileSizes, warnings}) => { if (warnings.length) { console.log(chalk.yellow('Compiled with warnings.\n')); console.log(warnings.join('\n\n')); } else { console.log(chalk.green('Compiled successfully.\n')); } console.log('File sizes after gzip:\n'); printFileSizesAfterBuild( stats, previousFileSizes, paths.appBuild, WARN_AFTER_BUNDLE_GZIP_SIZE, WARN_AFTER_CHUNK_GZIP_SIZE, ); }, err => { console.log(chalk.red('Failed to compile.\n')); printBuildError(err); process.exit(1); }, ); function build(previousFileSizes) { console.log('Creating an optimized production build...'); let compiler = webpack(createWebpackConfig('production')); return new Promise((resolve, reject) => { compiler.run((err, stats) => { if (err) { return reject(err); } const messages = formatWebpackMessages(stats.toJson({}, true)); if (messages.errors.length) { // Only keep the first error. Others are often indicative // of the same problem, but confuse the reader with noise. if (messages.errors.length > 1) { messages.errors.length = 1; } return reject(new Error(messages.errors.join('\n\n'))); } if ( process.env.CI && (typeof process.env.CI !== 'string' || process.env.CI.toLowerCase() !== 'false') && messages.warnings.length ) { console.log(chalk.yellow('\nTreating warnings as errors because process.env.CI = true.\n' + 'Most CI servers set it automatically.\n')); return reject(new Error(messages.warnings.join('\n\n'))); } return resolve({ stats, previousFileSizes, warnings: messages.warnings, }); }); }); } function copyPublicFolder() { fs.copySync(paths.appPublic, paths.appBuild, { dereference: true, filter: file => file !== paths.appHtml, }); }