diff --git a/packages/core/src/createRsbuild.ts b/packages/core/src/createRsbuild.ts index 531e55a804..8a74a9788d 100644 --- a/packages/core/src/createRsbuild.ts +++ b/packages/core/src/createRsbuild.ts @@ -27,7 +27,6 @@ import { pluginExternals } from './plugins/externals'; import { pluginFileSize } from './plugins/fileSize'; import { pluginHtml } from './plugins/html'; import { pluginInlineChunk } from './plugins/inlineChunk'; -import { pluginLazyCompilation } from './plugins/lazyCompilation'; import { pluginManifest } from './plugins/manifest'; import { pluginMinimize } from './plugins/minimize'; import { pluginModuleFederation } from './plugins/moduleFederation'; @@ -111,7 +110,6 @@ async function applyDefaultPlugins( pluginManifest(), pluginModuleFederation(), pluginRspackProfile(), - pluginLazyCompilation(), pluginSri(), pluginNonce(), ]); diff --git a/packages/core/src/plugins/lazyCompilation.ts b/packages/core/src/plugins/lazyCompilation.ts deleted file mode 100644 index 7f7ef6245b..0000000000 --- a/packages/core/src/plugins/lazyCompilation.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { RsbuildPlugin } from '../types'; - -export const pluginLazyCompilation = (): RsbuildPlugin => ({ - name: 'rsbuild:lazy-compilation', - - setup(api) { - api.modifyBundlerChain((chain, { environment, isProd, target }) => { - if (isProd || target !== 'web') { - return; - } - - const { config } = environment; - - const options = config.dev?.lazyCompilation; - if (!options) { - return; - } - - chain.experiments({ - ...chain.get('experiments'), - lazyCompilation: options, - }); - }); - }, -}); diff --git a/packages/core/src/server/compilationManager.ts b/packages/core/src/server/compilationManager.ts index 9ea4974d68..bfaf3aaf81 100644 --- a/packages/core/src/server/compilationManager.ts +++ b/packages/core/src/server/compilationManager.ts @@ -94,7 +94,7 @@ export class CompilationManager { private serverConfig: ServerConfig; - private compiler: Rspack.Compiler | Rspack.MultiCompiler; + public compiler: Rspack.Compiler | Rspack.MultiCompiler; private publicPaths: string[]; diff --git a/packages/core/src/server/devMiddlewares.ts b/packages/core/src/server/devMiddlewares.ts index 3dae6dbcde..931e0c81b5 100644 --- a/packages/core/src/server/devMiddlewares.ts +++ b/packages/core/src/server/devMiddlewares.ts @@ -1,9 +1,12 @@ import { isAbsolute, join } from 'node:path'; +import rspack from '@rspack/core'; import { normalizePublicDirs } from '../config'; +import { isMultiCompiler } from '../helpers'; import { logger } from '../logger'; import type { DevConfig, EnvironmentAPI, + InternalContext, RequestHandler, ServerConfig, SetupMiddlewaresServer, @@ -25,11 +28,9 @@ export type RsbuildDevMiddlewareOptions = { pwd: string; dev: DevConfig; server: ServerConfig; + context: InternalContext; environments: EnvironmentAPI; compilationManager?: CompilationManager; - output: { - distPath: string; - }; /** * Callbacks returned by the `onBeforeStartDevServer` hook. */ @@ -71,10 +72,11 @@ const applySetupMiddlewares = ( export type Middlewares = Array; const applyDefaultMiddlewares = async ({ + dev, middlewares, server, compilationManager, - output, + context, pwd, environments, postCallbacks, @@ -110,6 +112,23 @@ const applyDefaultMiddlewares = async ({ ); } + if ( + context.action === 'dev' && + context.bundlerType === 'rspack' && + dev.lazyCompilation && + compilationManager + ) { + const { compiler } = compilationManager; + + middlewares.push( + rspack.experiments.lazyCompilationMiddleware( + // TODO: support for multi compiler + isMultiCompiler(compiler) ? compiler.compilers[0] : compiler, + dev.lazyCompilation, + ), + ); + } + // dev proxy handler, each proxy has own handler if (server.proxy) { const { middlewares: proxyMiddlewares, upgrade } = @@ -149,15 +168,11 @@ const applyDefaultMiddlewares = async ({ }); } - const distPath = isAbsolute(output.distPath) - ? output.distPath - : join(pwd, output.distPath); - if (compilationManager) { middlewares.push( getHtmlCompletionMiddleware({ - distPath, compilationManager, + distPath: context.distPath, }), ); } @@ -188,8 +203,8 @@ const applyDefaultMiddlewares = async ({ if (compilationManager) { middlewares.push( getHtmlFallbackMiddleware({ - distPath, compilationManager, + distPath: context.distPath, htmlFallback: server.htmlFallback, }), ); diff --git a/packages/core/src/server/devServer.ts b/packages/core/src/server/devServer.ts index 69bcb92f20..bca6de6182 100644 --- a/packages/core/src/server/devServer.ts +++ b/packages/core/src/server/devServer.ts @@ -1,7 +1,6 @@ import type { Server } from 'node:http'; import type { Http2SecureServer } from 'node:http2'; import type Connect from '../../compiled/connect/index.js'; -import { ROOT_DIST_DIR } from '../constants'; import { getPublicPathFromCompiler, isMultiCompiler } from '../helpers'; import { logger } from '../logger'; import { onBeforeRestartServer, restartDevServer } from '../restart'; @@ -132,11 +131,12 @@ export async function createDevServer< config, }); const { middlewareMode } = config.server; + const { context } = options; const devConfig = formatDevConfig(config.dev, port); - const routes = getRoutes(options.context); - const root = options.context.rootPath; + const routes = getRoutes(context); + const root = context.rootPath; - options.context.devServer = { + context.devServer = { hostname: host, port, https, @@ -147,16 +147,14 @@ export async function createDevServer< // should register onDevCompileDone hook before startCompile const waitFirstCompileDone = runCompile ? new Promise((resolve) => { - options.context.hooks.onDevCompileDone.tap( - ({ stats, isFirstCompile }) => { - lastStats = 'stats' in stats ? stats.stats : [stats]; - - if (!isFirstCompile) { - return; - } - resolve(); - }, - ); + context.hooks.onDevCompileDone.tap(({ stats, isFirstCompile }) => { + lastStats = 'stats' in stats ? stats.stats : [stats]; + + if (!isFirstCompile) { + return; + } + resolve(); + }); }) : Promise.resolve(); @@ -180,7 +178,7 @@ export async function createDevServer< }, publicPaths: publicPaths, compiler, - environments: options.context.environments, + environments: context.environments, }); await compilationManager.init(); @@ -225,7 +223,7 @@ export async function createDevServer< // ensure closeServer is only called once removeCleanup(closeServer); cleanupGracefulShutdown?.(); - await options.context.hooks.onCloseDevServer.callBatch(); + await context.hooks.onCloseDevServer.callBatch(); await Promise.all([devMiddlewares?.close(), fileWatcher?.close()]); }; @@ -250,7 +248,7 @@ export async function createDevServer< help: shortcutsOptions.help, customShortcuts: shortcutsOptions.custom, }); - options.context.hooks.onCloseDevServer.tap(cleanup); + context.hooks.onCloseDevServer.tap(cleanup); } if (!getPortSilently && portTip) { @@ -264,7 +262,7 @@ export async function createDevServer< ); const environmentAPI = Object.fromEntries( - Object.entries(options.context.environments).map(([name, environment]) => { + Object.entries(context.environments).map(([name, environment]) => { return [ name, { @@ -339,7 +337,7 @@ export async function createDevServer< const serverTerminator = getServerTerminator(httpServer); logger.debug('listen dev server'); - options.context.hooks.onCloseDevServer.tap(serverTerminator); + context.hooks.onCloseDevServer.tap(serverTerminator); return new Promise((resolve) => { httpServer.listen( @@ -382,10 +380,10 @@ export async function createDevServer< }); }, afterListen: async () => { - await options.context.hooks.onAfterStartDevServer.callBatch({ + await context.hooks.onAfterStartDevServer.callBatch({ port, routes, - environments: options.context.environments, + environments: context.environments, }); }, connectWebSocket: ({ server }: { server: HTTPServer }) => { @@ -399,15 +397,15 @@ export async function createDevServer< }; const postCallbacks = ( - await options.context.hooks.onBeforeStartDevServer.callBatch({ + await context.hooks.onBeforeStartDevServer.callBatch({ server: devServerAPI, - environments: options.context.environments, + environments: context.environments, }) ).filter((item) => typeof item === 'function'); if (runCompile) { // print server url should between listen and beforeCompile - options.context.hooks.onBeforeCreateCompiler.tap(beforeCreateCompiler); + context.hooks.onBeforeCreateCompiler.tap(beforeCreateCompiler); } else { beforeCreateCompiler(); } @@ -425,11 +423,9 @@ export async function createDevServer< pwd: root, compilationManager, dev: devConfig, + context, server: config.server, environments: environmentAPI, - output: { - distPath: options.context.distPath || ROOT_DIST_DIR, - }, postCallbacks, });