import { rspack } from '@rspack/core' import { RspackDevServer } from '@rspack/dev-server' import chalk from 'chalk' import getConfig from './utils/getConfig.js' interface StartArgs { port?: string } export default async function start(args: StartArgs) { process.env.NODE_ENV = 'development' process.env.BABEL_ENV = 'development' process.env.BROWSERSLIST = 'chrome >= 70' process.env.WEBPACK_DEV_SERVER_BASE_PORT = '3000' process.env.BROWSERSLIST_IGNORE_OLD_DATA = 'true' const basePort = process.env.WEBPACK_DEV_SERVER_BASE_PORT // @ts-ignore const port = await RspackDevServer.getFreePort(args.port || process.env.PORT) if (!(args.port || process.env.PORT) && +port !== +basePort) { console.log(chalk.bgYellow(`${basePort} 端口已被占用,现切换到 ${port} 端口运行`)) } args.port = port process.env.PORT = port const config = getConfig(args) const compiler = rspack(config) const middleware = rspack.lazyCompilationMiddleware(compiler) const oldSetupMiddlewares = config.devServer!.setupMiddlewares config.devServer!.setupMiddlewares = (middlewares: any, devServer: any) => { if (oldSetupMiddlewares) { middlewares = oldSetupMiddlewares(middlewares, devServer) } middlewares.unshift(middleware) return middlewares } const devServer = new RspackDevServer(config.devServer!, compiler) devServer.start() ;['SIGINT', 'SIGTERM'].forEach(function (sig) { process.on(sig, function () { devServer.stop() process.exit() }) }) if (process.env.CI !== 'true') { // Gracefully exit when stdin ends process.stdin.on('end', function () { devServer.stop() process.exit() }) } }