@@ -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 (
@@ -42,6 +44,7 @@ export async function createDevServer(
4244 } ;
4345
4446 const server = createServerBase ( prodServerOptions ) ;
47+ let currentServer = server ;
4548
4649 const devHttpsOption = typeof dev === 'object' && dev . https ;
4750 const isHttp2 = devHttpsOption && typeof dev . proxy === 'undefined' ;
@@ -50,12 +53,14 @@ export async function createDevServer(
5053 const { genHttpsOptions } = await import ( './dev-tools/https' ) ;
5154 const httpsOptions = await genHttpsOptions ( devHttpsOption , pwd ) ;
5255 nodeServer = await createNodeServer (
53- server . handle . bind ( server ) ,
56+ ( req , res ) => currentServer . handle ( req , res ) ,
5457 httpsOptions ,
5558 isHttp2 ,
5659 ) ;
5760 } else {
58- nodeServer = await createNodeServer ( server . handle . bind ( server ) ) ;
61+ nodeServer = await createNodeServer ( ( req , res ) =>
62+ currentServer . handle ( req , res ) ,
63+ ) ;
5964 }
6065
6166 const promise = getDevAssetPrefix ( builder ) ;
@@ -85,8 +90,53 @@ export async function createDevServer(
8590 await builderDevServer ?. afterListen ( ) ;
8691 } ;
8792
93+ const reload = async ( ) => {
94+ try {
95+ const updatedServerConfig =
96+ ( await loadServerRuntimeConfig (
97+ distDir ,
98+ serverConfigFile ,
99+ serverConfigPath ,
100+ metaName ,
101+ ) ) || { } ;
102+
103+ const updatedProdServerOptions = {
104+ ...options ,
105+ pwd : distDir ,
106+ serverConfig : {
107+ ...updatedServerConfig ,
108+ ...options . serverConfig ,
109+ } ,
110+ plugins : [
111+ ...( updatedServerConfig . plugins || [ ] ) ,
112+ ...( options . plugins || [ ] ) ,
113+ ] ,
114+ } ;
115+
116+ const newServer = createServerBase ( updatedProdServerOptions ) ;
117+
118+ await manager . close ( ResourceType . Watcher ) ;
119+
120+ newServer . addPlugins ( [
121+ devPlugin ( {
122+ ...options ,
123+ } ) ,
124+ ] ) ;
125+
126+ await applyPlugins ( newServer , updatedProdServerOptions , nodeServer ) ;
127+
128+ await newServer . init ( ) ;
129+
130+ currentServer = newServer ;
131+ logger . info ( `Custom Web Server HMR succeeded` ) ;
132+ } catch ( e ) {
133+ logger . error ( '[Custom Web Server HMR failed]:' , e ) ;
134+ }
135+ } ;
136+
88137 return {
89138 server : nodeServer ,
90139 afterListen,
140+ reload,
91141 } ;
92142}
0 commit comments