@@ -4,8 +4,10 @@ import {
44 createNodeServer ,
55 loadServerRuntimeConfig ,
66} from '@modern-js/server-core/node' ;
7- import { devPlugin } from './dev' ;
7+ import { logger } from '@modern-js/utils' ;
8+ import { devPlugin , manager } from './dev' ;
89import { getDevAssetPrefix , getDevOptions } from './helpers' ;
10+ import { ResourceType } from './helpers/utils' ;
911import type { ApplyPlugins , ModernDevServerOptions } from './types' ;
1012
1113export async function createDevServer (
@@ -35,6 +37,7 @@ export async function createDevServer(
3537 } ;
3638
3739 const server = createServerBase ( prodServerOptions ) ;
40+ let currentServer = server ;
3841
3942 const devHttpsOption = typeof dev === 'object' && dev . https ;
4043 const isHttp2 = ! ! devHttpsOption ;
@@ -43,12 +46,14 @@ export async function createDevServer(
4346 const { genHttpsOptions } = await import ( './dev-tools/https' ) ;
4447 const httpsOptions = await genHttpsOptions ( devHttpsOption , pwd ) ;
4548 nodeServer = await createNodeServer (
46- server . handle . bind ( server ) ,
49+ ( req , res ) => currentServer . handle ( req , res ) ,
4750 httpsOptions ,
4851 isHttp2 ,
4952 ) ;
5053 } else {
51- nodeServer = await createNodeServer ( server . handle . bind ( server ) ) ;
54+ nodeServer = await createNodeServer ( ( req , res ) =>
55+ currentServer . handle ( req , res ) ,
56+ ) ;
5257 }
5358
5459 const promise = getDevAssetPrefix ( builder ) ;
@@ -78,8 +83,48 @@ export async function createDevServer(
7883 await builderDevServer ?. afterListen ( ) ;
7984 } ;
8085
86+ const reload = async ( ) => {
87+ try {
88+ const updatedServerConfig =
89+ ( await loadServerRuntimeConfig ( serverConfigPath ) ) || { } ;
90+
91+ const updatedProdServerOptions = {
92+ ...options ,
93+ pwd : distDir ,
94+ serverConfig : {
95+ ...updatedServerConfig ,
96+ ...options . serverConfig ,
97+ } ,
98+ plugins : [
99+ ...( updatedServerConfig . plugins || [ ] ) ,
100+ ...( options . plugins || [ ] ) ,
101+ ] ,
102+ } ;
103+
104+ const newServer = createServerBase ( updatedProdServerOptions ) ;
105+
106+ await manager . close ( ResourceType . Watcher ) ;
107+
108+ newServer . addPlugins ( [
109+ devPlugin ( {
110+ ...options ,
111+ } ) ,
112+ ] ) ;
113+
114+ await applyPlugins ( newServer , updatedProdServerOptions , nodeServer ) ;
115+
116+ await newServer . init ( ) ;
117+
118+ currentServer = newServer ;
119+ logger . info ( `Custom Web Server HMR succeeded` ) ;
120+ } catch ( e ) {
121+ logger . error ( '[Custom Web Server HMR failed]:' , e ) ;
122+ }
123+ } ;
124+
81125 return {
82126 server : nodeServer ,
83127 afterListen,
128+ reload,
84129 } ;
85130}
0 commit comments