import type { Stats } from '@rspack/core' import { rspack } from '@rspack/core' import chalk from 'chalk' import fs from 'fs-extra' import paths from './config/paths' import appConfig from './utils/appConfig' import { measureFileSizesBeforeBuild, printFileSizesAfterBuild } from './utils/FileSizeReporter' import getConfig from './utils/getConfig' interface BuildArgs { analyze?: boolean outputHtml?: boolean } export default async function build(args: BuildArgs) { process.env.NODE_ENV = 'production' process.env.BABEL_ENV = 'production' process.env.BROWSERSLIST = '>0.2%, iOS>=9, ie 11, chrome>=49, not op_mini all' process.env.BROWSERSLIST_IGNORE_OLD_DATA = 'true' if (args.analyze) { process.env.ANALYZE = '1' } if (args.outputHtml) { process.env.OUTPUT_HTML = '1' } const previousSizeMap = await measureFileSizesBeforeBuild(paths.dist) fs.emptyDirSync(paths.dist) if (appConfig.single) { fs.copySync(paths.public, paths.resolveApp('dist')) } if (appConfig.mainProject && fs.existsSync(paths.static)) { fs.copySync(paths.static, paths.resolveApp('dist', 'static')) } const config = getConfig(args) rspack(config, (error, stats: Stats | undefined) => { if (error) { console.log(chalk.red('编译失败')) console.log(chalk.red(error.message || error)) process.exit(1) } if (!stats) return if (stats.compilation.errors.length) { console.log(chalk.red('编译失败')) console.log(stats.toString({ all: false, errors: true, colors: true })) process.exit(1) } const size = { maxEntrypointSize: 250000, maxAssetSize: 250000 } if (typeof config.performance === 'object') { config.performance.maxEntrypointSize = size.maxEntrypointSize config.performance.maxAssetSize = size.maxAssetSize } printFileSizesAfterBuild( stats, previousSizeMap, paths.dist, size.maxEntrypointSize, size.maxAssetSize ) if (appConfig.single) { console.log(`打包完成,可以使用 ${chalk.green('@qse/ssh-sftp')} 自动部署代码到 v1`) } else { console.log(`打包完成,可以运行 ${chalk.green('npx edu-scripts deploy')} 部署代码到 v1`) } console.log() console.log(stats.toString({ colors: true, preset: 'errors-warnings', timings: true })) console.log() }) }